From f99ccbf013df9cb0c965d127554d27c218a543ef Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 20 Mar 2018 13:35:26 +0800 Subject: [PATCH 01/76] Factor out safe-mix and dispatch --- Cargo.lock | 7 + Cargo.toml | 1 + build.sh | 2 +- demo/runtime/Cargo.toml | 4 +- demo/runtime/src/dispatch.rs | 206 +--------------- demo/runtime/src/lib.rs | 5 +- demo/runtime/wasm/Cargo.lock | 8 + demo/runtime/wasm/Cargo.toml | 1 + .../release/demo_runtime.compact.wasm | Bin 164653 -> 164539 bytes .../release/demo_runtime.wasm | Bin 164704 -> 164590 bytes .../release/polkadot_runtime.compact.wasm | Bin 134847 -> 134847 bytes .../release/polkadot_runtime.wasm | Bin 134896 -> 134896 bytes safe-mix/Cargo.toml | 14 ++ safe-mix/build.rs | 14 ++ .../src/safe_mix.rs => safe-mix/src/lib.rs | 9 +- substrate/runtime-std/build.rs | 12 +- substrate/runtime-support/src/dispatch.rs | 220 ++++++++++++++++++ substrate/runtime-support/src/lib.rs | 1 + .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 20 files changed, 289 insertions(+), 215 deletions(-) create mode 100644 safe-mix/Cargo.toml create mode 100644 safe-mix/build.rs rename demo/runtime/src/safe_mix.rs => safe-mix/src/lib.rs (95%) create mode 100644 substrate/runtime-support/src/dispatch.rs diff --git a/Cargo.lock b/Cargo.lock index 3c5128bdef422..0a68f9e5b5602 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1461,6 +1461,13 @@ dependencies = [ "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "safe-mix" +version = "0.1.0" +dependencies = [ + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "safemem" version = "0.2.0" diff --git a/Cargo.toml b/Cargo.toml index d51455bd543a3..9e1d50023171a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,6 +45,7 @@ members = [ "demo/primitives", "demo/executor", "demo/cli", + "safe-mix", ] exclude = [ "polkadot/runtime/wasm", diff --git a/build.sh b/build.sh index d6545f4f4fb8f..43d8deb8c1549 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/sh +cd demo/runtime/wasm && ./build.sh && cd ../../.. cd substrate/executor/wasm && ./build.sh && cd ../../.. cd substrate/test-runtime/wasm && ./build.sh && cd ../../.. cd polkadot/runtime/wasm && ./build.sh && cd ../../.. -cd demo/runtime/wasm && ./build.sh && cd ../../.. diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 4033111d7d093..11ca5c496fb79 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -9,6 +9,7 @@ hex-literal = "0.1.0" log = { version = "0.3", optional = true } serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } +safe-mix = { path = "../../safe-mix", default_features = false} substrate-codec = { path = "../../substrate/codec" } substrate-runtime-std = { path = "../../substrate/runtime-std" } substrate-runtime-io = { path = "../../substrate/runtime-io" } @@ -29,5 +30,6 @@ std = [ "demo-primitives/std", "serde_derive", "serde/std", - "log" + "log", + "safe-mix/std" ] diff --git a/demo/runtime/src/dispatch.rs b/demo/runtime/src/dispatch.rs index 8290d071aa0b1..6179de711f21c 100644 --- a/demo/runtime/src/dispatch.rs +++ b/demo/runtime/src/dispatch.rs @@ -16,211 +16,11 @@ //! Dispatch system. Just dispatches calls. -use runtime::{staking, democracy}; -pub use rstd::prelude::Vec; -pub use codec::{Slicable, Input, NonTrivialSlicable}; - -/// Implement a dispatch module to create a pairing of a dispatch trait and enum. -#[macro_export] -macro_rules! impl_dispatch { - ( - pub mod $mod_name:ident; - $( - fn $fn_name:ident( - $( - $param_name:ident : $param:ty - ),* - ) - = $id:expr ; - )* - ) => { - pub mod $mod_name { - use super::*; - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[repr(u32)] - #[allow(non_camel_case_types)] - enum Id { - $( - #[allow(non_camel_case_types)] - $fn_name = $id, - )* - } - - impl Id { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - match value { - $( - $id => Some(Id::$fn_name), - )* - _ => None, - } - } - } - - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[allow(missing_docs)] - pub enum Call { - $( - #[allow(non_camel_case_types)] - $fn_name ( $( $param ),* ) - ,)* - } - - pub trait Dispatch: Sized { - $( - fn $fn_name (self, $( $param_name: $param ),* ); - )* - } - - impl Call { - pub fn dispatch(self, d: D) { - match self { - $( - Call::$fn_name( $( $param_name ),* ) => - d.$fn_name( $( $param_name ),* ), - )* - } - } - } - - impl $crate::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(Id::from_u8)?; - Some(match id { - $( - Id::$fn_name => { - $( - let $param_name = $crate::dispatch::Slicable::decode(input)?; - )* - Call :: $fn_name( $( $param_name ),* ) - } - )* - }) - } - - fn encode(&self) -> $crate::dispatch::Vec { - let mut v = $crate::dispatch::Vec::new(); - match *self { - $( - Call::$fn_name( - $( - ref $param_name - ),* - ) => { - (Id::$fn_name as u8).using_encoded(|s| v.extend(s)); - $( - $param_name.using_encoded(|s| v.extend(s)); - )* - } - )* - } - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } - } - impl $crate::dispatch::NonTrivialSlicable for Call {} - } - } -} - -macro_rules! impl_meta_dispatch { - ( - pub mod $super_name:ident; - path $path:ident; - trait $trait:ty; - $( - $camelcase:ident(mod $sub_name:ident) = $id:expr ; - )* - ) => { - pub mod $super_name { - use super::*; - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[repr(u32)] - #[allow(non_camel_case_types)] - enum Id { - $( - #[allow(non_camel_case_types)] - $camelcase = $id, - )* - } - - impl Id { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - match value { - $( - $id => Some(Id::$camelcase), - )* - _ => None, - } - } - } - - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[allow(missing_docs)] - pub enum Call { - $( - #[allow(non_camel_case_types)] - $camelcase ( $crate::runtime::$sub_name::$path::Call ) - ,)* - } - - impl Call { - pub fn dispatch(self, d: $trait) { - match self { - $( - Call::$camelcase(x) => x.dispatch(d), - )* - } - } - } - - impl $crate::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(Id::from_u8)?; - Some(match id { - $( - Id::$camelcase => - Call::$camelcase( $crate::dispatch::Slicable::decode(input)? ), - )* - }) - } - - fn encode(&self) -> Vec { - let mut v = $crate::dispatch::Vec::new(); - match *self { - $( - Call::$camelcase( ref sub ) => { - (Id::$camelcase as u8).using_encoded(|s| v.extend(s)); - sub.using_encoded(|s| v.extend(s)); - } - )* - } - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } - } - impl $crate::dispatch::NonTrivialSlicable for Call {} - } - } -} +use runtime::{self, staking, democracy}; impl_meta_dispatch! { pub mod public; - path public; + path runtime :: _ :: public; trait staking::PublicPass; Session(mod session) = 1; Staking(mod staking) = 2; @@ -232,7 +32,7 @@ impl_meta_dispatch! { impl_meta_dispatch! { pub mod privileged; - path privileged; + path runtime :: _ :: privileged; trait democracy::PrivPass; System(mod system) = 0; Session(mod session) = 1; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 9dc1ca8a13f0f..9542638dc5b66 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -22,6 +22,7 @@ #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +extern crate safe_mix; #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; @@ -36,9 +37,7 @@ extern crate demo_primitives; extern crate integer_sqrt; -#[macro_use] pub mod dispatch; - -pub mod safe_mix; +pub mod dispatch; pub mod block; pub mod transaction; pub mod runtime; diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index a415dd58eb92f..3fba9f397c3ac 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -105,6 +105,7 @@ version = "0.1.0" dependencies = [ "demo-primitives 0.1.0", "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", + "safe-mix 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", @@ -546,6 +547,13 @@ dependencies = [ "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "safe-mix" +version = "0.1.0" +dependencies = [ + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "scopeguard" version = "0.3.3" diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index 436c482015cba..d33a662a11acd 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -14,6 +14,7 @@ substrate-runtime-support = { path = "../../../substrate/runtime-support", defau substrate-primitives = { path = "../../../substrate/primitives", default-features = false } demo-primitives = { path = "../../primitives", default-features = false } integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } +safe-mix = { path = "../../../safe-mix", default-features = false } [features] default = [] diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index b94b5ddc9b64bf467dac7444f9050dcef50f92bd..ee1b27aab6c198e80724d60b352e1cfd99359814 100644 GIT binary patch delta 32106 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 z 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 M*VSDelmBr2Us#Uc*8l(j delta 32347 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 diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 8ed27520fc72e552939f7e72b49d004ac07a729d..3bde3d57a3e1be46291b2563b4790a97c8e80619 100644 GIT binary patch delta 32317 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 B>gWIf diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 3b3fb8f78c34f3325307db47c3986ea9cca59203..bd0d6c21100100ec4cf2cdf721d7c462cbe26829 100644 GIT binary patch delta 5012 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 delta 5075 zcmcf^Yj_h?cFs-Oq@7X%^pOI>q)i{8(02nA1qLW(1%XxGAQ0LrEhQ;!d8i*YXvOjY z8Xe#w2!^!^Xjy_O8{q3M-4#}zHhi)!Le;wBil|r=1hukz?wuqQ7x%~hSiVlqJ@3ao z=ge?;oBr@Ny{9LM(2yuX!Xq`H^daxV!`^SnPXrp2D`7=2Rk4OofT`Z6!`JDcNijs5 zV1~Cfel$^*8h!we*U{snFz_f7it~j%aGhld>QSX+$gg zg++;4E73|?d0o1dj6|rnk}(XFO9Fxxq1-S{u`hleJ>6P7Hzp+2m0fAy1M8H2js%#d z3~{XGqJxyHj*PD25VDqAd8SJ`O7xOujQZq~6B?*jHZ8p$)jwHUq}E~JGG^_QrGu4k zmc^^2$mMTvQl|Ifa-u_0piYAvg%@#td&JEb?I`L)KluS(-19@Zn`MF zXqc_6T{((0Wd~#iE4`l_PMU9{uRS?jIlXeM(o!3yWYk9BB@L+^Me1|8ysOraZf(w+ z*g>;av3s;Rt%`rubNrO)eeS96dDU0fy%Gp->N5!%EQ_N)9)ooROi~92zGZ_8~4C0<)e*L(f-JndMgt*y{qOc(KRUg2Bj)mxOqEA2Pn}mWpml< zoZ%h1C5H#Fcxw@}_lK=3xY?Jd*ZxNn$p0JVti_Oz&Dx-X|7OD?_uzfaMf+oa2f9xX zM8o8e38|++i#%`gHUq#MuXX#LFqrAR`08~%ai)4NG{zIn)F`bocyE$o+&dG`MER%Z zL*?jOdERF{31Or&)$88>DM4Z7LSv$L=K(E{4Qa}rg9){P7=ICQFf3OpON2+#mcou0 z7ybn^^XKwB1In&|787U&&T)a7->>T6;Ez4D2bY8Q`k{*G$e;}~Czdnj zmJ=g1q|KyUI6V%V!~E_7K+Id;nhxOdHu<*`#+>pVYqkyVt!BKwXUA*FC6iKiE}gBO zP3NrW>h!r}wKry*e*r}=pC6-~`rr{{T{x3eEQ({D0iK>?Hv^cKW7iVBH$NGut8GqV z^^y#D(}S^mbx9JDYs;lDLoQ+)lBDi|W00W>G7OS>tTzR&M{eMzUC8e+*j=GE z`vC~BC8xal#YkvWE`Bivld@cvVY;&DauU||`O9@A_M+KJ1gX31hI0IMvR_(a>epcn*Udh3_)m<@@cC+`5D<(wfTcQHS-Qj3`;|Ta2_&5FoHfZbf zWgX2HA&$BL?ghW^G{9s6e%en9+hLdQk6PFPu#V0P2Qy5gb>VP`hZ3{#d+3*yjtHq$>v!f`c2W!){K@1O{~2{hB_|JquRI2_|v( z)qOXr@6A%UF@;|L8%%&XzESVPGW=Zd9sD~yNk~UN9eN(K^!Oe>4@Y~}I<1mUGV;OU zN8m@7RWeHI(ai+ZV@JN!DT97*)nDhRIxBgoD~x+IJg)%p{~*sgY~AFDAXr?8FO8iB;s3N5E9YsP$CFP-2R3x z)PfMTA?X(-7=*&f_?Wm-GqT$;)}e?6D^!5zUYy&WMECv+?jvq9-5O2IT0zGBu!@kF zoOZLwvl8TsW>JqR6xbd10$dMf3=NfIQGX=DKHN^HSv1p0I$|DzRZkWT%si7gj88W% z;Yk*aeoQHYVFB(5JYpVLI)5@v(vX}X&Xiv*of}zGs%-XZTX9X9!!Frsq%wO+=?Yv~ zEh%)phV*~1Ed_H$+kKhMfR7LGsQPfGiqYe2)e9xNqed!SveZ@~$gWh;=s`(y7mZIt z8lF^oOGDB~dn!%S5@~oRO3#lGg!C@bU*cKAaCt+TXv{)xS{LqBJgeS4X>_%g3?%Jo zv`I@ciOWLaJBXDUETYkcT6jf53qlM=IDsk=%!=G%p@wfE-g@>fQc);-654kD7BMaz`S`+J##Y;vPY6J9^IU!d)EVwx^5P zv`|lSaf3dlCw=fUXQQ4B!@YP$PX-R!H3%C9P51AjydtFBGAIxvZ%RKM5JAijb)bqT zUhV#1tgBH)9nbmb`>KD12~==%z?g z0PXZlBBFZ`sW*vi4CwX zip1U1l!upETFqQz=QRf~Oc60Zy%cD zSGFsNRA2!%2N2vFSl|F+uRv?N@>S3F6*cI~Lo2(HA+;U(I5@c9k}&q2_^`E!Ti$w` z`gP%OiX)G*tf(G@IQ7DDY&msN9t+xMrFsEJ`5x||-6|&0 gZPBD}WHnwtf0?-G+-PC~4|PV91pLI<5>1l-4Ysm!&j0`b diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index cb08a3c72bf5e04296d54ced6ad68b3184534674..f69c79c4ef49e7379be7aeb9bcdd5240e9d67137 100644 GIT binary patch delta 5032 zcmcf_YjhK3cJ7xpNjq&x=_{omlfKeY=#vI02n-KFfdhK5P|7Q`MOsS|($E%BQV|gj z>@hmPSE10jr$?&`QViWxw;r=Du7W*KwX0abjjJA!T`}z9`T*Iz-%OGgSNF&M*q%=B z`|;iH-a7+584W!3mEFJ$Ggj?pB^<{jZdPt0?X>eu-0(# zvzBAfCM~w6Lb+6H-6N|`kkW1W!_^_|t=jhP@Zd8x^H=R+D))GnFo*-S=Y(gKm z_7q5Bqh2}msz&CPvGh%271q?I7ZsK#shOxSw0>(VIy$lSAds$7$-E;`YTq_VYJEhP zxGztP6h;bZ&+Fm@603>P^19Vh?<2FMMCV=7xosM0!M5q7uPA7(&FRL_uI&ZV?^{kw$M?ia^wE+a=Z8o4V-~LMS%j6{yQ4jr-Cl&DD zyylAWauds{V~4t$3wF8ULKvxwK$)lfunwTo^T3f~kx=1D>i9-Wd>NjYV<|+nA|^uG za6Ci0`*;Q7L`pevN&4r@6FtA}N{uAFnVxsMKP9Lv#T-lbobQPMGLR{K{7R}bnBz|} z4yDzf5uUd;8O6NtH*_+8iG0qWu{&tR6na6HxIj7IFWTVbH@$icw}U79clB}6As6CF zsqJ((R7&@qX=1{6&dgAequEl-+47Qh!1 z4B%E{g#9-7HF`||*axk&6X1UEdv5_OA;?`E0Y{+6do=={1!$u#HDp3L?N-C9N+Pp_ z{s|$s_=4z={p*Iir|)UtAS!Rv!hO(BeOlSW=UTu`Nq0sea8YA4R3i0QG;Cm9)`e>Rn=l-HG6)gHs_lwHI%(lieb# zo)+K9N*#|H=;&#X?erUTrPzQ0gVKPZ)!C9S)2)Rv@Q;>3N1hBW7s#Mjp#~JtqG-0} z;~O?zZuCyYMOUF%DzD2h65g$+igix5bHj}P19IEaZ_s+f(lHnJt?Zs;Upn{XM zeinE&%I@W)!_%J|w)yDbY&a7i9^X(9+C2we(T1tUxnLwN18tuRnWOfOGZDSOiNr(_ zv1XinH#rDz(o1t84+gwZcR>ljN$;KW;0^{?&W8o8uRHGn{79h53t>EUE`UY&^+nGv zfO!h9ZtTS(`F?(>m|ju|ZOmW$N(_VZ^3Ez)qQZ6=ZDzydeccQx5!k5*7eaMh1Us*{ z;8FN?srTa==!k?q?_&=_H&J?hngtGH*g*@p6~;CzJf|=U=u#ULV`n~LgC7*(7&;l!sJ)cLt9}9^w7U;g*4n3+J~V7t8(mN(5u*pzU2fHl!Q+4^DFvixisqo zSOk^ch7X_-zX-fnK7?(Aw3uk!ARf-={mme}InwDe2^v8!50H$4jJi#NUQp03rl6oL zCLtlHE2CkBknVYtFlxvw$Q2R{(b)ASA$mv@)DmLT1uc7-30fgqHwi}*qa_5@d?ux> zyzy7zoCHRkFq!aA$nZf&Zm=0vxFkKovk*kRzc4O<$@ELKYy zCmu!ZwecL6grXLNX|hhQfzPBZ8j?Ag6aA<$GpO-8N@Hb>fPvTRkeiQGNO}fwB1>KA zv@DVo6JI*DM3PjeKb=onYByUN%vFwBt3@z7gj!2=O*2kcO9r1NSga1gX1CgE?Dbm& z^Jd3}8jGX0%Isj7w`K5pVI;?m9v11Na3o&_A2;9Jut9cFvuU%ro)i1gB7nJNhAc)P z@@d#4kU^8wB!{>&=?payruSy@dN&5h3#lXgD?TcGIB@`_Hk9Td5jyBK#Fc{vGU;J8 z8Bg3<^c^)R5c;w(G-{`!hAu&YxrpC^4<`n)Xg?uih%1|Zjj;G=HXq}t*=Q?sG*?+S zTO6F≶awpxta#cOzuivI8Ia?!^9VI$cHP5w}q;>xdpBud$i!WoXQaJ|jJ@BKo=k zBd@b1a$Gu^O~EWP5OVnWGsGBt$n_)fH$iCos*HiWE7 zi$UouY?^#(`4<$BKtA< z(pHq(P&x`ZA=`GuWAMT5p>IW#GDDz{A7!=R&^MavYpcx;tGz+kXx<{&Yiw3K&V!4l z^CWY1R}mktu!PzM!C|!u)_PnGr;2zDyGcs}UTa^FsJB+()CP%0GZGhzcs=VR*2ket z1`t=vnY0wkeLTLmnAbRJH0=((8JuSFBKbXpMNIpjf7D($DSF~mSxN@!sW86DSJ z!fPI|HkO%fc3iX+|K&JY@RwjrJUT0TA;R0s-ZD`sd)Gv{>|;(%#M`cEV6m|!`+^jn z5h*`SiY3|Wca-v~`Wg!-?kdGYqpnQ2f&^B96I(-)2CSSrMATyiI)el*T`YZ&u+*cs zo>C>UrP+b8eDv8^GTGT;!imB+0b3o<S zcLD0Ms`?P(I^a%YFDkE;^CADNR!`xKkC6ieOne4C8%IV*H(*QT+Z$MopNu00Y|;~P MB$fClv7XKRHyQd`Y5)KL delta 5080 zcmcf@dwf&n^`0+jllHbHwXc+d+_velEZwX+)+7#nmZ45tW4vCrZVg@7^>m4)@3YSbx1a@5gt( zbI!f~U0VMxtviNTu6gm&zOrF(%+pzx0i@R;eKUU*8hFeL+K|kWQWtJwkyyz@sSusRvGaW$nhn9Y> zzE&h2lx9~v13u5iifaT)J?EC$AiQ7KGk5t^AlHhdJ=MQOo5c@jNpovz7~`#)ooKcA z;bK|5)%^AVE2&~da?<8(BbgwmMXixcW}rsk5Oi=gx>9M+il@+9u4PedP-~$0Im>?7 zEX}kgLa9`3ZIV?-NGY{B1Jxnut+MvLfx*YGY{$%cSDsLj#zIM4A0wS#Wker0n{p+w zL9ZNoVFPo^So+n&6xQg~FDWcf+!~_7(E3NWp`!zjZU^EjmP{LBr9JEJmbN{ni`|ed zh6r~ENqcos0*TZ_Xn9?^)c)8+axg!rH+|hW(%wg|l5ReBk2K#N1?5t;eIiRt@s}rE zwYxB^bA7J#XUB1DsHVr+WitBv$G2d7=lV3l3hv#oCy?I8ClggzA6H`nCiz+;MWtDr z78B_=k4H-FO(K#vn@nNM#jQKXIy+CPLN;vMEt7Xi zwiMdWU&?%TNLo$yk?2fas$h% z!}>d#3v{^RLbyYxMww^sE*-!^&qKTShroPKT+26F;>hqs>`x%7xe;n<`75c?y|0uZ zPNakb7o>l^TIBhIJ28axW_aFf`;?%v6tO?WbM`egkmgM3<3ow|K#o7jxGybdMsU`; z(;13+;eX%Be1-Bk1IEsP6;o&jS>gocd_QZ0Q@{H4{kR!C>3=jwh4;A-Tcn-G+hCzI z`^0J{Jb7ZgigYJS5vQhMCp>s+DIn!J)Rhh3^j!4qCQSI``>e^1yuXpj?mshKO)e!% z+s|gRy>s-e5kuWPo2K-}rgKlDYSQ`1(hnakLqX-aQp?n}6i?RQ zhHLEYsjOat4sUuSmTyCg_G9GIFWfA5{J1?hVZ96V+AaS1=jD!;gi7u$YUkCfe zeOLB1+jn1lJp+}ESMFm~UVo(k>(+L~KzaFmwL+JFiA2vEH+O)ZZD&^~3(ye}2;d6E2wQ65 zdGs0s&WrWwuQp$N+J`5juCxs@#WAW z`_~P0Pfu%LJ1Vcx!ffcE9a`DLMJ?c_q#MH!IA}&VEI{gsa9GZ|teyTn9F8lwOK;rN zdoT0wB7t_=90eY5dZ!J7XpP*CbYVQas3=k)0oY#iRwsZp9OipJN`|*o`u_B=;7VEL zQ`42>AdVhO0|^6{r^6%Y{=;-wj1<;4(K{;xHpPOIo*NBWiM@D>t?U+A^|bgtR_geb zfesl1>2_C|t{B_ZouS+TW|7g_OBsMkwez&h6Lq?YQ3VD)@E| zP5%I9z(Q}`2hf0@2Hwjb!a73y#kA%ep4aXD{W&;thuvWmG=g59BpC%6bs7b|pr9_M zprHO@AtsT68n0u)n8u&*iIg?m zX}sQt+2k-PAU%O7o(ikxOQUmCq<}cm<*E&JrSoxfY$i*csiMBxY7tEJLbau`Y7K6w zj&%B_iVU0GosQ>3M?;u{fWwavRUA4p_^4^7y5)k!S}#i}Cq0?; zqMGF1?abn%D@?Vfit75cg0-Q_w#;l@&EbbJuXmyoye+N+A?C)NKo4Qeso0T4#eYD8 z@yu>loISi=>%jM2T099 z>0y-iVC4J((iK5zPd1-V8?>Ylx93Y*l7!zl?`X+r+=(QN3?I=t0-FV04;x^-CTQF- zB9NrqkUqK~j2Pzl(Zrp=acmI!a@~lyGL?-vSS6IEAg6!4w&ma@B9~q95`?TuGePNG zPITu`%a4#tdU9ybb%-O5TzO(tD4`R>$z2Q1=HeXc6|=sO&jdsIQR+bHz%%R!N*nXA zyHGk9IeoT!5RbqIM~EH`Cnd=}dHi6j#k^Js?uSBNpukQH9Q65LvNf1y%%SCL%!p$CibzN_k3Y;4N*0EK5n%17fON&2#D zMZC&fW#Po@MR;h`l?g|&LSPj*u`xiH>#%apKEjL@*cKpg!(izHgvE^BT8ov)mNoSl z%T1q)BqQzqVw@>ld#RZGUVPYY#k(-}b6-YAp3HS3*N3{d_MK}0w|}j>jkpa^msQn` z5ElY>9J^83pU3+AvsyikQ$AD<&|~CN>8U6(B)kq=LVjgA=~Gc88Qk"] +build = "build.rs" + +[build-dependencies] +rustc_version = "0.2" + +[features] +default = ["std"] +std = [] +nightly = [] +strict = [] diff --git a/safe-mix/build.rs b/safe-mix/build.rs new file mode 100644 index 0000000000000..55688bad9cc51 --- /dev/null +++ b/safe-mix/build.rs @@ -0,0 +1,14 @@ +//! Set a nightly feature + +extern crate rustc_version; +use rustc_version::{version, version_meta, Channel}; + +fn main() { + // Assert we haven't travelled back in time + assert!(version().unwrap().major >= 1); + + // Set cfg flags depending on release channel + if let Channel::Nightly = version_meta().unwrap().channel { + println!("cargo:rustc-cfg=feature=\"nightly\""); + } +} diff --git a/demo/runtime/src/safe_mix.rs b/safe-mix/src/lib.rs similarity index 95% rename from demo/runtime/src/safe_mix.rs rename to safe-mix/src/lib.rs index 7512d8db81a2d..05e8bad95a7aa 100644 --- a/demo/runtime/src/safe_mix.rs +++ b/safe-mix/src/lib.rs @@ -18,7 +18,14 @@ //! //! Described in http://www.cs.huji.ac.il/~nati/PAPERS/coll_coin_fl.pdf -use rstd::ops::{BitAnd, BitOr}; +#![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(not(feature = "std"), feature(core_intrinsics))] + +#[cfg(feature = "std")] +use std::ops::{BitAnd, BitOr}; + +#[cfg(not(feature = "std"))] +use core::ops::{BitAnd, BitOr}; pub const MAX_DEPTH: usize = 17; diff --git a/substrate/runtime-std/build.rs b/substrate/runtime-std/build.rs index 35eb154f3a69a..55688bad9cc51 100644 --- a/substrate/runtime-std/build.rs +++ b/substrate/runtime-std/build.rs @@ -4,11 +4,11 @@ extern crate rustc_version; use rustc_version::{version, version_meta, Channel}; fn main() { - // Assert we haven't travelled back in time - assert!(version().unwrap().major >= 1); + // Assert we haven't travelled back in time + assert!(version().unwrap().major >= 1); - // Set cfg flags depending on release channel - if let Channel::Nightly = version_meta().unwrap().channel { - println!("cargo:rustc-cfg=feature=\"nightly\""); - } + // Set cfg flags depending on release channel + if let Channel::Nightly = version_meta().unwrap().channel { + println!("cargo:rustc-cfg=feature=\"nightly\""); + } } diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs new file mode 100644 index 0000000000000..1e6fa64c62e92 --- /dev/null +++ b/substrate/runtime-support/src/dispatch.rs @@ -0,0 +1,220 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Dispatch system. Just dispatches calls. + +pub use rstd::prelude::Vec; +pub use codec::{Slicable, Input, NonTrivialSlicable}; + +/// Implement a dispatch module to create a pairing of a dispatch trait and enum. +#[macro_export] +macro_rules! impl_dispatch { + ( + pub mod $mod_name:ident; + $( + fn $fn_name:ident( + $( + $param_name:ident : $param:ty + ),* + ) + = $id:expr ; + )* + ) => { + pub mod $mod_name { + use super::*; + + #[derive(Clone, Copy, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[repr(u32)] + #[allow(non_camel_case_types)] + enum Id { + $( + #[allow(non_camel_case_types)] + $fn_name = $id, + )* + } + + impl Id { + /// Derive `Some` value from a `u8`, or `None` if it's invalid. + fn from_u8(value: u8) -> Option { + match value { + $( + $id => Some(Id::$fn_name), + )* + _ => None, + } + } + } + + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[allow(missing_docs)] + pub enum Call { + $( + #[allow(non_camel_case_types)] + $fn_name ( $( $param ),* ) + ,)* + } + + pub trait Dispatch: Sized { + $( + fn $fn_name (self, $( $param_name: $param ),* ); + )* + } + + impl Call { + pub fn dispatch(self, d: D) { + match self { + $( + Call::$fn_name( $( $param_name ),* ) => + d.$fn_name( $( $param_name ),* ), + )* + } + } + } + + impl $crate::dispatch::Slicable for Call { + fn decode(input: &mut I) -> Option { + let id = u8::decode(input).and_then(Id::from_u8)?; + Some(match id { + $( + Id::$fn_name => { + $( + let $param_name = $crate::dispatch::Slicable::decode(input)?; + )* + Call :: $fn_name( $( $param_name ),* ) + } + )* + }) + } + + fn encode(&self) -> $crate::dispatch::Vec { + let mut v = $crate::dispatch::Vec::new(); + match *self { + $( + Call::$fn_name( + $( + ref $param_name + ),* + ) => { + (Id::$fn_name as u8).using_encoded(|s| v.extend(s)); + $( + $param_name.using_encoded(|s| v.extend(s)); + )* + } + )* + } + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } + } + impl $crate::dispatch::NonTrivialSlicable for Call {} + } + } +} + +/// Implement a meta-dispatch module to dispatch to other dispatchers. +#[macro_export] +macro_rules! impl_meta_dispatch { + ( + pub mod $super_name:ident; + path $base_path:ident :: _ :: $path:ident; + trait $trait:ty; + $( + $camelcase:ident(mod $sub_name:ident) = $id:expr ; + )* + ) => { + pub mod $super_name { + use super::*; + + #[derive(Clone, Copy, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[repr(u32)] + #[allow(non_camel_case_types)] + enum Id { + $( + #[allow(non_camel_case_types)] + $camelcase = $id, + )* + } + + impl Id { + /// Derive `Some` value from a `u8`, or `None` if it's invalid. + fn from_u8(value: u8) -> Option { + match value { + $( + $id => Some(Id::$camelcase), + )* + _ => None, + } + } + } + + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] + #[allow(missing_docs)] + pub enum Call { + $( + #[allow(non_camel_case_types)] + $camelcase ( $base_path :: $sub_name::$path::Call ) + ,)* + } + + impl Call { + pub fn dispatch(self, d: $trait) { + match self { + $( + Call::$camelcase(x) => x.dispatch(d), + )* + } + } + } + + impl $crate::dispatch::Slicable for Call { + fn decode(input: &mut I) -> Option { + let id = u8::decode(input).and_then(Id::from_u8)?; + Some(match id { + $( + Id::$camelcase => + Call::$camelcase( $crate::dispatch::Slicable::decode(input)? ), + )* + }) + } + + fn encode(&self) -> $crate::dispatch::Vec { + let mut v = $crate::dispatch::Vec::new(); + match *self { + $( + Call::$camelcase( ref sub ) => { + (Id::$camelcase as u8).using_encoded(|s| v.extend(s)); + sub.using_encoded(|s| v.extend(s)); + } + )* + } + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } + } + impl $crate::dispatch::NonTrivialSlicable for Call {} + } + } +} diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index b3aea78cbc6e6..78850a40de6aa 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -26,6 +26,7 @@ extern crate substrate_primitives as primitives; pub extern crate substrate_codec as codec; pub use self::storage::generator::Storage as GenericStorage; +pub mod dispatch; pub mod storage; mod hashable; diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 7c3dabf1880e0073bf91f2edb05f842986644b07..63c43ca592414e834452fb3a16a0a360a8869acd 100644 GIT binary patch delta 177 zcmZqr#n|+ValFz5tR+YHxrfzj`K+tW=L@)SrA)eFu=7 zq@ly8zj?pLZAM1D$qTjQCa>3G+q_?^jFHh`vzg8#HlT7zV|ySOY5X2YdYXU?GcwHw zl8a1DfaG;kOGcy3f@VqFjCz|(95*lnDOFci7NC^2XC6>$mS>H?X7SiJ+>C~sSu!s( PZ5E4SWZrx|TU!tSs;oEq delta 177 zcmZqr#n|+Val$mS>H?=4%;@%$voc-f%M- PY-Uco%(VG>wzePu#GE+m diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 8ab4d6073ecb8587b8ce47693f4dc08a4d83fd64..b43b00f68772fcf6a1054abe5dc4bc26451cf00c 100644 GIT binary patch delta 177 zcmccgi}BJg#tr8fSvh!ES(!FpX56aGXgax5^#zbDQhNg=U3Ga7C_;<$ksNR_&>vH+#3J@bH4uRLo6HmAqF;bt`19FlpN PX>(c>BlBkU9Bn}WQ@}i8 delta 176 zcmccgi}BJg#tr8fS$SAlnK(9IX56aGXfnA|^#zbDQhNg=e_&t!EX#z5<$uu8G zelj%ylImubj3%2C&62noO*bEL+`tT^N?lo5fKt_-c|fUGo;3oS)iN2GH>X9t;bt`6 O9GrHUX|sBcwjco2*gI4J From 1e38431546876676cc4fb15d5ddb27f638f7190b Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 20 Mar 2018 17:17:25 +0800 Subject: [PATCH 02/76] Refactor dispatch into something more modular. --- Cargo.lock | 14 ++- Cargo.toml | 1 + demo/runtime/Cargo.toml | 2 + demo/runtime/src/api.rs | 3 +- demo/runtime/src/dispatch.rs | 34 +++---- demo/runtime/src/genesismap.rs | 5 +- demo/runtime/src/lib.rs | 3 + demo/runtime/src/runtime/council.rs | 23 +++-- demo/runtime/src/runtime/council_vote.rs | 86 +++++++++--------- demo/runtime/src/runtime/democracy.rs | 28 ++---- demo/runtime/src/runtime/mod.rs | 2 - demo/runtime/src/runtime/session.rs | 15 ++-- demo/runtime/src/runtime/staking.rs | 88 +++++++------------ demo/runtime/src/runtime/system.rs | 18 +--- demo/runtime/src/runtime/timestamp.rs | 6 +- demo/runtime/wasm/Cargo.lock | 10 ++- demo/runtime/wasm/Cargo.toml | 2 + substrate/runtime-support/Cargo.toml | 2 - substrate/runtime-support/src/dispatch.rs | 53 +++++++++-- substrate/runtime-support/src/lib.rs | 1 + substrate/runtime/consensus/Cargo.toml | 20 +++++ .../runtime/consensus/src/lib.rs | 32 ++++++- 22 files changed, 259 insertions(+), 189 deletions(-) create mode 100644 substrate/runtime/consensus/Cargo.toml rename demo/runtime/src/runtime/consensus.rs => substrate/runtime/consensus/src/lib.rs (68%) diff --git a/Cargo.lock b/Cargo.lock index 0a68f9e5b5602..a4d0a7b73fe6b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -255,11 +255,13 @@ dependencies = [ "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", @@ -1754,6 +1756,17 @@ dependencies = [ "substrate-rpc 0.1.0", ] +[[package]] +name = "substrate-runtime-consensus" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-runtime-io" version = "0.1.0" @@ -1782,7 +1795,6 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "environmental 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/Cargo.toml b/Cargo.toml index 9e1d50023171a..84e93cecd5468 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,7 @@ members = [ "substrate/runtime-io", "substrate/runtime-std", "substrate/runtime-support", + "substrate/runtime/consensus", "substrate/serializer", "substrate/state-machine", "substrate/test-runtime", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 11ca5c496fb79..756aefc5416ae 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -16,6 +16,7 @@ substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } +substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } demo-primitives = { path = "../primitives" } integer-sqrt = "0.1.0" @@ -27,6 +28,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-primitives/std", + "substrate-runtime-consensus/std", "demo-primitives/std", "serde_derive", "serde/std", diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index d590150061860..ea53296142ed1 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -14,7 +14,8 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -use runtime::{system, consensus, session}; +use runtime::{system, session}; +use consensus; impl_stubs!( execute_block => |block| system::internal::execute_block(block), diff --git a/demo/runtime/src/dispatch.rs b/demo/runtime/src/dispatch.rs index 6179de711f21c..9f82c4027e845 100644 --- a/demo/runtime/src/dispatch.rs +++ b/demo/runtime/src/dispatch.rs @@ -16,30 +16,30 @@ //! Dispatch system. Just dispatches calls. -use runtime::{self, staking, democracy}; +use {runtime, runtime_support, consensus}; impl_meta_dispatch! { pub mod public; - path runtime :: _ :: public; - trait staking::PublicPass; - Session(mod session) = 1; - Staking(mod staking) = 2; - Timestamp(mod timestamp) = 3; - Democracy(mod democracy) = 5; - Council(mod council) = 6; - CouncilVote(mod council) = 7; + path public; + trait runtime_support::PublicPass; + Session(mod runtime::session) = 1; + Staking(mod runtime::staking) = 2; + Timestamp(mod runtime::timestamp) = 3; + Democracy(mod runtime::democracy) = 5; + Council(mod runtime::council) = 6; + CouncilVote(mod runtime::council_vote) = 7; } impl_meta_dispatch! { pub mod privileged; - path runtime :: _ :: privileged; - trait democracy::PrivPass; - System(mod system) = 0; - Session(mod session) = 1; - Staking(mod staking) = 2; - Democracy(mod democracy) = 5; - Council(mod council) = 6; - CouncilVote(mod council) = 7; + path privileged; + trait runtime_support::PrivPass; + Consensus(mod consensus) = 0; + Session(mod runtime::session) = 1; + Staking(mod runtime::staking) = 2; + Democracy(mod runtime::democracy) = 5; + Council(mod runtime::council) = 6; + CouncilVote(mod runtime::council_vote) = 7; } pub use self::privileged::Call as PrivCall; diff --git a/demo/runtime/src/genesismap.rs b/demo/runtime/src/genesismap.rs index 5fa83499b335a..50d2d7f10a61b 100644 --- a/demo/runtime/src/genesismap.rs +++ b/demo/runtime/src/genesismap.rs @@ -23,7 +23,8 @@ use runtime_support::{Hashable, StorageMap, StorageList, StorageValue}; use primitives::Block; use demo_primitives::{BlockNumber, AccountId}; use runtime::staking::Balance; -use runtime::{staking, session, consensus, system, democracy, council, council_vote}; +use runtime::{staking, session, system, democracy, council, council_vote}; +use consensus; /// Configuration of a general Substrate Demo genesis block. pub struct GenesisConfig { @@ -110,7 +111,7 @@ impl GenesisConfig { ) .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ - (system::CODE.to_vec(), wasm_runtime), + (consensus::CODE.to_vec(), wasm_runtime), (consensus::AUTHORITY_COUNT[..].into(), vec![].and(&(self.authorities.len() as u32))), ].into_iter()) .chain(self.authorities.iter() diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 9542638dc5b66..933a6bd1a1f16 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -21,6 +21,9 @@ #[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; + +extern crate substrate_runtime_consensus as consensus; + #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate safe_mix; diff --git a/demo/runtime/src/runtime/council.rs b/demo/runtime/src/runtime/council.rs index 6f9c155839186..c8e9f12fde7d6 100644 --- a/demo/runtime/src/runtime/council.rs +++ b/demo/runtime/src/runtime/council.rs @@ -18,11 +18,10 @@ use rstd::prelude::*; use codec::KeyedVec; -use runtime_support::{StorageMap, StorageValue}; +use runtime_support::{StorageMap, StorageValue, PublicPass, PrivPass}; use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{staking, system, session}; -use runtime::democracy::PrivPass; -use runtime::staking::{PublicPass, Balance}; +use runtime::staking::Balance; // no polynomial attacks: // @@ -180,11 +179,11 @@ pub fn next_tally() -> Option { impl_dispatch! { pub mod public; - fn set_approvals(votes: Vec, index: VoteIndex) = 0; - fn reap_inactive_voter(signed_index: u32, who: AccountId, who_index: u32, assumed_vote_index: VoteIndex) = 1; - fn retract_voter(index: u32) = 2; - fn submit_candidacy(slot: u32) = 3; - fn present_winner(candidate: AccountId, total: Balance, index: VoteIndex) = 4; + fn set_approvals(self, votes: Vec, index: VoteIndex) = 0; + fn reap_inactive_voter(self, signed_index: u32, who: AccountId, who_index: u32, assumed_vote_index: VoteIndex) = 1; + fn retract_voter(self, index: u32) = 2; + fn submit_candidacy(self, slot: u32) = 3; + fn present_winner(self, candidate: AccountId, total: Balance, index: VoteIndex) = 4; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -329,10 +328,10 @@ impl<'a> public::Dispatch for PublicPass<'a> { impl_dispatch! { pub mod privileged; - fn set_desired_seats(count: u32) = 0; - fn remove_member(who: AccountId) = 1; - fn set_presentation_duration(count: BlockNumber) = 2; - fn set_term_duration(count: BlockNumber) = 3; + fn set_desired_seats(self, count: u32) = 0; + fn remove_member(self, who: AccountId) = 1; + fn set_presentation_duration(self, count: BlockNumber) = 2; + fn set_term_duration(self, count: BlockNumber) = 3; } impl privileged::Dispatch for PrivPass { diff --git a/demo/runtime/src/runtime/council_vote.rs b/demo/runtime/src/runtime/council_vote.rs index 876bb906e7854..252caec043a3e 100644 --- a/demo/runtime/src/runtime/council_vote.rs +++ b/demo/runtime/src/runtime/council_vote.rs @@ -19,12 +19,10 @@ use rstd::prelude::*; use rstd::borrow::Borrow; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; -use runtime_support::Hashable; -use runtime_support::{StorageValue, StorageMap}; +use runtime_support::{PublicPass, PrivPass, Hashable, StorageValue, StorageMap}; use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{system, democracy, council}; -use runtime::staking::{PublicPass, Balance}; -use runtime::democracy::PrivPass; +use runtime::staking::{Balance}; use dispatch::PrivCall as Proposal; type ProposalHash = [u8; 32]; @@ -101,9 +99,9 @@ fn take_proposal_if_expiring_at(n: BlockNumber) -> Option<(Proposal, ProposalHas impl_dispatch! { pub mod public; - fn propose(proposal: Box) = 0; - fn vote(proposal: ProposalHash, approve: bool) = 1; - fn veto(proposal_hash: ProposalHash) = 2; + fn propose(self, proposal: Box) = 0; + fn vote(self, proposal: ProposalHash, approve: bool) = 1; + fn veto(self, proposal_hash: ProposalHash) = 2; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -157,8 +155,8 @@ impl<'a> public::Dispatch for PublicPass<'a> { impl_dispatch! { pub mod privileged; - fn set_cooloff_period(blocks: BlockNumber) = 0; - fn set_voting_period(blocks: BlockNumber) = 1; + fn set_cooloff_period(self, blocks: BlockNumber) = 0; + fn set_voting_period(self, blocks: BlockNumber) = 1; } impl privileged::Dispatch for PrivPass { @@ -280,9 +278,9 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(cancellation)); - PublicPass::new(&Bob).vote(hash, true); - PublicPass::new(&Charlie).vote(hash, true); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); + staking::public_pass_from_payment(&Charlie).vote(hash, true); assert_eq!(proposals(), vec![(2, hash)]); internal::end_block(1); @@ -302,9 +300,9 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(cancellation)); - PublicPass::new(&Bob).vote(hash, true); - PublicPass::new(&Charlie).vote(hash, false); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); + staking::public_pass_from_payment(&Charlie).vote(hash, false); internal::end_block(1); system::testing::set_block_number(2); @@ -322,8 +320,8 @@ mod tests { let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(cancellation)); - PublicPass::new(&Bob).vote(hash, true); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); internal::end_block(1); system::testing::set_block_number(2); @@ -338,8 +336,8 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); assert_eq!(proposals().len(), 0); assert_eq!(democracy::active_referendums().len(), 0); }); @@ -352,12 +350,12 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); system::testing::set_block_number(3); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); }); } @@ -368,11 +366,11 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); system::testing::set_block_number(2); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); }); } @@ -382,13 +380,13 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); system::testing::set_block_number(3); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).vote(hash, false); - PublicPass::new(&Charlie).vote(hash, true); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(hash, false); + staking::public_pass_from_payment(&Charlie).vote(hash, true); internal::end_block(3); system::testing::set_block_number(4); @@ -404,12 +402,12 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); system::testing::set_block_number(3); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Charlie).veto(hash); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Charlie).veto(hash); assert_eq!(proposals().len(), 0); assert_eq!(democracy::active_referendums().len(), 0); }); @@ -421,7 +419,7 @@ mod tests { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); assert_eq!(proposals().len(), 1); assert_eq!(proposal_voters(&hash), vec![Alice.to_raw_public()]); assert_eq!(vote_of((hash, *Alice)), Some(true)); @@ -434,7 +432,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); assert_eq!(tally(&proposal.blake2_256()), (1, 0, 2)); internal::end_block(1); @@ -450,9 +448,9 @@ mod tests { with_externalities(&mut new_test_ext(), || { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).vote(proposal.blake2_256(), true); - PublicPass::new(&Charlie).vote(proposal.blake2_256(), true); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); + staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), true); assert_eq!(tally(&proposal.blake2_256()), (3, 0, 0)); internal::end_block(1); @@ -468,9 +466,9 @@ mod tests { with_externalities(&mut new_test_ext(), || { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); - PublicPass::new(&Alice).propose(Box::new(proposal.clone())); - PublicPass::new(&Bob).vote(proposal.blake2_256(), true); - PublicPass::new(&Charlie).vote(proposal.blake2_256(), false); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); + staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), false); assert_eq!(tally(&proposal.blake2_256()), (2, 1, 0)); internal::end_block(1); @@ -487,7 +485,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { system::testing::set_block_number(1); let proposal = bonding_duration_proposal(42); - PublicPass::new(&Dave).propose(Box::new(proposal)); + staking::public_pass_from_payment(&Dave).propose(Box::new(proposal)); }); } } diff --git a/demo/runtime/src/runtime/democracy.rs b/demo/runtime/src/runtime/democracy.rs index d3d4a098be647..9b6d82fe42c0f 100644 --- a/demo/runtime/src/runtime/democracy.rs +++ b/demo/runtime/src/runtime/democracy.rs @@ -19,21 +19,11 @@ use rstd::prelude::*; use integer_sqrt::IntegerSquareRoot; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; -use runtime_support::{StorageValue, StorageMap}; +use runtime_support::{StorageValue, StorageMap, PublicPass, PrivPass}; use demo_primitives::{AccountId, Hash, BlockNumber}; use dispatch::PrivCall as Proposal; use runtime::{staking, system, session}; -use runtime::staking::{PublicPass, Balance}; - -/// A token for privileged dispatch. Can only be created in this module. -pub struct PrivPass((),); - -impl PrivPass { - fn new() -> PrivPass { PrivPass((),) } - - #[cfg(test)] - pub fn test() -> PrivPass { PrivPass((),) } -} +use runtime::staking::Balance; /// A proposal index. pub type PropIndex = u32; @@ -166,9 +156,9 @@ pub fn tally(ref_index: ReferendumIndex) -> (staking::Balance, staking::Balance) impl_dispatch! { pub mod public; - fn propose(proposal: Box, value: Balance) = 0; - fn second(proposal: PropIndex) = 1; - fn vote(ref_index: ReferendumIndex, approve_proposal: bool) = 2; + fn propose(self, proposal: Box, value: Balance) = 0; + fn second(self, proposal: PropIndex) = 1; + fn vote(self, ref_index: ReferendumIndex, approve_proposal: bool) = 2; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -215,8 +205,8 @@ impl<'a> public::Dispatch for PublicPass<'a> { impl_dispatch! { pub mod privileged; - fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) = 0; - fn cancel_referendum(ref_index: ReferendumIndex) = 1; + fn start_referendum(self, proposal: Box, vote_threshold: VoteThreshold) = 0; + fn cancel_referendum(self, ref_index: ReferendumIndex) = 1; } impl privileged::Dispatch for PrivPass { @@ -272,7 +262,7 @@ pub mod internal { let total_stake = staking::total_stake(); clear_referendum(index); if vote_threshold.approved(approve, against, total_stake) { - proposal.dispatch(PrivPass::new()); + proposal.dispatch(PrivPass::unchecked_new()); } NextTally::put(index + 1); } @@ -350,7 +340,7 @@ mod tests { use keyring::Keyring::*; use demo_primitives::AccountId; use dispatch::PrivCall as Proposal; - use runtime::staking::PublicPass; + use runtime_support::PublicPass; use super::public::Dispatch; use super::privileged::Dispatch as PrivDispatch; use runtime::{staking, session, democracy}; diff --git a/demo/runtime/src/runtime/mod.rs b/demo/runtime/src/runtime/mod.rs index bba91af86d7a8..d5b44ed75f8c0 100644 --- a/demo/runtime/src/runtime/mod.rs +++ b/demo/runtime/src/runtime/mod.rs @@ -19,8 +19,6 @@ #[allow(unused)] pub mod system; #[allow(unused)] -pub mod consensus; -#[allow(unused)] pub mod staking; #[allow(unused)] pub mod timestamp; diff --git a/demo/runtime/src/runtime/session.rs b/demo/runtime/src/runtime/session.rs index 430a095a20f07..514f36169d427 100644 --- a/demo/runtime/src/runtime/session.rs +++ b/demo/runtime/src/runtime/session.rs @@ -21,9 +21,9 @@ use rstd::prelude::*; use codec::KeyedVec; use runtime_support::{storage, StorageValue, StorageMap}; use demo_primitives::{AccountId, SessionKey, BlockNumber}; -use runtime::{system, staking, consensus}; -use runtime::democracy::PrivPass; -use runtime::staking::PublicPass; +use runtime::{system, staking}; +use runtime_support::{PrivPass, PublicPass}; +use consensus; storage_items!{ // The current set of validators. @@ -48,7 +48,7 @@ pub fn validator_count() -> u32 { impl_dispatch! { pub mod public; - fn set_key(key: SessionKey) = 0; + fn set_key(self, key: SessionKey) = 0; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -62,8 +62,8 @@ impl<'a> public::Dispatch for PublicPass<'a> { impl_dispatch! { pub mod privileged; - fn set_length(new: BlockNumber) = 0; - fn force_new_session() = 1; + fn set_length(self, new: BlockNumber) = 0; + fn force_new_session(self) = 1; } impl privileged::Dispatch for PrivPass { @@ -152,7 +152,8 @@ mod tests { use codec::{KeyedVec, Joiner}; use keyring::Keyring; use demo_primitives::AccountId; - use runtime::{consensus, session}; + use runtime::session; + use consensus; fn simple_setup() -> TestExternalities { map![ diff --git a/demo/runtime/src/runtime/staking.rs b/demo/runtime/src/runtime/staking.rs index d772aad898c68..d1cdcd937fb29 100644 --- a/demo/runtime/src/runtime/staking.rs +++ b/demo/runtime/src/runtime/staking.rs @@ -22,7 +22,7 @@ use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use runtime_io::{print, blake2_256}; use codec::{Slicable, Input, KeyedVec}; -use runtime_support::{storage, StorageValue, StorageList, StorageMap}; +use runtime_support::{storage, StorageValue, StorageList, StorageMap, PublicPass, PrivPass}; use demo_primitives::{BlockNumber, AccountId}; use runtime::{system, session, democracy}; @@ -103,50 +103,28 @@ pub fn unlock_block(who: &AccountId) -> LockStatus { } } -pub struct PublicPass<'a> (&'a AccountId); - -const NOBODY: AccountId = [0u8; 32]; - -impl<'a> PublicPass<'a> { - pub fn new(transactor: &AccountId) -> PublicPass { - let b = FreeBalanceOf::get(transactor); - let transaction_fee = TransactionFee::get(); - assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); - FreeBalanceOf::insert(transactor, b - transaction_fee); - PublicPass(transactor) - } - - #[cfg(test)] - pub fn test(signed: &AccountId) -> PublicPass { - PublicPass(signed) - } - - #[cfg(test)] - pub fn nobody() -> PublicPass<'static> { - PublicPass(&NOBODY) - } - - /// Create a smart-contract account. - pub fn create(self, code: &[u8], value: Balance) { - // commit anything that made it this far to storage - if let Some(commit) = private::effect_create(self.0, code, value, private::DirectExt) { - private::commit_state(commit); - } +/// Create a smart-contract account. +pub fn create(pass: PublicPass, code: &[u8], value: Balance) { + // commit anything that made it this far to storage + if let Some(commit) = private::effect_create(&pass, code, value, private::DirectExt) { + private::commit_state(commit); } } -impl<'a> ops::Deref for PublicPass<'a> { - type Target = AccountId; - fn deref(&self) -> &AccountId { - self.0 - } +/// New PublicPass instance through making a payment. +pub fn public_pass_from_payment(transactor: &AccountId) -> PublicPass { + let b = FreeBalanceOf::get(transactor); + let transaction_fee = TransactionFee::get(); + assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); + FreeBalanceOf::insert(transactor, b - transaction_fee); + PublicPass::unchecked_new(transactor) } impl_dispatch! { pub mod public; - fn transfer(dest: AccountId, value: Balance) = 0; - fn stake() = 1; - fn unstake() = 2; + fn transfer(self, dest: AccountId, value: Balance) = 0; + fn stake(self) = 1; + fn unstake(self) = 2; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -188,13 +166,13 @@ impl<'a> public::Dispatch for PublicPass<'a> { impl_dispatch! { pub mod privileged; - fn set_sessions_per_era(new: BlockNumber) = 0; - fn set_bonding_duration(new: BlockNumber) = 1; - fn set_validator_count(new: u32) = 2; - fn force_new_era() = 3; + fn set_sessions_per_era(self, new: BlockNumber) = 0; + fn set_bonding_duration(self, new: BlockNumber) = 1; + fn set_validator_count(self, new: u32) = 2; + fn force_new_era(self) = 3; } -impl privileged::Dispatch for democracy::PrivPass { +impl privileged::Dispatch for PrivPass { /// Set the number of sessions in an era. fn set_sessions_per_era(self, new: BlockNumber) { NextSessionsPerEra::put(&new); @@ -571,7 +549,7 @@ mod tests { use keyring::Keyring::*; use demo_primitives::AccountId; use runtime::{staking, session}; - use runtime::democracy::PrivPass; + use runtime_support::PrivPass; use runtime::staking::public::{Call, Dispatch}; use runtime::staking::privileged::{Call as PCall, Dispatch as PDispatch}; @@ -600,9 +578,9 @@ mod tests { // Block 1: Add three validators. No obvious change. system::testing::set_block_number(1); - public::Call::stake().dispatch(PublicPass::new(&Alice)); - PublicPass::new(&Bob).stake(); - PublicPass::new(&Dave).stake(); + public::Call::stake().dispatch(public_pass_from_payment(&Alice)); + public_pass_from_payment(&Bob).stake(); + public_pass_from_payment(&Dave).stake(); check_new_era(); assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); @@ -613,8 +591,8 @@ mod tests { // Block 3: Unstake highest, introduce another staker. No change yet. system::testing::set_block_number(3); - PublicPass::new(&Charlie).stake(); - PublicPass::new(&Dave).unstake(); + public_pass_from_payment(&Charlie).stake(); + public_pass_from_payment(&Dave).unstake(); check_new_era(); // Block 4: New era - validators change. @@ -624,7 +602,7 @@ mod tests { // Block 5: Transfer stake from highest to lowest. No change yet. system::testing::set_block_number(5); - PublicPass::new(&Dave).transfer(Alice.to_raw_public(), 40); + public_pass_from_payment(&Dave).transfer(Alice.to_raw_public(), 40); check_new_era(); // Block 6: Lowest now validator. @@ -634,7 +612,7 @@ mod tests { // Block 7: Unstake three. No change yet. system::testing::set_block_number(7); - PublicPass::new(&Charlie).unstake(); + public_pass_from_payment(&Charlie).unstake(); check_new_era(); assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); @@ -728,7 +706,7 @@ mod tests { fn staking_balance_transfer_works() { with_externalities(&mut testing::externalities(1, 3, 1), || { FreeBalanceOf::insert(*Alice, 112); - PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); assert_eq!(balance(&Alice), 42); assert_eq!(balance(&Bob), 69); }); @@ -739,8 +717,8 @@ mod tests { fn staking_balance_transfer_when_bonded_panics() { with_externalities(&mut testing::externalities(1, 3, 1), || { FreeBalanceOf::insert(*Alice, 111); - PublicPass::new(&Alice).stake(); - PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); + public_pass_from_payment(&Alice).stake(); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); }); } @@ -767,7 +745,7 @@ mod tests { with_externalities(&mut testing::externalities(1, 3, 1), || { FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 69); - PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); }); } diff --git a/demo/runtime/src/runtime/system.rs b/demo/runtime/src/runtime/system.rs index 8cd75b49ed258..bcda0584ad681 100644 --- a/demo/runtime/src/runtime/system.rs +++ b/demo/runtime/src/runtime/system.rs @@ -26,7 +26,7 @@ use demo_primitives::{AccountId, Hash, TxOrder, BlockNumber, Header, Log}; use block::{self, Block}; use transaction::UncheckedTransaction; use runtime::{staking, session}; -use runtime::democracy::PrivPass; +use runtime::staking::public_pass_from_payment; use dispatch; use safe_mix::TripletMix; @@ -41,20 +41,6 @@ storage_items! { Digest: b"sys:dig" => default block::Digest; } -pub const CODE: &'static[u8] = b":code"; - -impl_dispatch! { - pub mod privileged; - fn set_code(new: Vec) = 0; -} - -impl privileged::Dispatch for PrivPass { - /// Set the new code. - fn set_code(self, new: Vec) { - storage::unhashed::put_raw(CODE, &new); - } -} - pub mod internal { use super::*; @@ -144,7 +130,7 @@ fn execute_transaction(utx: UncheckedTransaction) { // decode parameters and dispatch let tx = tx.drain().transaction; - tx.function.dispatch(staking::PublicPass::new(&tx.signed)); + tx.function.dispatch(public_pass_from_payment(&tx.signed)); } fn initial_checks(block: &Block) { diff --git a/demo/runtime/src/runtime/timestamp.rs b/demo/runtime/src/runtime/timestamp.rs index ed51ebabc7279..2357d5c2ec04c 100644 --- a/demo/runtime/src/runtime/timestamp.rs +++ b/demo/runtime/src/runtime/timestamp.rs @@ -17,7 +17,7 @@ //! Timestamp manager: just handles the current timestamp. use runtime_support::storage::StorageValue; -use runtime::staking::PublicPass; +use runtime_support::PublicPass; pub type Timestamp = u64; @@ -27,7 +27,7 @@ storage_items! { impl_dispatch! { pub mod public; - fn set(now: Timestamp) = 0; + fn set(self, now: Timestamp) = 0; } impl<'a> public::Dispatch for PublicPass<'a> { @@ -47,7 +47,7 @@ mod tests { use runtime::timestamp; use codec::{Joiner, KeyedVec}; use demo_primitives::AccountId; - use runtime::staking::PublicPass; + use runtime_support::PublicPass; #[test] fn timestamp_works() { diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 3fba9f397c3ac..3047d70f4cc36 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -108,6 +108,7 @@ dependencies = [ "safe-mix 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", @@ -630,6 +631,14 @@ dependencies = [ "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", ] +[[package]] +name = "substrate-runtime-consensus" +version = "0.1.0" +dependencies = [ + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-runtime-io" version = "0.1.0" @@ -658,7 +667,6 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "environmental 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index d33a662a11acd..86007c15a80a8 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -11,6 +11,7 @@ substrate-codec = { path = "../../../substrate/codec", default-features = false substrate-runtime-std = { path = "../../../substrate/runtime-std", default-features = false } substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } +substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } substrate-primitives = { path = "../../../substrate/primitives", default-features = false } demo-primitives = { path = "../../primitives", default-features = false } integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } @@ -23,6 +24,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-std/std", "substrate-runtime-support/std", + "substrate-runtime-consensus/std", "substrate-primitives/std", "demo-primitives/std", ] diff --git a/substrate/runtime-support/Cargo.toml b/substrate/runtime-support/Cargo.toml index 61a4b064c4a50..03099b8919351 100644 --- a/substrate/runtime-support/Cargo.toml +++ b/substrate/runtime-support/Cargo.toml @@ -8,7 +8,6 @@ ed25519 = { path = "../ed25519", optional = true } hex-literal = { version = "0.1.0", optional = true } substrate-runtime-std = { path = "../runtime-std", default_features = false } substrate-runtime-io = { path = "../runtime-io", default_features = false } -environmental = { path = "../environmental", optional = true } substrate-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../codec", default_features = false } @@ -17,7 +16,6 @@ default = ["std"] std = [ "ed25519", "hex-literal", - "environmental", "substrate-primitives/std", "substrate-runtime-io/std", "substrate-codec/std", diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 1e6fa64c62e92..eda4e496439e3 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -17,18 +17,59 @@ //! Dispatch system. Just dispatches calls. pub use rstd::prelude::Vec; +use rstd::ops; pub use codec::{Slicable, Input, NonTrivialSlicable}; +/// Default public dispatch; assumes a 32-byte ID. +pub struct PublicPass<'a> (&'a [u8; 32]); + +const NOBODY: [u8; 32] = [0u8; 32]; + +impl<'a> PublicPass<'a> { + /// New instance. + pub fn unchecked_new(who: &[u8; 32]) -> PublicPass { + PublicPass(who) + } + + /// New instance. + pub fn nobody() -> PublicPass<'static> { + PublicPass(&NOBODY) + } + + /// New instance. + pub fn test(who: &[u8; 32]) -> PublicPass { + PublicPass(who) + } +} + +impl<'a> ops::Deref for PublicPass<'a> { + type Target = [u8; 32]; + fn deref(&self) -> &[u8; 32] { + self.0 + } +} + +/// Default privileged dispatch. +pub struct PrivPass (()); + +impl PrivPass { + /// New instance. + pub fn unchecked_new() -> PrivPass { PrivPass(()) } + + /// New instance. + pub fn test() -> PrivPass { PrivPass(()) } +} + /// Implement a dispatch module to create a pairing of a dispatch trait and enum. #[macro_export] macro_rules! impl_dispatch { ( pub mod $mod_name:ident; $( - fn $fn_name:ident( + fn $fn_name:ident(self $( - $param_name:ident : $param:ty - ),* + , $param_name:ident : $param:ty + )* ) = $id:expr ; )* @@ -134,10 +175,10 @@ macro_rules! impl_dispatch { macro_rules! impl_meta_dispatch { ( pub mod $super_name:ident; - path $base_path:ident :: _ :: $path:ident; + path $path:ident; trait $trait:ty; $( - $camelcase:ident(mod $sub_name:ident) = $id:expr ; + $camelcase:ident(mod $sub_name_head:ident $( :: $sub_name_tail:ident )* ) = $id:expr ; )* ) => { pub mod $super_name { @@ -172,7 +213,7 @@ macro_rules! impl_meta_dispatch { pub enum Call { $( #[allow(non_camel_case_types)] - $camelcase ( $base_path :: $sub_name::$path::Call ) + $camelcase ( $sub_name_head $( :: $sub_name_tail )* ::$path::Call ) ,)* } diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 78850a40de6aa..219a78d3945ff 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -32,3 +32,4 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; +pub use self::dispatch::{PrivPass, PublicPass}; diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml new file mode 100644 index 0000000000000..04c24399a7f98 --- /dev/null +++ b/substrate/runtime/consensus/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "substrate-runtime-consensus" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } +substrate-runtime-std = { path = "../../runtime-std" } +substrate-runtime-support = { path = "../../runtime-support" } + +[features] +default = ["std"] +std = [ + "substrate-runtime-std/std", + "substrate-runtime-support/std", + "serde_derive", + "serde/std", +] diff --git a/demo/runtime/src/runtime/consensus.rs b/substrate/runtime/consensus/src/lib.rs similarity index 68% rename from demo/runtime/src/runtime/consensus.rs rename to substrate/runtime/consensus/src/lib.rs index 8d631d0bb8e9c..cd1bafa8d06e2 100644 --- a/demo/runtime/src/runtime/consensus.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -16,9 +16,20 @@ //! Conensus module for runtime; manages the authority set ready for the native code. +#![cfg_attr(not(feature = "std"), no_std)] + +#[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_support as runtime_support; + +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] extern crate serde; + use rstd::prelude::*; +use runtime_support::storage; use runtime_support::storage::unhashed::StorageVec; -use demo_primitives::SessionKey; +use runtime_support::dispatch::PrivPass; + +pub type SessionKey = [u8; 32]; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; @@ -29,14 +40,33 @@ impl StorageVec for AuthorityStorageVec { const PREFIX: &'static[u8] = AUTHORITY_AT; } +pub const CODE: &'static[u8] = b":code"; + /// Get the current set of authorities. These are the session keys. pub fn authorities() -> Vec { AuthorityStorageVec::items() } +impl_dispatch! { + pub mod privileged; + fn set_code(self, new: Vec) = 0; +} + +impl privileged::Dispatch for PrivPass { + /// Set the new code. + fn set_code(self, new: Vec) { + internal::set_code(new); + } +} + pub mod internal { use super::*; + /// Set the new code. + pub fn set_code(new: Vec) { + storage::unhashed::put_raw(CODE, &new); + } + /// Set the current set of authorities' session keys. /// /// Called by `next_session` only. From 909533f2613e71a2c88e4ef21a14051240c129f6 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 20 Mar 2018 17:19:43 +0800 Subject: [PATCH 03/76] Fix wasm build. --- demo/runtime/wasm/Cargo.lock | 3 +++ .../release/demo_runtime.compact.wasm | Bin 164539 -> 187309 bytes .../release/demo_runtime.wasm | Bin 164590 -> 187361 bytes polkadot/runtime/wasm/Cargo.lock | 1 - .../release/polkadot_runtime.compact.wasm | Bin 134847 -> 134847 bytes .../release/polkadot_runtime.wasm | Bin 134896 -> 134896 bytes substrate/runtime/consensus/Cargo.toml | 4 ++-- substrate/test-runtime/wasm/Cargo.lock | 1 - .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 10 files changed, 5 insertions(+), 4 deletions(-) diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 3047d70f4cc36..6321f62a508ac 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -635,6 +635,9 @@ dependencies = [ name = "substrate-runtime-consensus" version = "0.1.0" dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index ee1b27aab6c198e80724d60b352e1cfd99359814..d2d251d5ab8283c44b60cd53e3ada34de3613a2b 100644 GIT binary patch literal 187309 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 Tv*z6OePTv^h~CbR9Q*$Pne(}K literal 164539 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 kodVHQ4AUx}e)*Z=?k literal 164590 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 H-5UN6xcTS; diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index d2bf5b3e7875e..f2bec16f7beac 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -654,7 +654,6 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "environmental 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index bd0d6c21100100ec4cf2cdf721d7c462cbe26829..d4a5f175a4c24695ec95eea87fa586a200128429 100644 GIT binary patch delta 1327 zcmcgsTS!!45I%F-aNR9;W4&yan1!0Ut>kXmO=v6WVz{AMK@{3%l(lpt4SJ{qA55{W zA3a%Zw+AVU5>9f`APu$9wq+$MHM>9(tdZJNMc0{MvsHTPp{JSo{`qG9`Q|^T$*pd3 ztLtY@wntVBV_ZJ9EVisoy;Xj?NJol&5B!Ap%7@MQpf0uGR`$JV!&s%0@ z`od}0*;H8e2T-%Y!bk))MYSWK+*fpN0x^#tdCi%*#b()cESPsfpSg|&G2ihDO35v5 z6MxfkO4>PXM(GX0WN%r%1`98(j%1lto#@SwN-6icRE00%kw^?f(y@P ziUk3hjf(d#PG5q49x8u(*!-<3`*=P=bXl3k9f?McbHAJpmzb*20+-|kjqeRKN36F( zq{DjOD?V4{lhldC@pi@IwKw&gqB-98EN7nX9fVtZW(DFWh+Fhx4wtW{cNLxu_7)ST zrq?WAe(Bea*=(hs(OF{ucH+7E<4IH2@S%gkl7aMK3}w%!^<3(iU$64_;rUj>%X_{V z!_9~4!X%=6QdFx52c|zRP$mBTtP*bwL;BEXqJp^ zkb+o78+=Ez`T=#^$MlkR%Ag5ZWnd?H~wYXa!rd rMY{h9lEop5bn7#Okr0WK#8jQns#PD%Ke(tcZ_gsZ)}=g~B>LeOKmNv@ delta 1327 zcmcgsTS!!45I%F-aNR9;!`otoTBMoVn(mfX25uL+7;bcjD6~x}OUfh-dPoHyOfl_8 zPgYyjgOo)HCplf93$BHBT8!x8trn7Cjgp=$GHd47bc>#P=xJuYf4-T2zWL9&@6z6P zX`2l};FgU+J2r}5E6dBgPG)A-PJM&bZZ#$edV7PFm1Q*(oV?oyZWir4g@N4S%+dHK z$uWCh0A(fYpDWMF)sinK?Eeb>Nz9tpLHLh6H_!c%XO=%74E{aGkbjqQ)cg<))$>$X zn6Yp=b~YDQOaNLoSQvqzuBd4Yl>3X$P9kQ>vA3L=S!$81ivxKl^jURr0P8HNqLj?i zHt`p2OIbUoMU`J8O!ib{>#%TIeFV#>dxl<=R8F~9rFsljojyMr#Id0IM4tBr6F#J;bXXh$T(g?T;N4mVH_kh@q?wZRS$X`gWPW4|TYamsf{P za^=Vtx@PS=@S#yW01k?kNDV|1NlFWVZv-sULO8Lct$`enHt8T2ROy}$+7V`0j8%@9 zl-qi^A|mb#0vRu%m<$jc0B*?~hWKcnG8hI+4OGh<16^dXiAjl!h4K)jNKH%O2-)aV za2_AugFA_@XFUE74!#J#Cn509QVCuL&Z%_iqwDxY())CXmon0!jzA0!h5YSmO7414 zxwI(`a7?24$~VGA3tJh|a9{Y(%agU*edUzj0I$s|;iOQ~aI4R;%K0N{YuB0jzddT9T zMX7%ZuW0qk;b-8`Sbhy-+`#AmLRITinu7sYt@^C2tkM!1YrT%X=oiF r2%%^Nd$CP=I0Ok|vrW431wsvOn_gRxU9hAu>%bDht|~95h(7oUfRM|4 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index f69c79c4ef49e7379be7aeb9bcdd5240e9d67137..2d716d832485a973b2a313a9b02769500db3a8f4 100644 GIT binary patch delta 1345 zcmb_cYe-a45WaKUaCP&Aug#3iAQNj-cU4fMmI^Ax)$Jh^3z`qqN)+)y1(x){gw$?& zvskeL$%v3{b;F1ZAEj8VMft9Ngs?{Czbsw1nWN?^(U0iYocU(HnKR#X8l7fm|h>rPL!oz%fb4IMzdWSY8Lq4a?go1?77!&e>M*m~w0d-U_N`uhaJKfFSh9> z*26ZfmY&S)r@M;Y09LfJ9l$_g#RUj=DZlmdJX49KNz@Q5@FZwE6KwY0+xbPGG6Y0lM% zyE`EQv6G!(Lvy?fdKcP$)alpG{Z_<-&*1?z@q7XCY=3wNm#ey=ipQ<2=>_`Y#HYP5 zOcsM0x#uPH)9&S)ePB>%=BM#UW&$kv=9Z#z;5&$mTCHwd$#J0^$4#L1L~8(!^Fhn$ s+q7by9X9h5TJhr~_>dBZR`Aj87M)62m{}N8oOU#Z(+|i_uDlg~0Wm|(TL1t6 delta 1345 zcmbVMZAepL6u#%SaJu}$sl$X;K_=Bwrv_QnsGu@hu2Lul+EP+$I7EvIEa?Li3cJ;t z$-)YvB0{?54I|2&ma?J`%5+-$5yBRg|FUweb6z!9K|lI+&UxPRob#UNy!Q?})x%D8 zOI8%PI;Szlz;G#gFE7^9#uH5;YYq85U8Z1aIjve-^yAP?C}RG~?7 z!H!ozS%u|u<@_==`Ep_TR|rj#w(sg8Jk9RnxoP(K@~n!u-*c8b?ov*`p;b}6V7);y zRZqvx*6R8RK(~7q0y(>{jRSK0o~9|py1DNiXEoFs zheOZa@=?29E}Dw56nv9{lhpM$&}hk?6;hzDgz)12*`fF`;$HDA;A-{`tj06_U@dWa z2MqFyL7(QgC3pEGI@{{sPP}%13dt<_KlV`A`e{`-hH~J`CW4tG4C3UH@2B~D35;Im zJp!XT`QDGsbXTSY@S#P|4Jw#1LH$mET@8suV@Jb*0Cp$>%D~M&M?g1*5>}J$ z{m?0X4O|rwKNSTsUPW0G4RK-MV%7x2$MO_?BIHC<4eK1}Ba8RbDH~FtPKy-g$$=`e zmL*`DT)QiS@9kd;oBW#o=VAO^8J|kXTM_tos;pcJwn)14)wO&gmbeb)v6@^sLm&nf z+P^EI5KZgA&800hgLw+g*JgnW$Wg2tAwfl2RTY3(3T|c31GqyPrgwmoiazUrix^hA z;PQBAU~4)d1F`*`5J0oH3*3`!y_u$& xq@j&PYX(7xM=O{PWHNgY7K$yI%sT?{(XLF5y0W-(adpwo#e&JLghh%z_zAJ((mDVD diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml index 04c24399a7f98..720e90591c515 100644 --- a/substrate/runtime/consensus/Cargo.toml +++ b/substrate/runtime/consensus/Cargo.toml @@ -7,8 +7,8 @@ authors = ["Parity Technologies "] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } -substrate-runtime-std = { path = "../../runtime-std" } -substrate-runtime-support = { path = "../../runtime-support" } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } [features] default = ["std"] diff --git a/substrate/test-runtime/wasm/Cargo.lock b/substrate/test-runtime/wasm/Cargo.lock index 8993d9c049a4d..fcc2d1b10420f 100644 --- a/substrate/test-runtime/wasm/Cargo.lock +++ b/substrate/test-runtime/wasm/Cargo.lock @@ -621,7 +621,6 @@ name = "substrate-runtime-support" version = "0.1.0" dependencies = [ "ed25519 0.1.0", - "environmental 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 63c43ca592414e834452fb3a16a0a360a8869acd..37419bceef3cc49b7d69d600a60c227094217abf 100644 GIT binary patch delta 260 zcmZqr#n|+Val;Nqb`B06R#qmK&HEWEl^G2uTdKYQl1gfCfF!?qCXlRD_ZKu$5YS-a zP+|sA0!kbLdXsOeudoA)N+_{|L=}`+1oRXI6&N&`859J=c$pLg95u2O7#t0<96Mwk zIRwCpHI!IEiVc)F1@t!W*SO8ds5^O~mfYkGQEZ#{YsoS)>P)_?9l@x-*-YmV8_;e^ zV|ySOY5X2YdYXV-W@MTVBo~>Q0Lkm7mW+m*1bj13 kvU65AP|@tHJRr%HeRlI@kJ-|UhMV(KuCQ*to~i_@% diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index b43b00f68772fcf6a1054abe5dc4bc26451cf00c..b8b1c745038c7b9c31e5e9320484b7c6353eb3a8 100644 GIT binary patch delta 259 zcmccgi}BJg#tml}**Q3PSXr4^HeY7ks?2CIxl{E8kStPr10>_sGlAqub$>xq1py5v z4kcy~C7{G1U^rP*V}%`9R6>azB&wjqB4DT}sKB7f%%C6`#>=E2;HZ(Mz~E?*<=7$X z$RPk$tf9mTQf#2aDPXvnU-LF2qrv2lT5^-3**5cQ%Q7_sGlAqub$>y91py5v z4kcy~C7{G1U^H1%V}%`9R6>azB&wjqB4DH_sKB7f%%C6`#>=E2;HZ(Mz~E?*<=7$X z$RPk$tf9mTQf#2aDPXjjU-LF2qv7O_T5^*MB3U-`YRfY+8cf#JiC{F|+@|x04QO|! zu|1GnY5X2Y&NKnJtjRPVNPaRk0g~!wmW-yG6U~yifyNwhEMzp;Z02Og%xJi|)O8*6 k!@_=Mi_SwzKp0lMHO*ZdOxx%_xJx5y*02dQRwEzGB From 1f464aee792e9345730ce7914494311537e3d7b8 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 21 Mar 2018 13:23:28 +0800 Subject: [PATCH 04/76] Fix up timestamp --- Cargo.lock | 14 ++++++++++ demo/runtime/Cargo.toml | 2 ++ demo/runtime/src/dispatch.rs | 4 +-- demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime/mod.rs | 2 -- demo/runtime/src/transaction.rs | 2 +- demo/runtime/wasm/Cargo.lock | 12 ++++++++ demo/runtime/wasm/Cargo.toml | 2 ++ .../release/demo_runtime.compact.wasm | Bin 187309 -> 186644 bytes .../release/demo_runtime.wasm | Bin 187361 -> 186695 bytes substrate/runtime-io/src/lib.rs | 7 +++++ substrate/runtime-io/with_std.rs | 8 +----- substrate/runtime-std/src/lib.rs | 7 +++++ substrate/runtime/timestamp/Cargo.toml | 26 ++++++++++++++++++ .../runtime/timestamp/src/lib.rs | 14 ++++++++-- 15 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 substrate/runtime/timestamp/Cargo.toml rename demo/runtime/src/runtime/timestamp.rs => substrate/runtime/timestamp/src/lib.rs (79%) diff --git a/Cargo.lock b/Cargo.lock index a4d0a7b73fe6b..1eace7c9aa8cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,6 +265,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", + "substrate-runtime-timestamp 0.1.0", ] [[package]] @@ -1802,6 +1803,19 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-runtime-timestamp" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-serializer" version = "0.1.0" diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 756aefc5416ae..9a36cc60a84c3 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -17,6 +17,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } integer-sqrt = "0.1.0" @@ -29,6 +30,7 @@ std = [ "substrate-runtime-support/std", "substrate-primitives/std", "substrate-runtime-consensus/std", + "substrate-runtime-timestamp/std", "demo-primitives/std", "serde_derive", "serde/std", diff --git a/demo/runtime/src/dispatch.rs b/demo/runtime/src/dispatch.rs index 9f82c4027e845..8cc32a518ed17 100644 --- a/demo/runtime/src/dispatch.rs +++ b/demo/runtime/src/dispatch.rs @@ -16,7 +16,7 @@ //! Dispatch system. Just dispatches calls. -use {runtime, runtime_support, consensus}; +use {runtime, runtime_support, consensus, timestamp}; impl_meta_dispatch! { pub mod public; @@ -24,7 +24,7 @@ impl_meta_dispatch! { trait runtime_support::PublicPass; Session(mod runtime::session) = 1; Staking(mod runtime::staking) = 2; - Timestamp(mod runtime::timestamp) = 3; + Timestamp(mod timestamp) = 3; Democracy(mod runtime::democracy) = 5; Council(mod runtime::council) = 6; CouncilVote(mod runtime::council_vote) = 7; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 933a6bd1a1f16..103a22ea3ea3a 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -23,6 +23,7 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_timestamp as timestamp; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate safe_mix; diff --git a/demo/runtime/src/runtime/mod.rs b/demo/runtime/src/runtime/mod.rs index d5b44ed75f8c0..9f7484e5c9ae6 100644 --- a/demo/runtime/src/runtime/mod.rs +++ b/demo/runtime/src/runtime/mod.rs @@ -21,8 +21,6 @@ pub mod system; #[allow(unused)] pub mod staking; #[allow(unused)] -pub mod timestamp; -#[allow(unused)] pub mod session; #[allow(unused)] pub mod democracy; diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index de769b5a16cef..ffa18911292ec 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -162,7 +162,7 @@ mod tests { use codec::Slicable; use primitives::hexdisplay::HexDisplay; use dispatch::public::Call; - use runtime::timestamp::public::Call as TimestampCall; + use timestamp::public::Call as TimestampCall; #[test] fn serialize_unchecked() { diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 6321f62a508ac..eafad5cd937f3 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -112,6 +112,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", + "substrate-runtime-timestamp 0.1.0", ] [[package]] @@ -677,6 +678,17 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-runtime-timestamp" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-state-machine" version = "0.1.0" diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index 86007c15a80a8..6f0db9390bf55 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -12,6 +12,7 @@ substrate-runtime-std = { path = "../../../substrate/runtime-std", default-featu substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } +substrate-runtime-timestamp = { path = "../../../substrate/runtime/timestamp", default-features = false } substrate-primitives = { path = "../../../substrate/primitives", default-features = false } demo-primitives = { path = "../../primitives", default-features = false } integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } @@ -25,6 +26,7 @@ std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", "substrate-runtime-consensus/std", + "substrate-runtime-timestamp/std", "substrate-primitives/std", "demo-primitives/std", ] diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index d2d251d5ab8283c44b60cd53e3ada34de3613a2b..4d31a0d7d5bbe50e0e519f15634b35cf0348e7de 100644 GIT binary patch literal 186644 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 literal 187309 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 Tv*z6OePTv^h~CbR9Q*$Pne(}K diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index b132cee98df86e0cedd4518bde1b423b36dc1681..cf49743f0211d0ca1b2cb74654569472e5b98132 100644 GIT binary patch literal 186695 zcmeFa3y@sbdFOW@-90_sJu?kp0LTzC&4|%q_}%@UzDsICbCSryo7_z^9LArSi8b|M(~0 z{l53T>;3mVdHmEvpZbxkr3Xv);E^XDK7Q(f)5kw~-|15i9l!6?qmQ1>+Irm8<4>JB zemv_axv1o)kDpGJ-}lfXrytE`^r)vt4?pnP&p!HK)}3S=fB3pS?jJ~~c z{NaZmee(Epk;jjp_KZ0dIeCg^?)%K~r@SwXJmAh|RktC-%RO=WQ@44+1-(pF30m*c z&~hC)-c#$^K-s5%_|d2Cd)K>f1DWUY&*x=XcKDS=SrlcbledeK;mx|8JkK*mI?u~? z&Ql8Y2b61br(fCY&G~;Fub`9u^O{s|r$e3kzuTGXl-)uN<$1TuqxtzxIZu76s?+VY z+WE=6*K3z~wq@pP`9kO6;}1W2>PL!f%c&Zz5U1Yzn#Cc_uu~W-skgwJ5%g{)+?T` z7Om=1eqy}yP|*rItL#v5J`em`ExO~`D$`9iE_7*)OA4IN*Q-{T9k$1_VYWJR=Wa@o zu3Go(ULUs(72RTO@{j!TBXe2Uxk|0$_Lq*eKR;eN7S4TPt`(NPz?)}2Jl77hcg*F~ z*co@`iY)5~pgL4!gQ8#MqfS5U3~hrgbjWoOX(Y7oP{q~3^=fH-G~;)}^-;IVM%(%A zDAvlgFmo(B%u8LrSn2Nico37i91MBYU8kc(Q1_@Vgw|B=0=)?L><%sKUq))>BLKXk z%GXCbc;#v)5J1Pw{=!=Gtl|2&7rIkfG~Ew_lofXFFAg3qPEv)CN)>}Jn;u#gRm_Fn zR2EgthknXZ6(d5qY6HDxEO}nur=oO!nSzV4~xxmL-lvk%}MVz?bM_%lP+uqIn=OS zG}gLHBr$w|o^;ot+mYqMwS8bqed^VH>0i@_w*XrwY_Hm<8FmKFQJ#r3hU<=OOLW&A z%}PWxb1UF@IbR=d7eVg`?R(}#?KS0FSHu&YVQY}X07eYF6uUK^)q7O5zs$xS*}>tpBeOiw*WactSO{j1h#j4*h@w zm%{9^{BX&*iVCu-HGDA4u4lQbingNXY1K@ouw1@k4g;tmeZIGEIBoxC|pK8K7nCMpb zuaCQPS-(#gRn0h8??9~RpjXp@<<5rQ;W9u4vxqb!0wnAI)harTalf3M7|#gxGs0*W zVaaf3N*Nw!1Sx;IV)(n!~sE5s8G%oQMwbd9+}wA;X30n$j< zn41YLjbteZ^J>-jx^R$J9ppgDM!z*23t-Z##VSxkSPZo)5QS1&;+@v)v1yYTk+zYj zC++ny_Xl~6V*5lv@71UrDi*o$WC#?&pvb9^zS)RE*ohF6dz)g;7#QY-WEM#$6HFOz0ji z4*~;aTLMEwN((d9<;+PfikW-z{EPvMkpZz9#8r70f-O6c0k^d{*2CdqunV%vGRabD z87D*X`oEPIWrJ|T30WE~p+V$X7+Q3Xz_11j2dgtK6L!kJhDXHS3Xl?<=QPg+_#Y&f zVbo9*bU_25QLV?VIj)rBX9BSBJ+hxfB-cj3UJ5>QDSd!Ky%bF9rRS=bey3hGN~-OXl9&xE z^*;l2w^A+FtW;T~{@MUM_}v_MXjFCbEkf5pF0X!8B#vR2g+92dVZ*d^ymZM&5u|?f zrP5PZ%v_z3xr(iTEA=MKRpa%ExjJtGQ*AZPRm(MV^-?rfU%rmH`ge-Fa|WYC>Yy4n zZI(fZo@)CV!8wD4ft+k34%(q@auY+9yGq~?T^TBr2h;)Y5BtRL->fcJ#|Ydkv1ej5oQLvJ{?Z!kh4WT z(?mm8FXHYVDh6C+R7rDm=p;9C*2}8Acih@NHq$akr?pSW;^sLfF*b^fW2sC37fhFT zg@V#iPznX5Yz$CPZiWJE4lqT{lJUhy#xuLeGFw1_jIYo+p-u@Corr@OQ|r>e>N83_ zYEr3WxjGR!vUg~+3$aoX2gd!D|31$PvnWi-&Z)v4C~5Q8yVIYOwGCu z>&)$wv~}jTlx}uLux<|D#~bjWW$U^PzHc@%48B(z83x}gjSPeDN+ZMI`{PE20r-tN zBSHu{$-}|LgfPLSDCD+a6mpOhx?DcE5eezl;!1Q0NtjG5 zu@U4k9AvV|BL#>&gCGJgGM9T`Z=!`%5qPkqL&|*(DKblta@og)C&4WBQID>p!4O}# zysB>&hpdagt(bGJgYGeV@qq}S;V<}S2XbS&jML=j4N(wZ{4jRu*2O0)QfpQIDJ&-%#(z=#@f0CoQ6Dg%DLf!>8 zDj?QhMgfiz(cqW&;H2OzNPy#Qh8YC7spXE8RPLhN6z*NbgF2&`0q&jNrSm4%EknwC z#$~zP(qkzrekRN1VdM2hS#GwC0CV+gkZG9Z?v}|9M8aQ968@PYO8EcamC}_WDy82@ zAU{_W?S@h!{)ec?ovu1k_M*>DMb4ryrhtc${}LDENJgPOqIR+s2UKiGmf06eNg@Sr zs_fSMQhAgVuUFFides@5(b7xift%Wh-njA4Q2BwkD6=T*WFPlj7%BJJsSlDx2<~AN zbvrIi?qQwi9r^19gg-OcXMVchg^tK~M&yf8eAuF69mJ~9EUNnAHCR#G5i4dgv>huL zJi-b#r@GdjV5Kdr@P`hXFicpHIW)lvuScx3BUZ4G^pe>VZOK1qS)_;Is`wH2!S5F( zwfBjLg_U+HrFdsmf|VHhEUJ=T$@Av@%m(Pz{L8m!NQ$ZelmprSc*_w|ST=@56*f%S zz|gQT)e)vJ-5gWx2Bxmg6~`L%qv@k#0_d2W=iv?Em`(Sr=!z%^Cib|0&cxRW5+;d) zhQ$5S`1_CTW@4xe-_I=37se}YgRVf4)g6d~V~#6KuxhkIupyv>lo!HqFUb+VF~1x6 z?c;Y7zqj$bncphE{ruj}?;ZSZ;dg-FJNezp?;yW-@q0JF_wai!zxVMw#P2Y_+xWeo z-w}RC`Q6U%`}lo;-v{}v6@X$9W=ChMx?I91*-&l=%ydk;8_#^~feTCGvEJB7GUoeY zQkR1aozTg9LG_GBL@{tmMygN`6bPWkQ5Z-6+_R{49B!P-qUIaJzLXV?#W^P%Dpf(H z>0t_ev>UZDpd!f5q*hfyzyKHdm<52SV;>=~!eTX^1sFF$L(MGecpD5Dvs8y-1Ro2d z8n$t`DL%e2yscUAV~TD}z??vL9iRmA3f9hn46*=7rEfs3C_Rqpz1S{F-x$+-n51Af-l)gE%bXkqrI|&0Ry+5XR5Cc;B?J>Qbh?vsvi0MV5 zSxVm$)7uF5D19KNw-W17`kgVoh47Bjw}!SZ2V*wTt?f#`E2ifOeklF!n4Vi7?^OCd zF+ErxFDd=rn8rL>R{DK0-CG~;Qu-Qa@@~|hoU&T7%HeGgy!@BGWhjdvE@6%-|yjPc<;XS(S z2=CTqdw7>F?Ql?+#c-=G+rm3_*%}V$vL%?X9ENu&wGiH}%Y4|cODnAEG8b;vWf0z` zOF!JCOE2uxWj5TXOE-*lnF%8<{SXv_424OKeNwqL)w81BWnqPf>aXsY44|jF!w#XZ zy2DH{6s=TPiiV{XREi^NrD8tGaIpgCIyzP=3{k_#O4VC;q^wl^b;rw!f(M40m1=I? zv9nUmuRDTPs)cpO(TeOab-|4neU1_RHpAjzznV=o-d`q)8(>ykIj=lSIWApYK!S10uK`D zF#?5}BqlPlc!H{}&XSx6e5AjEGCT;Sg`w;bVyLC?HY#^8VsQgj3kVfN1%_p6dKYh@ zlP!iboD0R5hJ#S@2b%d0-qJkVj+W*tt!NzoL|M!DQ0QkaTj2mCiCqgdL(C72Ci(>lz$X*RSNwaYaSEQwTQcZn|;YCY-bg5g-5A;iUW zDY}$5QZ;>V0DZ(foalhs_az{f9Ec%h%+%F{BF{<7K7+$%WMAStnc0c$=MT(k>bjov zdwa{x*{<%R;f7D6?&IND%VxBO85)WHBlCY|xRrWG<}44>%$y9|G_B~tLRObxrp?Ms z!_x(K#aeI_VPb*8uA6NAUS_0N47-!tnaSw|L4SFP_} zsR*(bZOloC%pE(c|5}>WnUe(V`elfZ$Ks13W1+!ZRUXN3CJA z4mF9mG)STohGa{w6(r!4LPle=P!(CZM-ZW25ffB>n>8M7F4VfJPz*NGlT^@Cs=K8N z1J5JqRZS3VY>z}GU6~uuN$AE_Z7m;$o`}d>GLCT~o0xY1#uQ9y3fL5FZqsW_%eEBw zoFdHP^)?3Li>y8hgW+M!(r0JPI{h|jf|$yg+&=6y%LU4y;=Xip3UcK1A(bomT|PIcT{K3el>Fz zn6L83#^r7>H(wP`k{Gp{oagr{%90GH36l;;9E%0pdJqd?B=sWCJihPg4sr(^-TZ zN4=}JCAREw<^xxqUtvsQb#*~9Om-NKrXIq>GyhId*xPRgiWwxw>p)?%81od#r3|v_ zAcM3KJEdc1ZW=pKZ^Vq87RlF6!c1y$Gpx`c61J|Y!e>OBX!sZe2b6J$$Qo;=UQ_{t z&WG8L!ZQ#JmRXqBJgzFL$4B8zpb%%b#o47{T^0C)xl#>l_7*yMa%30A^+}T@Jn9QD zmI9l)G-(7)v>>4GWcNZU3t|391|g2-U_yI5U!5H?vs@LUIkH*dmb2PvWz=mvKig7) zk^%(<^3iN{MTIg}qA!dFl3`R^ZGDodgHx)#Mahzq1trg_WKPKsjs}#2!$S8IOg&!> zo_s9yD4%(m4{8?5o?~BY*;FSz_gq~5`Rap@QCRPoB3YshAupj>O9V8>WoYi#Xr6U6 z&r)*6>ta#%1kDm<6IwA!pVXO9IiQPTCdO|ABMFVZgzQ0axQs~~A68Oz8tk)n6VTEw$8 zqX8x$i9mgiY=Au`Fz=k33BBsfYS#Ut*1fy)$FlT*bvlmDh>f_ zKo~MslweOwSdi|=@iy9|ZP1zv*-Od zkU_LRH-}L3t0qTvF^O9G5SgggRJN$yfH#TSixL%FxG7QQ8cU}<<+M&j)9;s^CKxQ zGZ3{tjA@=I^Yq9D+_*oKl6jM=popoe8Zxiv1JRSr(;5gFWIcEvUS zvHh+nI*>e6!cstV_#*}OXc?Yq|b)0b+y{^C2|$sVhI>1yvT693>=o>;F|mHm4^$6fE<$Mhd;A$8K} zi`WP&p89l!@jCPPm(1sWIeP}(T}m`TZLA&Ej_w>96+TJ27Wd7n|JsQxWhx_KCqz2tR*yD5EcqXA20Tl>BY#IgpuB zVnvDhS%Dxj!zY!Zm6TSA51Uu%3Ja8&urz28F0nq%z)8cgmVnC86I!q$UDS1Xj!UT8 zJF1q-?a5T-uFzh;^19-|q+(n{`B!Kn)k>oqRoS>}1rYFzxVf9YV+;y~Aj%Ug%{&nU z&E3(g%4qvn|5s)k%WSU_X0lCTwmVA;sqiF`@(@atBGun66!)cp6NuZhh-y(jBZIpr zjwSvajfNk9n}GEUZgPbY%`JSO32q!`))&Z+HUkU1LF-mRG&8H%)S?8ZR$I(g2wy1m zP_c*mOWo=+qeyDWaZ0-||GnBDC9go%JY7Z1=&>tMo{KEFNKA8M;H}*)G?h~H*43cG zg-QuVn^G{}#2fIAK~f#JhtxGaQRli`tOX4zWTB}IHmoU*BV1tAz=5DiLdymsbb)`B z-mu&eEl}B-4^Lqz#uRA(Fh#h$m$$SP?@;kEu2()_u?y~2$+?^BW#U{1t;`ZRpCE_j z160eaj4(->(YiIurvcAbp>K4Dx8XF@fW#*PYa<{OQrwI7xEpW>EZhkyTI5b`-_Mm5 zk*N!>I$#xZAM~L*2VD_$iO`X`DRiE%LeKXMItFYkEDGO9H!#W!P9C}^Sl@Ez*mb9g z-=MMa1-}rdadja%UTEGzmM1J6GFB?Pn2-gkz)oamtcF|yLF?uv5G-8b)wno-2LMHq z9tt)=L;O$kORZRg+%IE#mJ7kP0I3x29~J>GLy_1c_To%@1K?B^SutT{d+8K}}1_fKsG zn)`|g8eph!9`zQNMJ_aU3zrKk));phpjEDC39S*@=S~<0079PW-Qjw5Zb4W%w*eh6 zvMpd&6Sk&ID@MaaDzHO9>&aL)rbbHZ+mI_zFzd{Xa22>-rgbcdh*%!0K2;?!OLfEZ zD8T$7kbF6BC=<tC1+w> zGQdYR9bgNaZ>I*2YHIbGCPgg`Kw9@_X?EzB;V>Ox$iE zF!hrg#tcM4!Xj75!dEO5%`szfpTdE$4t9; zeax)DbHl$}P`11UP__t^tG3yNNL*6y6Fm+FnKibxzSY^kC?Bi3Pgo0h9fZDIc? zc=9%SJe}ncrWnB#8G%zd+Nv!JK!RHl0o1~G%Ex#|DriJ6Mswwwbxg)2Dr@O6%@oTln2vA_@g<1kC2vaZ(+h9f1J%4ZN0+cPitk6$*N)x zhbBVu$CycYevd>aFZPBW58Ap% z{b4gMK`?C#QG`jdOHu>*1RMHek+pc)*RE1dYZzDxs5i7juTtHjQMUaM$^3=9C>je$ zh~7!20at4R7fNe0xO83tZBk!?ON%!Im-uD_T<~s$%kLbnmcs>qZ-ndbmqn`qS6mwb z$_*`T-_~Q2jUX0C5-^Hh+kB*L@D?zPC&1XTDcrXz9bceQ(5&VywTxKuF>9%C3zjvh zv6|Tt1}y{&Y1CLs+ujsnv?;BCBx0&g+s>5w2m|fl;5lKfR33lH{4Y;yoia0@;GAYHi=F4o?8J!e_H}i z(AlVHIr6Z%92syZYYWxm-t&5Oa@;BQQ>`~KJQ|mTamP1?z0{KTUuunR*Z3_R-!*+SkNDXI_UG=nkBS0r8hh z48PoNY@ED|wCqV>$Pkp}!JVuUNmZ6I%UWMr-=CSm&|@$$Jv63u4#o(=pHWOXAy0RV z9{jwj6w{C%*;t=2obBb@^{1bmk|RP1W0pK z1ZU33IAa65e4F6xbo!e{Eu?4Cta5LDf|N}2Cex2~q{)*|a(^*q5{pvC#A z%PWg2aNDP{sG?D;s$fz0^U}>oC94{dRq&=)WeG^kDp5jjJa3x9aiwTEHa~x1ea9ia z)Xrs4sxD&}o*-R!)ysQP1Dp)?&E8e)RDj2dtO@XUlu-ep7g(t*92Tcp(TmSW#E*P+65{q^C0k%zEaoa;mSM7^;3s=&=U79H`Z%x>qoz2dj5CROqC{qatC zblj84myK4+HR!DyR=~oEDm<*M=j=u#eFr9*=R;9p$X;m~X`a6<;Zo<$*SVKrnL2wZ zX0KFdF&0!Oy|b2n5}d1fHDlW^EigpMLaGl zD;juK7B$g&jcH|3&2lY54A9 z505How4o7GCCz%3MJ0`TRmoNCymP`0qQ`8iS_4>CRO?a9TNZTF&;byEJ)~QZfz>hT zyfUaENlz~!nUgvz2+s8n7i(r~V_e-#HQ3r;UZ6fKpi5k3R(?g-OA7?-&E$r%^kkL% zalU@+Uw!Q#fBjE?`j`IE5gFgSM>pduSKtKNizS@}&r^;1U@1MiL?wrcEAzZc>dOmb z0uZk##r3%e$oU1RvZI511R(;-3dGk0;j6q*skzLI7b?0k&xmk+b$$%J=ejlXMP`-i zSeJQKm^mxG>shwSKt_&?E6=h8jh+QA?L}Mo=2?gj%d#0-&q7{Umg#t9(G!|ew}4XE z@#nU`)t;}?9W*wqzv{%kia3|g7HP5CIFzn z*CYreCu$DSlU4GezGJU^?SJ_CPyE3j|61e_?T(4BxKxNGmz_hR%tGAMJaV-)CL!dh z=(k#mHa@Eq*DpdjDry3a`ohxi11j}wALYRHTp#^p@-nPI@XA6jEIWZ+R;>Dq+#{{O>)0Ix%~^>YGHLve&0zso70z> zbY0+cQ$+(c`#ubCWNQZr#NS^*8%<_~k&(_D5;4gu2+ z8~)Rms7CsY;ePZ>7rRW|hm$Dwms8%5NCI zi7L0f#VU)qZ1LqhyG=dT{L5P1-M&Oq)!0*6O& z{E2BUe*!ekCs2(PiM&u?ice(eU!Ff)oXvUU`mmwBTopDHm@=^UYR^HhpGAkE0i|NK zum9s_ic?T3cTD!Pv1)F92s3F68IDI`{0Y>uIeGk*a=T*3kvjXDmZ`o{!iq#j+`vK+ zHCWl6`I}x#d|y@w{AlmOPML*QxLV9(MR6;Csc!C7cBaD}Zee{>j)E&j^sjsgC9kkE zhda9D%QX_J%pcBpa>m^h28)52HYUh=OTL=xSmEOti$c5c_zX>ZzbqFm?oQ9hbNMU9 zbj~m+=!5~KwB+Du{xgat(T{T|^XejxVsF1#-v-9*$2i3gL8xhhXp9%nla@pFB3D@s z{FN)!I)(I>E5jejzB`1T{pI=MSn-1vi~(1Lt(vy5e5hWulx#8#f7KN&S%Laxdlrq6 z{lyoVimW|wC{6Pfas!2C7kv#65zB=~4a+4N;2T|4$13j+@1!15!@C5=Wef%L@I=-P zK2pB{w5zSjpq*_u2kjY4 zH3rSmFTb;T&YsnS_AE!tn(py&of@?Brmq@<=5D>lSVp9~^~vI$xb-wbW&GuR8#Gcr zXvUC?o}A+`PRRQaPcgtIvNs!@<@6#L%9+j1ne2k$563R~kk|C2;o&4{-oW5sDLz5z=_k zIo@359!UT~Nz!-Y@v$>MIERj_F5Xzp44?WT?oBJkjeRlJQhbo54}s_@dd8D0W>PwUx9JyQpjcR$AU4(P-KQN!x$%~duz z^CFniGe(m@r!4Q+#V;h@$N4j`$qOO z$7<~`=TbOa zW?83D;2u1i+yg1x+P@yVQzVF$kJywi&1DeXJ{JOVvlO8IgA;QRuI6Tu|U5*fU6 zZrk9Uh5$vFF%^-h1mLsL&cRUG#$9Mnp=TZd`}Ad+A}RN#%|wVY#b%~vG}HkgoDB{80djPxlJQ`6gC;;_ zG^huu+odMalC|LBHn$c~>1LxQYr&hxL|6IHZ>hkf|w4h zwVJfgt>ub)Cw7Z~x6_$o>y~a>XcjhJj*9~r>DN4*CoKyu)PU3yx5BZbf+4uH(9otl z9N0E_U(}D8X>KAk#ky)xBmzQVk`VtWMWh-$TF~^AIh)3!quikxNeE%7T5W>j}He6_ay3wU5<8hC2%=H22?1A z(O#|uC`UJxv~Khbv#Q@BBW}}i?#Z|@pIy&j+H@FtGH>9ebPhZ{+>eAczE}Wtth65L z(zfH<@xyCI-^w~3M1HiHY*Crmm;xGdAV5N-r^(jJ@%a4(BI@a(Ad5iQbV zA9)vbY}ANZTfIw02vmKAfQR*1BMz%9H7kA@+PacM8~cvsf72M;&9eIY1kMoHhUqg> z>U|@eLhqA-Vg{mx;cR@d@`x)@wH-eabb<+J!U|wkGU`jbhcB~>*xma*p&zAB?G{kX zj9878PY1B8l7Yt4*W3{vwlf>Eudn`{um9>dfALq$FNo}Eji5)GTuGwAm2iu3C0BFG zczThrWr8P3Lrt|>x%jqGZ$`NX376T~80abnzJ`be3LM#Iz@1-EI6qFeN-Iszw{8>T zTLGJCRe|ZL*2TJjO|q)M##vV7)zhrPOxPM<0@ciaEkRcDGo*8Z7K@UtV1i|gISh_< z6bb_`qx_&ub)#4dOZBW0#hLK}k%TCX9EK-(PGpsS>7XlZ81hxN_PH!nq;`I?%x9wb z{Cr9$5C)TKU~=h>fbJYSgtL-ci*XopX;k94 zyQJU?Wn_(dL86wGBRg~If!2b~ad#9Hd9D<~=Jz|CX=i z!9Z7*V%u~2R)`%cGViO{O2u`}rsag1rI3`Hk2`$_J z4SUDLogbnSP_PzJ?z~A<6adCckvAbb&=*-F$UOMI!rK*AVSeyuH8^> zmW4gZZI%Co?`H1U-YNI>22VAoQm5V4x8`sSrCBX3Y}4~mtZk$q%NEfQsl8i0IMCFp_yd|k-(G6OILIq8b;mPN?<-Yl9XD(IET zq88;K+L!AE-$_ApM%qRrIZ%OA0os9pM|x^mRDtz1l|^TmWKLNy0a_ZecWay~R$Q?g zBZ^-P3JX-#Sya)T)--EwswdZ{35E=?4PYqiS}^cL+$KMZtpp&GFUZz2vOSNO86YY} zCA+2p(R$CbBAN?c$=3R#Y@P)q&3aXeN*eVFA#o;l;*TuXwXp8Li8@VJ$+j?No1G;H>&^Zy2NQwU+hI4f)Oakij?v#Gc{ z;wzzcwgyPwO2gjNfNNm1uK2u!w8hfwo4{ds9{`$QCPv0UWG1^}Z^i1dw`slDgrzoN zrOkRfA?67yZQvjq$AYuPcUIrX*w?TUIL8wOf}PMD)|J3#fe(`XGSi290o4ofjU+pl z%TwAZaYOx#uOo$BbqX#wFV#!l9^El(={B__guB0{JSR(S#TJ5q4dayXO~z5^yIDMA ztHzPR7|uh2`FG3_lf=SBpTFNE^B!Tix?p6T`7E< zq$o=_McrGc@}X^5TO__M<-_S(|HHCQ@J-xt-s-e~twO@Wlj_;2`!V-oBHiDp#m9Oz z)6w=f>avxY87|u}SGe?Ca&WiPWde6gt{u2ztoIjdD(C8w;kJ+PCC##o*z$ErmIDMm zJh?^=ec*$ADaS!!l(2~-|Jkk{<3#)3^@JzG;X=KgAO2KML5Dl$-WCQpMQ>yDBzB3|a2h9Dx!Ca=s^{Yp z3GQVfK?)`k@V@4{0}e#76voZAJJ=Zv&RUF!SvYDIOlw8F%_|^Gh`R3*iAbg|4S!DE zlL%zUATBNmaLWaynpkMeEJiKoR%|MZwvWQmW$2Y_>=qKgqzebX<`yxme~ z-$QgqA4tDAdF!2uNZIMCspXB|Q3n#&mknc4ATc})Xgxg2VtAS(=72XxOv57$fwR(7 zrOCiVW>afpI8BUGYqO!KN+&i2)ViM<(TBC((I?4#V5u6Ic1YRerfgg_cz_U5npe^} zX{Lw+4M=$r4-r}ssUDrnE7{8#U3HP#QOhedkb)In;#v)49D5!oLmJ5G$hD9Msbu$S zUB8w}8AFI;*iYvH7UkIb{v7QnCmY3sa@%ZOzpIDn@+D=#%lKYAl8#bU%#|cpi0dRO zEA3OP`N!L4jZ$aBwyCu%@<~hsMM!hjWExA+tqIIHCuB0&&5XBAd?8>2gQiskzR8h% z_>gj8GwDD*lz%K4fCLt{ZNWFpY>R2%^p~NnUSQj?-lIhGj|1 zdbctQdH5`!Vcc~6GC{x<4p^|0Y?N86lbnQA&m=6gC~wxL60Z zbq{j%AdX>YG;ln9tKLpdHEwi@t3kL&^_<>_TeB@gBY+D?_|_wOFq}6+Rkl;ZVnIou z&6+@)#n32h2c8z!DEc6ulcP#?Lwq}@+3(Ft{OYUU>xp}O*Oj5xWm+t09$MnwLYHRB z8au2+cDRlx=Y?G&#BKI6DFusNDew~$ zwN;1NHTsaaj6!1*Ya)|b4@XQEbwG7f>o}&(FtfUiN<~vYl>>sSd91i(e<_11Cu<3m zLA4Wm%&i9VPIz|gjI1HphmVwiO^%{-;Y}xO4nmDM?xL+|Jtv2bbJ%vml*$*9~--cwHLCnk4<34S7fR{ zWprFS-kiUpU5No3Ny#Q~Nr*CBf60h2O5$q!*m!F38(A;TaUWDk_OTJ}m8D^G0MzXB zEo5nzrfXUJHBcu7fe{h++v@zKiI!#7OKRR{T-e7ZBz$kQry_Dx#vIMmHr(%e(HnKi z*w5LGYuZ!PlvG*h5|dvV{wGpzG7j)Rh)L+FZtNoj*?}xWO>#agAH~hw3XQg?xwIK1 zMu^JoOao{?t!=fnJA0-%0tMCWixn%HD4>MBZsQ1M<)913TL zHZ@Uv{d+qaOraajZ(=8t3WkDHF*p<>$10&lM*KlLfeuoZ`$I`rSA30(B!{nQ8>Kb9 z>P-jh2fd{zr<&R66TGC;CuXFDQl+W5j%I%|Ak5StEI9}| z7O|zR)(!$Y+c>FGd$7R{1XY7z2YQX|NGI=@f0)dm;92Y%D!F6MMl9H(7uxTt(^CMK zBc1%b9ric4pP_FA0f8SK0(SIS9@2hvh^5W#@Pk7vO%r)MIK^IK$H(=I z%K84(rnozM3k~Rm02=ZHCD?PelCvKPir_=r zp=6?(W2bvkF*HAVX!H**_Uc4S7K*ZFK`yuRU{EhN;s+*6$q_fF8bwnmA zLoq>dI{PhBn%G6;UdcJ@|%q^<7FI@b7m@N&|q0txwqcNcl?`)EF#b#(${v~SBC;|dWcws-j9+sIWC6P5N>MlkW+I%xW%Oi1dQ%`RFmY|i z2264{<$y#2MtFXG*(~bNGU83%YKWeOER~S)QA3JM$x=j0#F2}BlP9%ggU(E()Ch|r zrIxJvL>!2yC2OG(n-Vz@p;0nNky0ZxiWEPPDdH3^W`ThE2B>l!>OKi8wLq1Y3S9;Q zJVX}fC5jk>J8#=qY?MF~-sU7^c$=jrCM=R(d;_HvrMS4PsgyP#(wtvTSxb}_5!pc8 zv`UJItW{D(WJ6X@tE7m?8gUVkewY=AG}eLNC+O4Z(i^lUBXv_^ej_Kk9ilvcX(5L2ZL6 z`-G_DgVbTB3I~`@32M%!mO5c=E}tD_FuT)(xmh=C0Gr)NvQ=jXGptjxRgCOVH$)~9 z$Jy`Azuo|2xB{-iQVVV!Y41s|IAI>4EtO$4w(MV&~6K)c{HP(EcdeoyPb|Jh?^>oCU zs48hNx2>X89~Cy=GIpzMIAL~|+;n^VrcATAhS0PidRmlh?@C30Lpn3&R5$K<;1e|* zK6$tdIEOP#s>nC|^<%|NXS(%)i5GU97_Vv_+G=%itKz{3gL>-K^Grb06R(~}^^(Ui z#L7w9c6X5t4EU|1n?pV->}xJY+HIX@K-b&0ji`Ov&Yb4M52J2!6U#N3sq7wu;`zpf zmdjZ?5&-K^#LRemwekdClc6KqcaOJA6iEFr%d=fyj?m|9`e8NP%woT-T+x}A>N*vIu(w^9Sw|86Tg1GxS-TN$?1>LudkOqK14 zM6wb!XnX?Q?~PA(oAQSMsega=>st>OFD-DdqqmP_e@6Ri_WAN?{wnv?rCF=C2z%Td zk6F~Wr(V9Jil~Ii_gNmZ_7^zz#tLahIh3Cdd*B0cf#u+|dF`4iOb^ubtHsfrUI-6= zh8(;>w}k6h%|GA`Dp(^2;<=j(1oL4pdc%=yth-zDJxBAv9W?YIF8CZba^cJ7APw5f z-oa)2q3l-b!u}-Ywh;E#T_b0=V7DD(J_P%V!Qt#Zl>R4~b&QVy*2R@Y&!|C$r1eZ$ z^hn4)+(7iLc{rMXlBVg^_(=9C-K}QtIaGX{g0JG*m429OF6I<>DP*%+J;&NSJGGhD zK4mmv6XW1_F3i_p!~iCcB|OGePzG7Vxlr@Tqxo~WHC=q%0+>d24uQ4ryzW9^ytm>z ziW)8LngR-r_>WEUHQ0E!$5BPs`ATAHT}?fgAI;fQrEU@_h1EqG&?tXJ>2`AMYW2d7 z*uT8)%(GZX+fh&|Iie__Yb{ED#=)6=X!I4`n& z#oL%~(3(WKG0LP_Wf?um@^N}n7OYaUj=FgT4tXWEaGq&)#A#9eFLW=F1TEf532h@U zs^8{;dEQ0!yWGMF%KbfV;RfCQA-8aZZvS^~6E_sqKP6>@YR|q-3O>KM)x@SG+_;d8 zLnu|RVZpfwvVl#KyREa0+X!5+?PnVsYW;;o1N4v#VLZO;+RG9sdYXV8j^-jn4tQat z;_Jmk!hMB&91%{!k62TNwChyH1~g``wU6dsZlLii+*hw!{ldBckmNQg#a{{7D`s$} zPN-DlU?GA>5WG}0f7Ks9SSXRbB&olzcG9~LrXMWC)eaUi5^Xfc^d020J@QGr`tf$% zZ}>DjODA60j>h>}bL!Yp+OB@eZ}m;^zw5W~LG=@UyA*+g^!AYZ%aiI1X2@?Z*}rIo zow3^0&$r!*Fj79}JiDvGE>ZU^HjgatcB%CUi6;c#M(Dj}xWG0AuD`bcsc`)xzT&Iv*BAJ*hKqVALqwtxY*-O->+G)h zWZH`Orzn3(dqZP`e^<5R!C3YHu(%+-2#!JaQavupfLYTLUtTA}2t{o|D7zCICqj8K za_!5Q0TKnt~=>`ra574jm+;SL3AokSY?5+35v3RnH?blOgWrMfG7DhJ{Gf`RereP+U&|_ey z82`G;ETIbYfA`8PQJE_<)1t6`QB5f`8zvFPb<|iPHOBY$-ijJaGTwy8j$rb^)Ri;2XLOuVVk!foRLr?!p<)Nhi71v7I0K*k&8Lh#ZsPqH_Hqo?sp0%uFiAeVU z>irE=ii+iH4kG(#j_t1LVzr87It)ANMk1NcLNm$gjby5J|4n_+y|IbpdL&gEH&TTt zwJ4^#{IsUOyAqo_Y?VyOvhN+&&?~fG(`%yKz515D>3UXdzgc>Puj)QTdfnB~Sl>Op za_q)Lo-wwGTua$q`b+|Ys*i9njv9N0aRGZD-IU-d88kQXAWkZ9D{GsKA4X;q%4AEQ zxyIehuJ@w)ahP zC;Zzxh-<;?B0N12N?ycheZ~}g)CpGM=cCHMh!m4FjhalhlB-=7PUIYqQPU=64rHI- z;i@DO=grsp3U+>4GzKGaf}bWl&tOL+8TyJ7<|gXPEl#?$z3#soo8#@_=BX@D0vxG@ zN~OR>0}dfU;xw6@@(s-7{N38*oS3u}&T##+|5XFvHfe1kyJ>*OLXTpke?fDw6x*|f=i;xqzs2x8Ql;!fGRJ>eaK$m0@^B*=HBbgY zdbV{Z#k4d7z-AwdRT24O_b8zh7?ki+rGpn%b@tR$v`U9+Y^^f?99oK0Sy-Y`j8`jd zAQB_d`%&aILW(AQiHO-48fOEexlj!9NRVSZD83_IWFLz6SE_CL!kUjfw>@sfhuqG_ zTVA^{-p;JEqr(fZ!RV%VyRbfbTe(KUjT;X=dJ4SSgrwAu)-@RlSm%^HE>kr=I^&)7 z=*zT=wxSQtcw%eo8MG&*;^QC19fqEHwVkQ1cqDUl|F}K~K zlsy@AH_G780_QH8qBFGcLanY6fg@dRl8=xD_Ri=sD{@Nq!K_HhEFV3Q1bz{1DW8+^ za~KjIXi=9TH$EH=tB_+nZ^y8n!Km(x21XxDf+WLKtaBaLkur=le?_awVT1wZ2r<_s( zzCYh)=SL&BLR__`P4$k-+Sls$8zx~(!+}wv+D0yF^Fkd=+Qcwjt)lZACcTice=%HtHfFd_Ev_?Hf;gsx5{k zI3-MG2h+7gwePVFOtn^KjZlsHsFb^5G?fJo+F_g!Y<8t-B6l>W#ejVLq?=#j+pPFE zi4mp2+%iZe3Lo088;Z8c4K}mu0W@XN5F?h_)`&?Fn>FIfCYd49$!3OVSe!?qeYBda z4!(mPn`_rYdUIfb=Y(=LH7zDw?%+$*zJRGD{66oSLHPW!BpSzw2=qNkCZmp?gUn4f zi`-=#DKh8sPN^Afbu?+E)MnDp!moPBK0XtIUJdT5$--V!7WSI5u=o11(9lG^aeR=4 z@^1hgl5|d@dkyFn7e~7J(1XQ?Ub&W>QZS&7`MTzq5G9$kWV4h{?=HU0F>6b((F!vkvj~wyARaL#dl54|628^mW%whH?_3 z_E%y!FTP-*FSx?qA;23c$;^b}jpEdNh)iYz??{`fQGnDU3IyW?t?95;HZ1L6_8BB; zJ{!DU=%BfXfb%&)7Fn38@cZ`Dx?BLI*kSrB;|(8v%HqB@mzVmJn7%VPM=w9veG;FMg2 z$}Rjsu0_m;(IDYV;Gz=N+8<-flU6)wV*v=QF6JC<#Vr#ynv2XqJ zesMJ9nsU`I?mr~3KQ6Gv$#m86=&Oi2eg>bRwYLGS*T<;Vu{tV2UyVv|*F>eY3jV_E zt$dBbmQmo5#qRWEB&GHTZ%)-p8&lkrqVvtp9yRfTueqf#{;{Sk!9Z69eQhxBfpUr}lI3 zad4b;zRapxGdrEJqpxV&&fX5yNEcA=sEjr|nn3z;loxA(lD2hMYZ*z}UL89*)V`vT zs#Gy5lx^=3k|3_p^6zt;F(C#ZNb+ofU?;yzdt5SnK~~SJ+Z|Tk`^p8D1PK8hb!3rT zVjFxCd&t5{3!LC+u=vssM9Hlw;gvQVBx^%V5-S0xi=lrIYqBTzc!q_&e=ez?|oG~Mq?5^q)9%-IYVp}ek*0?Y7{^(pD z28=f@7bkgFgU`b46M7o>$A?*%G|(nxmBSgLDqmbVsLq>lCR0}3i>Ik_{|UdhW0e0E z_fR61&OpV^=g9h*>e)OIEsgN~n04(NrJ-2Ak?Ej{M@OOM8})O)N&Q$_)PyCF8$X4< z-pJj>5!Y*U$v~CTPZ5ziwPbz5+M!Re1$Me}RD!-eD>qe{2%qL-j-wJnv@m4Pp+ddm zj?*-Osrn`hZG@k?E|~F?Fdp-*jzL=~Rxi$LC2rNx$e$ovOD{7MXWZGa(llgimLCHK zYxHQ4uH4TB&GJbuFt?zvT@GXc$NuvE(Y(_Xrd%HywlVIw92m%)D8l>~#u3Xbbt}WX z4tgIO)~sfuEeSd&6Jg7{CG|8*3VG0#`oPwAWGWxlr~g3Q$J;MQa|7*3<5KpkHkSfn z#RY2T(l41dedB*&j;@qh(Q423`kk3BJ&H|o7=gFNd3n|fn`!_TB&oxZU|GBA;3>`E z+lu6Y$U{gIDM&+qf-ii-i1Vz9rzUM5oEt1q8>s6zDNPWTaAiW(aRs$RcIs6vUgcPV z8ePJZb)NkWI$YY1+UklVr43@brgcDvuwYUy`(Q?~WJAOQxp4|)-soZrn)7`R1EvyH zwS`-aG%w_O5;^9@T&$~}bGb!Sqg_l;_!L9-Ylfs5K3%Wcoig}pnre?^0*KU3Vp2Qx z88IFzZl`u0-DV6i0wG%djBOaup{7-ztF@~41gcCFYT`>3t1d?5E;WI0o2_QS?m*bp za6)nYsz(kB9MuQc?QvYhv>IArif3l6iQ*9yww_mu#w3!{Fv?JhtVE>JTI|wbpXz&R zkS(ncyv|0h+fKRF427UesGu>tjA3)&sfF+Sy<7C41R7 zk&c?MtQsg7>P`gdQDQWDo3d2TZHG(4yg}gu$?bV$#ioK%hy1;cr0i{!loBBN8j;X& zN#eY<&^Lk8cIHLy6qG>jbhsdQG(@>mOV-c&KR%pRsKr}Ss2B$H)%EHC-I)~XZyo!J==7_rsM8?qTrP64Z4nq-qAUcO)FSez^9t;mSF zdwwXl#@(_I;>fC6nnYs5#7S8U3KiJNjW)QpIlxXsusRSMrUzQ7ybBUe{irKd4G<&( z!@6Ld!^?92%AoKEDMKe7IdJBI$;@@h0SAg;o%sCDf&v;xqigS?PM&jV38|9>e9Qz+ zWf}D+nTojEU#zlXNelyy`6~{w#-UEV=oUu2BW4iq?9G?pHDg8L4in19$=*&#ekmii zZAx0cVQ47n6rMp15SKxEOYNKk5OLhIx*}Vi(be2gGS$@n@?8GC)YPIs!TP2(HDLdh zX==4Kt*OCO8)ze~vKPpQUuo#UXvB1g;Vr3Z@Fu(I-%(c!Q{TO=j{FVqQ@UE~fcu+s zI^OSurA+{sG2Nfybo}Q{I32H`rg@J~Qg zxRmu<;Bgtho9X%&C!dUwrE#sIw;^^-&j3%WdUg6usd~xBrm81+ZL0o)Swq*TdTY~l zJ#9`Y`&YI7#Fc$&9YVF-H>d19z%JEXE5)vGUJ^uiX~vjsQ1-7OfRgMoD~ng{dk(yT z^&wT?OXdoM_fl@>bE?mzem|FSLyt}JoaTbSIk{2QCumIeoRq3}U{D59>?i?Nif)j( z2s1svb@2zaagYkWj@WhPRs_O2pX4YMXqv}7OCeY`Wh$ZSYFT_CzrG-zvH`R|@-5l` zKf7A&I#brWpw5>kbPP)?eh6>G>P7@8T&}%ja}Cl0EI0Gu2l(N0WO7 zi_=e*tLMFE99R0(c$bj998I?1DIH{bQcs@OGy&JUuXTswI~%_jw|op*(rZ>@-B|iw zT=yfKLc-T?p3g^nFnf+=qdoYO)ysa|=eKUvsh>}ecYRD}Z!j;h=f}dXA3v7q6Ee&3 zOweQb=cFx{buNspAjL+ z5{v13=A0?`LeAH%xI*%ff;>~=bE3ZDC0IeBEACqMq{>ew|s`iuXqpj57G|CG@J6eCadfBag&U}{i^aJNS7ggOM z7tz_wMUKyqTko7)=G!8A{<7e^>Xmgv7R9S)QPac{_bgKfX2D9b=n&zTG4HRck}C)v zL^|F_U5T=&gjn2E7L`oSYPU+RQpptwmdjqrd~G~<7L}j@>Pl3KN(S}m?N-SZ+=R<{ z$m$~liK4_;W+pES=F60%9BC?QW!; zEGkjGF-!1W0KU7a!wiAcf|YmwP*~DwGvX|A3`yy8YX-&Lhf6j^Xr{pm)TiOv2^uNT zV5dIV^ZF>1$Yam#%mB|)P%GL}%c!hfsHc;#COs!GA$UM3e?=VTvjL6` z6$w<99%lX^6NX4=gxtH+OJoR3F~f`3b#0#%r`w2xMI1y9{FhwdJD6ENu$+_mkv@uH zi-gBeM-(s=IH4A1LbiOBX$@kFE?BZEgyPdDhUb|(Db}hh2Zm4j+=R^ndM|7Y70j=?vwSkC7A{aK9!7CAYqIva`x+1wGR5?*C)^)2CwTS!T01LGz8%73o zh$GYRN1BS?va@QHMIGCbF^xJP%mz&{&5$0tRf*`>*36*-);gvf0bw-dG7lIej}i1V*wP!m!b={3Nl0oEBd8vsVMN?q$> z-OJA8HPsLAoMfqjaV~G@vr-P`br3I6G(kMP;W7+(m^#<1brvwiZx<>{ZAl`S#EN1? zI@V42TC6lgtVtRwQN6Jgl}KW_Sc&Rj62h+4L9^bd4jT2U62ywsL9HqqZJ73?JI#8f zP=TaTuPTX}LPs1pe2X=tOxHGHmL5D=F-PwzoWNKPt&IydFFZWfaYuxDHHkX-$ZkXf z?&u<)Ysl`|J)Zm0vG(W3yX>2{-LUHmn75pyJj-+d#YRiTT38f!FZxH-h&tEYwaBd) zk+IsAKrzmvYnXgVL2aLUX4v*;+$II7u`5tErYCBwr_YZyus%^(n`2$$57w6e$}yGk zIRnXALzX2Fszwt^L>zO=r&##VDY8`uZC;j6A#D3nQLNeV%+=GQ9aZ4dLis2w*AT%i zeesvgBok4E%|xS-vbE5`=e;B(2tBx9LVCsmEIWyJ%yY*(Bj63vXHYXswD=_{YH?-a z8#J;=x>?7x^w~1u_9%Vy@tPe#9^+ka+TyH5%oSI6adO1~ zRF=V9O9``(4dz-Tf*%txR~mAv3A2P!9EjA7D5o~SEZY~07ViOz0G@&9rTy=cqgP$V zBFGR;tW7g%G*5(Thc?vBhb5%Zyrj_*yf}Z)?&0z1k}UPZuttC=*xR3ccF81$gdRGs z3zhlvS*XnKdi586tRz%sav|)5uA0JOKnH8#pef^8IN0|m5x`mOgPxh>v`F&~1nOu9 z$9Q8D?W98)eeKH@VmTo8j@d$H0BOBZ6r}YdY$6Vl%o>uHZF*lIMp|R zj~A7(>EeZ~MN8RxW9}u9l{l>#)fbfD`e80SySw@}Q5ApHjzgy0ht++qcl)9kb1T*C zh^T}Ce8JXoE}0xPI6^Vpt2dr!($;1I0W;Xy@npVWD`f2SD{{5`q%fY`sm!w(Z@DU?Q2cwvPQCF~NK=6L2`Tn9tRKq`7B%330y&5x` zYxvRAnCnBZlpwbcZY}~gR*z9g6WR+o_O$h!0zRriUr}=P*qX*c`gA8+3s5RvsLq!$ z0QkaQ`y|Pw__>pfA04T`gR=1fl=aWH7rPq)!ON_&*)LZp{#*|f{}Yl5q3mDA9IM>xBuF~J zi8X>q*3`r_a>D6(Ad($1}JL+lddU?HJsEyiR+J$9#UrG0CgC28z7zu)@jH)HLCTj zSL1iOS4we8_5|SqMwzT;R_1iCd_0BfSc+Tg=WZuSr&1gNPwUGIYh&)!RW3$uDl>$+ z)%mhPBNhWT(zrtNoKW0Lq@r{WqdrlH(k%I4uj7P%=2?l<=miZLRV=KJw|GB9xt_`B z%-A%R)5=>Uk&8Df0&b8iGz`EI&In$FY8sdb!xT?{w=nd>uHg^chQLuK($Ts|*K^Vj z;p?OOFu^iI;1Sup!ts0hoLmnL~2}Tyi4cWGsm?{GeI^) zViDGia==~3VkyMq{eU}somGnPwdb$>hqdC|g>j8-&oq8MLw zvddqMt4=KSOs=K7FREp($VrvFA3fF?^VJh}t4k!PrVvZ{fDGxAz*#sFJXXsh%lr9a8E zcVc!XjE(*@X%89BC3d*%>@n}@g$7rwg`uZd0^-%c3yh#KJOd-EFA2~$5Lu$UO@)@# zg)h4m{Zgwbtlw>(-V(EQNmWDuf^-jD9`51b_1Wr-J{#whNp-WeA?jJwxD_|Butqwy zy$Tf}a%`!J)1bWS+Qs)QUR|tfgFs^?_Uc)MLd8QORo>lRx8Yg5yQBV|cZ`6lmumI` z@7~X=!QR}7YwFNh4lgc+9nBo@J^8AbRdD~|BCvWqebHqrUzkb#!^5ziTDf5Tn{?}q zdNb+78^AtW!@RYIRT1Sz+rWrG*p%|#Ji$%qZ00&jv1V#C1!n&iS^wFHRhspv@)c5( zTJ@}RJ-A!rlX}|u4aOK|OFgtNDbY7A(m)wqAx3KHaa1ctF z*qjk3^WIj3tC%gvmjPVq{mXIfoBX2Mm67v%$9FKWe}Xq8I|-M3ppxk zX3m_Ce6I?Cr*uLRJ1w$d*4d6e{=l04Er!o2#NNQ#4(S!SMBr|tF3Dw=*>PcML6 z;rPna%;lLYZ0J%wFk)!2MN-Ej8?EjKkF3#4G^nMwi7F>}PdSVeC521Rf!syo-^8}% zz)IOB3=Bopq0(+roCW z_+owT*}CgJ^rih>!~$_(9l8ijyds8#9lomc1sMWJOQKcpNV1xKBi@sSc@zZu^`Ou=)Eit{83S3rjikhI^k zZCiYm*iYS0FRBt=gtQtjAh~d@HPjPHm0l1WR9{b6(rtXW|DV0L0kZ74?)&b&@6E@~ zdvE4pclL93cJF(;1ZQc$yR^YwXqO`AZUG=55GJL-4nsN4+C;_hE-V2o$Yx@a7>f`M zyI9gnq9}-_$tf9CKvH0`P7n!YG0~_BmJo}P;1bJRD=2%ag4n2trJxeTf+Z%*?|)8r z-+SN8Vt4UDiB%%F)9?1}d;0Y0b55T=eY%_5VZW}P+=^>0@v%KM%$VctX|~Y65~8t; zLnc4wY+*OpGBiJa1H|Fy^Ga;GCTqWYHt#*vD|(IXL@yBe`I-fvW(fPrLi~2 zKx3qP@v>crj@NNEZXcHJE7+|P8$aYAzawH=XeI0^4h!m5g-)`xb@6N8pN*>W=@ zE}t_N^{X$zQ5(ix1hUZ&G-f*Ojr1&VX21!ihi8Eo14qn~zjhOk>zcr>Thjraz-rAD zuyxdf2Q34(UPJRNz#=S7uxlMc#(>JK#Xtw3^=cU5hoOAEHNj$?iSjpmtV8)ee93;P zP`+MeL(C`ZH0pU%M8iO#a)8QHUo$tmq{iY8d&bg}*)N6Xe;QJDWApxW#<4J#{%Xe} ziFmlwk>jPWNLb0_G~~;O93Dtn(n!ypp)Nh^{rPWy`JHg(EIv3~V5 zq&JI+tvnhF)jvFQz*JwOh-Gg1 zDaV{7WTy-Vhc6+1!;YH?C=QqWRAwt&a)u8;xq^ly$`#d@sL9$5F3{x_c9ZJ)^HZcy z?o~a@&UjoIqTEG(@RKT`qB5UoK;WlS?(uoXxH`Hwj&Z{u7~T!BA=H}bDvs%~^kn|o z@Ju)%?>YL!($m>bhV-W}GMx+8nEOe;AdS*d77q7VKIWouu?5-cxPGbO%pg=1+12SsDC6Qe9;3RB}4oj->Kf$sm|t)k+AD4l2+)3=SwZ+s0oQV{HDILQj$@l zFn_7%C!npl5xA9;79YbAz=1kV){tvI(zd2-{KcWZlT>w@Hk%T9REC04RPEwSWnt*_ zEd5FK&+3i1L3!fZNKIctvdyiswI4q+WS@Z!1FJ6i&o?AhfB^rCk_OVB4(ZQ?^k+k= z{o{K7b0PggNPj-0tj*f{UkK?JL;4Rx%5tr}|3@MHa!9|TR07RfzqJ!H!30{-Gm$)I zjX@cJ?HlyjCuT!wzl=K`=HSNB}Q^HMcd=@G_ zqkj9AffoZd5P2zOHV}C+WwsG{98lj7L0M%GVNLZg;Xrq)^Til{lk~FL?NW-bh3SCV z++?Q=FM>QDDEsfh;y+t{R$}}f`cxAVuAv&uFdE~PU^BHQ>l`cgzz8FM)a$JBB5YB% zH;eAbf@vQwyrk(GF#~jXhR9T^$&zLCy@)j3K`m^HZ$rXG_L#T;!w$$9|$-62|BPQJ+rc> zqioVM4l*5blb+!(owJdikzuPA;R>nb_SY?;o}@O@_A%odHQfr@o;-qV;ew@4s!kjH~@w3;aQraPOQ;iru?*u91q z|1KER3<@26<7eXF>6QaEyE*GBk!IFQF21&e@4RUamOScO==FZ3eY}sj9TsMnZOK)D z3&m=+1Mc#biVE#_R4>%8wmiE+V%?+#PS#?{_B(pIbfF-uq?PZXDRfTV1 z36*%cImx(p_qPzaBXT(G>$K4)DPRlsBRPAWiM_Q$IN z@+6|DfP6v)NT;Uvr~oPB^ei@*Pyu!~VM7IoV^eulfE~TnQUQnnDypRdbSob@Z53d% zXQ=>RDVe1+lXoDh0Q49t;74OWO9e1$Hl_U!i+m>OeMVv}$Kj}j%j8Jr>{4T4DnY0< zRpPujsU8*{%5E55b({%PF{x+ijru>sr($^0ag{TCo!_yfL3?QoqCluvODd!~>|R|~ z7xLkwx!!5T5r}H?h_M9GFpL&RILp*9(jC|!qx&hP-ODM~-o*JFstE&uhVbShgV2>H4L-%s_+>}&& zI?GAyR!eDhTbHqO8oY5Vns_rs|5}P93~8&f%qM2WzefJnEP;f*djV!&iNX} zdQORADDCM#_a}~@RptXq6hmprk5*5u;6OdBMST?QVV(AZ5Ce}G$|KUZhjBSsmOtsu zIlZ|=T_x$d>QoVZEfYTT`S}M1OJo36O|czS5UL}1$_vUw#7lWpD+Lnsa3<@m+5%Yr zZup4K&|PBz^#g;0=>_y^zF1b7M|0WGBYsN?HjFT5^5>jD`LBoPe;(4WTY5VCt&sk9 zUVZ(T(PhJ&QI53HMF#@}!US3+!cdJ~fw2g4DW`*-ppy zSxJI1I5RlFgr@}Z0m?0-59~Az06{zz>-kSBx}=9vBo}2rEwJV2kdhVVOHPZ8RR1}P zUM7E~xF4wO`UM5hR=m9ovBT9rVDWf?l$EDZpY$h5#dAMJI!Ahube8m|Ne84qL%M_X zXGzt|tZt1&q@N?bf%FTcJ4t_@bQkI4q>H4#K)Rdsi==x<{~_sKQl`nHeWd@0bU*2r zNe_^Ig>)4-MGJ3K9Bz<(X6J0XX z8~&H-7MB+&C9x={?imot-lK!*%w>flaA77<2!1x33f*`6;0OA5si!Xk5$z@QWV2xn z5oj;Q0I8zR<(%KX#wS5TKH?!&(n!2E;Vzd?;sk)kg7{WwCs_Nf&`%Phw@Eh~k^&H^ z(974Q6ikChrJ!+Oi&A(wAJKh>b<|U-3aW1?MrqZ4YGQv*viE@j@8UQj<;(WBI8F&_ zP`~5lR&G$h<3lmmRd8WQNfrE^!3V0R(Tl@RjE-Q>;FKSgNA4ZmLgoDU)Ts_7B@`-) zU;i*={(fE_VJ~sx#ZRfk24g@}VF6FZ$T&>cu;X~*1+m-DC@HBdON&@dYZHi>iK>3;N+ z5&9fmujet)50Q!0dl;W#&%V4L-d>POJA{3&V)tn%x=ua9{x2yXDt;@CoKX+l4hgq; z;l`n`$X)eBEg+xE$D^~4{NP}*9EGDi{t~}y!C}zaPH<3_Y9iPga~WfWZ6V^Z%D08s zPmV;DQK#IrCnOOk?Fo5ydmArsBhnr%nsw9nwep%Y^=NM}_9jkdF-`ii7*QZJSWA4j zQ(lME5w-O&D9dv*G`<9-`|F4j~YU%0h z--q-MLi$=r|3gUsFr7MH>5uv($9qS(UAT`NIx6W zzsCXv zUp}Fd;XqrNB*Y~Ndu~m4j27+L4huget$q`xMKJK+gid%1q#+LFHk%4#`G$3|pS!s# z9`e!r%~?)CvYU3(hH>7cu&=9jtQTQXsYrYBG7|eKKa89#zy>?m20g8Gn;H-c+t;MV z;+ovRiYUoDmKaWnn5t&)8ZYzPhRbCXW35CUquxmf9QO%?WkgC4mT_qCPY@U=BqI)i zx`4BW0m4kdM#8$ z|;|qeGolzGfe8`3Cpfn+M55o!#;XqSp4Z)_G4JU8^L88s*}F$?{8 z?H&s1j+2cwiClEusLz!#>AF$gr0Yg`!3@-BB6m)3-Kmf1#ut746iHeyCbBj=J_{n;L;?obND9lat?;}g& zi8+debT|HPLcg!)VIgo*1UdgJY+x?E>2GlL{ifme5f6JDx7R=^01r95i?54d$uGhi9vN0t*ydkLjkc~SpWQ#G`l=X7p z3BHn2Y4|7JVRqnLa3Mi>c9r1Vez=<5;!tvylWmCG$b5YZZZogob(4!}rMQe9M+x1C zcuJaKE!+=t{Oa&)**20a6EcCY8;dfwur8<%*UY&{51X@O;Y0GR_fR0_EMX%G@+_ap zA@iBwW=E8*DM0u%719cSc5ALAxGO`o7(CiOEBDgU=p8+SGCI^GHZ{I%r#ZZ%yz!Hx z8!?IHma)wtYDup=`Xp|x@ss$txJ80m%JUacKs=m?4+}h8rY?WQS*3_yd?FTtqYTj5 zGy>%$eGPFAk;_DD*;Sn)(a==qrDi?fR0`nSu_V3cZtAaaNG3iww@ebh74?3XvafcpYp~Cp(zQJn0 z>TyG8sk1hn6Omje0WutU(HI)xRoBt9Exa4XA#jLaz`L-@Oj){qV??GiwL0k`&zY7g zqX}yd$c6du^&r-NnbSQun4wy{o8~N5`8`mWh(^@@)mz4G|!WzoIYjC`b~!;*B1KF0kwDM`B#&|Q&3=Mn zCGs2Ag{%ZDjt(Lx2hH;2!oCo(rFA=eF{;%6lLnK#sOPjt0M*9{50@TMhD*-=at?hW zox|!aT1VIV&~sR%Dl)oPvtJ>!T#k_bdB`tq!}%%A&t$r`KKtnQpGoCnJeEBKn*>F0 zLQfZ}{BMoT!L`r8My!Kn3E$#GGcFS{E5jQ_8k?1y7UPX$xFDsmfT?PATri?oAl!Vl z0}Iw`d^fwWjV4TTdPc=Q>l1u<@UFq1hhuoUpi`1u+Z;4)gAA{jAWvu;Mglk)LYYc5 zUy{k3Sh|&KVkh2?xq{Z#Hq0O5OH(ZX!oY520fo!#VwQwsLfZ_i*Blx6R|;T91FW)u zaYGHZ);7xt@B;gsy+yO>6tV5JO|!C~ZJLz@ZL>{fXdBrRD-5|&+ssF8vs})FQCWJ^ zwGERKj?(7~v<;uhH>$7U(q(Cz1roFk^fO~Y^AlqSS#+jtmg%F^x@Ed1HE6gDgs)G_ zkCsmwtQOj1YH6QGb{{Q|DGmRov6pzT3<+f zfrZH8zW{qoyJCEO zZ|0<)m@b+(G&DaicU(XY=GZ=1>rj!<<5gcw14A8OzN z$|ab=U!4zt@P-nh%25Je?%OuuT9m9}IGl*EnB;?Y-mqCD>b?w}J{>q8wZ< zjKuz|Fe@9b65f5?3j;Df-kMi%E!T!*nyuZ7Sd4slh7=APo~HO(ZU+@S{{5}<3Nqfjc&lZ->dCXG?CAwh zUO83WWR-l$-#+8X=ij43ASVNnxLabWXjnJ|M?S$#h1WesODuBN7NrO;v?iKC5!_Et z6V|Kt+UOPIclAAR?Gog})wij^0vEl|=T6$j<~3_Z_)yz<9D$AZ1$cBpSQ_vZvFCYV zzJD;a#XeI}js;K{4;qVpsX-3kF4FU+Qj;B#bGQ<~bG)ZjtjtxLJl?OAfrZb>g&sUx zJ01)#_}X7sv9G`1TC(~6>Sm+x#f{9nW+SWK-Hs;z`mN@TQLn!gN+AtQb=rf|WK5bVbm+Ks;miAOdkoQ(ez{G3H$kd3z)#dnG1{$r=@kHRF@gqDMq;?0p?( zsu%<@p|Tk6F_c?b4EG8<@xeI0VW87wtfQV3E8El|o@we?fD-g**{GCRAIV0ktq-<; z`3jFl);WEW$--x3HIVjz&M;F(55eZ(r_DThr86mE9Z8lW8sDIV0!tn1l=5=fs+kwF zz-K7pUK)P9Y>ophKMNXVzbi|KP~3?RdFGE@`!XV5twYqbOvv`z*cm8M%*WtIv<`xn zaiz*S+q;9jEums-QY&xFm)eT<0-M^2%5>mu2<7OAp9$qS#MNocjSv9g&QO46QJlEA zla@sNl2OW+%Jtp-V>~u=ag0dFTM-E!C|*Y-Py;L>NRht;!3HeTf;OfFPFpF?>5Yv? zRCJ##0n^~5w>f63c!CnbWq2LF5z5;}Bbe#Hnt||E3)XV^FBORZTI$f`^i=nUJU>>z z$`O{}<&y7HED`c70LkH*3smru3slrljgMN5#8Xr$AVC}yKqT)dB}0(HMrPmLiAFTa zuR7*;Do6pFtr4Wa*$#IWAxOaj0RVCvQ#9*Ak>jj8sl5a6`#V4p*+MjWERP6%A*WrR zH4T*!3rp6l_#r$?Ui^@XvjS=)mkv}Y%Iif7s0>5ZRRadFAQY!Z@m9Em=~r2NiFS;!f*PDT*EL1Y%|@Q!v@tl#k}~`=8E*(yqGcS_<6Ba)c#T> za%ri1gC8D0+JftRh%ER17z>mh7FTUlcRc72FO~xmrCFU)GNBFD(y{(Nl4=mFUw*zMpCIw*B42} ze8nQEHd~QY|F#uL^-_qWB48_8Xtm-Z8VmVQ#bO6=_b0WVnF$Y(YD7{Y8K%2PrB!)( z&UBY~MQCBI+Vs&Cbr-HDlRM$ApRd1O6Una8n@+#tvW=HZs!Mwj!9g98RF_3lQK439 zz+W@@Ani5}@zN8TOIioY2+#WwIUh3|@B7DWFCfguHJ8mD2_3n=SamUMhgU&yAeHBb zN4)h?XEtDIUG}QW;9ziVdIpQl5q_)mjAlwLJ+tgqrbTH<=g?dla#V_kv~)?4z#}Pd z()3s%%9WLsFrJG?uX{YdY;qCD^M7q}5y$fvgIv5_94-h$*Z0JDE~(hK z(s+(kXxd{zhg#i|7P&J@h1f@Jy$z3p#blbQ5P!dgW37}mAm1t(a67}#^d_{zMpztH zc=hC`VWy!o&Kq*zl5b|18APs9d^T&tBzCnFq;x`Wsbp`I5+8Z$<#qtNVr4-8`+0NK zorQ(~L1Pu?d@$PQHl=f*6UA+jo)5f2ucp0F-+-otdQCu!>O1*EG}ShthMk&p5n7nG zR$}doc7blBbGN+pTyRoO^sb5kpCiHXRBTHVJYD zi*{uSHh-uGd{9`LDikF(94n5V0&#km@lZ}KTBPk>*;(z6RGW*q?==}y|3jWnKN6eH zemJ&XcO9Mh7br%xxHWd)1KJVARROjccBD;Y#Q#1pwk@;W(G=ZSonSt|c2BmLjjUUB zmjIjQU=$k6A^1zfqa!x#a!jBO_rpC^<($C`!hQ#>YP3dxvi4kq6Z`A^^g6he|6f1a z-G{e98%JytZB1j|R3u2Rj^3B)g(kr_ zjiKL82ETsHH;U~r=g83(=4(@LH>>>8b<=!$JJIC2$R@?t-gXxMo|VmilII*RvKj`F zsI5CJX_SSQi1M<~(Kxww@!Ao`4`ZS6{GlazjP4v1;Y-_1%@C*~h4V5H-yE%?Jy*fl z>X?3-CZ|Z5n(k$a-Zjy)uuFBOEn+qw6dJysEOWJj0kh*!eb>6RVoG$zcQEd%DO014Od#Rkp()eh zr*@lD&d9;ANjaLrkk3*jd&^T(MD`Z3U$w(t>rwN~H;sUf>ueh1)OVw4zsGt&^W-@e z^SDoq#XH$&7jvk`9(qm^QNn(1C2a2JHQP)p5!4P{%Q@ZJw)M}3jrl47kySdS1}m%PmFxcnz~bTR;#gLxmQJRsX{w3U&(CCer_(K_Fwj#|WJbz} zipY0sJ(i9##v~(1x*l^HpN*J=qDVvEzn8uu9YR2oL;dV z)bbXvF9_D`8-$q+@yN{`1MY~EoGg$q3=+H1788O`168g;O!mZj;Nzk{)R)gPYtDyz z6%z7nu4&aGVFrU^#n*D31NixzCuVSnv%IQw~RupO*qKTGdY{5AYktZhj0rPB_dzd5sG2mB4o zB=k%5WFB_`iZ8RTa4^Xy$mRfc0?c&GQ~C&27C01JD+|xH19Z=|kwHa)j~RxNk>)c& zKp}*prfn==_&<0ie^@P9DL!!$DWQz^wVEN@iB+lG!)Njbc!{?KG@6)^Lv0|YMIY5B z344~7loZz?+6Ciigj9Wl3>It>Xv?rx0H@Iil?x+;H$fTJ1j@Br@W7e;es4i}vbY!S z6J^;n5ZZ#>ilj|&cHR5eAVJeng5bZRr`V>z+G!+f@zXV^0k|Tlfe>NQMpzdiSpP=? z2J-RQ@%(shsVulh5q>qNQz2)0wzA+H9s2Y-T>k=?!l_B(0?&UK3cc4@wiY~|WgAZN z`+FoPG(4btga-3DfxuG|`k{0$R)S-^n3!|jHXoy9UZF`Zt#Zkho^FgmIARj)H z-|GVM-XP-0P+P)HM}Z1vOF}|wt3_L7KwD18ilns9plu?ysCMs}9MKmeJ?o=uQfM6D z9igjWX{sk`O701WFD;9j*f!H7vJQa#1h(^RC`XKD_$5gYt0hWx%ejD~#6hpxBte@6 z99`?-D~**0%E{%qEWq&8@_QlDrzkciHV$W&^~Deyg8q0NEtd^X9rp<=~9d(992BF1CIy8A8 zU$q%)F87?994W#v&K3rZR&e*BvMwpcImM}&ogl3c`%$)`chEEG{tlNSAKp@< zgN7OCXy8^R{K?u!%nC?^p8gsrnt~VhE-f~+GWpZs7Xly#NRu>440jWAbr?B2ngp(W z`XMYt2$Rb?WM;_xK8qb|j3>-MR->K4O;Cf9kkMil#1{fj?7v|mM&n~zz}xY#CZj1& zVaTE6M##VpoiY?k-R?3>iIWGC^(imP+un-gbwgkef#)m%u8A!(}K=GXI7;TiGmu` zSGZ{DW>CGLc~`ghgXZnCFi3Y5fRJgCu}>DOju;kq9bIHxuRt-V-fANKm{v>k=MuHEB&=;p8Ob{s$2UpI`dN*r|lNZ+nIE7 z4(G>6>CcW1J zSKS#wr|?1=*~11v(c4zXIltI?Ym&mEw(w3A#&wCmayz6&mqZnHT0(lClb5SB5hx?- zLE*`>j#buTx)sIfgtE9dwROQ{2ET>zN9v!@E8QV6@X%3zZq+fgU4_YT^B;890n$zq zG@HFQS)N7o#51t*Mi7&;*u63V-2+&x7~S2*w}nT*pTso0SEVQrxmsr z&sBo(RmCL3bMSV9sHRntd`gpW%N&iM=Bp?ITLg)UAh0|_WD1S08~zRT^6E%;wxJbJ z4w6srPv#Mn(6QpilJ-uT!+KPFN$82DKVk@Geyl10bxIZA3h#68Jha3NVb^*5WsU%bek2YF`R0vZ;QnO-|$u6Qr3}`ybKa}L5DZ}byhO^E}X5sDA3aIZ? z%kliZX_>4Y4k?yL0|hv(*+!?@T|YB4bvUj#y~phBRD=4N@w3Ch#pyjtku}WlEDN*U ztk-4XAZk9UUl$9%aZ%H_iRaC+lrexZFp5jjV*+T7u|rb>1&&!15?YYUMOQJxXDeJK zGQ$7GKgf#%k4&YYv2`vAThfxF8=)0Hw8qGaN~QC)=@MJ1#ciZx#2M&QkQF6#Iuhr% zzSueMF5{)@8}-lUxLR*EzR>&UI+P_Bs^cPN>^pq-czS7E*m#enLmmff+t{HcdbxOP z2-7rRsk+Pr%X}nX(juO4hQ3s{!V9ffbU)d z4O~B6ueMma2c#F*bm906ms{li0S`gzW~mwoob2ag0(LcEJPt4tS8Gl?5QX z_Q70YUWyiZCCOD{7+=Q0y-}zlE=Qn+mxUTrC{=_LFG5x0Hi|R(<7)i+lvUcqLs?V` z9`JzZB+LQEDb`bbu|~6HibZhMrh%y8TLyd*XWUDcVK@tP8|TNtc@2UH=XH8$Q|m3$ zju@RXd+X63cZwiXC}*qMZ1zzzx=2fiG!g@`*#0mnBKPz)kF;62wpB32gm zoC~>*uyTdu<`g=jp6zLXx6a!_=ExsduZdJ*8R|oLq$@;PD@A2HaD#=c;A9o=K|^IW zIcBaw`M@!azBMMI1~Zx49J8bD&EqikHmveBR^q8l0IYw8ExEr{N$yImRdG8b30 zndE7erlBKFgAO6A@i|uzs`H$&4Bqoj3XlO%4hp(q}wH0rHmAi)sz#&iptb>{Bz?9zBTsyCQtszlo+1;@3} zrr>6cH@WGmGb$k|dZq>i7%opR7~yleWz)NA8iO5`{8~rulO5(; zvtW=jppHZ53`Ya(d$`*7V~Q79V>BmTgnPHAs;RpN3?=2%{B%}Kb-L4-?(Mc~iV-i4 zkne}VZ0f?;_Al#t79w8EX#w@7s}6HhLxPk1in|A=_>^hZ9+Kh%gMCakrdWFxs{PYf zsHPr;aH`ut$Gm}R;6R%aQO);x6-rzEjdHT#jQ(agvx_ba-}dvvhcyH0 zpSpf*jD5fcohho18K*T?6MIq&rsOKxmWr>_yaC+$xY z#d7H2vUgMvA@MtrFV_Cf-Q$@izl$pHJJKdn!uw%j$Ptb2_Q8*n^L?n?cRm^rQkHSe z+26Hn2-6Idq0(eS>KnYL=VsZYu83F4b6;68fS!DT6p$B8{H$4>&;TjhWI^3VjH`;d{laDS6W=5w1Zr% zmAGXAYj;|D^HQkHJ%ASu{M=jX9a={_}`M6U2*vQcwf1g6zV!^cS$RZyHy$EDHUK>u|Bf=^E2K9 z?eFk`4+3C*#!Ef?9qn5P@Ax?kOHl@Yeab8@#5&~8Yw5up-Gq=dOG@RgPjNm3-S~^< z@-)3I1+Q*AMgzV3{_&K$bA^V|jdSI`(878(RTa}H>!!MQ>Q1TqVo!Nh%2%&iH<#W4 zMm48Dm(sc&$*^2gS%xKpiP1ROZY;-b6jjDi8GlCRlkCFgU=S4IgeZsMq@}57w`t_r zhglB74wH-XT3`iHHCRzCNV(Q(0p)r#Y60cCiv;Dm2w*Y)o08zB+AyV2s|@`@VIYuE zfH6C-EWpsLCBWj-Aiz=AY!zS`GFKPidObA>FzcyFZY0yD43dFhGL6*k3OMj{@u~vs zE3jJx7=djGFb?9T0Pk*Sk|4l)T$5Z$fW=%YDOrxe;C@dS9x4 zin&@tH%i-B4g!=|15;u8@9uutcOV{6Wl|gMC4Ce|P?%wh%GUrGRJ^PH!+J*b%Y>Im zGIED{n=%E{OWOkArajn^>lR zG%_YNl-OUKCKCfAKi`H6rj5({oa$=#!V%*%KVc%{Q{s9>3&utZiWsz@%M2;l%i_~` zF`P_$aV!q^y9U@2W-jZHS6ci7m9{@*;y!!luHnp^~1YO7S3 zF(ua)EM4=sGHhlZ5k?hABGy>SA%d)95oG3(n(4{U>#R<-5)eL@|{yW#w%8AWV@O?N12BbxLc4c*f~!BsZHe==cUbn|hT?pE7CdS4oeXUaVR z^lUPaWe*BYn+WpKHvNY2heA&2Qn-S|} zsYOkqWvd7CD2-cs^?xFgHoti%LRjSk#tUyTOr_D#Atw}Mkt1(F4bWO|kT(%b^|V>- zWoIPo?TzS546KV)lYj)_>ZagVSHQAEnxZANwmbml62#LFvp&$ zUpM4P4TFO{_zwMF+Y3pSAxD4{8t3DWJKq_FStaium9aL}>$CU6ZIA1pg0TXJ#O;tJ zHn%jMjh;&KW*eS1n!+&>SvhCpdNf+_hiq%Km>&h>zBLWg_$Q*FaHJ(gfvwZ9IF)>T zKT30|BQ!;dmMF%84?Yfi%k zNg+nNk^_>=bqjlrereR=dM)oYHqOx1VR>BrJ@2N4~20u#OJA0BVr0$D-DX{s9 zl#hOtINP&=GPRq2lsN1}&5%YPYgw9x9nxl;H!2$q2V>KVZxbrTR%Owr8NJZzu3*r^ z?pKx#WV`BdK=lWZoHaofMsw|>?rpJ>f>$PMmFl+sXL|ai`}?2!V1=vC?91b+CJOLMy(3N z7~JrDm><{2;QflMv*{ZC0PbaF2E&x7U>BrabZ?-2ZX^%J*=%%}x3;>2JL8UlP7o^C zTgM5q3`J}lHIf4mEvr#VS5rDKW0=S8pnWbmKwl}Im>SQWEMBysPM>IL$1FVjB5UL- zZZ<81%?$6;H*4L|Y_S?p{W<8E6;RbaX^^xJv?^)R{fCLCktX9i8vS!1)=nTk*eY>%;wWt+_^Ucy%D zd?CVB#0<+G`o+xcE;eKu?9sH*+iGpXy~09@shnEj=oeEwMAl}rtg_K}#ap82w)kON zi#J9bYF1TO@mySOG3CuGx;Ra6t!8#bJ#l(_72Q=9Q?6gpX#@z0E)LsiG38AtIvgoM zsa;LcnFH!-iViG;r|s&BF80o!07bW`n9eJDjka+77CDPr+@=*0hv+U$L`w zR1!nGedX_2q6)+hgAz7QvjgjjZa-mfwou@;DZ93ZPO$TO48m zRGMJb+`#}z1fNLODm>#?nz4@GwPVRWXy4Um*#YfvUm7^QBkX!;lTr= z1g9A-<<|SJ)6c?MeQrKx)aq|2k2UJwRLWfIcfM)?QGe!elRV+*td|p9d$gHO5r5_pn9^}3Zx7!Y z;Gh5iNK+#Syfbau&E`fV_0Et!$+$uTF8AzlbXQ1tj&cv0syrz zXUB6|fDi}s2X;hR89QQK*`$MIJ#Ar#^W64;>$3!jtt#KD%VMjZ!`s}{Wn0>WF57N^ zMl9Vua2W%d5sBsghepN%J~C0UYsW~VplZlhuQo;{S2iKv7cs2!y~jg-y8$mXMkI|E z8-*`2s`m*1e@jPPTfGdU?dvZE2;oM%)J!@(j;W27U6rk`G}`V;j&E-wY*xFrJ&PK5 z)NE#^2gI2G+(PB*sMq0rA~2Wy`AeA0?JNO zbGG)Jl$bZvrPdCfaQ20yR}!pfBuKDKd%GAk-Mp^75v_*EOxJn{3bGk@>gu9I*67yWg~G(i}IM?49;LM5;E~J6SG~y<2OC z&fev+PGvg$=!pB>@Kvw^d+138u~FII+y2a zW55!lKMRk`Tn*^^l9Wjo`4=9u;zW|elz_31j|$?sI&CfzM{LVQeKjX z*(hY4p``>O6#X_V?;qeY-4iRevgr`@plZgy6F!K>iyiWDs$;#Uj>RyYie;>)@d4Gf zB*qC)K$cHANS@BEBZ$yOgxneTKq{dm?g8P*JvAEk2D~*T74UQ$Y2rAc9yqR1DIDiG zd#h-7JUPW13dl~QAu45jIUU;;F}GQTSON49u=v`BD}b=ezLjO_C=p0NaNBfXV1g4v z!H(ZDL--YE6U2{Il0_RabzE)e!qs@;L>>21S>M^u3EfDM?YTOdj&D>m8dswN;cDCA zBCaMZ^?-a8^F({mjHAKiy$N6|Z-X$-ej`WFoBjndY zVk0_xWulqzZH%Z#ZKT%_%933N!!Ax2n3hR7xs0|1(^@1{8!bwj#4Go^(yXm|V{P)r zrM4>H6isYi>y5QaUo={!FH8@`2Bt5bn1TpgIYk>J%5J#iajvJ3y>&LU*(lbjrhOD+ z|FOw?j0|-bU6gnH#4W?;un#~!iiIFk4LE2z#xRAPR!{L{Yd`kHxaFF_o?Kf8Wnejo zQ|O=k+R#MOEe$l#U6D%E2fg$zXBnd#lZ25C&_X>pR>Fk<1xYYby$8P>c1uJx`uiMlN; z@K?z>sC(Czs$b#fes|6P20st@&u{WGP1CC1;mI0qU;H*tOVy*D^TNw=ep5LXjcSi! zBvlW8rduy5xvgm3`}gYX(u09r3sgVRJ#VqWn%>kiCEIuJHnv4XW1vyDcIC_X*Uw-a zlfj@@J(oF+KX2oBqaiv}tr01ggpN z3bq!MFoTSA{FT^5T5$RVA2)pe&v`}yukSaRS>EZOG|9Y;*%?;8!!t-sMTAAh2`j^Q z>h>R=?5s0(>TVFhBq@~}gtm98_uoD4g?RkA5<@U}-`IC7*Mv<1?N+41n(vT-i}oqh z_xx1@V$LQtS$@ia%;b=ta_ACrME>}d2+M4Wu8KJhrwQ5XYQkCHQWrc89P%9weh0So z3O{x$8x9w*284#t=Ty{SU+O<5ez?=;@wppN7DZN{Rp7o3HxX@IQhL=Xx`GnAPWjSdOnuFiNM zCvCK4j%)|{44(%y$IdFQ6N|i?agvG(`6&%{lAuk-GL6ssrDE+&L7RAGI=aRC-f_w7 z9zVm#DI?muY@!rrbQ)vlu6TVwP?ltAtc68&#l*CxMjQgq0?Bl_AHNZfP0yPu_ltq8 zcwTaMMY$h!OqTAJ;uUA6*axWf0|vy8>F^IY4vMp=*_h%V@Y6rwh$^{<_9GuUa!?gw z)ap1kJ=y_QQpW3w?dkTu&?|N}k0In1hh6EQ6uU!@7%T2d*ByGOu3fsv1GTkFJHXJK zyG-k3b}cThPQB4~n=y`ac5;z%L~0wAh9KXZec_0QHX&*m+Ubbad|5oO3nmTNCD@Pg zh($4nqQ2Q>Ck~T~Yu=vqlG`D8xFm#l`h2c%tY`E@`mkW0EFR=b;Bl8`CmVjhianE$ zSp3zM*Qj;_YYrA==}34^_uaaX!XTcsaHCPfP! zQ%ZU!6OHuzh4B2vkbcS1)7h6p`V~Y5i8cChbr~%_mO-~g&6svUgVKK~o3`>`Z4Ix7 z)%psGG2?Q8M;MCv;N|Q*3mo>X&J~Wk(05gr(+j=-Fhz&_Q<+lV(@W)DFk4rE3f^cC zVP@P7h2(Sy&I*5r<*NF;lC*!?-_b{+tKRW5#st$t$BGZzVV~9^0>2||we&2Y&e2is z74a+}5bYMT1VcyuiVDUL0O=<`ie~|2z}?>w$SaNpcLc{Q0l5SaaR!GU0%E}rfi=33 z0|c(;h{aU~EN)2gmDZ96PjOh{E}clp_dC=6Zp-2Og)+uFTMpk3Q|z*R&+(=w;HVh+ z%zXo)zM1+sBsHRoZ6U*VcvAsxx`APi*3*^)VzTENA=u`MbH=8%u==OL4w z<>A-tRvLY{>^DNNVrbXAoBgrs4~v%FR5J(M27p|mJ5e+8QFnUX*V}jT_X3VKWEd%J zxWQ{?)U*f0*O*QZf$1`-4!i70F{+h>`~@B7#~pi|{HGfT$HSBSxb)8I&+EtkF)XGY zDbi6_YaC#O{!!SbbXvxB&eBY|)bM2#i2_bvAgx}&AjvA7R7Rwya+o0$Itq*7NLPhQ z9ora}SD!01a(D(_z`S~_k-^BASC2L_Xdnj>H!>J%^Xl7ve69hd)p_+=BLjOVuU<_V z9QLbI(*nlFI;dez+Z4uNq!S>U80)|_%^GsO!@l)qR!?Dd841W7-li{}VzwBdVCA6P zJL62SN^3A}=dcw`%{a%zD;NWUYZRS)uMl3F6{~vlwDpc1Q^wOb3czA-0h${tDPD{K z=tzfAo>7{tfYP(*&C3BOI@j|(=d6Ys-IK*Iyj^h-!15;ms4ER5UONEjAo-FTwR&DX zNY8w@i2=1H0OFArNS?^^_xj#O_Rs*v%BLY+Nyj`zDwevW6k5Ydy71n}9EdAc(#Zab zjqDggHnRVF8`*Wdu}1b+ZDdz}>*{C&rrO0I-a#72oma`DKAyZ1aR*Auo}TV#m6A~% zKqu)CQr^B$z}?g1fO{DVgwKTgvwUEUO=55q;#Wa?Hu|2N_JzYFOzmY&XjDWt#56iV`Fq*qVbE9)&XUjQHd7fMcEs+wbdAo1~Stix;=vBo_F54m_nS()H^ zw)M~a(4Z3;SCGC}8J8)++5D5pbY5L6|I$&$zbG^H#jRLq3eU@eGVjVI8K2SRU5u0T z3=4Oe>7-{Z@L=1dXBb%fxYINIs~z0w8TQrQ?eL5RajooYLWc&1ePJ(CxZAL=RGM0c z#-)|z%&E>tXd!JgZo#CM2GH{_S$Zb>ry=EFeezFd|5HeRRj0{|I_MhXVkuAwNQD^NM^TyB+^nKLzTQsc;a;0-$!!Ulg*p#DcTxO&J?qaIp7*|K$dk_%m$hrpFIn&DmG%2>s+&w8NLP0 zb#C*gJN)SfJo%uK)7f9}jpL+6FJo(Smjr>IY4s~+qCS8b~PS&yPBhq7@g`v*Dr^hl3*q9|FLs@rPmVT|C zD$Y^93=^U_7qJ`wOr=|2EQjwo05%!a%zn7@couG~ zjQcsN^<(-`jtTUJl`#ut-bv18ungtvq*fYbePud{(nk%>b#gooDJrK^rG&&tclyz` z#6;G-r7Sg!M6H0ybR>USYnyOk`fRmUPZNImKyjooDcD@_NkR405h;h!JCOU01!LD~ zhFfUr&+yhv^BKZ(6Q#e06_3Q<;=%ZvGP}cXB^wLOF~TRCeXC+ec|<%13+0uv_^1_JZ4=*PrfmVR z4uAk+6IF{Z4PI)~~Gg)R`Z4AnHoPFezqocU|M_769C{{bGW;z}%-|!Y8Fb)B|jbmU=!ws!=#^_m`e$`XVHX%sTR+o3Cqb_m8#nm zG1nZ(5v^SY$|(yV-SS{73n1fiIcBMKn-Fttp4OR4f$Gdc!u#2B+$_1KzPrxWxvbP) zEt=xua;Vulmzcxbv~ExyNdtVhJQUCwmxr5(Z4RsnK`qmSppE&}+u8(a;c`@U9^@u$ zh5(Etr+t={MDLCSUF0;Y57c%fm{1urJC}o%Mw` zt~P}IkBmlu<)%muEgl`AMf4HMtF1l#&%eWfR=%6C@G28Mzn!MQ01MzZB$OAmg#s?;4 zO}a5QhEgIN<6?LcC6i2L1>Y#&YN;oSOSgQa>8zj)PZo|sv9Ii$Wk}%DN( zwp>g1vQoRmtVQ=i&fdlKC%U0+<{lPr30y9s&AG5;O>;+XY#Y z*O)`Z@+nS#w15Vt__JD<>M+on=O`^jeY0rYR0#1n?Sx2unk%0W_eIG+uur$zo$9cZ zP1UqeceAm*o@ZUP#+0TbZzV<{J^?H3^uso@0=BDS2Owb<|7~CE#sNF$i#yn~;(rtf zBz)whbOQ)sW`N}ft0TG(&LSZ=ttD)1@?HLNLbB&TvpMP`6x*<-^FdynuQp_R{D~sU zJg7vSZ^>ct89%M_sbAebr*3B%RS9R2sn7W>d_9Z4!xd1^>BG|B4kvN%r>Bb@4ZjT3x= z>Ax4X%yN|9B;1uNh79~#ta=a;-q}pPnrh_%jK0n)@O*9DJVStV1Tk>3QO{rcik>-c zbUP&d3UqqND#xOf6bp)sE_r6;o1xFZU6{%KHY{0fnpH$jULB1N=vmpSc+Tr*Tcb%1 zaC3F#6bcUOSp@~*2V4<19=iCkP!9mBSr{)Fju=vC+BLwkO z`3T9uUUaI0wup#)L09#G`0-;fozCPV;(?_nMUaR&B$d(?&W}9eXM)!JSd{n87Ie6U zMJ%nT6!HbYZaD;35EL7;c|lPrA}ik-ZnJVR8VylY?090u5e3cXv*-mu(N<_uZdwIJ z(|sgje|zGf1U((_gqfGKza_ALMV~-6bYEaGtXzbkC+-)6(W&~S+@W$IL&!o7So}9R zKp8;-@Ps^bN!2_zl0zCt^{?hd(GZCZZbdb&MBNN`DlTUh$yIm`;jaW3oyBR} z@ABj(B_f<9PB^g@gcC9%6Q@_KjAzy1Gl6japcgQ=2#3>MgtPZU5OxLt6C)fOD8&Oa znm>qeFV7V>Gzj+!ix4}dk9G>#i@8#ZuCnJZglD3wET8BqQj4y#l;|o3Me;7%QqWFY zjsfeP7G$+cXz!GWlI0J2L!1>4tUB#fW@#dCrP|?E`t-5NqUR0YV*zWe^nmbpim)Wd)&*$?_~f%%?yq&jLmri)AoQDE_TT zp15v`QJStlRg+m1f(fv4109+%SX*dAv+C%n?M(B8K2+2KllN=w3##2{iBu0#d1QcQ z6xL+tQg@NOMRgd~bPB^tb<>`@_v=pIzOSzt%bnht5!IdIsCp%8rzx;B`!QVLNQsYP z*pX)a{DOYUfZ17nvCjQc{qxKEsR_3UK26?PeI;f!Wn8V!GD)z;peso=o#3249Ev0{ zN{!Jubj)0Gv>Cz(A)nMtU-SC*EdF-%hfRZwaiD@tgX*v|6j%y76YnBvS%z9gA%tb4 zt)XRqm@^rwhp0c+$xt(nmC>m^3yM>t?dCHSW=2zA6<<$c%8W6Vd(WZ5*162@ZfSdn zs)Gl$ra{-<-7qG;QA=!|Oh%!YrkmNFk*fN8ap-2CvT<(>YF@&)4 z(nb}&oR|gzR(2yV93F-X!M*T#_Z|ic?C)}ZpD@&T1r&-%b z)HZwCqeOc&8$EI&g7d6g*p&@A;ze|}#v2lFa3QyK2 zHn|17CVq^pn(+#<*K&h)zL%P&=A}%dX1CJj!rQ!Ei?{aX8)`AN(m8Lc!R<+X!N}i% zD6$ugfU!3TbE2kWopRKvTUK_qYulH*le6w*N5ZLQyK$bJbE-YDkgZO|IqJP>$zgTH z3|Ypivf(Q@YJ=^(nEDMa`=n=HLJ)tYD^?ZC7PZY@O4Z0u=;aV%=4 zD2e0bR>|Kqyij=*2Qx~tfgU92a7ANr+^_L3S2XY{_)Ae7-&oO*Jq-aB#UVh> zO$I>IP;%fV|0S?^z|@1&`n@P+bW~qUCmBW=GymyvK(zF?{(*J5!&jk?2|!6-lB_UA z8Z+@-@n|;%zM&P<w|Jg3RO0^fK}(Qlf?@th|A3Vh=^P5!kS#dC^&Q`>n?(QoQ^ zTof?qim*|9h&4}hazj(c>GEP$@g+p8`a~Ueuy1CI)j9@T#kzJxndxVGNBUWv#Mom` z%<)~KNu-}GIjm_vKTV)h7f7Hjrp>y*e__a@p82gVP*xCVz7>1Hf4+Z2{U(7HQ2s?> z4x^7Xr^I2fwGaZ_-I>CWvzZb<1M?uBfZWuXl2SkmxExU9?S4beU^EOqWB!%jV z#1I+=-tLIE6|0|~;cXd%=^5VE9=7xhZ_7SR&+xXk#HD9?LtT=d;cbO%hi9Uo#M|@` z_=&d_GS3g(#qc&iwAE72Y$t#PEiy*uV0b+8EWAy>!T@xuipj~OZeg?{5pUa*7O2ej zu;ieg#M_n}W`=}M+Ic&5fp~jbriT_h37yn0t#=NU3q?Z~%p0f*Uyoq+(#8vUJm9ja zXgO7nd|;smtNnhj7(CKR8!Y6gSuhsU0Kp_%&1H>T!`Oo6IhaIFf!tQirDNFs#9A!q zEPyd{Y3UWVJ;gkrXmx}HkC>N}IcUE+WncG`b`4ga%+Zh>igxt-27Uud6Pgig#XM=& ztWUFyS<6myo|ZQ#$xGHZvNG%m;@2Rp<8x1qCN<>seS*s``bz?69hA90askSSuqLq! z-pcq}%mE$H*|(Iul4uiga<9{kc_gT1ZYeO-_p-r~lUERHwa4PG2%PRn&{dAOQk%`x@lb5k4gOgTc1A zKCq_HEoyLR!BKBd$?!5g4u~SBdK(~t=&bOigkcG}1Y~w>CkjL%EhdDtpsNt7B&3A~ zpoWlQ6Y4n$sg7jjISHwlkLM($YB&Vn3D?UluGJ&AxK@wc;#&Prxy4yo z+yZ03KF%%D>h!-1E8`Z0Cc0K%Ku@?<7q|42R!`h=3&JR4aG^TMFPV%B)#;RnJ|T26 z6nG!MWJM+xdw<9%N@X@!$n_9f?u{{0@Wd}v8|F|pC11U~LYw+p0{$O+#qNgJV~vZl zcT3)P3;&H=>6z>~OHXFM9-jYsNWX6B>Fl>c`rCQ++%Xj3ZiR{>1G}qD=ITi9?qk{W z`FM{6VYi9$z?m*SJtEMZn`<_uoE3sv|ut5^1HR@2usYf3lqZswY2 zt$cdC$L3kn<(?*;!5dSRrE4#SxynrPdco%$%~S z_Z3k@nR4}Q%0+={jh61y%*lUp9R-%*sNi3>gKA+SW{p=d#;_0|8bWe*>+M?IBo!*l zMJ8&oNi)^qdk9xB!fMpx;`HE|^DG-^<5pMC(g2&B*1Hu>v4#W4x>UUaklKIe9VNVc zm^4&X3Lv#d&wy+IMBP=bJCNFI?O6b+-PWE3klJr;KsEugE+CuPgyY(?08&SgdKN(H z2vP&G4iLqP$2*XA$kS(J#?cw6qjsOOX4kE)8+oO+AuA$~f?ORUBqhtxYEYRhLo4p@ zO>J8()uo*YF4dY7{Z4?v0#)ddTsLPIU;orzX!7Mg5m3+9+6_>cB{% zsAr0z{!0{X6ogxZlbFPF#T))hEYT|jjwUvmT+Hvq#X*N1EeQmLZwTOGcen*cb$ zjDzG>LT6Bd(cck*A<~>M1Vbcqb9Tbt5rQF-xfy~XlDQdzA(FWnf+3Q*iDHF(vYWvV z3z|i1Yo7Z%$YFAz7qg1+nQ?yy-;}k#!`f@dWl&6UH|mzmdPl3z_H?6?GugX5xk-su zpDj5qHwr&(^*MEcR-d;EJSdf`F3?LKUHNu$WF<#~o$AJqMT6u*n3LvH;q$}2YSOBX z`8DRDlkKI;ru=MLVxq`xTA&xdskl443?{VFIzM>8G90;bp9WpcOdzdSnrLIx1w(9F&9!R%W z8_C?PjoV8+3v}w0XU_s7_7nuOY_B4Mu^fu^0>m~Ph<3HQ)#h0MA-JrS1(1HS?F`5| ztB@N4!uTsp25E)fvj8%mY-7&?NNwpF5IY)BKsFsnZS{H0we_bN0P(KoA1d%;;QGXFh3J|P_Buc#?uSycE&W!wI65pe^6K&ziS|b15C3eFm_h#fiPxL*w}oORf18=9 zy(R-FYk~okg$Qn=fX~5Gu?2N+Pjs>-;;iE)w3;Hg6)kn-hN0CELuIr?Q5oBbBMv%^ zSorom*>)J~ASlFGYw&7ac*Cai#)UV?D}pB(<-(gzEiKdHG#At8gGj@cis>B$Oq#+( z3i8c{cl?a(kyP2bwK@)DX`HjM%>=0vJKC}U(NC(+fULXjO@f4iNndDevmT9`RntJ$ zs|9~MK^mmKb=d+)&8D6OCKKa@xNy^&<1|`K14kOjcBc^}4P<-Tth}k_=wy#LeBlHO z?P0bZTV^=>K*n--$R%Vy{Hk3)iA1Q0?HG2#DhPsfL!#l%G-&MFN--0pb#Lr+W3*5f z6zkMuMx`v{gslu9?Hrp>2jETiGL1!)YAdBSPPVa0tQXb{u|^*#15t{>e(-`JwUz#B zvig`48W>C)Rt*U@!CB>(JJ~%^M1mtRk`b0Sk(VGXhzMR-P8<8`+5V@;`^^hGTkd~y z%;fEZ12(N_TBc==?qG@uR`9~=D9}tb&T`*H{KfKV$m{gD+=)l_@trK5fWx$Uw_f0C zopD5;Dhi(plEv)Ow&KEII;?=(jKOGwVb4ri1Onw@@A!dHE4*QnmEt)})|Uj^ijVu& zd>f;8X!^&+D}c?%H7A>SpcN<;{5Q3J#~meY6bM{^ll90KCY#ia=&JwGbLcd zM`8!;Xi$*X$SeXj^AIlMyA>RSrpk5_iNFAO$0+a6ywXB3bUrHN2ZENG6}`b+d8T3? zvnI)qOGs+CXP0u=nNT>E^ zY}K*uRgdG&Qh{&zxq+5JPy;)#jQ=t_{5smnnGOn0?*6QLFRqh-cUIkEXl(?vzD2>P z^RntCp5ja>t6ttYdV%|9s^YW_b}JRtr?p|0C`EF8TPwv+6s)_RZsW{6PH;{v=V5?qz9CWT|0UeiLUMsbR0NKi*kp7ly}2kcO-firO1W6^bVM(;c4Z zeYVJpL_clhK*MyICcsSD@UJVv;DnlG{ifWi`|;`~BBeN8J{N`krUGbSM-6j+bS@XO zHXw9A?w_f+eZnJ+w<7+Wu_w!C-6#fb5CGMYwa}`!g<)0Y@c2vZ;kmBGa5;glM$a&D zQO&I?JXAu9^8V5wh^2}Ub*=bZl>Gn9T~mz^lS?c)q6W2=hI{iI$tJ`$W}@fiUMO_O zrp;o2rCE%{DTDsnM2+WFBU7Rt3$s0oRCP1FpbhmUPaI=KC{m z7{k30J1WrfCcA2vAFh^vtU|o@R-F-yL~Carn(t=Zoh?edVQi_&u!S3Yy43sXG_5JB zUo?1+VXMR#GGl=6+d*~7ftB*owem?f(s6+Kdf48bP z)*F7r&>Am1snf;PGrMVa(OuP*~qOzE`8^3qT-B^pbZvi_>}khAYErz}b$0 zc3qi)cELcMH_1S z_0Hxambw<`k$}T`A6uAnFLCtoK!KdqLaTh1#!P%g%!&yltSdwVF?}@kyC=?IlaGJxyY{ z8r$`xIB_fe2`W~E-BZ|CXe6q*Is0o0LZNZT^K)nNr!@V~{`zPh6tj=9D5cmtS$*W& zQvKn0U4gy8l#E>uqHlDN#+ZEyAJ|Pn#f(Y z$&Zi=#+4caFmCh{z;y#yb`$0t6HQ}k_&PUQL2C}Y(H7-1$IyW0Em4NGL{+w%@`P>= z2~D}oDEGMneiMx;IuaFV7mR{vZV{5}lESIT&6<_ys#<4fliix71(GRVi>0?R6{-zJ zah4|7MWHh!lQ^@W<~L$QQU*fOSgxtyk{$+1F^5ob(uM*G0>laFxlUFq3wzKCE9(Bg zs+?rtG06ZYkc)w9SyTp$8Xa+o|6j$lv31gluIB0~hB{NzMrHJf#KUW9HNqr4R?~W8 z1obx!IZ>lb=KW2YjYrWpCJ>Hok$H^vd@hL0tB8z=za$IHnqAAtE>cg`)G&?KBDKnZ z!n8&EdT%QWVNJ9b2|q`bQVQa$i&S|I0z7S`W_p}DS0%YG6@v5H)hJP0i4e|4^=WWM z?sL+e_ys~KB1*z9iG{IZ=yE3U;g>{%H*KP*lOu+%64~M(tB#04wVE2VS$dBtZ|wKZ zIq4o%ETY3kE>`Kr8dr48i+yNF6Wyp?Lq0JUQSqr)OhbyOjhTSHN&$!>t(ZJE=aB~I4*NByP&(_KN|D)Dr^{Y`)#OxilsV$CM zd;>fkJ8U*bWK^Bw>lUH2VwMoG>MvuXXnb+0vQRQGY;ev^lC9*aLRm9$ug4eogV#WA zNF>bFU=cXOOEi=Wz6%H=t`jHNvZBZ&F1C4?qZ2$BXk$s5~D1o;5oHs<-a%J?Z zOBSCOTp7dge3;*QwCw?*4 zW*R^1jYD5dr|qJvkZPp)v?SC6nJjPw<)3ma06 zcxr=3IL>$r9G{3Lc#BtzB$-~F@ZVjL=N5jGs2g}w0%^lc48KatKV$?_bDMBV!C7@U zM+HYDCn4xnaE5Ruy%Tjam9ts5>Bxl#$V`!IlaAac&lmd}4!BqFR2{$p7y0gure;}< zhgIhxxec;%SlP*^2f$V93H!l%za6p(xhxZnI8WvctxQO#r;6fFN}8M=VlMYh4VOp_ChH8 zsYQy{{O24CKa_ruK;ZE%0*w)%{fNpU+55rzLbdWYC7d%=PO!#q@@^mK6TQPXRt{OD znPbnC=g)(9o!d{jL>AWBoG@%a_G@jBb(ne6tp;n5;VHq-76>p&NvN`wl4M?qk}HsR zq=`J+UJg_*FqG0e`x<0b77)Q9QqoERuRej%h`VCPfE=*NF)*O4R*ZZrpXUNb2S@nv ztk&U*Gio&o?{NM|p57Lb}asuW-vII6cf=c9ODKufwu+oGU=~|UR)#)jIizzxh3Nrb1+|io^JM2h+Y?rZlPZ4nJRd!lS3A(Z^S2Ln z^EshCco`0q^IDbU8MTXN#R&puv%d(|(i^U6D#m*utJYLrE199v?MMqQleLi?GxO*& zz5BMkwB*YM~TLPphC01-XmMu$)BsnUoPQG#%IznwD6ERuNs;1dB~nz!Q;Pw$3MB$gm|vt z@y}1DIq~U=hS8Ps!h{mwJAtN`5Gy;ub8GpAx`GI1&u5i~+6}!kS6nYtB7&PIr{5S%l z#e@eKi{u6uUWUj>uCa^+0Ix_1NssFrmeOJ`M3xeam{>Gi8oy7^WaK-JL$6qPxcmr? zr3el@jkG|vd)Ow5G&;BTYnhAC1}I|kfRE4G_=B524JmLfH>o(JaI>f*ykZ<9(D%fd zPa0>om+OpczZr^abz7%)3Vb7!TSqr;D&Lla*E$(-(-|ag+>X%2yFBW9V~#duCS6@4GzL)CSP6Euj&w1tuGg+T zt4<&~W!b`zB9V}U@-7{Al?!v`kflSoxG-l>S{Qbf3yb|$LWU1>$~5VOlF&NNn4!+c zJ3~|P-I-yS$WWt?^BFpvmmv;*qzEASez<~B%JoBA2GJ&!ChCaH@W-8+LQZA&h07Js zZKxVvB%5udj^wyWJcZ7Y<8kO5Id1aMOc%Ol#tLv9@=PJ`ujoc4PKd=q~ z{js~suo=|XL{6y`8-b$`)B5`JVEn0o}l>*PtbgR zC+PXuo#U^_x_ndE^&l!-m*y}_%MkBUQYn6!Q@@unS>?1=no>@mM(ClQ zG8lzzI$ptbm2&EJ9oBJ{pFj&qGtrGtP5m!ULGY^6&ySh1fn6uF!6wxV1@+!OY6 zK6|y>^ae&-2Zv{c7%D0CiV_LLK`7lQE2dQOG^Lx^?@6^YZACyMx1UGr@(K$okku>& z+^a1APl0Ff&;3NY;0urQ|QQ{9CJLJE09qIm@g+LDk z*ESHzb|{}Mx`q_)kP|m5FM%C;x(klrcIc7-P(%1rU22k-(V=+`-sYhR^D9D;*^f-8 z+(^%&56PtC>tMtZ)(oVbk=0sqyjbUI01d@<#*SrBwqC>U|5p^2SQTp6=uBmN7 zEf0mwH$4>ge71+;7aAY0(CD?I{19@_mN>5{|CV0W`W5Bhsf22jh>itXQT~J?OQBs?Fk5Q?YGwIt05xRF5J!MaEIo(9ImkW9PaQQr!!}g!scLP&ziyvR10|8=CAK=tKk;ey+m=p>1Z$TLg#%Ps~jVCXKl&geRs2DRE zBZp+92O3P6VY0B5C!rx?hDG+4Nfb(!`W26S*5xH?D7el=xUnye@aCOa1AaAwtUE@( zthry*I7-F29fPAF%ERL@Cy0{p2t+}$5M`6foo_fqL`6saxB!Hct;aA>gk|Xh$?WH` zB#)uwlGBbcLcZFDZd;dPALNMaTZq4b%CKq8xI_bynvBSjP-be!1O;vwgGViJwq;}3 zD2=4WOvMzYKDX0fLs_C3MvzbgS>ZUs8Ppv3xf}H%VZe(kAV_k!L*qtMlp^Rk^8rhnJ8$X|eMgMXK zF0Xw=xEl^0;#=EyK8sLqKHESu#GwgLmo72`;Xk@O>G+~(^? zc-$HERK}QQ(hSdI*e?VyI{`D2K-MQfMbJH=Wg9r{O`J(%RDWQVsh>(q`>C|FpGr$F zGL=U9{?sFuuRryB{`o2Y{C)rYw157Ae}2Y4KkJ_}{`rUg`A7cwIsbgrKR@rEkNM{x z%NB`9FRt(c0RiTgZ$)891Q4+y`v|=@3bT$u*aa7+Xmx7qgHHOn{%f670muaNQN;oD zaFa3$@I9RA;)r%`g2Y?L3{88pEyUh=rZQyYm|3!+4{#5qAG zOyhZQnvgl>@TP;vjp6XTW*x{sX%B!$6cpPq7t3cp=lq)PaP{&>+@~<38>b?b5nwA4 zT%#Ir2sH10h(wz}i#!sb5*ceVMK&tgNEZ7cEr>#rS&E((5bMF+9eDsPGu~Ca+f5RvPa*_WDG!Tu+Qdxhg~ymGd*=`<4X* zHPD+=IWbh@rH&|N9n<-rW7g8a8A(0@FG~}}irZ*SqF4a}i!)NTORJ-gnUV!X*u18l zscHH9B~>ArcqxPyI-+p-0VWhR^Qde#1ZrS`X<7V?Ba!J5n~V&ZxR963<|vuYY;-Iq z6 zxQrWt!AOcg;bomL;|3$IlnY}z#T5iBGwP~TLyAdwv^w>9t5Iiz7)~%38V!q0s6S+E z-QTc8SPWZFp!NBF-)dqB2Jbd5pV#l@oLkuMSx2)-zsD<*?@`4eFtS%9haxRezh}Ft_W(=cxPA{C9AH|rQT^UY3d;>IE?2+T zLP7dH4GvpezgJ4BcgtPB*RfRb0(UbpqJu%r#HjO)Fss7%`&PFNk7DY9txn5Yv+DnF z6Haw?$gru{A~n_~Og1^UE0e=-51TbITWB|n8&DYA%UKq+B8Rnux-o2(z0gc3qnLak zD#P|bYse;xR>->lEbl$XU3N;9A`=z2jD@nY2IvIZf4y8o7{%D3%H?5;(n`pt;~D{h zz(pKU1R9);Mzbf2Hf0D-=6m!Iab0~D|&O=&YLlt{1H9-D`TuquQJPKB`vHWiiLS?Zs8HLcMNOw<@60ShkdGg)Y3c+{J?19&-#WJHf^wo z7)*kX=S>|DNHFqg>*LfgCy%7>BbUuu)GXfttqBu@sd>wgIqdb*%1<4D!(8$jnq2`4 znpeQ0DY8l=!~_;v0%f!mm)kIhIbq_*#=DzJEgkT+8y!R5DO0&PJHW)EIuDp=5!6iw zC=*y5>zgU_xUGbv(V76F0+v_HmeN!mB!+xy+t>*Wpi4QRrXK%XjyHVXaHa^=9zxt& zV@MQGk&hgx=Y*etpyj)cYerm5j8HX49_;K^CbS}(VQH|oN&G6FmOW&repX8hx9KUA z?>nG`(`0y=r+Pbe#)l^qZ>Q7va9ktv)b2>JVIyNNjf?!7a)#jFthf*PW-w;n(`o7M zh+QC+t)lr*o5Fo*{!J^)X*#|P@85JPVPfJ#ldN;R1h8(j7S+52#Ga2QpapyQymJwL z0-AYk1enboL=({eTpao5<9TRDKRC?1p>m6w#v_jhpkF``#oi8+pe!I=FcD3cx*(%) z&O|i+4q0Or$BKCZ&Rg;3SdkS+t==MkDT`a_qT~fcPRn=vLPvO6i(BcjZFU7OZPhV9 z&Q(BDk{*6W-ol%y$aM|T)OQZu7m{ zxJyGl_KjA1^JtCMdq-Mcx$0iAS=2sy43q7p4=H}=MI z4kU8`w{iNHd()w3a~pviLHMdfMu;X?9dGrn7Tye%$))JA^cb5jT4kcruEAz%Gb~)!u!M!do+af3Op&eO@He!^5k;0y6$Vw?!8_I)e#f%_9h(?o)pT8qTV1AFIARJXh z2Zj@`IXSL_4h)lXf?yCk9^YB1v_EnN#B9fwj5vo-Vz%SlB~cWDW*4PWAx;k!^sIry z`ofYkB`#vP$b)RFUra|;jB?sKsHhjiNwOF<>Q%a#r+TGt`G87?@&QqIk~s~xNT^Ye zY3x$A zJ}bLB;!s0rwCc}FOIt2;);WQYAg-fJ#RXuzOIMC5C(JqrKAqI~KQar{8)DLx&+-+U z49X-#-Jh1pNK>f>1y0Agq+VNi3m##ZvXOq_SM-zOc|M;s9o%=+;gdex4QKwFAufiPRRcX1IR7_*ngSj^= zL7^czNb$oP+UQn!=xgKUKg|to-W=g}w|RHp>fF*SgkookBWkoUh1*hfDsq;KH^a0Y z%y6xCRodYUc9VTsM0dxKRX0f%$LH3+DqQ%vKmFP#f5?UOs0@9t1V{Z}cu(N}Q7(L{ zIn$ZgH9gJ#)6S$Yv=c5nB@CZTv-lV5YF1*LcUe|X={d{jgP27qcIuWV{e3FU^(7`2 zzw=ukc4ASN{z@!bmMP~cZuMzx^KGX;Nq}=Z+_x)E+i$VCI`#ErT07^?=!++lTb)We zBOqoNao9PWDrbSiZve)}?B)*`^~pVx)_$Y>YM)gEgg%SBQ40le4t?)QXs*$!PRKv8|5o(*21hk z1kR+9cdp&@C61w2=?p6cp2C^kt%W9|JGY6G32TQ5I>SO%Hwh(2!%nT&r&8okx-h7u z`68=FJ#X3YNmz=0f@Z}sjLz~IJZ$7Eznf<*&!6R4$CLAWiYoT~JnMOWfG3m6#cXz; z4VQ3;z!VoS0NV`;s&@{@_;|-9ZZkQj&Wat_8!h0-J&#?iy%Y#H0H^4#QX#WyX%+qX zc3BmfU=i#_V-cRlBE%YtfIvj@)yi{5_99Qv*WyYITZIjAP-(g2WY~p!&=k;)Y9oiw z3g~J+A6fiR&J0t{QL89;hYLdCA5Iw&bJdD%SU>5$@FXhG&eSui>`DPKXcXtk|6}wu z&f(^3zkIB-%t~sSo8TW@7REO;ohOU#$*4pN*=HI|p@ViXavA3IjgHuu{05Uv{#%b} zF|(D%Q|UtubM%;SKMugWp(BQzB^165 z%x*-jQDX(?G}rRr281un54TLrX?yfyvWeeCTg-=u0-k!yd`#?ytM&o0|IHdX?HU== zvNa~03j(K_l5mAzj+PhUS>uDa1=?Ec_@KfX3W6S78y~?M5%nOTaS#MW6cX$}2({y@ zj*`2>B1#qHSql#8{-u@}jmzQ#eXGNmrBzX{F>R%NFWfASk1&ubts=xgsx*oa+SIYI zO&T^L(sG=3jKMiDakd1Vp(Um~u5q7`vpk|^M_8IoQ)JYwUI_ZOxJ+c6FKJQC+Xd$4 z`9OBrZRLh<`#@M(57URBI4FxKhc3ntlhs5ByG7-{4p}C^>3JGgKt_!_q&Zz07KHk?z)!D&25AGFIDlSqM0x%DqVq=yfC!55IO|>%Sbypk%Z=}~$ z&(Uj0P>)HXcBFt?0}&0>*E;vL(LFZlp*zj&(Zjf$<295zqto(J-KC|%eN|`=Al{G) z6(s0+$aJ$7&L4_Yl@h7-1s)(~t{MY?z3#>^J3>Ymu|0K zTb=Y0dt;Wl!M!zV0^7oxH2;!LYAadj+Uz2s5QDZSjw3u+7nWjbdz4qS6~GPW)7{G% zPR)_NU?;^!)CP?SYV#gbn=^q#Z62aFF`nA<)!2-v4O^nDIcnP(-Z8axmSaVWHEMI; zU95IU2|?|U_TiTTvVc-rhp|A&6q0K`C&&YkL5~+r zP9x2sCK8k9Kvt7i_`g}oAuX|nYgM3;=uXq@cEM&1#H6mba?}N&nP_7Dp_&iT$v$*? zLmU(BMzEMhVq(gvM^R3b57P}#3V?nZb0hjCduy*qN^3+?k4!GP4x8ofvRyV>rXmq- z8-9!y3uPje{3GO{P{7TW)*&Ph)c-Ck4e^bsfAA1xE-wwU>L18Vt%@;%APwo`ku>CR zUvLyzc}4@$>45Z3YfMU*1mn~tD(rG!{qAw49=cTA9@hxByc(LTBmsB3ZesER?yx>% zqH!@~ld}`b+su$T8J(zemyD+|#5h#nN_u%x4zZR^*ku1qq#S}vROFH9U%n$HjrF{! zXcuu=hs$$gfbKtysF+_!Meg}@Jq6?HMN2si=&!nzgEdTKNU~Y?UsTF*jF|e8y1iFA z{t2ZVczJ#)$0bY}+b$>NxQ&S=1+TW0(}AonL&~8>hJ{8a>1^hWZ=K;RamUixO!*MU zYHO)kS;UyBTr!%}A7jTYfywY!#gF@|-}t2;`f;UfW}ws${kWPTb2}(5H=A%Vm#&I0 zG?8t?fSAiT51nnmsCGgIFQrr|bJKBiE7f%EMS_PYbg?djWZ`ZKM5$4CJ*>idQLcFG zF3FM01RlqCqbB9FV>P9{e9<@a!YM58_?xvPx+W<8Mr!Fq^Z1+ndpgTJ{-y=8G~;g$ zhO)^>S3X(k z7DoE&5D#shl4z3=M0S~dtf5ZkY-_+=mpwP!XaB z4|IFcOAjeurijE^II^!gDf_;X%T&#?m;doR6-|=nglAh#PDn{n`ldT5Ydl06zialL!m<-bsrMhzS>99`Es!2Ur zN=w{5$8SGfT6zbe6vuk6^!|<$B_0P@W6iEMW;3;slhwl|{<^8B6!wk+_^U;^nw!%? zBa3C}&jHr)wyVzeMd}P+pelA^yy&XR>G7zIm#OcCYI_L{%YrGLPmOsvTm)IR12bLT zw!hQ?A?iR07+(sq9Bx|OD(})toY~n_Y1K`o_6}y7>QMAq_sp`oj&NnTiic9Lw%R9J z(Lo8eEsOx-SB5J(ZsMwFoQ*AP3oxRxoZgVMG_FFc&s4?I4sDwjTJWKhVX3Qx;FXDD zm9kCs*mC%&o;K=P*1;@fo+eVyauVdNo*=GATcee`wSyJ+u$_*V`gEn0@(5~i&8y6ypz)GdHS-GTPgK+SFWF5xm5chuP?BBqQ_6xl!GHgi;kEu4(4 z%^WFBJaK(z%C=@z^Q5X}FdBDz74urL?_>lu(Zw`bYvi%*Oj_`!`e_JnH!%<1B1+1M zMrvE9PeCnV2WKp42Pc(>9SzKSq{F;!STKrPr_bqhovOI!J7!kPXd>;lI!h}S>-&Z; zyd%_R>9}iATP#Rwz=9&Q8o#pT0l%otb`9-l7L>a7|o)bhF zy39CHhV7HmmcpoHHl_G@mbxZWevd`C=QXR1x;w8nLZ~d+212MS(FDP(y2Mx#y0(Ey zD|opyFnQ3s4M zKI#B3#ssq7u+K(C*z$OBX=a~z=mdj_&5f9_Gnv<&q;(xKZUL>4Q449!s^BE8DQ_;V zK|q98>tUd-E`~0q^*r3oqcuzxmm%^~Mt!1K1sT`HAFrB@4jTrRe<8U}SKA(gzXbRpLAddZyGmIi9_3ZSd5lw8+HPV4aM3=Z^b#agRnJ8Tz5x-q!Vkpf@QosFYt!&b z>}FhAzXWlAT|+^;vY?dL+8Aa`KuBhL!V$2JdD_Gnh6{mO<`PGie~CLL5=1cKREs#e zX2*$jPaH&)@XZ2M7p?+dI&m2B;{w2!L}G$Ctcr?aBN4tRabk{25+`D(3UTN*QE`h9 zr;y+!NI~107Z7L3LU3gdLmUnnwL^cUewWz!2_x7zp6txlfwfzJfrwqi+Fg$CB+@~E z(+hyS`nh&xYTu=G@jP>>=r2fiFB_DX1Ug%nJs0~Mw8PX`WQs#u07dF7cg~7miYr); zRJ0>DtsB?cSw^iowtze%(t54Sx0D~en0kGwL7_*7%FD)G}1*nop zhCpr8rs}0AT|AcQg>z!UJm*X3k`-ySI)<3rH?*UX;50JDmJtGsc(9wkj!M;Lr-L&B z_NUN7Xqu>ViG#9&I4`4cRS}TYreQb7>nD?QcL4SIaxg7c&f=x-o!$hW2QE z&BTd|ivrG*%t;wbQON;7yNJOm6<6s{qg_J9>$t!cd8gyc}CvUKX| z@8%t%mt`Be==Cl`w@WhyC z0GbZA4iqQHM9E9jz~p~{QG8R`5-&+1E+aV)?LT)s<(o<|zSWhcT5=#ifa&JrOA>H= zJa1DI{OK8iKH-}R(%EKL-^Og>_cjYHwv*3Z)AoA*7O3D}&utN+E%d3)g1hn>Cy3I{ zY>@_G3CQL{skJpIQzCpAMfp^TeSodDV~|`B*HWF|Vw(r=-@;T&%0jA(T@VW7c0n6A z*j)Z^*wt8@tE$OYr_z}$&KXC(2xmf$2@BB^VG${jj!h)!7)}l}1l%6iRnHbJpRdU7 zYyvoYK)O}9@}`D-IZptiCk1J`)*IHG{lHWRF&sbdiALTu0Wg{sUCRM0T{9*i;#Sdw|@eUb*&UGoM2 z2xm{GwXDj}%OL^=ytxCqbjp4eW!SL`UG*sr7|?&No6zGVU8S|i8DV3kM7=yDz7Nwy zZU&!1n3U|frapttV&>l>roJ%se5U>i7RGuNGBW=Z3CqG6s7zv|eA4L4%jk>1%L7}C21b^O(Fg15${`IM(mK_}HS)ne zbhzm(3*U0Vv(P5QnO(8#ihm)(qc*q%^fc+)m2}_JANsCpgrLE<#*)?IC(d{0roP90QBg+-^ zH9jr7N974jN4bjC>XcD2CEdxa1-EvQUQMMe9MV=SM{n?e z6h5fZtE3nf)AVM$y~?(M8ai$58luCt#O5c%?6}&3_^K3(%AR(I%@)(r-{Tl7P55Vu zUHAtrzF=X?g+W1#zLbuEsVQISZ)4V~Qs9y1&GPG>RC;gvN>?mEGAOy}aST!;5dBA5 zNOzpYQ>}_XJWOmvHj+iVl36faQ(j{?73bngYI@RF?oD(5qUa1v(QVhB?rz09eZ}s4 zM0n(JnL3Ctg7bmY$p{CM|As_cci>vBmXNt8y=HH!7EA;%NO@fZu%`RnzB1!z;e#}I z>O3@FSZHC83u4oQlXzNK;CT^2P7TRP@*hiQ*p+OzE&47LZDJOumO!#@U(7Vb+@;g@ ziDE&RYY%_cH0~cqK<~)SsiJv8o@fRku%SH3eVvhc+I}>w^atBhVKJ z)>4Gr@oS&_li&T1pL^)vJYsu7$pY$Ka@Kvg9@M5a8dj>7Sh#m9L*b!_p}ooQlrGNX zk>lZWfT|SxsYtM<$TCjWexRyS2`$%GcS&m_cuBDgUV&`Ci`GW4SR!<5BM>}puZpdW zAT?K-vyhYSV7E-fhli5PQ(qz(6lx)tk;8V^HU+H7did(h#(Q$_01?{jU7pRIC~XwP z8@;<`DjROpa*Nrtp0>NszS-Sp-+$wu?C#^+cK6xyTWLFIl0de~u)=m@d7AaRjCiE8 zeSTZS{u}*vEz}$Lt;pGQiH~W)z;nzeQV~;GieOdR#_~C>e1ruyMLYUkBz>-n&^2>I zsa5RK8Hegl&K9;qy!^JETV1XJ4A-_fO?vSy(fT^I;Tx$4Fv0$0{3V$GGX4@lQaAmh zfWGhw0d2T0jL`m<#~9PE3>=kldGR;n;L?_Z@IIV$?LAz=Bc>7;@fUV1oS=ueZ!LW) z$xq?Gb;eMQmXOga?kc8jq)%!8oBCv)-C)C|+Va1}p#7}PBGnRdvb54JIo_fRt(cPD z@*qh#YPTlT-I}W#(pmwTE3QTkuMCn9yY;SCXmM@0y4XdEFe}J>m%-U3d9zXbQ>_IG zNBkiw@?l;Op}oW7N>m$eqZrg}c07|<2XeEHJnfOarn-{ml5KAn_jiUqG z0{EzL$OUVhC@FoR@EWyxDq9SEe)UZg7Dg{!S(*nkhALLNn=^wXhNv)rJ~mCo_ZeGq z7HCbbLmhXuOCraR0Ph^+m8_AospCqA1;?>)Z)nKER@8^yU^GxQC0o;+);7YT#6{+T z9F6VL8gCBrgL+Q>bur{}%w#B&B@EZ(kE!H z-N8}nlCK0LXh6ZT00EF0pGrM1^#?kbMh4}zAuGGnoQPDb14Zi#)!|x7;WMm%LkIq^ z+HftW7}Y}9jA^VCR}7?~lC-pz+e~?5a~HXA6|ocE_zLhu6L4ONaqi&m6tBK4L9BfJ zsY`z3{f9s#$_0PZaPtL`$a{k^wzwe*_;GY~VXYoJq&u9Jfxil?Y z#pIP6Ml}{oZZRiAf(|}M@!);wYB!c(CHPW0`Ie9RPxOdQ*))MaqHuzB{1*6*w9_~)f@RD#v6lz8N|Ll{!JT3nq}<`p9`2A2Z| zF^p2}-VxN)xv~6l_RRW0pCKOe(?z#w#>BlAv@6oRZjk%Hy>6Bh%)R#N7*+SWMVD&0 z*Bv@l)xGY$ZnC3Hp{gJTrT7a-dgYN-u|S41-C z#Xl(}FY`@43PkVgjgGZ=C^EPxO!#e(v?EzT$x0<}q*sTfGPm7VVXLpLuNK5>6<=J% z+ZuZdc?&g^7rS|@JKn?F3f^ihR`)>L+VEnDH(NDswXCyr8dJ;+X5dJ>HRweII_#?Q zR>O&Dzw+F=Z@8K>9Yr&B0vL9^#Ca_uyf8Ul>MR#dGm5R%V>OTb>EarI=TU?N8+1>v zFHXY%(!jt$MVga?c5WcKvXt;YSR&!0*5d>5Z1^CeSq}I&5cO z-%t=2lu)nIVl<$-3Jr2?Gz!=Rh@-!esAD3c-ORNwig%ApKf|u$jv0G_JyOw!+_moc@<1pkYzmEkrI(s}06} zqUB4aS{kYu)CGfDN|yCFiCf>dO|=y8GHm8{(W>HxKobQfG3dZu(yesjrd>2u48tz& z!bUr)E|nUp)bFDh*F8PDG)~Z~L6UQgRXW(K%}SDlj+ItHmN}ghr5GlOI_N6LPNl`z z$@x`FQl*u{VU7Oj48pL>Ny@Mkahdvi;Rw>QmWG!~sFo6*@Uj^pwZ}uyCVkRbAd*M) z9#GW%a(Ff3bD9%NQ_&VBNoSo$dIx$;BU44uCu5(kJMf=^WGd?v6jmTe#g($;8VY0r zUz!U1(Wi^jHfoqGGjVAyB{C%X(#9S-(BAYum!G!H#&($vyS`j!sTukSk=_)Ad>M%e z0BOTsR5P{qWxgzdsxxD$xj8Jv-Ipr&?M+`)>;Va`V08@dlHpZO_&hF!4Wo3mK`0Fr&1Hl0Syh$LQhDeVp@r;847?V(3f-h#Q zEC&Wa#$ZenWH_lnrXXSRs z9mU}zDQU_gEHY3sWx>k!a7{Fav04HEAxOMMWdR{P}Uv~O}My}>sZNA0i~NMG^Jb`u9TOeC0wtsWm2#a5HQevipI8EK75^bsn zH0r2@<>5Nj+9uJR!ZgM7h&bA&=OUJq(HfH+MZ%qOn+mHO8e^)`4GY6~xNFep@%CWj z20`IKy564qw@Mqy{aWxpWc7{Egw{VWOc%Q z8%Y~q1+y5aKy%#F&N-u=I^Q`h)tr1XI1AIWG>X#g+$)Awwt#FmDQWk^2vG%`OiOyFe5l=B%+raTwLb z+RVN(3W}{BDyOk-()c^%ui(TImlXF!t$Sl}8!d32F*j(`3wZ7~2?IQ!*aC9(U`o~M zA+;6q-~n;dsuUh*9B!@WLWGn)*1|yb!=%&+&4h$q4b6JZQJkH@oGUlmc|#B7w4Opf z(P!4!$_jr+(}lI}kmmK}?UwH8Vlwtama80RR{l9D2&llotBg*7RugEad|Py=r0to< z@WeG}3`YvwV=4J(4ApK?;KuTkv>Df%V=)*{h>v!{%7Xfat;s zy!`BliGPGoegPXYGQQv}NkJ|;1Hr@Sq4RLfgUG`&Z#JV+^Q%?ibh7`+$r1IqSF6G~ z9sd7Bh4bcGUQP?sj1KS_57Cf^XviZ$Lm7IGhF*9vjzNAW^}byZfd8xV`kl(_)0Nl1 zt-OA>^7?m`SLq}S-vHza|NBbR_badeP$8>D=PIuhUTAXSP?gj;Z80O! zEk%$<)yJ;7giB1qGWLHtpI-^*u2f6QYf|}mDRkNxz#zS+)MGv*#Q9lWNiUw ztVFKHRQZ`yG%Q3w)3CDWHk;F;Ar{GeWSxye58LCvR%dGFZS;3*h-@W`yp+*MeYvM5 z7E>ktnY*3{a%n{oM^j|Xh2+y#g)U-CV{D}lCl9+-%&AECj@J))7BAY;A9Wlnu7$Wc+HSuHflJ@u`+4|o42BXneTXI9Oc-8wKny& zXpvBuwuLEKG`ZkUU-t`ikX(>Ew7QT2Nx{m2iHX7S$)VAa@aVwM@ZgdDaA@Sn;9cRB zSB1laBdKz4&@?=B+raSf=;5BzgNL__Po%Ihf;O_JR`ToR*TnBHGpST9&lEOv&~@2T zU7=IypzRQ8yZA)~eG+xP34jng~Zm zC&Q6b!^4}x$zy}#gGWcl2g8%6CMLt%2E&06NQaJulXs5|GV7CD6r>O3g0>VjsT~J- z3gL;G7m2Nq<6`bI&3Te+Q@+q?UuY%URMn!8Ojli|w1=yL$J4#Ny<2;?^=|Lo(Yv#E zS8reM?%q9Hd$(@gx^3(Btvj~v+`4OP-`3q*_iXFkwsqUKZQHl)*tT=qu5EqWc5mCW zy?6W8?c26*-@aq}&h5Ll_if+3eb0{G9b0#7+p&GejvYI9?Ap<{WA~0dJ9~F--MMY& z_MJO+?%cU+XW!1Dp))nX68QcwMDICza-=n?Cq zvo*mLhv~M1N5Vq~#?-<4`%jJBIX*Dfz2Q(ucOM83y>WD8@Q@hf6ufaZA2de=jamjP z=R!WH`iU)Dw)`Yj<%70^)rb-5-B*)Jweq~cHxL5I*YZK3moGKxWBI5rKZV1&K-xw^ zL!Q8$>g8GBS;>2UZE!Yi#V8p+{R0v9FZom&{X&bmd>Z)e1=Fb9=PM^wK37+1(#L61 zm1-@YuM65{XsD=kiKlu^g-SDZLH9vIg``6~*YP~dlkBN!p8TI^_)~Sk!~g6WE(D8C zAwT^~5+MFAf26*GoX^C_xlmtWM?_T2ju+V&aogRK$SWIN7$xe1b&>EI2oE0{7!Pk7 zJvDM83>i zogwi>5{D$d#8aJ)F%VVL;dc%&{TdfE@CwXS`BGD`B)ko173z{(_?bdbI0zxdp@(>u ztjrG)+RIl9U(GRC7Yad3BrJrB!3v=ZL3K>yLQsnEGCnZEXvNrMxEmCLfavzgV?cDK zIVfD94hfWtJR4lighn+luhiTev|5cG^ohxV@yUsBV3Kk!HU|yXGDzoxW}AZ_OQo|_ zRr%^{O)j6WE!1@c?e(nDcP_cQ-c^@H5A+2?AZ`jX&6=3{r={d4d8cfD`D`Oy78_ujLe zUH_%A>Gd~m>AB`@KY8o#{2Y>0KU-;seat+NJuG{}s zzTfx3-yr$tzwq@Z|N0W4*X=(tICbxt-}&@sKKqrgUi$Vs-}UbI{M>ubO+WDK=YQj& zPkrXIpa0`8e(5j%^9|?z;7=d>;+OWn@xWVu{Oz~C=lvh}_$NO3**|>jkH6a7y8I{J z_T9gG_PMEslXv{p*BhHwjf{47-TKq-_^sdme(Um;tFC|T8xP!k%iG@mj(dLh^I!hT zUtaq5-;PgwVDi*2{NfjSZe6#f=fU6p4n-gNt^$G>p#&%XAb{>QV=!Fw&iW0*F#mhSs{ z?!MRLJF2Rh?|rCoZ`FyND_f_&o^8*kbERxuZbz;ro35#@DFg?bmejmCpUHLB)n@bA znk;+0vh}$tl%aIvva0@Ub4_(sA^(<|OwF=}gSj8cZqBB2&DBly{kg8S4b?Y>Cv(Tw zPCZ_A--Yao>id3>{qdS*!SdRc`j-0R)pgY?s&CF;QFVRYrd)k4o!uI2%B`plvQrNc zwW@q$ZgX}re`U5Qdu3lfzp?th=bGE{J+vCH}$^U)Mv6C*(Mec%`6YDO;xAUG&uujXX>&+rjTyVEvZ_%q$RT~vm)DB z)seH!uF7W_iGe*NC7-+15y zzx>Ppwz{Tv*Hu@)Q=O4?3tJkjU-oCs4hS%MA@J(-ii}>x(;lZOPChq#_dw%wT-~8NUAFx$gXqAU$>V z-oDz_y8P6+J=w$g+TPZxVz#3yy>EB!^;O-uY_2w6TeB}*pR2FkmF=%uQIo5$Ik>-X zd&Bmc>U$5Zy7%5U=2kZSNMn0VUG;0~*Vmp3t|@P<-dj~y{iD_CszSDE>gV2Gx*=aT z_3LjhT^H0zc1UEue%GW0@>)#Wm0rmw6{=iXe^u_JSDTU1da?$4uoUlqo+}~Fcn7`O3#Kt^_p;G;3Ss8Ii{KpNnz)o zo=$r?Pv}0r#33J#hv%8FLh$jyiBrRqR^MzGWcn%g$uI~GkDl&7Jvuo!K7lEFDGX{9 zK<#)6!=N^bCGJeoe-2KL@_DuxCB+4Cj=3=26O|bED#o+^ix5fs?hwlz2hHf7jq`A+m0a7Th zJ|4B>y}Ucdo?aU?-Y_t6%={{Ycbt-^=fc{c?ILYklgRN4agK{?gEco*nnJUN5JRK5 zWg<6>Ibkparq%_W2M5LnMu{R@TW_MKkH$4UOzc5oyA!d$7RO#( z7j(aAa&%mNp-S~92PO|6Lo%Ww$Aa>RU|ApZE|g`*1_uzGTcGzK9;BjB{qPYr!8aG#MC^~pvC|ua ztqUnWIeIJp-2pmTc!eWOcr}AS6bPm^UVgZox*~YZ!XmF7#gM;!@W4^WHc>Yp9p4~J zdS2`i7!Ag{ctx;&VM#~FM^8qOBu3e(O#!XqvZY`RJ}&$PgC{3!xQCOxSxGMoCk7|? zhIgpTKfEc(nm_xIO$fBff&Sq^@s0l&97iHP9>t6jbJ2fH$Zh&H|8aDXkJ(KS0GezE z#WOrbp40rC@R-^hY)@z=QOgZB8Rdf`qo-~^79PdZF`rvx9kL zLiPKP(_-SMHZyuGcl`PwKrp2NTE3SE{Vf6{OK>o3!GB2FxjcR@5!xSf{`oC5lC+YL z(>$d~d;yF*Nk2oLsMZgXM`IT#+Y+pPzTScg=9Gb{p2d`?lX$74Nr&m4%efb3dR|i$S^VQ?L`l4bEEY^o+9(l^K-rM zLT|9@M+QbD{iHnNM>!e}438r_8D$h80ei9c@+5tV;-@HfEk#DfPxGGRhv3;7to6m8 z8i^}VZ3`+nzm*YzDS}Pp>*YzADRF{>bB5Sig04-(o{wW^w+7cP>~g9PZMYxYp`?ur z4EOh=7M?mhdF!c>+vwPXN4nQd3=SXNcyjdc_`u=2-RQh6*tD<~ z8v)d#PY#U?oji5&)+2*sqZ30m#!PJw)*K!f!Aq?{d+;!ohI|g*H8e3PubT$+(Fu|4 zf$eD9wEFr)`#ur3Z)SUN{lc1GeEU2|TY72Z{X2rTu@$cOM0lQ|CP%PoV)qeiqqe8Q z=i=Cz9YJp-39v&42;EG`7|(j1Q#|R+FxsO#gB$FP zk5D1}vwZWON~2%MPyZH6L!a3d6e0-zC`whH-Zi%yFu0E#9vU{@nAsIi0cQmBpT{s?B=#V&!etcu)j0N2U$6%;W1P-7<=6R)rt0(53iP`GUX)6g~A z{JY4vJ;4%%j?;6;N$EVYP-xE!8ZT%2gOyY&iH6V|3y+){SI52`p@F`R2}h+D`h!;E zf9FnC+QX+X2}V$uE)u7VR2r$+%yi1Ar276~-6CZt`M|1>m3VG1bFQF0iTS^e@pOUM zeMCv7Ms)dp9Q!!2;k?)%#Idu)s#t_UocGx{cIwKYeS8p^V78BUWuF|HFkKxT_{yMd zLA3AuP=naGfmViWq|LthvsWfi>tb!n!nYqZGrn8}=-8pa7Xw#A|8^qd9I>)eld<_Y z_5!i9L?ydMLmd0~RTXA!$DGB5gP57UDrk*lSIlcn1dKw;sjCfM$A7YloZXeslfVaQ zj+`1}qCrlcL zY0!b5Hw_y8H5JiVqDT+NHNj?2NlzY4m)NWq&ZLO9XFn#GN>G^e9tzGQcN>vA_pz10|-7!=+@(9_kMf zA-pv&B6iMvPAgwZsnnG;?h@DnQK=Drj+`G+^bEmL#-ix)IC_TYMKqz}&;*NBCP$@L zMVig6@(wUcT_Q_IQnm7f=dJ4O&cpL)D!6jtuy^Os@bIl@OZ>fU@K&E|cy#>MfyqdF z8@y|5X#8#}d4eL^F48KS(e|ynKL-0rMPDE~Otk7farD&ZQ^7`NaNVd*72!#28qr3L zf~HZM!pS?CD1x%`K>2(Cog z8t@@ekXG8rBvz(n#>?2S&3I{>w&xF~#3WJ$iJ3K4X30oQmsmCvqe`k+$tqcRMcZ6k zYa?YvO!wJ|Hn)0V*X%@2Qb$Qj%k9r2*@?_D=Z~D2vRAPtUXbIF;v2<=)_o6t zV(z|Ap1S8B-+%AP``&WTTW&d=6-wNo#1Gtm-@Omt^RZJ8J$&zv-DS!Mai!!&cxPu%xO?@J>MxU*^1ZOHI^A3yb>TRr2v3R6{r z*1I&cR7Z~Y)VelM@~MCF&?oPC^IL8OnNQ?Dn|HgNZp;4l{a?{4THPY=6fK51>vi)y z&lvGMZ*_9LYPANl9o3Y zbKTY)70%4GJNZZQnVC*2&o)f`K|bGo;JybQdiYaC1~TsZz{gMB2PHi8fs@(7@WT&& z_|%8*z5l}>OG&#nr7Wi&zW2e8-TQ%4AAab;Z1>!UKKx)a+n)JP@c6-dLCifLc5Y%ebs**MpqqHNtcn}uRF4|&;B`W?DmEZW2NAn%jdULJ1f zr$WPazyH^HRb_9SmtB?5%c+lY-+H&Vp?0h-iu>!x^Hz=b=puZsrvr!9541i+Iyq~!N63m zY&|(%JY2NHV)^XGWgrR#f0nZBNRh>~q0)wvX+5R&snTPaF3R(FXNu>-@yHFdEC+c8@b=UJl>-FgP}!xORa2l6L<8SyEkzM zUbs6HTDsgEwvYt+TG^2-qme_p^un8TDZi*VDCEEo-hgGXAK4R&~=-+|pX z*j-rigs@BREAWxm@Xj9o~YL@~PHx zS~s7Rwjs zmm$jWu1F9!h(4_rd(&GU?~ZR4mKU?^uqY=iE@i*7@ksIFJokm={|nkzvrn~-=C5#H zo}IR8i?FMzPf66bE9{1FQbkm9q&PcGiGdZ^9V?_6rI3Fv>`M8S(q4|Wx0lC*^g>O) zQXI|ch4Anf#ckOh-7Zq~;bK4u8aze{#PcpL5X=vH);+gnW8EFfcOA_GchJ!7T)Ky| zyhk#*?70hQ3W*(Le;uP;mQ1Hej&DXrhwH& z8qlaW>789HpWYh#msg#6f+YHvH|R%6s|ZL**1rkTxj>^&Z}kp}V4m1&tkyXNUzHc> zX(1^$9)#VYcM>5teA7OGqp4)%!x3k>-jNifsZhV36rq>aQ0ieZatj+wyv{>v)|Em{&4oYT&?g8 z%V9?f&eO46Jbf-EVARBn zKo1^Vd5fCJ0E7{G>5D&@zb*SSm{Ul5kyfD+RL&pGkEm-g`@?xih3g;Bi@+AMugs5T zsY0Tjkra^#kcJhZHw>t#UvDO@h<}apm$WxD*6c&VGm&L)0v1YcF61Jga8mEpI%H9=!Cbv=5r+G6riQleK#{+6+}1wQ6kN z_`&2yOfdd7`4O94P}L?sns7+L38f$pO?ue74`#?LQ_hG+Q~@nidT!X@nW*Pl4Mape zx4nUisONTuH8@CmPB^%No?8ez*3ol2!Z7x9R|U@Qus!x|Tiv*@eKlp)YVelW!sw

O04V};aM0qIl4melA2S6Xb%Is+*{JfLMT$w9MolJL$<^*6 z@_RJoMWjvg+?0KGtCM>q&I4yug17#4TCtG(?Oe=Kgam!;>IK9ue6iR_X2|ty&!YidL42x35XjNAssxl** zRlp`OQe|O@MmCC;xdnU-l2PQfk?;x{iHO-48fOEexlj!9NRVSZD83_IH0rwlA6b7*0heGM`ygP8hx2|rt{O_jB8t4@1Q*?6(6VCh%@##^G- zOpBDv0@WKy;Aha5!VlEzFeE+zVI+Y4_;NUWcgQiGw_sRLVN`cV1EY`jHMx#d!btO1 zw3-}756aXIV-f-4q?_e$UWoo?3<-NBRqbg$p zmI+m~~tmb!aDHVa)gNHFbAQP%%p65;?*;~x< zB=&;iiHK>F@O&5fTmDldKXGTdqkG&PZ3V&yUuqS{6raw@Y}7+S_`eN@W5Fq%jL2c0lZI7mual1>~=#ZMB8MKq$Qgzbb2g*@d82gS%?7aHc5>XPUBb=IXN0&_unCtbi<($^vvq(xp1x zYe28KIMU5kj|RR1UH$n(Sp+V*|GORKZ9p+?fq$n)yTWD^6xKBNldKBo@P9EAs{gv@!ZUq?2WdROmN#2U}Y7G%0RA7+a+@^nSTf#GY9Fi znTL?4nTrsUnUA{mX41uXOh zS6CSWypfWwEl%B|63hh3BqISJ!<3Q6N;iNLas8B1+8{~u+2C!Zi{>H%ZmNbHM8G|O z22IKzbgQ$XJn=omQ9A?^Z=ew=6t_4lnp7ERQr7(X7N_P{#YD0=P1d-qP8Mf$!)3fj zlLwSn?W(gtv}L`iq5~BS%4K}v_=qH^Syt>MYg~G+IaM?jx>Xy|nrSwxB)UtpRU1lL z%@XSvF+He7(H5qlnGK3<^r9I9bMz#MvH7G@rnq1;_qm`a<{=EC774DNq88@nS*a>& zVFUoOYRR|S9aC_e@CA7Uv++HahM5+c7Y{>G%4AF;45L9Z6dj$@B8}sPrrYy=mi0>z z$}$NNRsX+k6$`z+U^BuZ{gY4mBsL9#aJQ>p|5XfsbpKWjrX z%H5^b5a|T;p_8iY=+UdBN5kcj(Bk+ot7J_#fIm#VgAsziHBb}X7`N3%CisxhR^^1szBr`YEBR`nQ{CKuJ^`9xS!ae^$97A1va#Drud*QhH(tq0vjzx$^=r|GVq|RKT5Jf zC7HZS-Py3xG-PWElL3P@X6PneIl*P-FqIFqv_m-VN-B^9ZkAdnMsrS6Xuv)+WnA=C-P+ z>(hTA?&Bo2Mze#q2z!tX}JZx~`K_ zjj)6(N2W#rq79LqX3922=LBO!m+)krpOtc$7M%k@Pvbw$pZHwSI-oBWyI@i-`(Q?~ zBo2D<}cSHla%^~)Jj@UYbf!_qj8i?2nuMzry?bi z(=Z}1Ra7k!;IS5aG}x#588vt*6Twe4+fJ$F6q%q)sGu>tjA3)&%F`~)rov1mPI@+$ zr!|&Ql=hn*2Pa|xQm=$%s_Kwb<*glf|NIl1`76#6G3{F7>(YhB-L~4k(OcJpm4Mrct$L1 z1tn7TYLaqhwWO2)VK7jUgYs;?3=hutP2hB#d67E>IgmSDF324XQSQ`|^|StGhLZ}l zxGsf?VL)G9uMW_iNuhqJs(m1c?7viZ$(DbJ%jdeQQ}F|hpd`NqApCFl*FJ=!I8qKjlrc3T1sy<+@=TW zT8#k4({-h)0fIzeSQo5w7^iNQ8WjE_B|x4LUNc;^emAM*sEiR*rh`l^`(i$$Ywu#e z2EKfeB;aELrGi*VbaASZsp6Pok%b;&7;wyAafmezb*dnm8(|&qaJAx{m3$FiGvo-v zm{2}WR$4$Q^~H>kpebpY)S;oIlUIuxz@0^Ut7DG?h&b*EU6C!1>1x(HiE3)8^?3ez zYHHD+V7+Ed4cOl^O|7;jH8q&(M9eaf?WC!NX*9Lbh-qrWTT<2FO?K0FsH=sk*RHE0 ze*^r4t`?{F*XQ*9dYmqu)#UX4x}1(zP|>_l0~_FoO(cOm)O1Q(%juO~GO?~D@F{OJ z7pfLk^SG4tb?~^1-}Q9;Gu>L(WBRXE^ftt<=^5ZjRj*E8ld6||Y^r)a9)J^|U#m>|fEUeOLCWbqLi`uT9x|ToU25TGyccuXE7oV8Udm<8(_@o7r(EECWVNbK(3tG`h*Z4;gEEj}H?>fahM3X{ns-)0lZm_9^#jZ`$nBVVIuH zaPQDnqiK0!Rhu!5j3JMMBv%7!j1YKFZnoa#mBmSZ8-trEf8Obh3INiFtI&F7j4~n-m1aIf zRD!!EDy>!U7pCRHn#;kAbnFgt&3o0mGF}kd?b%1y`?^@X ze{4VyQ34@9iW`)vuLC@Patu8h&~O%@j%4r>U~&@B1}o?O3>tLsi7Xv1LjQmN>AcwS zXuFE!otZj0-YH}g3!%RyHx_2Y_GsO`FxGl>!6-+lb#hDSL|5w1Kb-cWOh$|>~YrF$Kr+;S>v{teK{v;wR0)^-JIzdo_{AFu{bR*#UN^7ZP$x${SB19 zBfhB?-%{^V_Jk6E=j+>zR|CS|t5Dz!7#G$$nQ?z<80M^EutKIPJ?^tr*J* z!CDLkdlKsiS>XwyHM6LOXyi!thbr-ccd(v1@%}NF{DOdgj@JZZ8gN(=9Z+c1*9@1(^nz59^)1ClrrujEdfH=LiYM#jec|l?IwqRbQdZt$iBC!nD zvSOMU{G*l`yk+;ctS3iG>vUITAb{rROz=hY05Gcq+S*;wQ9pYWba-Qi4h)2ck${dU zga)N`667gWKt84Y8HrenV_}D6ZAC{7G$#@vE?4aL#1#V_iLTDYzm}3#~ zfk6#GgI=mtyw^r8f6Qu?dRV@~ldPk)G{SZp2@|KKYS}udBpsIb^lII^r(?o-dbRFd zWCFDwDK3gk=;~;@g{n1p>6zfT9z^{pd>AXX5p_hW(YQygQ+W|(fXbK#@iJB1O3l(F zf*ql*Qe%w^Ec%ty{Phcg=1iEYlurRamAN9F;T?xi%3Uo2oU)j)n$dlBRA7inG4< zPRVK;bq3ulfW4|N1f7FTU8b1?b_5v>DJ}VKRM_m4B8}?;*Z%f+m?Gv|{~zp zqp|}PJi9}pYp$K`UfAWRmguD^(QFrW&D<~9#?uSq9jPS*;#Ami(xaQg`HqN)={u;} zL?hNkV(zG+jn#+C&8J>^Qlc>}tgU$_qL)ls){Ww7tZvUtHQHNpd5_>mZFi)$8AQ}} zN0MGzyA!o`Cu;2uI>R);T!gUNE@K*CKBl_1rVd6HZQaqj!b-Sf?nX(zUAkmLwTExJ zgvmzs-yyCkuwB|?lMI>V@#d7~!d%rgCA=?^|00%1rS5gV15-d(nF6{>{d1L>qum5s z!iGwvC<*nyHEfJ6p&Asb!_=Ta6o(pFWkfPoBFo+(7uiK(@3kjsurA`Zf~ShgQ#Q!Pm-Vxjp!nSJF0m8XF+Z9idNb;DdWXFngd#%}q5Ani2}pXwu5^K8x42NSaP%#MH%NYn z=+}`St60?B=qRcZ&r>qV5AEUKp%DJH)U}@2>#Y`h2VLxKbg{QdLuqQa$&1&@nGy$Z zX0IU*Oc*3NwgcanDWyAR*&-VavFl|_nPviTk}+kPDfOz1iC}6n=3HfQ8Dq}7wUroi z=#07H>Wn#K6<#l6ZmdLt^AwD^sS*p<%b1(hb(j{$+>%(zm=(_zzE#;nJo9)cSC!*F$+m#<=#!I+MEv0C(iUX}QY zjG4AgdjgDULU%P|9vtk^TugiLX3fRuln2Q2Z~wOSQ4Es1AC@uj)>U>IOHPuV)@nMB zEWS9Ih`eJ&&bllLn}xOqQ=(8CM3GC|YNlu}5|n(Ge|0_-;yxC#Key5>H4CuMnI-eb-V#3F}CS6;YOXec)=t6)|Ixr!;C4Z%}Mf{XTr4T}Yu>$}kQf#NJGXlAf44 znk!Z!Y^`8n8Fth$+GjakRlT}M!_2)-B+()hxm8ojMN`w&^ogPI3=5GJa8w)TK(ER6 z%ci%0stWWN#u=c?>bKMy?aehnP!jFUSAlOT^Zh;!sf+U%D*m~R|fGa0F|^pfLO`BZwr@-Pr~(eMKUAe zUP^JkuI9>+82!OcBf{6Dc;q-<$vmy&1Nf>$YIG*OdBc~uj2 zz9J6u9qXYr6BR!unWG{)&ePH*SyMEfI~iNQUK2H$p>iXW zahXiifsh6FK}HiE;knhmV{MquY97x$(8LeWj1ScMzM~{sGc>=0wOyMdtKdbhHBswv zsE44&{>I9xT_5LBhE>N(nM_cS-jq)?Q7a}hn-wW(*p>Wh`i?=X`<$G%r+|nN*LUiY ztxNOT#BO5nA7~zu{JTx_OnywzJQJATRhp0Sl5~_>Mf1&g$+gk^j=|6^EsPrG25?5O zW;(-vszv88L(-b(aHd9`1ojGk;jz&k-WG%1#yvSxp2L5RUO^qR zdS5eh63}LvxbTt5#@c9cADN!F6${Tt1$oX^ESQ~ufw6)xInJzq<*#iYzF%clx+6tP zx7$RI3^Du|9J1~BPgAxN!Dr*}#}tRu;ws*@biprEz_qJM^6e_MgC*69lHdeck8Kl< z1@UPI!%TRQH z$25XE*Tp|uA}@9|2i5NnOTk?Dp@ z7ztXnsGegd za{5lyRP?`as#22F!*keL$;YewFLx|8tDY)UR=H|smPrrLUK509m*NT3mAn5XAI16x z(6z0|I-^)MTQ6b}a|Wn-5(#obFGMHw94l)~nYe>EX*FH|yvtqGLOKY6Q-{_7)9Jgw z7QC-FiLh0ra?eE`>$~UmoJhiLRInA{R2xH_r0`qTCy%CkUXh172Bv2!EHucYUgA=b zM>;>sbI}xW<{D`}=E=*f$iuPEXifx{6+Z$0m3!UO!J89i@TRKd2CipGYqUAdOm<>OZe9=I_z>ESn! z?Ed}Q{=KAW?DlsrCS<{;C=*iXVXaIOYppMngb=;CR-${UAum=Fottg4*(#!IRb${u z$fWHR!&gLyT&U^d3PcxW5|d4dZ<2LuGD(AqOxn;`#}$cgV|BbALs%2t#029sVS84B z^cvLGtEf#UbX$$PYB0AbSvkn!t7}2;-^7@jcyQ)PBgf`To2@Z&1i1AX zD_IC)EHjhVW2|T)B;i!?R}xK=Z03vC*ls2!`7W3Xwld+2TXRCx>qp`WWIG=>rRvor z_gsU@u8YL0@P4A)B;hJ!!R2-pZg(|`snC$xjm9;)S0eEVx}1S7wYrI^-w6_*CbcGU zShpr|2=f-qN2Y16NaD%jm|lm(F*i~TVv=ZRy%rJ|J$pyf_?UDyvAaHbC#+tTyek9D zM{q59Ytyf}9nynwZRYOd;j>}SW24>DCz@8<^*ODa>+(GkTY48`Rae$4-dL(R+7fh7 z>4}GVtn`Y~udG*C3@p83O}nQ>S)XmG1cgg{(goXkDoyF@HLdi?rZtI@#J(m`Bu1j$ z&W%8=Z7C?6sW=fX6aTABeaBJ-p=bjwv7V{Vn<(VejRuq|V-#==oNLoQhnQ;;^jesz zwV-#|8D>aorXV#vs!2;ZOWF@^la_8|{F;*7o3lC1I8brMvwW7xPmiCK=U4;VH0hq> z8OdJ__2+qplp!T1AY}9XE6Pr}`S(R`qj#w{uCE&l*p&btIP9aU&h;~y&sH1DT%o{X zwqHF;c8$tFtC$thv&fzpI!;Sh3yKqoudw=~JpIT=ndjw3t7k3rDUT|`pdt6t&8d== zc3euS=75y*dU!qF?LF0Ckyr$O_Qv$m5Y82b^%6dh>_}1|l!Yk|vwWmOz*SU~)^MOkYy3hxMn= zSd?MgE%wCi7Cu4zMGYU_sdiql6w`KIu$CV3s;7*7HN7wRtftK*Ue8*@rJh`L6@n*r z7CbF!WvW8E&Q7%|(W^gV{kg3x)TtIspqr(9rdGLLbIrC+l!2q093-2yQ=RT+4azc=&7_Pbgp4J9or7ip6m!9eE%>-kL+lAl>x#XIqe0r1<+TFc zdN%p>2tCbTz&ITfcbz*$#%pApck$cEIANU$)=m<12sS1X<2-4JSTlZ(LhX48HPf2q zc@u!Ujin8ztp3G1*0wIK7O^Di6=u$L?Hfx~GTm2bL@oQ*m-HqX+-wF`6=t`JZU{`- zF)~(K3G9@pTX9*%LgCn~>Oq;epqb_}lv><@s$@X}a1wVl7zu7=^43z-_9lYv&89bM z6cOn#d#~tskzQLzK}FH%h;mVvPBd5rxrC;X9^fG%(`!qjlI@Lpqu^z$LdxZ61QNc` zQ&n9sp56#+e`s~`e+}kKs0+*+INEAQ&acf4T5KCQ&cXg z_YVX=N$`C3u0ie*Nwtk@{LfBQmsGoI5iag;#LFwAP3i1r_5Ai-KPM}fBQf2+?N_H8 zGf5gWRD?^Hn7_7)%??7-rx}W;q1tDnZj`IAB9}!JO=GIz3?m zObqI|Qgt*+LRFn91rh{HY*6nQH5+HlLX;S4JAtRs5#wtwq3?67-k9R?H@?qNZ`8Xp zty+nxZGcTpnN)7H{WCJ5q)ae@cj8Lu$c^;$A9ymAq<2zDXyoj#CEQmbfw%0gIxll; zA-4QKRcJ6YQKrVjMInw9j>htIPBE~Qo3axi8?9hYjZm%w=(M5Na}PHfjyZ$QtYeX1 zjlg2wC$(% zMKmp0E~=#+I(S7r z6mP3pk0XrqDi3wWo~BX=&t_XTvtWd48#&28%AH}UrcPqv5v3$}tsY3xP8Ibr=i`Bv zT(yc+RvV2TI`op(366SjQ;PRz0(W2pT2a$J^3}Mn)FkdCkltw2-=F4Q4(0DXir++W zZ;hjA6D2u7HL6&8BzEFhV@a4y2XN=HPMF*s^l8$eq-jMxG9AjD$Sx~q>9A3;y+Q_? z7oiX7rXwGauQQVWcKCw<6k*BW@(FYa{gJynSN!%bW{**+zWr+(g^AFdFKm6k(Eb*#N9Tn=j1j0LB?S^>7+Oe6Ha>+l)vc83LKBb~{SmHX2tokr3;fs|35!eD0Q?)n)G1jUp)>J+FWE33~! zjXZ3Wl^g0D@U^H#OKTy95f9VpK}U)LAzN*;@@D&x?|#6#FlV|sM3>bQAh5K(-V+F; zrz4?8VPttP%mwx;f0W)9+EW$E{4U62R6f;T9{y4uM$F&z5&8K^R6tP%ZkG8#UIByJ z?Hsok{dOA%e~^8pKi(e^;Kok_rTq&w^4J?H! znzfRL8XA?VhNt>Rz}E=WTMdo+Er}|cl`0o?G-_2H;Ye|eDnJw+0asW{zOBU5pqN~C zQZo&r(Fr&yjkAXI_Jjc8AaQD`d#(hksQPU=D4+I28_^v*Qkzw&a=9%pa-D#;rooNjJTfV{OIN5fAa_b%U8bfU;M@wZ*Sm%Uxs^^j!j$ZdQEDgM+VUP!4X-E!FbFazLKxZ17Dj)L0)7-DH zd`JvW^Vtm2Mldsg06VY>M=^uDQp&(mU7fx?5{mS68AkKIT$=L^T%H^6V1P-+N*Te( zUg71rg3qETYK&NirWe5*W}Xm}agHh1qZubb+w(8S=UlW5mO6r}mMM3p35#XNe$dCeUN^Z3hu@IQX#r~cQk|8``a0A6Ad zms>HX?WA`KcS%&S&*_d%rw|&I^|8)a!6rR%H8$d{aS8Q>ZNod2>*+p9gX>d$^p@2c z0_3bD^hIQG7zn)}!vb>TLx`d|ly8tMrFBTo&Ys^9NesLemo2NfAWWCg@hH8o?}#MQwl59G}D9}R;mee z@$o82yfP2&xA};a&w=w=Ieng|S~@?&(}W~m;VZRIa~_#f(_4TEJSR!Gj-ac?N#kZ> z&Zy}dfAwog6gxE`Z=3*K6q8fqr!FJWS5cFsrjxEJeZD7ZGJ@u6T7kEw6~HkyKvToJ zl=HEUQ`Bi4I$||f6a}4EO5?gH>Y2hQN*~2QfC=DV)~$r|sQlGB_38TdH*_mYzb3@r zOiAn0SUdunL3}O3?JAUZ*X+%!hVuFa!#95J*Z7p1%-@no%(k?LlzB2 zJ6gwRBifP}j(7kKV^HaakiaDg9LsGO5uc}2B0;;}Rqg}fNIHzp}EH~GL4ZY<`u%WtK|J9C# zil4mHEml_Nel3z4*F#bFN_J(ma;C7?QH#n=Q1Uu30KmDee~S z@>KpR*W(uT6oAU9CxSzqu=sOC4%8KnFQ)sv@?MtDSGR$o`$=Z15reibP~wnG&vKQ^ z_MD!5u#o2*wL2E3=`eq3YPd-#V&1tpUi`2HYoIwh{nfuSG|~rKu_$Gc*(Zv85Fkmx z`a*S1>_`OlJcqrT)uSHCW0WZxoyhZMfHj;*>=s^~mg((w3!8CF-*SCH78!5Pb2W`% zPRVeaKMgmlPpZ&-K#?{qoj6A6=JP4N!AVLt7f$Jud?Yij(bV^R1jpZI_(WJ5HM+px z#;Bd{)T4H$qj5^3_M|;EMolChN9`GV7u^vSd$G>p1ocMOe`3(AP-DFaoIr+L{9Faqar%cK;G1B^&KTNb4sUi4_kV6Y z7ab(&t+89``}qzJWl>)-*p^O_c777|(O+RCcs16qWGQRjLGPUA2(RHr+2lPM)U(@p z$K0D^h8()f{DUAxW9~kd2S*h}%l`(_sQUWN#oznBueeUG2G{E zQ<0AgT27QKT7x$gPRMw4d13lbZ{W`OMxyClkMB(&CQLHI*@2f>{#H=Jl4eCnEj7Z(f=6%~g((gddb7eK+2F{Lvp~bMxNv^0=HDKJ+8pn|eg|y`TG$ zlpw;E;u3%2#DAe1XkD6p2Q;_FxG?i~jd?L17=2czT3%T|4*%HPco_trHyL~9?C!ym z!W@RR(f;z>8wFt4|0A<=4bZnXK;PN`ed`rLe@)(h`Rd|2fgFvj#hmswV@`~!KkFq? zCmvS7nG#RuWj5MsI@)4S<=JtWl|%vL^=I@wi%xlpOli0|6NwBMOzro~&PtjP64?q< zhOH#V{DdVmu~;;`&@r*}$`6%rasN~~Sq#djK>QhZbc~c)2JdswO(GW zv*e!W$k0Qi@CyAf>V}49CTU1LHp{T~t2oYI2AGpRA4Ffrxq?1r=K9A2vWy2f!r~bA z0LL&(Z*%S%GR4J7_bQpYGmYKz%SiH2wuKmqY9S;e`_E|TSU%x+i@1$gjmTVu#)!bj zme!#hD%C)k!F}CMeR*+QQ%#Gipqk5~Fhe&Mo;Z{bKz>WtL{aMQ#9)Z3#%NhcZvnfK z`8s^P1t|~eVoSt(*v(_aHs1Ax<6p}j8A}0uju{u!6T0FDnUg`xXeN*%mLUa`*P&f@WO(&2HHOQgn zGH52FJ`n_I<4P?MWia*AMRwS)R}W$hvsdob-cgl3f8gln`az-*ohxWt{X6g9~rb!?R9 zrkxbHYhqwuV=FQ&N!d==ijgV!?w-RYLn40WXT;}6U7MQ$VXFzS9unQhZ%{~tyV-y~ z=beEqGeH`NcWyR#^VkX@9O7%|_RR!NIEy{BZy2d;VY8rDup!WS*bvM?PoUjW#l7l( zjb)}%^;~VVaCAm|SqzyE`hBUTxd?@+Eut5dsv2gm zRYfTIQTY<-@+w~BYLgvYH^h8=qjXEW<)g_Gb%ZZj>SM9X(QdA&2evwmN zlf43qN>hvYxSdVLOSE!eSAPe~&P}`n>zKSLNoYY5%Y&L{pg6ci8?0I0wL!4&rIN~q zZ$TMVF<;wzg7+G60N7^sP;FV6{+N#W`$VwU8du`*M(T+pkOvjYW2C}q&P`6Hnv$rn z*@lu#EZE05S{f_5!gOuRoogp0#7L?{uSI?rMJ+DrHu6msny_JaA-BmJO(`_6+52V0 zKn<6Oegpw&^;e6Nt?`SH*QLBTM#w1tPmRajL<<{hKQS{qannQsT$fIwRXs(pu$;_C z(Y@?E{xZ&(eZ-ll-#(N((iw&z3}_ZnH%_j&6EFBIEqY-aN61BSnf!$4irAoKI1=we z+WMD_K&GmIq{MX0*1q!7U-_+X{@VXwjzVNplTJ+Wcw5e$JT$lyZZz)XT2CsWdb;{b z>NdVr6yZUZS-x1>s5m3v`v{-$y`&872LDh?goxD)+l<~9iy(ul=d-g6S~WS_gJ^u? zw!ODmS>9KZvOSq2nsWVcU0n=$~)7}FH%nnG}R?mQeL%bFfk;4!2-WHf?Qnuvl>e|?o>)a>gbjjj7 zt*>a;QhCJkL@7F>4Mr-`hQbssq{NUh04+#e48#P_FY(a`Q5z52C#C7*Q~FFXLWYk} zspE<6B_mGQXR=2#w(XyVC0ogW5fRlw6rZPkvWQS=MI|RRJ0#W?ZGBKjPMP}T`WT{B z8Ba^ZY5|!Er)|xKPZQobQyAGpLa=$7X`b==p^<0cXc6TK*BDhpRMbp&(U^|i2Z`k|=NXT;pK{*K6qOph%VCn6vI-2dqlzY*2wJ|RNV#Szv(HSg9%wL&Gl zJEn3~MCWI~*dn8WQO))Iypgx$jd0=C(Ke^?WB3S0;(RQ9JM+Uv;tK($6fjh~Q-iZT zlKAb|0yD6J4OUIzGrTqkq_p|TfjohNuyKU`@XS|@BXmavMs^e9 zDA}Q5F@bu8af~bz#}RY9F^&@~1CblcaMd{S?h4~*MmOVV!i8~^b?oD~BaI_UltdPK zA%W}z7MxkC?^URAsx?t%)8J6V?Xb6dNz8JYv&x~plApVi>naZl@6F!rnRH=q@JA$p z*DRHKgGX`$~dM&JLg;1BaWbVhTO_F!X2pDD9ZNR0b1p zxRq%Og?x?|sB$ak($(Hk8se!qd_J0MX}Bs`ohB7!!k~uq zebq>BZv4R03c%Oi4iC`?_k~WD8#6}|+J;*Ebh9cM1vP2WEUY~5f!kzmjmHR;pl7iV z-nE5Qxt^b=PaZ%MPX=RTGZTO&pl=({I9FBCu_*XF(O$vFckA+OwY9ws+7c9y*OM&=?klSZnO<+D-Xb`kmOkRm#@dm3Xjp+%f zKs@w}#5VJ-Ae)u1$o;_qf~%vAdd=74G3dia>x@`lOGI`>1%#qvv}Ky(&D*HEIcVY& zn}V;3E4cDJb<1vNGGnA*EkU(W9}T~$%n+sk9;BSb!i?cZo*Hhj4WdEW>-0damaiP7>*fE^b~uRUH#Rb8I^%&<#eucihb5 zS-+Uwj2&LYM_uIT+u`4V9?+-)9|YUQ0#p&KBmA|F1U;AG-3#6g?r(Sx#8xTo9n}X? zJc*`QzFNuui>~kRbW@V#HrDb9st|pnFHqy@r6ol-q_A#yE@Q8Bny!id6LBU+f|xp> z;kpiz42-JHq;^?On{q|Rcs3?S}Ai)Kr`1q#2dBlLR*;#eclR)djS{kwV zgEMN?Ta2aHxDM~}(HevafL8c8IEZ52n05MhvAS?H{2{J zR{0A7&&KIg?j<~tc3fq<&&?J(7iahI1VS$+VTSd?92=GHABE5x<*j4L$NwDjRC||3 zIb8d!*4evO1e!a5MrK>I?Ht*XH4)i~5xy-AtwuJX%!rH{wd-S)&qfGdvHxaCY>Qkq z$SH&^hl`s@WTLq9#!OFYd~Px>PI4b{^NJh87Y=0q}>pX}w{z8n^+SGP)ViYlUt zrgfom1ts@38zEp*d|yR3g@%}E51S6(5*nru&A zH59Rg5+eonD_klGaneMulE7sHy}~6Pi?1XB7HZW%*4kXPHgIngO0CU?M6}e}P#at%B5_37#04WUS@c@}>T1l-{DMr1*N>;Yr`%#LmsLr)vE6d;| znbzyAq>i%!8Y&FjdR73VmWPH>8={TL)r?x+p2Ju)3yn=%8Jn*pH>bl!6Qz~z$6k_1 zNRZ~yfR_(Z!;CBeTg)jkv1qdkCMI}~9V_rnWah(r)h$R*o|az9@o)ki3){A^7UJ>B zn0Yi|WXlef+ZSyY$5hGF3jg32+RThzYP#@!fMIY9u<3kNa4gI|gK&wR02 zKqH4LfoPmjM3q1+&ZwbEFh>Y6TO|nV5JUBBa}l>z&%AtFda$XmmfOSv-xf&B=K6+B zuKA=QqFTnk`2&oVM$mAi?C- z|A(af>$KvzeEnxfu~XQ~LHF1zL>P_kac|6ELdAL-B12rswxEQ?lr~yvo)i{rnl;;8 z{z^mgip`6f*V+cB4A1Ch*kNMRbA z;UIY1K71!S9wLyBUlMPef)tBm5@&=Dj69i5eZD2pxhgh*Zb;z+7Z1&WMpE0XB zGL?FBJ$k)BwnDH+GME`)1U|B-MO#&C7PInT1wqQN{~aKlTs9PyXey-3upN<4nlqz4 zOmLqGfGDl)5uHIiO!-#HIEJ;cT=~wSa@st}XmT#u85)}~;XBV&Ziv&qk-?;mM->hC zs~%pC>50V5;93(|X4LFe+5-bRu>b_~h4hLfO^KW6m7p|QIiDG^)GHB`0IAe#5R^c@ zHDTsPqQ|I~SH~X}U4ZsZK*VzDm4?WT9?cUocohpo#%Z!Z(_g=6?X2UkpHNF4dVs4F zZj(LStTo!hjaqB;0i>Z%Y~ijfn30w4RoVmHOuP-;iK7E0wE`(2k|NcNXEXsA4<yat?J7pHBCDm7-Z@@RWxgj z=$NVFBsDscyfs6j5@SL~O~Qh>CSQgJtIgS5Is zW@0iVqcIk@Ch1LcOWxm~oi}JJIt{9ZKVBdn&2TjD6B z$gA8-r6M(aiA$wFDmHy>Ti}jq2ORXg{kDuPzcTlbh+NxqJ)7?A-PrIQ{8Wvg zHFV@)2y8i>+nE@Outb{@Z5`@hcb2D7wqQb`RhQ+~%Mxvq%c;XPVuRM-Mxxau%s>p~ z#d+wl-T#|~qWft62sE5gO?mT4eacLy#%Ih-geiHu69`F&S$nmUPh@@KQ?i3e8A8EP z8Jv`nV;xf?KWaH4wHt2tz|)1p+&7rb1D&0UPWfl`0UprDJ>^ zN=#)?*b01uf_JfNXqvA1y)k2(UdSlRf}No<9CLnThZfn>;4W{+ePBON1nhLA$n$uf zh&`JJ?5By?Gfm|2G!c6?|JTnFv1de29?uf7XLEo3I1$jq$08<1s?i}qnMTUK3^+Mb z%>iLCjfQj)C)ej{g)=ul8Cm+wqa+b|0_QneR;_Sm46|JEhr+w<$EMh`b-U_jp)+zC z-7KWT^LS*6<+pD8ktz0U-A>)4e(QFH<|!7!FcO%|z_(cJBWgNjLy2|&zK{khxIyH{ z-7u28L~g>d8|*Y}IBx=Xk;=8aTe#ySTWDjsfv+-_SsM@a4GmI;5d& z5(8%-#SS%i#)O}$~-!#CCT0I&Ty0XLZB9C#3 zwZTC~JoGwax2n!4ZHP#q;%Nz335L}ae+AjZxoKDEq|3b4-Lun$Bwjn?8&f9m)<}o- z2!c$;OnG_G=GhrX>nfyTy^Uq~z0_BQmyDUJ+970R0JeMo}U z3KjtOC+0VDs`=C<63KIh7Dk| z8%eh6Bsj1>AzLMF+$?E`OeBu8-?ih*#B;=#+s6@KRI5f!@n9twz6!?|E!)>;?49V% z`dS<_dKbRvuuNUwIwqDOQ>)1`8XJe6zJUt~d@03<<%(s#9hSjXRENkHuuPbziDlZg zhCIMOq2-04O7aNN!#6se#C}U=JE?T&Ivw{qT*TKM@6i0(j@vo3Nt{Z5QkkT%=G!OW zL$g*op<#jmoLQrZ09FfTJC?5=V=3q>RAZLRm8x0AT35#wAEJCCvNz_$EPj{)<^h9j+j*EfZpk<<78{$O#Sak%28 znUmv1(jhg%zhyRpxkhjc=H}sIz{PyQ#qu)7*+YlC)T9@sXgw%}rH`l2CR*5#2f<+xC>6;lUIT%?psOcFXSEJXvPj(@ACvwRoJOVs^dztRkh zBfyBbI@GZR>bPPH3aPE+_fIrZ)yKQ!OEWJ-V8rGP1%r@j1?h;Ut~CFw^ztLptK)@c zBqc1AZEb&D(C23~UY}GRi++5Xxh;U!5+J+UiJ&QiYd!_v^77N_8v+=Sl9#8fya4#* z>hgNM0(zl>^5P@QI{294$G9`3vP$G*@FjQL2xou<0of zJXBbIoy{1zhwT>2i%|0(F(O{%;o@r$Z8&(OWyJfk5xRyuRVWgF71mx7w;FA|I75Y^ zi<}oyJ&SU4ojp8ZYPKgew1@8Sw;bHh2uxMzx3vs5IEF8wgPmW(26K##42!?ohp-cU zRy~4p@%E^h1y_DQi$<{?`tI39mR_*utwS1u;j3avuFvWDS?2xJ-SVLGDtGkbaB)#- zbUjs|K7TzM9)q>2l{UWe#!K*bv#{cwuZ2TO@j-CRc^)4q;q{xb6k-Z)U{I`wB_~UR z4IdOn{8c_l!5-Mef9icIs7fdZX*CLvnSCM}=^C0;KyXlfAaqtWK;9$8^BTytu+}V} z`cv1LQf$DR9rS7%SgCs)%ZS#_F$$tJ8=dD(%&KcCN1{U3*jwjWR{yGy!1I5!>(T5p zg`SUQY@OkHTlU#_{h7j!4dWJa$HXc#==Oc-Pd*6V=nAK!2?J9f5v&@9PA*VSV^9 z0DNsYy!1NZuxVRd=^ng6>Ena%l^P5Ok3ah9$kfhH8pn^&5r2At@nDa-vT_b=ca)o^ zXPj({^Ei_R#H7$UeZO0v=1^%X`2*w87mg1e86Pw=p%)IueepUHq&wa{o69=LMkBsG zx!WfG6Q}_RnjvwibQHqw(E_>lw~hf#luMZ`2VhZX-FQ*y9_yhTl0@bWM6OKm1;@(i zy}~_if#FVJCRSOojwiBG+Ez_{y;|{P`xk8yPz*=(Jb23C=v4xyZ*!ql&m%&tyQ^|o z1cRk_Rf2^uSaz2ZsNj6{l*^`;#Ru>*QJWCM!F!vXLpE6FG+J`qhUh(6YHV2a@_V^T zBDkUJbz$BKReP7mrfLYj1!>=fuwNFRmf*-F2`Fw64!K5b zc^chF?fcQ=7@@5D+$QovX+JQ&@e9XWpN-VFNz}&~x>ZYw-BOXT?^d|I-WZwaeT!E;fu!01n@J!YPfd z0vf`!L%hcTjXiftb7l{h^A2?Hf${hY$BP8?Yz6e30nJ{;d1I8Yi~kswJMSEeCwBp$ zK|*y4m~>_96Rc6%;eDtyafDa%Vpu%NH(tQF1HcgWsuMF|YBo0zN#dG=iV6*TE9L|t zC+V&kO5+7BnFa~cDEYfJp`$eqr^b7@+4DmS<2^z-3@;q-(Rmj|*fZ>g09*1H_Pl3d zcn}n8=}eD-Ee3p&Sk;ZDwBn1b+C_x_ut!crpwFDQLlNi-@H8gioYl$^=MFbjNB|cX zy1E|CziQXR`TrK5|Brb6x?OL}{;zobH}QHgUjHOs|82Z}BVJ#Q*FTNdKa1BtkJne? z_20$oU&QNQ#_KoZ_20+qU&ZTR3oqK639ELOhb^v`?E5gX!>zrI`^{9MI;V1eL|}PoUpY6Nh4}+BJLwI9 z;6}FD4ux+NnszzLrn!}Xg6(!+hoeC)Bh|9oYpJxY`HuJtrhBzP&J?AvCO9v$o>}gM z?h($kxmf-)z8nzEZ}b+YV5IRv{Q2!r?C*t^bo_%J~=wjj7f#*3A*I0drbPy5tKLXMmFZ9q}m*y{$(8&AGSoqiLlW&?ugKmhM=Nu-KmuuEgz)Jxv8pUKX>P@Vl+lMa$#TZ z=)hnbr0Lbksluo?aHQ*-CFth?va3kY6kfsyYRT}?MoHKy>6#Po&!bg z-9Q&MS|in|L5r_ynsT}jt!x$_ST`djf$um>x7tjXFmRLgTUe>9xK=FJxP4Papf_86 zB3j2NW+eCPVsxi4%2H=_cnvB=_=}6#|J@ty5-A3!>GC{-Vd1#bb^``g$zpip5u^36 zcqlvFJDQ*GRb+|QuL({AWbv!b%fo+`)2Jl$8gwDu$yWp=S%3`?QAmee76*T83 z;)AlpQVJ3?HkMLe_OKLw4@h#9W2;@5I#RqWxGowqkB4Et+2$oa;(k%D1rBJK59u%{ zPXY}bo>N(3$^{w*Asv=w-8(bI=?ALhv;ieyo`CvR!do-a2tY@QZy7##ZC@}OHi5b* zL?pBV6fjp12-5&n!^tu4>7`J8o*5uRH6!K_Rj|BZI-35>HWBnK5cC4Vs65YWVBwsa zCM=hxkaT)o8TrH1oFxIvYy&*y0zvc8Ni=_L{6SDPvQBadLC-l*y=rf)FbY6Nis#ho zSqF+SXaaS9nh$>K^#z&(K{{I}S=&kisJtE`%Voq{p;18LH$*GmMy)2Uxp2S)zL7Fa zx~+cV$dm0ybEx0mv1B3WvuIdky;Bbx$yqwa`&jAHup>zdq$Q7*qa`z`rqCr5rY-gP zIr^MxhWT%->)S^_qlRJsa@buz-H6duL$t^Wf4$ql=@VSo+@q&W*apK-=x%dZQ0BJu zTR&nHllu_Z)H$MC!alXSRWd%qam6i3#HABlD=cT~L}CG8b{{Savgn)Ck1QB|lzIKB zlF6E}q7H;a{D@kcjd^YH$EUPohn5&Ii&DG90g6V9T2KJv>Ik(W$4b1^lc64=9j-dR zb@4ckn{rxTsu*?|&u?Yd7fy(T+UOuE^Eir~Ex>U%(aUerrlLp2Z+!1;mj;%?!JiCo z{LJx;6JUnFlJ|%I3F0@PAoe@_7=8HuV1BXuj|jII{QC^?{FutrYP$WbZhhbr-uMcs zC6$jiW5W(Ny-yAdCfa1|ehpsg$bG~MlB^s~oKPwlIgK<b z6Uk{EL(OX0BXJg@Ic*5lvJ%|s`Q2R}%cH*WUO%g7k7g$KqHCv!592i{5H?b=m+)vKI7E1{Wvzv6w0*>Kvf>SH4xR?B;R@xK((mvZH zetN%M&Ih~1t>AIY9X&tR0 z$UtE)WX6ExAefjbn&n}-IHCV4H~`rdH4#qkQt%|kZJe*6)A9bRP$~tDN{2b4X^=#KBb*VuRZvA>UTFdo5NwG> zzH2Q`%$j^pTAUCH-;)+kH^tCvXwen=j6_~8DIi^LM}t*Q?ER=@U|})1)uB_BVXs)s z6|DgX#3kpS@HXE5+xqq!_3g{`?Vr}Se^%fAd3~$Ou|6O>ul(QDul}OG{mc6HoAvF# zuW$dVzWwX^mdb~+lP{4(BMY@fmF%vmIwELEu#ov36ySDGvWSv;P6n82L!jw(AtZ}S zF_`w-iXtWDVQ+e=vL0VWeAs?I*#%*LbQK7BB&R`wKE_3BP-_Sgz3ajw-MwD$Q>&Zm z8DeyqffW4?H{GTYWGp%8NOHS9b{)Y_6+y=gAGS(d_xNPbqCQNF*hFHYB<>$&amC9T znQHP@nbMLAtBM)y>%~Pq7%J?0d=wm1Ay;2o)0C%i=n;p;R`{g%X;XQVv6xx5)FZzu= zM;BTrbp*wlPl>7nT34|r8hMqBG4I*U$*!x0l{)baVXs)xQtKx;pUvAQZs!GU zeWn!@+@EGmOcCGM<}qU1p3iqWv{W1mW>D&@a_$Zd%G35Cdv?kgV_E-{1kBuuSW;`Mi1zQAQro^8o>80hm%l9gThnX#FF*3rA-sZ+Ei zbnE3=dwHIUl(?b_l}mL9&syN(cVHQNQoTZ0c@kJgOiU!vCf-s?ii7u^^vmp-)US!| zTt_c_UCW^ST9Hoa7NQvf-?d;qVN6&|IfR|od3J<<2ZLf}!|MUO;hU8$ua!E?MtdCq zL2_}Xnfz>c-X^j5fX2Z`Dd_5&RxnJUn@e%)5+{mUZHA1$+zl?3hbZ1<#=)UOfJ%;0IgZQ*N# zi}C_Orhs{d+v#m_Q}(sOkBThHOD(J;Kp1Pg{h8Pw|0E#BYBodpsX=xK>7u=RD1y^y;*|`dSei-net?Z z^Eq9P<{NdnE!*msZLTU*37UeBq9CkQ|KqAJjz`@#hcuz``{l2BCupAKb?;Tgo$DgSRpo(V8+Rw7Q`C=jmu+Bjgg`YZAJ ztMU44@ydtZt=zB2D<6EfXFmAuJk8{VjUcwtjIi(&AM_MbZB%8Yl6Iz%24%LD_PD3% z_B6M~XP}sBI+Y1(NXO!;&C@sx7|{0B1GS_YzJ|37ZA24VeTrtO&=c)aF}w0IUBe(X zU~PbSMaa%ESb$bEKvR<0-03LXL=yCQ4RA&d5)cP9^r8ah%-v~s5@TAx(`|#Cqfq&A zl04mZkXt&P(DL>|LmLKB2q~`)Tug@$d#yTOQNpgS@9muPo)UzOb71Z{Dl+-O`e*J$ zn5&?Bxq7h*Jl3nm5|i*fMYUfQe5_kEDJ%H!%3R8tE_|4R5J_zMvP}+Zcs;pH3GfEa zLtpD|jYcSfpa{dUxL+xYyysX-QQu-=GbJ;QwOh@@gTrU&4z)sEwpm+~DKm&!l5VcE z7$cH}xp@3S%L2Ss%AH6{GVsXd-lHYqGHS=DiZJiWs)+H7gS^z@fIjaH?e$hc%^3{D$ismzYV}Y)&Tf&RYg4@P+Zlt0eq>EkN}4Is!RqjE@YLE0M^Rs)GLFSDd(8r z5Zj{^rI6H<_NHy_o;-l<8nN4d~H3Mkfs;@ zQBgcvRMzS6q;}i3L#zCz=BOSFEjHMVuo87+-U?R(4`XM+7IbHEZ_kHuK%AE zt;uTHS=`2vVp+g)ZBNiz8LV?dIezkqa<~2P`+6t!cZhw)x|2cf5eRW>wqm z*mkG?-{(0PW6<=Uz@B+)~_e5h3wj#>01z5V+BmXzAJWi*)98`sa`)@V%*XeaTV8;jekE(P}t_qK4X8D^=CHd zPvi=(Wm*68oqVQp-Ogw3fB?GBowcARgyEvg!oX9IBy77};aPjw@y%K;i8{1pxe;;_ zFdffeyADK{C{@2#deDOUn~_D_@6(Z0Z*$R&KD1npMetZ-Lqr5`6fGf_>J)fnBF~`W zu_aiuHL$(`^oTSuchk0MHP3DXLEZ6pwvikQ(BPh;L$2lpCifMX5R<^bvR}~v^fONwxwlGAX%Gz2}h^Swism=sr%uv zOdrBN4i62gc}JX(EP5T&2RlDtCUAm)A=nzad5oNb8q^Riyv^v{Hagfj0+=g;cFM;x zQ*6(Wq*K18RHmy<_g-NF%ue}=Q=f&TPZ8IotAU<|f+|KVvgF!keQr)HSOb$9iUUEb z&`B1UD&UQ6WBy7P>`F_&bM-?OY&5HUba#X;?@`WI;INLP3_73Q?|(v?#Mf`GrEWs1z?1 zu~1Q%6s#9s$Vj=X1ZY86?^=zb$l&*zbz%_h=xc6mE-@FPQLMfXGSDsTVrh<98KmY|yb~DEE(B}iiP(8|4OY~4#ELO|$FTx?3M<9|+qqO& zf#OLPRv>z$XTpjmuWPJOJYuC2v0`U!Z1+PSI!2r>Cyj?t4#JAvZywW?eNtD#3NajY z%%w%y0xOZ0Id05o+0Ue~0XmdFd54CiV3kbCiE+PthkQPyv|+Krl%bg_g(Ha|JO-B9K7QR?F)MY!BO9`oH+DYNi}@g2t(_)2RL?l|80?B~Y& zT+Zx+@?@jy;@w=JdoB6$k-&^^;jo&T&4)Z(0?^b@_$L}_NNBO;--}m!- z2fugnJI1f%cbwl36hLG0*h#L#gih0azg_YWe`!BK5|C++_)0f69^rul@lltX8N-fe z1nYe5W*;AhVL1rcx|7T8C5EAD+~@O^R;iMxb$_@qdNiJknr{pTQc}2mskr$_@e!)f zPI2=u_obJXWDcgyf?BQ0MHN$Zt*YW9NAO~)1A|(19H?e%Jc&9MtC6%O5}Fc zAvgHFVP6Fs>xLpAH-@DIk}|$m@ODB1vs?A~3P1_u8&JV40vqj%9o>UDs^|Ujc{e_W zo^OoLyOhji@%u1B4 zdVX7cCYZKO&$q?GLXEy8X(ewAmXXdYO(DOUO?Kfq=l#k$&o3dZbN2RW3^3f0I`V0B!c+8Iy zd1rVhCC2ZRSh^v+Lzg|_`*pcJ9Jjd6?coP3&U1SxZ=*8OkNtn_y??M>*LB}_e%$x_ z-S;kj1H{9_xfh^#A(7&XO9L>#nD3wze~6MvNo-2HYJ((dqyYK>(y+owDe_rnWF}Uo zbfU_vhmkNDO-ZL@inz3lrmFoiW;CqoI>h=>M|++(0Dkhk|?!e_VZn9?|sg_ z?|}sP!?I>1h;QGs&pvyvz4lsbuf6u#YagR>4iMg~VpG*|B}>&YC3~x%P;yOmRLP#| zh?3paVI{k&A6K%ox=G1o^&ctOQT>>b?bV-AvaMQCvbDNV$(HK9N_y1|N*1f@l}uFc zQL<3ITS>P%q=eWVO6J_#a<+Pxo;c{JWV$*?f^?I}IQTwfVyT7GK;6o!fjqzHsD5D$ zpo{v&t^=LaFBCMx&4Bn+j-COth+_!9pHq&6fu=jd!+?Nbj*0<(PL7QMr!*ZQ0~sL< zCj-t?I9dkyJ2_?sIGZ?f2GSr6KLbvQIEn_CX&p<0dfO>S)IfFw!_|ODY>uu$z4Me~ zY*6pQZPEL|65a4NsEPe=s2kMR5Jtk^a*d)Pa3Ir#d8`hI7U^gl)XTV!d%69m44L4i zI@KR&GLX010aj-m=k!yc%oSR2RGKNXs_!bm0c@wtOt-S?@OfVX+pkc0t}u5sSCak; zizW$jRK_|iG7}y%>d1kMHCB0dPw9T5?1GU ze1I-OhRBvx@q}uKvcTemRmu>BouumL#j0Xc3a3+Y+$j1Jkw*JfJ_5|>kb4&k0(>&It~QSQsQ7QTaFQ>%+ySD zJ%3?ZlH4*`Jo<0t_gsCQ*6*OGO}nBt9ZN|`WnJ-ZgpPi)4EIGxsc)pd`YOkiRx1!9 zAzFe2ky>UR)m$0{?h=Z8bu#TL+T3hrq*(N(o1at7&za`u?A#<}dy}4Y=Kg+>cM{z* zcv67t>tqX}DJ?2-rhNSOGI&h6jK_qej4c5kK83E$yEEwIFK1`4Bh=sSoVqbLC&q#x zI8gt~*{4VIJLIFfAP|sTf+om^-H29QmfwaMV}`#*(Ydb5PWO)Vp*yl{!BAyC!c{ZAKf=}9 zNLSBJkNB6#{?(NX?VecE{|Eqtwjl{R?Fn{BCSQ0H+eTO6c~@kM>>&}ma%kSYD^jouZFz3Ub|IrzOrP^RQ%4P{6+?AI^+Ww9W@VjL>SF)AreKangjd%684H&_1byeI^{|s~O>I^6qZetWJDX zVvvfT;48;#|D>?vfd0Uyj`<^Sh)L?(Huz|ZE%1eNGXpBu~l;QuUBxFoV6Uuc319Qm9DGfDvY z64(cI#y(RLC;~cRNVen|$^s)nA)~PwsERDi<@%$r0T2^ZebgEcIv3Nrx+)WCpeId1 z5325t5(b`E(5srjd10b2b%Wp|g!QD(>CkGSR#EhHt){nR9OFb5niAcL6H`-wC6mVl zy+*a1kbc zFqgnAOdJJuHRFy ztv#PP3vj99{eyBZm|Lie&+^b`gJS%jiV~~DX~Luf5(jk#F(rkWt1Iq@53#_W?!%$F z;9!MIQWoG+oebxKsNyyle?iA@C;P(QB%2SK?WHefq4P6pWj7HQ7F|1EtO(PIM;RMk z%0o@hMG7WGruDVNmc7;)F@_0OmsDFSNA>p7P!yW-m$2~ETLQwqz5*aHzP}z2cDvgG zMRH9AS-rv#jpL?t+;GUTjT>k;;6+OoN!Q7Um)PPaIH5hnYpSVc;fyTN*f9c*ECwN< z3ZEUe2_Xr%bD^5K+eTYwbgBhyK&hfMINCn|2(k5q7)+Z=sP-<^P4=r{Z973EpY2=1 zpnlc_39l?t(ToE&EfQ3xJ5bMS*x2w@7FpiP*R|vKu&<6ODdH0r|ZT3yaX84)>}VYznVXw+B=jiDOpf*O(kli+455lJ zj)IT@9?WPYGl0(^2}Jtca6YuFTaj326xBi>`5a+YVd%lmv&n-`eU{){M6O9dEzG?( z)7m>k9?CUe(^URG1Q+i=Dil$0a z$2eQAO%r`XmOQLXVSopCM3^4e{J&(vQulDo){p$G_S5-6clk;V*qf9E9KsNUaW>qI z%AHw7LuaY1!vDq1vD)9kw zXH4*|qwXM36$&@Lj{rO7D+&U0A_~+A-eYIA_t-z7ITNV%-gA+}vl|4efS8TLH^A#1tx!;#P@R>a0;i&A zSVKZ}j?y|*LuICV#JS6qLv1_b;}K+@UfF;f_gAH4UQ-nmF;Z1a=FR#*%u43X2c>Lw zQA}HqGuyj4oBRBPTj28kB-AARkNw%}qDp91DzsKwFH~UspJZUh*5zMiO0JigCW#QM z>AK1m_RnNRQ5Kv0Z&G=aTrK&Bl=X-yFKN{TT=i?O5tk_E$GI)_p?Ym=eI76N?e#Z{ z-mQe3V^jTK>l@SFa@cYjMxgN8uDV}e+*N-$uV39=zoNpqXg04O|NiZ#_%o-eA+P`7 zm(HH5|F6Gw{ayV2>eKxG%5MGq7k|Ldu73UTYp-SZ*I#*c_I4hA?bm`|s}*oJo~>D7$gF3uGCRDVjyE5UK3 z3r8km4jq+>B=nGz;yvPgbLA4+Kn_81Q5S|N96#m^hN(AyzKR%c?eM77T-RMh_g z4c%53lD*_jR+bNidA8)ReJs%RPG(Q+jP^|lVrd9#;$A94`#9TY5~Wp$gsds*U#WjT zqcWt^{hzHD?`O1U@7!C-3T8DFU>gb%B!3hk(Upi`LV5ot=GjyX0gA-*rSLR4*Q4V` zN&3_29i98H%Y6C~le%mk2Nf&{OK+-&->P>-ef$*iN<&Q;SVlpd<_!^~r?q^=Ye5 zGaP;cRK`4kVb|uOX_x0L2UYu|Dxz}DQlpjog!cNCr;6wGxmV1xP-`n@BGpQx<5L+2 zbyWZ&W5jK#Ihc{w0fj;k`zreiqt=^eHExDKaIFuLsX0MK^;p)aV)0kpftQ6ZUWXvSR&Wx(ENlCkbD$i-9D)` zv?*A04_dbpq8S{0q&m&WV%1|n5WZ0A;bMv37pLk=+$_Qqr*guO!Tfg(rfC@}k}^+M z5i>TLHi7b9WI-Y^%?|@_^$ww_)I@Jxtu)(mCPsz%!*Ki3gpS#l>KG(7>H3hmrZ?&w zSI9eqYe*prZEJAx6wy)nMD_u3AZU`%vVo|kfqzJEa59zFY}*F@grXRp@ap&gMR>Z2 zuVzfCy+;`Mvu3y8*AO-L4$@1I`HGd( zLK6m7Q_cY)TQ)D+tUcH3+T+ zNIkLoLnGj0C=z|dKAZ|)0G!GqD;id|j~-y27As?d6xF~iR;6`E50VOza1X*cn%?Zfu*12=9a~4AY;ekgD=Jk$!(TbUP)5zNvlZ_iBNFiB#eB=-E%ST?+ z=OZr~7#(>&5jlK<6ldm04wsNCA_v+MIXpJoCI<(A>@ji(fI$x5m=ihFFU-jP^{aX7 zL?4?|I?zW?v24*96Z?gd<~SciBk!;tgJL>3V;SsWx)MuYng0}r6=0M+yk3|=4(Zk01~RYOsZz_sIN%2lfdWKljw{d zjq%GHDe80NVAdx`7zY5%o$=cq=NlG;mB+@=L2WqGxtX6OpFJ^(>Zb7*bRpj{T*TCq z()!jTr6fDf{1C1x(lv~FXc7Ujh9bQdLF^`_8=gl2_6~vMxx6)*XupC{=m^zpdn=h{ zWvD41&Le>5lduwjeh`hen8%!a zq-5Eo(NMk(ZC+nMKtpC^hzB6Es$_eXgfqmVnwGu$aP zW}*a*&X80jsVyHHHeNV=Ja1zbnZd?KANiOW>3N>8_U*-Y78FjbiQJtp-vE@JKzX&u zryfC~b$xR8ziA=Njnij=^S z9G!TO1|Y#LivaMwR^HDy(jxnXx>o`gfJvET%G!Ol-u-g}j6ffdq7rn}YEHXNl$N%{ z0b~|+tgaPw?E$Iyz=ui8-16Bh$bXi24fwN5dGS`}Gig;>AIlA|?`Id`#k~@pd^p?t zk4eFRf;)XF-?(c~ta3I7Pkt0{xZL*8OpNHs$ehGN;hX0)f2O%#uF7?GM;0c@E=djK z6Kv?O#R}qO_fw^u{1@!J8v+5hi&}MyMscXlvbitk9PY@|;SQ{Kl4-!zY2bn%B;|~( zT5#za$5FWCjV!ptH)C+YX8|t%<#2KFiN1ip$Km?BWzlKD75pMVxuIo39weDdHjG#x z$*%cC(Ai$3kkoOfegPu~UUXnIdEJ8`6E`%gJxjR^OFm{+xPzEAsWHs#L{$gD!ZXuY ze8%4@L@-w6I!nT{M=`c%{JSjla4gR#D7Z`dp7o8bzx=&?lG*hHAJc_6Nc$577^rBOu|%SzN;_Ia%$lzzTK;sDPLF@Eb*tvs=x9Bndo0 zXQLw5W3Cz0SindKQNW?BIi-j20m&1&_RwR$)VYG;(YQp6JHAouH7$AnHLcO@gx}Kf zjR`!yH+(1jiq0u-@qvxfKrPP+znVRHW_=sKH+-|*81Y>Q-_W;+0o;!fgLc>jT;-J; za5u+~18_&1X9Mo0=GlPbP+x4^fV;kVHsFTMvjNA6zX%-E`MShVMq)5UH4p=xc^zV) zJ4Otcpx;Si`09k_lB|~D0TbS%ha40Ck9)smA?Zv zUPla|5HJBSMNFI((_~7?WDY#d&)$2lq2AyIK9x?fdKOJVP^op5vb9rcT}=_f<_uLl zfpHgTS^T8(%AyLE?IT%K(W+Hd;0Dg=V!K(^sz&4#eCbu$10-gZ=s{m_9-5zyD_P6Y z`S}a$I}YjP@RRfsjhFK1g{OH=UG?%_)Bq<#eY0<6I~CxeB5MNt9cNTP=sA3og~Q@3 z{(Ry}q!16Ya|jlqPh8!Q-4)n8*)&q~QgvZ=$iD?maQS#sU*J5`R_6@$6QA zy3L>7@5u+09Ls*nle_DeIQq!%^-Mt>{$EydJZBgL z=%+pTO#NLSDZTzgt|Ai~k!Bn%7LDix7!C*1>8f@^;Sy5gilZ>XOn zqA&H5xEtzsi!N{&Xwd+?OfL^7n&7y?O#3~@8}PkuXolkuO#CCHvTi+)$%t$tRYxBq zg5y~lk=fRWyfIZM3~28&f;)g4pbWqTm_|Vf5R7o|n}om}$KokvoamkgKjkGyW`;2YpJ}De`mDs${kC6Nn}kcZUr~cRyhqkm}Pn3+Koj;kiM6mQLUv? zrDwFMvQedHHLpqEOYhO96hHH)Ok2*s*R)1-pyF z<-bTisH;JJ8PRI+ShH-Z(I9gqo#sxW1jzS|Bk3%sZEVzlT}Q?u@`KhGrCCp2>*bMW zln)>%>Ke6tOy3Ab5W+zX&Bv^4wZJ{eB&w-VrRG&C9GdUeM95%1T-1WF{>GA4uN$KP z{6^d2gc};hOV)|)e>M#Zx#7Ck-Je9aU{zxppcFx=0bE=b4zg?SrCx#1@V{bbu5au6 zLeI?pEJF03on~h%gVXFRlIatwz*()z86?rACVpGR)EVYlb4XzU?rRh}!~d@y?9SOu zz{Uf&4Yv5>9R>S0uNvDIv(3;w97XpzMGJUG0skSz_l2v*_j&Gs+(_OpG74=%xnuY2D$FEY(u^_@lKP<*RLAqlbf;T#3*a7z2hYQL(7|g>JPV#-SCX~{*^p0 zLnxIry)ccK%L-E(kyD6Dpr|LlA(@ADm047=JD_t_dBxEIb_ei*!hkI5z^y>Q=Z^+G$bC5DJWM_rk~n=Et%tB_sZMz3^;9aK0v=nCcN3Ue`D628v% z=~8xFbtNHt{7Qhg-nHSwSKBq_sXvLXeK~J!8fx1NI~q8uU;Q1_TpTOvcbgw)#nX14 z*bZfJX8W8d9@a{j5*_ldPpH|?R zWo^ei*2yQ52@PYnD_8ZLh*g@}WKBTO%ftqm)AE32hyLJrX3Mc*@$$0Fm>pYc-jMyF z-TTr3LdC@R&a%Q%pmXswEMBpa+RUBmWzadXX?6=amT~#oFQb#yd4kbG1Ef)4%V8K*j#DnkG%! z=H={$48di+80cm1r>#s6z1_R!S9S1;wif5+{^zooY;B>WO=1=z$Fjv@wVr{xOjVz% zS^XUJ-Cj0*eVC?vn6z+Wg-5mq3F=}E&5g!JGop9}Hd))R<-SK;85ZBScXD`}F@m2G z8)2HTGh|dDnL5Q#DG$MGkJf}9up%IC z4~6ZxWHSicami-TK@LN6X?rMa$Bl}B*7lHuALU0yfU)C<2tdjsqDDl3w%5oR6#=%b zCJ~@r1K+~iAOd8@&U=3`jI_CFIzHPcfyeM2_I*EvVIPz3f4095LPPF_lM6mYMO^yIw< z^$NaWX0X$kI38wjh5^J?Yzk3f0O1fKSSDNyve$?^zX*S-nt*E;eoy z+=_%7rcl1T(8<^}H}^R96;1cuuS<#1Lk3G=U{Bmr^ISHa_K~|~G#8<)BTX|Y7l)h- z|AG6+WH*yqm-)p$CcipdSoezUXjMyCaV7jb1A)A6B!dxNh#A%XL&beZidS+9BV!*_ zay)y;pC0z7&)Z9jbZnLBs4f-J=i0=|%!vQU?cIG|uPlCXm$FosXv^jp{>W;V@`6B#d2Z7y)gh|& z?|N&rHe@GG9=OZt4Okm_vtNat)Y%GMjx4+sFItz6=Py}$IR6*n`42++vZcqee-+aI zC$FCw8fsp&XzvcTp{BT$3jyj%KvzNy&FB>{3pFp~(2*A!-~BL{o={t=BBBm4kfN>} z_KxZf+@)&y_HKn>TCSfQ_C9s`?rxtCnfxAS@Or0JaQ9%jDnHoWs|Gb&FWLG=Bxzp6 zx`mo+c)C=!EYs%_<(7~V+Ljd>L7<$C!%r)^Z;pI41bf+gMAfcvn>EQ%Xx7njF17!l zIdhV)INnrSSDylg{(aIe z>3>f;OZp7yUeaetg|L4>x`p(AAl*tzJREKr-(UYj((Rd7`wwtKR}6Rt&9$z7i8_GFJI*LdRmVOQyC zV8nxd<&r;C%f0_f@EQ+A;y@B|bAP)b7poV*BOFSTb1Lds*BIeg)s#C8VJ3w?#~e zm);=(u}@M!_(Dcsm1Hn!9wh_JS#OXGujKt@#-?IzyrKr`Z%f;~&wgt8^PrgT_U?c; z`aZ~Dt{-#HkTkK#TV${_k{jgkU|-A)yDJ71mGvI#ez5)`!m;<6ejhdGmvb&S>)+e` z2^#0e=Z=(=6j!M1ukeF1e><=G?3TA)82@NGjY2HI$$S}S3lp(|-W)nwek~3?WGQdQ z6k7+=d&FI&KK*U1*JzuJek87fl;G;dfPv?TeV zDUdvW@Pu@aAY|~I_7C@S*c)>IunNW@ z9kYo5BIq7td7qY<6nseY(VLJbxN}Gl z(f-@2^YoViaGwBN5P-`yI?$kgv|*J021YsY$cMT+s{_GV=FjoFVIXFy%@_!|seX!P zL}W%_^&j(uBo#4zUSsaLk2XKQpr4vL5{7;;LbnAh6*sAM1=}X3HL&uAB9FnsrR{NlJzN+X_om_ z|J}EDFgDK$Koce7^X#wWHJa>Cxh4mr+1QV)Udi0JcqQ|4Yu6r==}>o`^ecY(+F05j z#0ip@-xob^Oi*7C2;>QrT17@zq1OsfKm; zD*jUqO!X3UUIT4W&l7Nh>=i=tVAuOp_aSKzK>s#QiEE=%;swWNRMc8iq7bohO56m~ zmj=-ia$EOZ5g!{dF@npbnl-$sHuQDz*%Rd#1_T%;;`nt{|0yudX6CR$ca_GZy9^4p zbgBA9bOG49QJhVfDR)Gqr`*j&oDt~jET#vvIxpZW$xKQ#uy~#eL(4;ZWVm(V%>1ofaG}r``>Qy!p|d+xN}Ggl zO(TpXw70(`IUP;NS@yQc4|0NFmmoid;}QWc)P(FJtPt7!$C1+ow0CR*T3+&X zzfU8GWT~yvM_e|4z*E4dcfMXm1^_5i<0;m{Q*@1paB!bt-Pi`%sCBl@-TSIVEw+Q~ z;5%-6#|UDStr-ik5f(=Em!bj*2p0)2;!<8qs)wq6HTUepg9G;(g?(Qt;ak@ZpMKj} z;ryUsh3n|tn4lpCt_nh^Vfw!rnI1R6p`&JS(02H_TIP^NlC7$r>Au@XqW5qR5w_}M z#luPSPqJj=&OX^D7G0@y#j+lLN_Ow;MAq-~#z;k`u6+ZHDALhvF2ja0fSPW9mKl|D zOFC!2%*2P>(tDK*vz|)sYf7>N;MLWYl!EVd`Y&k=P^Py&=s!glFr$@K|HNzjZ}ArZ zXdW^JntdEI_>>u~wd6qB$}X^6%?rLoj8L3O=r4#F)Wh-q32G-;0~*CrRbp)nF@V&t z?2p$9?{|0Kt36la1hb9VGAt;Rjx#jMF~hZ?(hta*1{*lRvi*pxvNgOb!H5lqQW@pi zW~=wu$jt@I;&L@OvG1{`>IXSixWUe79ByoB?1dTFNa6)u--ujb(60j>!XDO7Sa*tF z3f{O>tdhSZy`~QU0%IAgviI1HXFzJkvqi$)w2Wt*^ItNV!E#$RGsS_969rAED|6Mg zPhs9X_!PEIwtj3FPBY>>pjk2IJZP`!McVQwLW0(7n&<7E0)cE7s}On#Y7m=%g?;3* z>Rxi%vWSK}D?pd$yVypdGectsLi4vvA~GA>@Is4seYT`YYUB<0vp0ceDS_K;DiM)5 zQ!StFF9Q*?o|p=qG_pzwvEJv_%b^WG`{UAMbC}$IsC)bT9dp%nRrTR0zg-J9KsS)= zz;VOeIYP^{9N4`fTZk4~nXW36@=~=J%xP>Lt_5e>9@Dx*71;yRp>6HxK{WpgM~a01 z?RUZ3+w1&;plZ9epX^=5?=OsDe54K~2K6EQN$Rn84y&%c2hA@{MFs2iLgAED%KnN6PyuI3;8v*}^Yw z{%#k%FEl1OGuD{0#u`%=jV*3$jDeJfJEYHcEDNNgoq_MV=o8=5Xfm&s?&g9}h!Y4Z z!#WOU4DsFALPeaaKt?RpgQQ{CN+?`n%N4hAqh9t>v5X4aED}$p?rCkFdZ;CNLJ){N zgj#;2B*5Z==pSt*9`p7E;GmCMa6tdDO1yU58Vj_%yH5mSX4z2s+Rw>`t4~Hhcme=- zys!Ib=Wh;*X758`Bwh1aoIjx#E2k`<^PGhOT2lDniT-0)yKr4|4faUVV2_$8ho4dZ z&|97*5!j%MFW*)n0wL_s;GyVX@lV5;uEI+`z7s;{MR4Yt=r}BRxhWz?it{vUeUokOZQR*;cj6LIP}Qs%^y0zEm+` z2SOz?)s|SD3XX}Jc4I-@v>OZJrqzeo7~+P15;s1oAU%njebszFhZ-4O!dvo2Sa)%w zIYGHXB;v+JmDK~iY8At58N`hW^s%;TPm0g?N!&!d?UT5PJ=`a86XmQef`Yi&>+wCQ zW**>(7#Ng9D8_^O?M0bh5`Z@Cz7&>A@MrI*s$N$CKQ|^lgoj|Ozxq+MeffdOFKhy^1)_|n5l~o6777k{-nJU zm&~7%QUeJ7;$xe zmpJSICTD~?5E%(BbIW8CBkSydE0W9s2wbWPcpv4Atzu2*e5r5dB%fGP=CSjJ-dW;S z6LnKFt$erlbK4IQKdfl)dR`GOpN%7k3L$R`E5aTSIgBEf?500bECABvoNK!#IUtPt zOf*WuL1*{kL@h`%9zEKD<}njIrkNshY}4k6d;lF{*b$j6gPcXAOHhP?j%6``VFhad zBSH{rK>&>2d;s_qkXL}Aolwa_(8)Cw8_jE;y?3yHh$lyrYQ=9V)mI2SB%q9~WK)yi zo>%BJfPqw*aLvy6ghyfQFDb?r4a`;Bv|y620y|EOpei_XT7tF9tx59XCF;2!_7e@$ z2gVn_1Q8{Jq#@)J%ow~l&7cx=T}QD+$p}ze>_gKa0|@r=m+|AY&ngpc!@4d8YeI_jsja7KRg{>y4d_vrjj*xKehu@+k)G>6RADp99}S$~|LCM4`> z?P&cTyQ%cz{t6nkJbr>C{p4WYvc*_|6cuBoe*Ahny!P15BWKt&UH|S8%X-<9rw`lH zx+j+o*Vp@XsQ&hAo;-S!3egLRZT!ILAC#*^R!4rJnT9P>xq{nvCZ1=uongvjun;`S zOCiSQIqET&SA9>thl}s&&G%`+v#rqgZ<14Z{pxXp^08xU?JLJFnz5Qzfit*I2) z5SHY7XV|gcJr>`@KzCm58$W3sy!ey#4Tg9OE`AH~`o3_zksq|E*KYB?-%|e>D;V!2 zuD`*(ftVr{nE%^e=G9y316JmokN%g|Gy67u@;W~*2Hf`Tiwif4y`26kXe|+@E6YZC z`=B^Q_hEryDQbx*P@0g~XfKQm`;5M9j$C-}D&3>%?De~mF<#KpnY_VMnk01glZT!9 zy-VE2{yiR<@@<3_R}ec%jlqDYRU0#Mixy3@QNyf zjXhPV_NbJI9H@%E#w;lXuEi*{y7_2ng4W$hT1MJ-yj5urh#s4*^`I|3Oogp&dBtr8 zP^9slYajH-He!%vfwT^lE3)+47A$WiWaMWLMn>feos&u-#z1M+GF&v;d0UK*n{G*i zac=|kEVOL!7Yt)sZac!qx25??MYI*DK6g0D>s$vCB{rtH z?FKSi*}CLKOW(XJA{is8CA7&->1c+L0LWvF&jPZ!fdu=@&fb>a!TNY`9leDFuNEh0gP z4UCO!_d*0Qx_jZ}aD9p8Y!gG}TALWYVezE3$ZU#gtzH3U*xyj`w7+3|WezY*7J~F7 z3vomKeGd6axxb+PMfVqa#2o-9VM*KTFy|6J`>3sc13DDJ%h00{z}G1{0I7aM3XVi{ zQ^4Vj?!Xy$C?gg|lkwu*SGeTG_o+AtEoAkF86Rfd0%&m$li5EGC3z5CQe}L^nHDqP6fOzVQrJz z#DTI9*xWWTF8gON8ina#6QR%bNl~0fp^v^fl7&=L@S`vfG(ulS2?_lL34L3lF>(uO zRb~$`RGa}MPLj}n5pX3fslwzwNH+Hmlx?QJ$`a-%Iy~UFC`Jz-ZTpRwHfGAX?LdJR z$hY@#m3uNyt4|niqe+j+EP7C=eKT^lGXU0n30txhM@658NPCevf;cY;pR!V{M#%-$ zUZtZRiwqN9>m!bO-yCt&dp>E&vihwNvie3Kt9Ncryc(hc zxk3E@P|S%UD`-Z!`G%({~K zO4&&8DW`OT&1EP38VRer51600CvAikoNsJ0L7;9fHc?RpC6cUK-m6n>N?d?9 z-ek0A)_0TvoCw-ZW!U~h4HEhCoWR$_R!3gxSaI_~Gp$$+dNX>Y-e1OCj=y)SHu<4x z5mzYcExonl!{LlAql6@*yS1qM@dAn5nfv}|ELDziv!qwx9TYZ&4`#>|f|{qD{&bBe zihhlA=CUVL$MnJPo(8T!y2(~k9LjbNO06Fh_LWe_`lVdXxgIGhos=W1Sk*s$JLcX> zj*g3}agKLd2xG5XWl#0+T;RILO8X8)Ma74TgGYcov(P%SJ7xNCy2?)IXsbG1Fd5Q0 z!U#mA>T zu4-aoD$6G(ic)9m>~xH}W1|Aa#tw9v4#e}AI%CWNhZC3ti?R;*5zL9bG(v>>iE5%d zb%F?f9`P^KD(t3ux%2|hA2lb>9~xD|+!~?~y9|#!fh_JE7rZa(8kiCAWCazbomyMS zz6`8e6PyaFOE7zkx%G$ zJjD0FzU3{#KJz+wCO9aOsPo=mRp=v5IdO2YjVDl~%TAppg;ZniG_XY)SW{3zfhmB|JWNwCz! z{MOVCzuuO1z?0qY`1atb&=rvL!V`#L4{V-Iy+8o`>ef%^r;uhyRcFuM$kTLuQV|n) z&fMUzA&Y8ESXZFAY7N`|4|cgB+5$2vkcJ5VZ*z8?7OU=!`Qya2Jp+ofUy%b?cbNSh zMwjAJ_*l?OW=U-9KZOa{KC(Bgoy8ZNN!21l(5s5C<}%B5xk-$v(&AdDkIeR<);l9v zSa7^4UuPK_RFwKrVUSyzZ@Ol=z~(mT79gw~lNu~Jw-g%A>QbAL-&J&^-d(Ev*C_4yY z?}9R{3zgE?GeP#r9WG(7@9 zARwP*OLh@Xd32z^RViVjjK`j`BkH*j5qL)^Vdxqp&2dcIXf6&~7%~X>#{3g<_m%nD zra>RW@LuQh*dHcXu??gK#>zs0;u;^vl#7*55tw~2W3G^KFJHOx=9`p>-&$lCd5XbH z^yKR*z?vU&sL+UAS+veAnj={XjzQ3vP>R6S8K zKJJFQjG=WKcasIRD*lLNY|d#HfmAm`#Hs_I-2;YhHa2OPoo8E5jPcmbHH#fqPFl|) z&{1A=Ba$OHjHWjdn{Xqhi7{_u3%4(~q>2qbUyL&4J;(EVohfe) zVgO^^tXp8CAbZ?Ia-m=>Cc*M*Cj1hjocaP}T$dSsi5>K66eUQ|0HaG< z0;R^r17!CS>L?NeJq~7HO$`#L(%2DhVSu2UILxsYiDC?NKH>QGf{hc|h}<|oCOndD zf>$VR4L8|PnwM?{J0SUHNAj0I@jLv)ppaGfy5vqb{;e}ff z6DMynHzWqP>8OD*;9OL2Fmc_@i4ZHDZDth#m*j<(+Z`R7>nZ?^2*!JuVNpP#JY0N9 zsWbiG;ipj@cv;j|ZA7JJ_d^9+sLDDoTM^cHIMkj|OqfHX?cV2L>pTG>QrClcVLlzn zvQ86-Vk8qbU}}h20f;cn-vC6LQ3SQKip}M$?KIm4<3E9_ZE)k3fhemKWodo7_AvK7 z$|h>+D2rAi`(<&uFsci{N^!AzQ>{TlXjN?u#22a_PdkG|RAz%*@Rq>s35_N>?Y^4@ z&kW>HD!jQ6n}*xpJIt!VMve4AG<@qKL?eu|(-GL0?QIDI6!8aw2Fchn2P$NFG?dUq z&>i9ugRDh;te|y{Q4x}2=l}>2MFRG9Fp&)JQ_4FS^Aa~@uq5T4Xnn}>rf&VEm?5J~ zx4x()YG>|4Tr~v#Vy`ALxd{n09uIkPHKiXxr3Q& z?jP>-D{ix3-63=${v^89lWB<7w@FQZSHS<0G=q2f$k>MquNqF_x%jRZ&g z2r1*q6%Rm1S>GEfEqFKPBB_AZ^c?`p?ptZsbqa{pYUV`#Vf@*q6;3VHrQg(Nz4ZEI zj+OFGD5=!}MpxCT>&LI8{fX56QSbUng|sEm_U&?l*FI6~gLy8*ZYUDBLOUuh7|rs| zI-(xXOSDaWN_<4SS;>3O15oP|?h@n^ASDtMsr)eP_5GZX_gLt<0 z#>>;No@j?)Zvqlx*EsNd)qmflyZ3J8HwnOg;l3L^gT?$Fh1sq%?4+j_bkd91w|t^IFj>5z#<+F*h47T zHVNG*Bg$;RsD@5d!WA^H$Al%rIgj7rl>joCsAL3?fu>rnq~PK@ps~e>pdsUSIje3a z6#|0B*mD(MHZ>7Ez7xR{4Yh?-lPZZnB}u9oe4gfM`3(et`TIepCI|w_i=hHGdw)T% zR=H)=qyoZ0{ORM#B7(tHG)^N)dnd_ZBPzP&{)0#mEHz8Ah;b$LiP;#$Fg{srv61a! z;Mx|A)(mzq8>gdbm~?;ZxC9bjjM8orcmN1{7`f@=fK6!EnA(7ooG?<=eSPzQ*_p=} zQ#$*OBls#L3UwH|t;cT$mRWJgwh4yS-)KW`gp<(Lo4|=rW~x7mi8pF% z)0yas@Gt%5>iYGA7;82{8SBdp0d^s=zxnQ)I)S)HR3yC!>_Lo*sT4}`(B@$cGSeBi zvzP%EsU&b@dXL&$*4^fr`LiU1WO|QK zBzk#x-Z%oUOTq#DrU{#h9SX;KEl1ZN5jDu5OqGp^m!Rm+`54wb7Y z;nOvC5-H)|D7fvmNE@PT2jd!z4A*Fq+f#0ZP*j#H;re!LHyClDc*?xcrm#RjsVK2*mwZ~I6yu!c zP02%3^Y!TNqw860Jp$OFvO?EVX?bgzh|&!q0!P5I{5~VqB9v=-=hu3Tb*kx0(}hhTXC9L3 zmmw7C1(&NMZzT#9hDh=wRX~ z=WXG$n~y3R$c`5dn)8tHEpF`hb}f4jQUeJe`Qk`MB^aJ+`N5XLyU|Gr zrO$&FJa&Kv4^lm{cwtGY1qhEFtun>Rfah}2o_6{ZMU=UuL~_xR{m2nasB{j#rhQ4o zSq=AOWeG4!9P+yY9M6Ig(Sgk8*0wpq<+d{}eCB?6vY2U!91uIJuEpiK&bgVSoOQ&` zM#O$Z=2|Wn6kb+o7W4P>?-&YW*2&x&%D`WR!z%9dqR?*QrqTAwpg4yUcsr6q*9 zAaqPa1z9IaZ?GjNV+QPkOrE#~C3?fO$6`DfXLk=6K*2EEPfJ^9UF)lrJI^U@`?QQ? zt+?$L{##3c^gY^wsjRMjn8yoZD7-Gy1u4E&RkEj_+a)NhVqhI2C>w@_HX)Ij2fS(w zM33Q~WM*&TiTkPs;?R7hY1HYFNA7h_CWtjm^&@=0N(7xs7xAT$f z!F7j(Q6=K0_a14XL}52&6wM5e^}|`EME57y)4TlX-JV>pME56Ha$_Y1hTM#SHN|NN zbc+J&0Z6B7%JB!isPtk5ER(?UdM|!1tsj75_aX$A=2Bl*!q#7>1Am?7|Md6ZLQzb# zq*8N@hX@^`lXx9lu6Ug%B)u42Qg)Uc40LMsCh3X2lDC?HIUWG^Y?by6rtj@Gx!nG)G_v+3QYoof2R z3NcjEXs<2EnOsxLwwuT3PHccsn7-+h=ul&Sm|xN#diAlC$JS?f`;+{VUYe-)mXOh+ zPP`TH1ah(@_JfhsI8Cy^@qy#^U#3m$3~97QD^5=lLvheWEPB%-BTJ3>6SBbdUkT|~wXmHck8Z%$Th*NScG)2WXS^Z7pm&vO88EAh%V(X- z9XeR42!+J(0p0%27(F&Mh!@hwUZKawh6nNT`K@$F%RTi*TZa-NcsZn6l|`-S3L{yJ zINDImQXS`6?p;(RU{aMdjNw^S(r}1pQAxwm2FOJ!d0ds43~O<>2cAmW~S2GCC54s$kAe#X=)(qj-Yy-al zhI;sxzz7E{=!%O*rb>Vr`RI+{h10SO0gFJ00yYI;h{rkpD93u) zC{I67>*c6m9Wz@-Tjr()NM@hQpJjpM?JP@)#9tAM+348 zP_ukRac|OpckZQnCOoF2y?0@`WXBm9ps$C%4-D+gmR0^N6UL1Bj`El5P0QZB)yz|@ zcmZbEpDN!M8)%QyhdM;yur))Z`TuhR&0{@~0f>Rd8tKDsPh5haCj}w1 zVJFeBTjEP|Su_}S9KcP1$TjSRrhl1}D*uJql40j}rJjdjr@;79fok2SAk=3=4O$d9 zA+N9oReg}ght|0&gOWG!Gogon@chh@Wt@<&oSSn-bd;OvbHlqEdc1Ko-_&tDS``u6 zXcl2KulzKgz8u?qDbV=JN-y|N)FH;zXijT1S;$xYlAaY|G|SCK^UHI^)|PbEVY_XR zYO$(+c3RkYW1G&QqYiJAE%9+u5fVonx0#~m=Y_Y)+ppp;IxjX_Xlqzp8fdcZgbQQ- z)j;g%cSYWqzdX=NWgE+EokO?E&I@?yiJ=zp;kKaVviLN<+@_Z(&pezLKsQ*;hFfONwk z*I`But_#I#H7iS=!s)2=Su6m;MdmoMC4)V)WFS4Bv1G86B?IZPj3tAmEE(9k;Wvsd z+)a;dt*~8;y-kemzm!d1d9c2Q*Q2DbT3(5pNZU*sjV6F?I#jH60hKDbhoU|HlU`ey zn8$3UO{9+21_f^bM`~6l6yj%8u>2i5m)cVW{EWK0zhmTtSH0tB)IAv?Q*sSM8er;d zbV3^=RfT~y=tQ1H4M^yir8GVJ)jdJ8!RMKckiE5g)y#aEb*-4b)rhsN4U^&## zECehEC>rJ8Dqxi(4EoYyYf|Mchwqz3faUN#wwrb@dTx4jWls_zt|O+>^1<3+`2fb+ zi-Cxr5RgM-8qsnF0*VHUW-Xwo8&WAlK_G{Snxz2y8{u`cq)0frhonr4?0jVh`}-cJ^(OvkEWtnC9S3kL?a_r@+72Lb^6+7_Rs<5%4a}b#lSpGs+s+~Qg96^DH4dG zS${#UNJ%sM`T-}UNebPNee-~3cDZ@$D!AtlXlB=VYi75~e8@r_v>>?EL5Rkmyb)0c zLW+MH5N#PSt5eZo285Ki7YnF+au8szLV@s^V8^xJJDb?xe9nAEg-r77)zLD$6D>aA z#YpqgPY?QGPkpl7a%pQ1j;lv05Is( z$k!=Vpu)ZoNTgUOGP93gEFfER)*T^P4PWNNcs$dv>iHj7dOZ8}kUnSWvFz(1{Z0IM zsz6D$)QF>XC}YH@G=rqk@+VkF4xDO$RC2IS<_u1{W4HSzX&sp#Zff0VaCV?VXiCA(=#-z zE6&q1B&;jW(=!yTJWcI94EaiB56@^2S4zIdbWXmIm(5q3kgsj~ z(K{qAy{x7z+P$dOs09^T5?}LB2q$aDJd- z2{k&{P%*;6sMnfy0jM&fP)XF5lZW$Jn1Z6Lr!7kAigU;?E4G?&V+z6;xA1tYLl+oT|D<}lmIe40wp4JR{F$@-h>aVKRj>VpPO3!(Tw2i5jvz9 zA!b;QG$X_e>yl=Km|=ZdZ)I4gm=R(D>l9ZA_;b5cuMeY+C`X*X+N$4>E@!jYfWgQj zF=ZHxayW}63`WK`Wf+WdI*TO?NO&S-IFyEXag+htJ0P0)7>q2^z}O}->F2zJe^-?p z&u;an+x+SMo_s*bvFxWjx!aR_Jo%6(ANJ%Uo?r>o2mgsDf6kNt)RX%>`Dssn#*_cd zlaG4xpL_COc=G4rC}5SVM-LJ)GG~EF)}f3G=3^GiJM#}?*%PxMB`sF6J1k4TR*#4= zAWE%sC)2Kug0@x6a?L(F7pe72Hwg-mT)`NP`2PercT#qcIhR$d@W^6fB zMvEHo;tmo}8k9&#fqXl90%{xMP%&a05`#;HbmNd{Oe&;mf;Ppu5R=s*6*8g_`-MH~ z6)x#SM-z<0;#PSXevIEF2T6ESc}*rPunJKqQ0qzbebr~jS(X0@TSxE%cOeh!qeEUk zk6}fwTnz&UK2|n6Q2LPTaBcLlPG-nM$9L>43A!mJRyv#W`c=W3^{3S+nE^WwJpB*oA4#Vi^ zS8L22?VL#;_CP?1Zq~a-1oM$7^b7?k42sho&kX-Ucvcc=XuZolY>zzDKZwg!pM}A- z#cH`~tBr%zwYu_Y(r`@1om}%ub~~wCca%jXd#auB z3oAt>*HpV=mO;X4^feGs?GCxK)t>NcuDYgOa*dL(?xdy*gR5~qXe^G_JD~{dHy-qx zxkg#Zb+40ga%ApJm3tOlSW0$H&!P*uO(&p6T~KqEgv>Rs_Re{wF@(|;XBXUdW8IboVEZ@eUAH=r?6-u% z44-hnX8hRjz!hF}A&6zV5Tr4`<~DXgQn>2Z@r63)-2@f8Q?~*#SB`IG|k@cA&)?EhR0v7FvpyjJ_6aRZxMCoQvD}_ zw7m&wTuU2JwQnQR5Cv~~{@6J52&OdjNPPeOz*`u4$TYx?i*xw3Wn(YSY3LiCY1m~` zPHEA|&Nhwg;$Z`gycJH_h@iKfH-6y5eD3WS<{fE4wll5jcBRE!8wRS7$Tf~4^p^(-nuzets+6qPjF?pDbnQU4~>_P)2S&Wfnq%+wx#nFXZ2#?5;xLr)uf zkM|V#@tRBEV;o69rB4NZWdj^$9(u3qBAr*aZUU1A0KG6eLhk~Ww2s-u(5F?413@>y zCoEFh&@uiM=2kq!V=Cr9+5nxIhUESUHQ&VM)}g-*UP|3##|8UEw;?lv+dLg2so zP5EyF#*F_k1WD|*2|!t61fVQfa1#N15}JxVXhwT%kWao23vL9O=R z*o+;y9^NOiz%iRnVAQq3BF_vv^@hFy8Oq=qeP24gmN^>@io>7Ty zR7~$cVDymkcc5=NyyIsik0i>@S+AWNr>2#mBP;c#o3G`4LrX=oxl z=L9j?B2i_5v9g&ntP~h)=I4e0B%Nayn)4OoqfBQR+bH6|)M@dEJoB{GVcY_X;5%Ck2*y7D@LvSjB-9^)-ooPkI3%~HZ55MqJ4ZlhSYh-r?eF z^iBIA=L!~RQx53UMd2@KW`_Wxn4ZSuy}LZ6YV>45H3U9^OlRwP>_Su3 z9!1HVs;D+jw$KBLG#_Z`Vk!aqJ-VT}(7MB`pf|!*Rf|pVh zWrXU|YC&YT?y_uNKTVj&LiUCVC&HUnrTPYJNWQvwkKd@`Rik_tra&n{E5dC-dd?-3 z#H`bJ{M>XJDvs#>)C zdkv@@144lmD_G6}HoRV-Qi1Qd8=`%IzX7{$;d8d-lYGf)w&0T*oDo4f$%l+{vI1*8 zfW=OE5_*}!u%x*mQ`nUx#WO_-*N5lyVTi9nuXP{| za9^jsu5Ui}I8GG$KR$Jj|6T^w>IG~!LC~v8o)z`Or$7tu&J0Q*J5%Rp>u+~X-I%kJ zo}ny11mxs@dNjX7KKqba{n|hN{TuIMAKt3?^q}nXO=OLXLO~GPh(8_FMZ$FGI>eOq{=BwkSJW*VH|5ry2e^g#`fKV*3#v?Xd5ck7K_ic| za;TqYtFACd_s#?UnTp#dJkoh9;?Eh8Kz!+qV3 zV&V(g7Yfcl`7(yOw2UziVi+|pW7M=_4qM~3Wsp*!LWFD4t)&$+R8P||vGp?#fZj>kc3%ZZsO+vUU zLPrC3=TY9=d9-y#J`vo#7r zi4cXNuo-otjMhYq1?+L+oU6D3D-mad3BKP*pwdrOJqYa(UHSxfe{gR$Bf=dZIXFf! z+0eihQ-7>{q*hK+B83RHECL&c{fes=AsO5`q{`I5;E9%;Vi2IlqG-f#%%XfNZ!(bD zM=P7N=;?OG-6~ruC}Q7_f}(v<1XQ{NsF2xVZXhG#5k? zP27{MO*x!<2Jx4izWds=!@zMl^rQwRE5$i zS^IQibvkxJXPWvg!@8oHT76ML78#n+yeG=Ao~YnxSH1>-=R#LrWSaY80aFOa6zvNO z^b00|H8)W5RdL}&q-HHk6js&A*?6}hX;nE+(i@42SqDOKlFndiw zNoQ}Q%hCe1&w+7iKA<)f&>aGpAwAd8YGoNKdSPXKA|iAs zXRk!2rqDq~@eZ8C3mzbCgcl|vNnMT$I0+@9O+>D8;(^D+1Dt3Q0XMv;3vwaNg(WV#E)r5?;W+eY;lX;MN#bfrsLPSVXF?r@%o zT@|ul2w@Js0Ci-az7Nj8EMYw%_iDH`Mm zp^HSkMPkztFtCQhX2_+_l6$OqW>{RUJ5@?auQB~LC2`j0ge3>S`0iPFprGyFs@oGejQh^ytI#h7&i?Xn7Fj?6yianz@K<~EEY0qLO>;0qg zMif2@@`iaY(sPtI^Y!;}iH}oM;6*G}F)IKO(D)_BK@wk`X5k7U8r!WKKIQJ?lw>=W zjBLCWN2FCUrIzbJVAtXxM_AqG_hUE!H`E$I)CA(yrOEzCzsQs4YR*>NcH_m`bdI5lXr}f7M|U=$$CUszLTs>GrtLE zkk#l z69!LMs(fr^MsNk%x<{_#X|#_a+sD{>>kvqxqnJaAxiFElHgDN7V#5TFGvkGU&}x;R zNy>~GGh#^~vM*5r#n86Q_Kql9wv74uyxnabY#HBBQ10e<^F_jeMq7rC59BflP7gRm zV75W{*BmCKSFZ~@)eIqIv{kFSjA!($1vh+*-0&`jj?O504XqE0)nH8TnlYVQvYz5Y zjOi09sU0c|@7QQ2yLrYrsZJkTIw# zMYilMd?8~Lu_fD)&tau-18dkP6NDxeRy@AWqydC-NZ$d-a6pWmoK;Sp6Xz8OVgoZE zO0`Sh6eeU_<3GESG48_6VT4ilbZ0|;s?RCQXW4{WP*@%IL1y;$yHtolozoIB#2bP! z#5ZotYh;lm4>9=M|^K!Z+Xpu9PJ=+2NVBi93guJO^quA*vS4o-I>6 zZU_Cm)CgSO6h9+V{EV661*N*eVGGlwB3MF}O~1DaEE_O^1^SI}ts5Ss7v~$Bl|WsX zdVpB3R#btkX3)@0{3ba_!ka1~!z|6Qp5BIfD!p3udJd`{(GJOWucrrJ08X-2OH%gQ zc4X*IP~&`wS+5;Dw;r=7-Cc2Rr`Mtu;Ikmn-aQ3?HZU`Q}jVz@u@PGlqj^6CHtA^*dC?} zoRm#NpwLowGS-H`f3ayoXeoYc2$U5hE8o@}AIUfw5vW3;vVxp7zDN?EO~9tb4(FaZu{~`nzp#i1I(G%zOv3EOHIm-(SnH+EICX39 zrSMa0hQbM_Z34)Pwk_nh{HGIbvr;5mv<>b{(e?$S?K05zZy9Z4?ls!}hS4_T6li-Q z(6&`zJ&<#)_k~->Mcd?7j4Z#mYiti{l+|~G$Z0zOTKQZ5Ko}STD7@peO$F6}ofXkG zYzPhmt(ATvH=PeJMcb_tw54cU`*f*1v@MH5dWN=TOGwZ3K!PkiL))70!}A234Q)Go zqHQgf0BgEZTmya(HQt`J&6JY~Z4-aFLJQ}cX=s~qg#bj`lvYG@4GXkQBHFem`7HCq zr%u}>qHRm|Gxcgi$!I$bfoOYD%AgH_|6+F#+UB>0AiPvNhE-x|^&xf-Y_3D1pY>kr<`_*=w5 zr;*t=Rf{gVIfTTNTR(nXJ!PNvK3=R=iy;s==?eHRTBl1F#i!xx6~2H}j(VFu2k8@i ze^h*0h)>szPvhazZyKMno-{sv-uP4pq2zI)ilAxx+SJ!Y5db;d#+bBV zU}3t%q~X|nVp0)bn@QF2Hj`rS7n1@bz=_EwfUzGAA& zOAlw?4A0*R>F-*4Ec?BX{?okv+7JP_LuMIxV28Or!nr#RWiRA|onnL?;$;7&>~+h& zL)m<;-j$vRRQC6DQEKH9sgaz0%V$5S~bpV1v*jfz~d|*;36-fxShn*DQkLnVo{dD^IH1$ zDNti5VLC$Y_)iwoXomfQ|2ie2#rN*~9dnpAZ9qnFM%|&OwWdp|tE#rQ7Q&pX_#m4r zhFHydO^gN4vWYgjZhDp`*yJFzL*9~dY_cI0%BZAqhjc6ouH@Gk$F3EE&?>>a23mpS zoLAC>BlIjP(dH|2tqrzH0ZHS5ZIxW2l5?u$Qf81ery)FxN}AIUo<$|i2?(p?9F?48 z-j6=FGs&-#pqLQ=_4}lCyXkGy$tJwwXy4!!AxP(*V@H%_U^RVHmVp%yLZrT}RvOZB zj7oLANTvVo+*@r&bz*$CSKH0dvAyQbIPQy)MWaLBwElC-;v_)c-^oN}{VZ8fdq4Tr z^?vfpT3%I)Ahk-syIIt70_?4v0D8y)QG9)*lq2*Onc%2Z81-MmXscj#q=b-!QO^`c z{g*J>DhRa*CJ~9}+Qz(9E|O@KRNLn?{S{)|?K0iK-=}&Xwgfz*YM^@at|!Laj&CV^ zrx4^`$qaL<|C+^3yj3w|a&^GsrK9VkxXy`%MTFb#YQnx@pj&+E2>o=#oOIBgLZIN5 zlq+O7GPS8w<+vXqP6G6-fF$RkO#+~@RInA4^l=1)SrxHv2n(8GOjC~wz;VOLzbx~K zapUrpdJMwwXG#jga>~DcaY7Z(;!WwRgm-=@Y` zrJ8WxKUA_iJEUr~N|p(jo2*;@Ko$7+UvCfkH3Z-D3)&3uQ{?TkiO@CS*LzBIq&xur<`Mu|TXhSn926qPt zgSlfQW&lWL?LubYsR2`psS&7N2QvpI_Rv0r6-wOrrdXpM=q1k%kH+ zvycsiOoR3?_GWMzk1;oUDJgL23%V5T|>b z)IGByK@~UV2ajj6dnw|2{jLZfw&JGaydCN-u(?i=12fNof+3keL%XFG#EaXi+>CVp zQ;|=$XMKzVG6GM-V76}n^jfvxf+8cZZlGg>!>*2lx>(*qa%9U0+&OjPGyNk@3lu1;#j8)Ebb&Y5nbu<$TY7&T`g?(q~YD2is7x z;o?2zDjN5$Y7bDKu7{t}0(+{?IiS3Qy!UnWiQa+#s>ivcSuAUwzaTPCx$`Mkfyz=g z0hg?jJvGZkjvg(TH-WwGW=I~yeL%oCCS44SVUorH&!VO_j4DMnEf_W07a^1vR0-oPQZZ6Mba@7}Vkak42E-Dh(pi5v0aSiM zkmIspC;zPE6Fga1EPIkWhf$!O)aDC(^jKcY&tTzw-5q?+{yBcN*HjBSiN`ad=V_%v z2$T)CLt1)6pz~s|3$)6%{k>)FS}urN*zjH3uNh#$Y}>=)`}U5QUGRlfwkLc{6YAaf z+`<4h{{QygJ-V*5yz@U-=}23bqlMGO8 z^he3>^L^fT@3W62hlGLEt{DRIKKp&&{a&8?^Sn2EclDQe5is=j80`#Xp3@u8@1c9ncCgG!X1&RE{>8MAAz8&8*PUULWK}nO(8O5i z0RqX~wob*7`S5#b2wHGRT~v!i)1I&=hgkdf-}g_B1ty4H&hkf}%=+ptM5h0AKV|cSbl6{xxP60FM8MWwLs`)j6u+ZN9Vl=h;|bmKrE6QH9!l~CZ~s! z7W_m?NP67X*v5!`avRBriB;3J#?6;!|J}Rq1z)l7aNi?1+7KMrLyW*CR=b3eCbyB} zb!@*;@Q<7V-Dj7E(MPwV8c{7r5j&uyC}>nGa5+MN_e8bdG|KEQ*BjM-XM?D=+h}-4 z`r8{6=k4}1{4GzzO_&6}Y9K~YUnA`bnPL*s+?%qV&6Ie7E%ovoBsh>6cjRkKM&5h| z7{=oWUB3H9qnL8If%P<9LnYDyJf=#Jt1;4ITCCTtNmVBh-SRL?LyAN~5_)&#m|S&f zZULZ`L%6s!w}jHtFnC>>DP;F8b2cu`Egz#Cf&#lo^nxt$ zY&Z{STuO;9c|Kf=mU4V(TYtM`2Skj>rq-CLspNEKf7q$~Ze!F)j*BRry=W3|g&dDl ztK_)J!?YxN*2%UxaHZaTPey!0XApL?6RU|EcHjeJ2ndhx5JMw4Cga{yJ@Ti!eAwy0 zzI!3vcIY?@9ixD$LOo`xRi88>5GlyO;T`GBnCu%x_Nm^kfDsCQF%SSpE~0u-_x}x4 zuW|ekRNt2%dd!98G*1#!l~p89(sGI?X*t1@w4B~adO30@`^QM_FzpYac0^4-8nr_; z5_Bmkmfof+mTS@tO?g*M%u3hYji_iJ$Q-8R<&-Sf^^ar1 zt=F_pX$|6CMk>{>k=INZm2G9tYGo+p^f`nc<|)c3?9$Q#$13I2>wAoGI!|MTq~Bl* z^2C2}36eLS<4bXwj9Mq5k&2Owh^00Xa1~3BwAJi94DbVNpR?NF=`~@)>lzz0<&?rU zH73$P8!S+K;9S)FoMnbc@=@yp-uLB<5zOe!PaE2tpdrKK_hyjvIgu{=UGPvFcP`FDhUzJ2}@BD z#uF9D2=3;4t!1?3BHc9ZCK*yvlc;B_S1Lk>U4v$WuUSEE6Ba(KqcO9dX zOJU}^0hpf>ETSBJf0#=T((;~2l&<&581puoa9z0mU#L$QF>$7PIhEOOW;c3-Phzv% zECSwX09EOTWu@6I-7f>?{6;4R3ueGPVrF+_vOH{g($C)PHoF0v-SxwhLfk7E^~w?o zL_rwcD0MTcc$(2o?u#<*%vw>Wk=rk0b$NpY6UbVY0q#wfe{|uEZD^F>y>7247&Q)r zj1@T!yv@bN3O<7wE0_hV87p%cL|2uug4X~|m>8C6tuRMytnhnn`Mb79!y$jkemgTp zrQfN>$DJ#4s<$gCRS}h%Wa=Atwu56mf}`DGS8o$Gh9!XWK6y39I4&tlKw`M$C;{Ju z1erN*TMrWUGNksnu8hZwn1LOdzPjM&vGfHlRRRcSJyB^o^QH(>XSh7 z-GtL!a+Kh}B>|uk{8LkE*17`+<|?=?0~7971S0bv33k5`&Vq;J((!gEA_*G?($3Io zBVirCYXLCycB4DifY}DA-~XpDEU_x!l$t=T8PN`=9yYHGXFwU9+?RQyCZs_dB!sLl zzD;SjYsb0=|0}_$_-+}2P#;J#^`Uh)TED2?2D05_!gJkLIqLvFD$2rir%2vw2YQuo z8Q+-j7?YybBvp5UpyeVnK6#u@j)ElPt`)4N%lO0K5&IJuhM%?c$V${Z0P87FY*iFR#u!DtFq{RZTU&w8+pQ^EWBS^hAo+d&GvT1_C!}?@z53pBv`zD1rH>M zKz)KU|AZc&Kw(NG%)b?Ntgx$8KR%wK6f&+7R-tmtX>>UW+fX^UVe+u`O~OLN4U7CO zlPJ_I^DEYT#_|$1R9x>eobHP=yn7dGzl1cf@QVgVtpv9tv(&~*eK^KdNz_C{AWDjS zQibykhKQ(WnVU;MIMqj`t%PiWC_$fJ#FIRQk;|91gb(>@hZx(!HhbX<>y}>h#fxct zT5~S3Kx8H(vLuw5+A%>v7{>aeK{?-&?U%Ah+Rar=;p#(M};Dl&2{y5?Trrr!f%; zWrXYB*4s@$ni=Y_`&||_14I@jZl}s<#@kzjVrBM9j0lX$9i^u_rZkggaGt_{A%WQmh>-&FKIv4{yXS0ST$3|R zWig5$QkB{ab;TJo?XQY%Lz1`{=6B~~R-m7leb1oEjt#G3|J6rB4qL|(I0Ntf@i2fq*n zy4|OeyNB~M?tj!de zrlb;eGy1}-uw=bncO~i-J~U-dyp4;7Bq~YP>#03auX^HQ&@p+{SF8b} zIO<4ND~dCqL~GNH!69?BWjB!O1Gr{rff3GZ1Q|9X?q=nox`U04XI` z{jYgQRbUEHY6cP(f$$NCCsbw=mCR{2Il7Yt9@`=cv3_DWumr zwD95g+{>{RIYmTC0$y0Px!w*)wxgFlJ-r=LT7Y4V$X8;mLims_@EaGs@lz2THaeCU z-lGIZ#2hAp)l6ML=QgvKXbqScN0-*!iF)=kwd+_ap|NH)*6PnVrG>T=pWU_kXHx0f zmDF?q3~@c!8yeXH6|yD^z!6zgAFaEX@pbA~ms#i%?X39{COgH6#qEL&KRv0EBZzge z@eBYoTOd@m8cyq)y2Om1 ztk*MsqF(Xra>h@z5ix$UUeEZ6dRJk5ju!!5PQQ7*lC0J8)#% zj1Pt_%nwN(Y^)UftJzuu3+>>AJb9a_fFtZK9bu^y@9m;!Plv@VWh3b#|ntWBG2b-`Drh~E^pNIzR@ zUoXe7YQ8qh#&e{S7M?bR9r7AlNJUgB5~4bs5<+qFNp^q4-1hBz?scD2tJo*1ZVgAY z$R~ipS#DbD)P8rWv2BIramxZ6Ve`E@>V_V;jN{4xES9WA(&R`!2#BOnJ@u*laYO<{gb%D%HeFOTOfoR7TmR&amr?W~A@iIXEXfTWV$a>TGa;#Y|i- z_y!KtXP3J%p1D*xu4qDVu^!7zb_W1T25j~W8`$9=HXLMtI+LRbw5TYz!ZJk*4Y}n< z%;BNf8p`S084l;O>QTq=r26Tj$v@*4Cs81n!zMB%`N033Js?PZO=RwYHeL@G_fTRJ|R?(|yT3(SYkFJp|Zj)5lv!h_bi8OvVHzA74TRNQS(i7&l z6K+1eI*u>nJ2Gw9*w)YBq9|tr9}wlN1QB^h8#DXq>@Rnq0X=n=x0XgRs#h1~w91^w z)0nBlM>%CG3UY$2`HY%st%?;uZqbTVxr-`#F`kB2-@})kk?_;d%x>E>G!x*_H1t1} zaQ?-3HrnA23bUA~f}?Pji+cdH1q4wX^Dqg@GSU^((XiBlT*IpAXrdnS$v^=AqP<)^ z;G$J;;T8FEwCerxSF^-bQY;FIIC=q{KhzReIJV2~4ri>o-y+3u70;;5ocqqdgQsJS z*we(~w*wPJMV>w6AR6OfMnv0*T^>e+`s_T^QnW=_)`VY#9W8PYbxGG#yViX3=+GKL zYeebh57_Z2Emi4erPvWEI_t#B`&Ht8af+?nPDv%1WsMtbFF?+AC+kJM(c%Y{^Avm0MTAf+D3nAeWn@IoyJJE^nJdPP$I;1EJg&oCY$A5Q zblp$&Adn*nU+<|myXKJ04e@Sf17&hSdSxy9qr~v47o^9_+BIT1PY)~TBJie*cY%GV z!H#O+sr?{2WGXD)+Stx9@8!8r`d8;5lrQkpOdxw(+{jF9cl1*cDawQ>=;CX5qGOA< z=$ow;8K4%-kEj;sL0S1O%BehVqCGL6^__xonAc`9qg{d!YbTk%e3P$+@FK^fJB$fO zs2XooC8#y>>=Q&9d%eIW3KzsAS)YhGcxp^oqy|9)nsa{*O4-KpL$J zwA#}4mH8k}SR|0^@RA5K)LOSY;5Anmm#v75(AWn%UG7th#5naP0kGt{ks2>#mF&3wZ5`RHWB>*@>`3hB`!bPTgdJ=%|HfGJ9SP~ zV}5MnGxi2jp&Cz7=q(uVSplYo6nEzw z|K-KoAl!gpYf7-WbPrXbe1xMF%$W9D{!m7#5J(_qO7&89+5)R{S4a!%2eTn`RF~Mo z_Ybw)WSf3BaAI~TS6<)(9rOL{Zn6sykZt`dtvqYBQ(VBIEwA#dRc_qk5)r~u`S+K) z{9&tI(P67Pi4<3e>5rPmj08KqqUT!8%N|=f1v;UR2lz$SDYF1r%wF%*(LP;-rby>k zkzf`4XaOnnS!!=F-CuAID+3++qhstI-hM+C@KF@l3WTVb zyoM><4nAS+padf~ut~OB7nNj6KfX`UO3}1J6224?DAPZP72$wN6_ry}ToP4Oj#qI> zR8cuD#%{Ws8q|5w+J$J{P;@lvhLWhGa&n9-MIDvXVyun}xF(0F1NNpHm2+b(g&Hcy z##jm!B<{`CI1UX;9ISGBj3#Fj{PDXf&}(!|Q>RvlDjER`Xw)^n%C}2??|&D$^+j;9Vjd)A%}sH>VNvf@*ZN+qP}atVJZdL-VMyU7NWPIW=ei zYodU@tZ|3Al1vFyI+aqu0+1%|bgoHeKMga5>`Z|8OlXeybyLUK=e6z}LI!M`%RPt; zHf;Fz?e#HO(MO+@4Qf%k$4-?s-9bv9JH;^qme(;H%Mg}yz!$9$JnpAEl(h+S=_u$f z+G!u3R{Ys?CYvC)&@S_0x4ly`85@j#14+~R=6Gh%2ia&$Op4mBdEE>I0iZ5T3+Mqr z-$E+z764@_>8@yjKZbVBA=j0$UG+9Z_sbn^pVxpePq1>RQiSFh=XsmBeElmwTloWN zJEY=@hb#XF+2R1@5c=50bZDb}U4z1iQ(uhmaE$IMj3 z6;VQn!c7PzG%w$C%(>>D713Bl^J-e?2WVcWaCCd8=^k`%J-Qc$>_t6i_q#j1H6$^X z!0I%thQYlYRm0G12xoOk#j+j+<5*{Tq0}^EPyD6s7SpTs?om-<{#}nloEH$appJ!M zb5#rYmv(4avsdD5OHvE|{PS1?qbMSEWtI-QPcsG?uh(V#Fqp>pz_dtlm6Zo6xXcNp8~sSAXlEPY zh*mC8HVIhjh{F=r3v7x0u%faX-2Qg@*jRl*aKG6cm4Q~qxB9Ruqp1vH)xI~yN3=D^ zN3<2=poZ@wM8O~t*fvOoq@}JRTct9!8`&xy@o8qNfUo7tXq4_ljne(nD1BurShQO( zG)kAKQMz9mWuhQ@U47ChU8+Xuerc46l4^TOA~RvG+(Fl!xnikiuE;cTpXsPN_e)3B zC90ZwmA$hgUzkT^(n;V7q_U#E!Rih!T+D&&i^mZF;&>=#w{Ttb!RU+b)LYqGAsQA@p;{%1S%yk}0XpEpNOe<8BWUmQ zk`W1o-NCzt(OG_h7fXr~o+T(^$x#9=be2ht-gS+Mv7WENeL!kdKtYzOFVvvB?)yrO zE;-RETlmF{ro*JK5tbw)8MTp{enPBOIS5FCik9P6yXYHH-({}qU6KsB;NrE3+tw|K zDuar6wj}CmbjG}|gbEOXy8d{`Oa1t=Z>5;fkK(&lh8hx;(ha^IN20H)V`wmQm@0svST#CD(h0*-NK6l7{{f zlMdVN;MNead86p!Ku>ASa=+cqf6bTEy&VuVr@$gj;1On|xhOTlgxzlKy2Z)mkpdN# z7?*4Y@lHlR>`H(QKDq7P}^Um{agyk(=o zq`VSo|6}qK=oZtsxrLaWP>z75DivUIk}EKcQc;TfD#=By6f{8;JNGGSx}AF9k5kSPxofC`|a2`Jn;;v&g3as zT!K$@j2ug;Tjh~sBD#DOe&mIxxbH!y#nBbj&)2v7?YG|dAOH4uKK>~?O|G@Ph>nB( z2r|gHu^>;Y<|&j|aF;E$x=)q4sJ5u+$#ki4AoIN5cs`~lx$`_#A?C$xD)oH2w_eZ1 zG**Gt8e;w!SZInqk~hzV&z7n~|G5J~W`XW+t3!;_Z`i|D_cw}ODE?TQ^@0W*=IrW< z$H*@Tc((GqbzACw9UYnVfI#bMjbSW;9C%>mMp9!DM3{uZddbroX6=^&Q?Q{9z~K4H zfr|?2V)39;0G;{)FwRF3kRq*HA9JTm;@gT7=#l_5hb<;6S%h{EQ-@RiwJ}>;igiCy z{gy%n+yb1e00A=u6r-LcdmE{2>n#GyIxAXZpcPT#$j_Rpj9sOytreZUpU!q!70q#@ zmO>2`m(5bBAnC3Fvik>_0^&{%KY+$qE_-hcg0aqa4QB3tC4-_q22~l0zgUE7IDsb# zC4u>V0=5yDD)y5W{3eh}jfa_j!U8e@i`3IqFK&L_UJzkXj270FPqLHx$A>?+b)(=dIIB~(<$JAQ@3wpUS@y4ILpNc1z%2t--2y2QnsN*gTVP}+EBsk?{OGWF0P3Y&EkJ>iCMBM+585lY`uXl)NQ*ggOf$lnmI?YXnm z(1R4WWAKGkDR$wbEp9?#1AX15+W^}ImM+lL9=5qgNZydBRwcXCj;(%-+UcU5HM*vu zzz`WqCj|=Dj+C|<*kExIecjQ6{8nTQo0;?6T`MF~qB4{~O*E>8sEL3kI(yI_?06_M zzt%%1gC5|)aurs>vqFufHt;d)8W{#P`yRN){jl}ox*#xe2S8Q(o-}=-c6FgG*@bqx zQ0VFHG%o5;gUn$d1=`DYWn%lS5hHD<9msT%#%Tjzw54cgGMj&4fT zv7QyVOtOMimS~!}oxEfs$Z4dc^Y2wsVLj$0`aFoKi6y1+7Z=m!DRjj#J%0@SSlBNV5O)-wtAutTNkfABvH*Q)%W?_kCZI=B5STL zrs*<9>9W>Hp|Ru`NTIF75Y%6_CBhQmZN5kgw#r=ac^cVJ1K;$ruK=PnQUK5_@&(ZP z$50oMAr#@rP`SMvTvZ=#5CZBI6^w>aPak7=)JxGukU-WO^x2pqXQ;PLJVGB(CU)PM z!mE;Kz&DBOdSu)RTqC1a;+lnCNnBG=HLd|b1Xo+I1nBDH-o?0H2D@dru0)1oTvv7t zxFn;xXwd5-_`e8W#S~B<2aCI6z*)&dl z9G!?TD8T0PINkRkYwHz2k#;gV%z&#qAw@4v94(rpDsDHG<}hX?D!le?sBpD<&vbAU z5_cs*cY$}0__;r^%>Wp5~EDXAmh5|b`}#r#&vdovjBpT;am|i!us)J0G}XZA z*UJQw-~;m6ajm5?X5p3E4>qp zky9h&Fjt&Ff+0uCt4g{}+=+FM97L3Wm5utR1!H6 zIaQDY+eFo^f}G+CWiSwT25 zvO(yl7XStEIhu)0Fp~Kg4Z3>}`vuAFWrMz@fDTmb2%Fh@YPtaunPaCuU6DE4Z5PiSp2YK0c4!JGuxfGDPdouI>ERq zkKlHvK7+&8z7$HY;ozPCrUvppE_@FA{~*6MdFz%Hz=D=%hHo;oHPK2yX? z%Gkt-%Zm~&Qp`yiD^d9Zg!S;ToVA&_2Aaf%Bd8`2(Q#yuvgh7Cts-g+9FXKO!6Nn1NWirq2$1=K{V4*G zASTsWIGCi?ZH{KaEK!4ORL3>$5|=Xj9#9m zIj-aiu5t|kCcYSxpC6`zUWt%32OHNk5Z8tp2$xz$cQ5GSS_&c<2W?wGNMO+ffq6(0 zVWLA5XD+fqPy#1`@TtT=z3whC{{rRj>;&~tDx2{D6@J>#_<1LiLri7m#Of$3&7``a zO9Aj=t`E~rhyY_V)Qr*uCewe*d=m)8u3dqCg)#+2)ACe0b!N1qFxM*w@PtmZ4w?_|X+QqjF|LiFtcE+3+!93B%Pjc?N=pl{Js1j5)*zh1`!`>7b) z+Zokb)4*)1cfS&wN@9~7$xHjrIb#WWBrh=BVtHX5X=nRvIZHb@Wl~s@dDwlD2F9)h z>i_^}n~jYuZ{TImsCC}L0qfCfVQk+=?q5&Ecd{fi;;Y>B74BbT>^a?mo!F45 zR_cU0)>NvM`R85zwX0xF~W7Ivny)l9=nx*3OVN2?s38@ZQonmomKF9}#n$Ic- z9=ueu>Wbqlvu-6P)V!ZGN97tbyTmM;%cr40I7(_#7iK|?F>$!)JkSI7?i#a{yT*(K zysxY@o{+9#H zsELB^rZSF$iEb)mxsYxu;~#D+tMz5KrHJce07qYO^O|juaMe^_VpdzJi->gP5;G4W zv>j)Y>oz&&dK)ktd`F5OQSEtIhP`Rn8JU?X+k#sghpml9cGxzj$MznN>?C(MoRX4IXLbMl)Ru#t>w!NB7I+DM*OP zt#n|0v_eaI(PHpT|Hn6)0jGGNftzZvV-}=%6-*8ip^teE1)ZO8Y+{$!TA+8 zYHFX37}w^*Sv#j`I84`e!r0)t$QumOWpi_72#WdTyta|?Pgg1HCcb~|iAUYUH=n>9 zu6QUh=!*%C)CwH!m(`$60U?c0QM)GRHu0N>EzF~o?HKdj30rTj& zANBNUmspmy+-?_FR=dPfI*T)U2i5|3{LVx{N@s9J`G_MSFn$NCcKKhF&j`d*aX!lh z4Yn>nA7Vl8Q(+ z+pD!)v={&>#6XZPwr7dH7FndqrkOi%n}JY2ds_J3Ehdv>td*h#76QH+s73birHU3UM;EjFd3)6&Gwq<$BC{CHwp+^hTeW=yKY&$JDrl?kqxC63PiVF^U!k)4-S17>dA5h&JlH~@Qf|?k z)PX~@DHPeBpxMlm8r5H57cyxvnz=bQfo2LcK&~1GXyzd_+uJqn?K=0^s)x{Qj~&2P z3-Aohj6!I()iQZj%edYP&HPsHc}RiT2$!Q-O{oyz0L=!NYBbZq{@yyF*;X;uf@Y_V zyi(#$**maH3=s!H~47#^d2Lb7vG2-6*A-!x= z6Z;zpu;}-ea+8;5tjb8hETZC;hcl`FqmQY*Y%m{_ov6Gfz1?a4X z6?bhff^9XdB(ZU2EVMW*@JL{xAJOWTTkgSMF#;9EU;qj^x-1+lBX$iPCa6*+#4+b9 zDm+D~INEv6Fl{Mii)0t28;tUh4LRsb7&3m)dH2GTz35)WIEPagD=$sF#F!IDQBSi^ zV-c(+fImcJjK3te_6wzqMkw{bEEd@UC8OWYD$u%46b4?bLIJv0d8JIG5mS2!4q;eS z_lo49EA|SdAqKzrgNHD4WogKcA-`$Yq^(Iqcsx>i*_Hf3IVsU~Hkgzk36N<^SQv0` z!|ri|9>b}d+~a1!mY*mZ%wY+|A;%^L4X6Xif<F-7^TSCw#9BhiW&VjsIRuxm$RojDo{`LS@luYMhg+R2LFARn07aUclC z{QbD49II>Tpt0Ypk#e}{VUd;3>Z6^8#k(Tv5_bgJGCG_khyfzWp)9`qYBYQe?g!lOTCoX*fPKxZ&zrM^Ki_KFdzq>5B#}AGQv3H%Vl_Ak) z_w%6(?sZ`Xn!-0Ti_-0AdSYc-|EY1~m+_EaW^dQHx9i+vs~+;p?6Ct0D6l&n7U4tQ znf7Lp;qc*JWC#*SkdLO;h#FYF9-0m@LnOAs%li6K#c}>xE|X7e%KFjJR1_-y2~GXD zXv$_5euQLIne2MA}b#M=wubget$w%|F4qOiA`Ed8J6#9I;p)p|0Ny8 zJb6o+8--cpDRDceHBrdh^Y$D_z2Coo&_5rs=Wt5vrzCqnl6JN5Hpfjds>QE@&9XKk z^)MGTiA&mTgCa4d*3i8xbIvj^Qj-!7`$DQhk{YY@hwaf*&oC~&c0H=<$jh{^m|E0_ zWm7%vn(9$U-BAWSZIDq&mI)v7v~Hrbro7;Q`eqDjjmrRgUaHGJn;1Ksuo5iEvyqZpEO$V?p{!0LCmu&$JuI)@?CGg}t zrB(`Hez1h(7Moq>4L>M9TWTqXXSkM?Qo5aoN2)gsf?F-3z<9KBsEyfy7F?Wi{v3Pb zW5~(z>21yKCxLB`m{29$RvwJN5wlWRNuz)VbJ)pLz)l<#=trrFc<|Mdi01;1I+bzO zjNk6*lBkK}KC6<1y?CQ2%Z4{c2Xr{fqY@Um#9xRQZDCKec{XOk%8`UtiB26bGG27U zs+@V$ZacH7q;mL?OQI*0Ewxq&tAn)TmGicI2WsNYv|0)3HnLht?RaJ2mGM@Fd8N^@ zgxJBmGCCz0uq&fel0iB;fgm0ow_iFYT?XeDQdS95x={xsiG-exk_6{PKqOHFTd5;{ zUvE}Ss3bb#heHxa-04$g>Qk<6H}NTs{HU&lbIkb*X%;2lK~b#ER|2$K-N~SN7k&G8R{;Is-@$8j0lp*_BoU(F6(2!1(IT~Xm0InDnl*N^EGx+$M|E(1 z6UB9gL!Ff~mq|xCB@Y#}#-+H`)48;Qo-_ftA68R>0HTqzAfUEB(j?UAk21MHK}#w) z0aVAH@|2Sn36ZF@(CQ!yENtPKRfHDjMN<&!^>H8w7aXO(L0x%irE^x&X8kPr6~= zEji2whiy*FiDk9ii*B)gFMx&Gu+Gb2;XPZtT3?`LAzA21s53{6#3w9LtP3w9g!%|p zUJ$j_-)%AyC7d5liUUuEcR=N>aVCP___?}}mD&N~l zBdsE#JjrMXSB?7L8uy==J^e2l?DzZtwDiesUH4PxX3}xrf_29%xH>>(SyQ%5^F4HF%{I$Ods1Z zGBvh+dL~u=%T!Q2L{2?_?fj*!)KV%~r(YTV=uE1>U!FhJQOjQn3n}PY;71F8i~P0m z_a_vu4qA?lOpP2Hn|&ahJU2RhVtn#Gwi>5{w(+r}Bje+f$97DQ+;`8p(PP$& zZ&I6@R&62A>e}WqtJXH3xk7DEW>(hLK;OEpZ_j0dn&FYNv!{kr<;$61_ss0{dv@>HvuE#~fjxtJhW6~++rM|` z-d%fl@7=R^@7{sEgL{Ye?i=VI*g3FkVE4eDfxQC*1A_xY1N#R12X_wc8r(g&XK?S} zz~JEE(BQtI{-K>iyM}fT?HSrTG%z$cG&HntA6?u>^ZTfJAD`_bDOLVNO;9`niM9fq zn{y6GsqzywLDw9qTS#5tDbO7RA8UA~%3n-;vzu@FEcJ3t&d~{+}55!}YFQ^DF}k256mL3CXSEZAEwH44Z$^$@EQq^of?@A zk4~PQI6gA{!1dwStg^-?W>6HAU1$gjVV^#q;q6jGP_sFlJP{s2G&clk9+w+lC9z*< zT$R`t8iS^zqbJ8E!W(W3M<)u>bklDUHRX*Pouz0|LX_`pni8O8s3Ug6v`C?PBNs!lnq5XR$$UjGI zNBB;J_pd;XBg@N8s}5o}x!zEC$6XT9oLyz_Zb{Ols6}XQkz0&|xk5uFuSlOwZ1QBeT?V zp(SXvk%45NG~W{ZR4Sd#=LCUdL zU7y~_Hoz_Ut(k4X_H=)CXLeWS@$|*aZ)Scg_iqb-pZWjt|B(BB_N6)qy){_K{Pz71 z{QQUhP5;{uA9?uaAGxq@{eNj{e#0BL@3{HypSkDX{nzs!`tV18;WvNpGk@@a7QkkIp@K{`a5$qtAZr>q~$0 z-uJ!#13&-Bqw|mb#>L-!;xm8r*)RR^SHAie|M~Vu|L{+r`N~%hyy@WE-|^0SKJej> z{NATN{n^hw^T%Ir>FE6FyZ`QgegCDo#xw8wt8X+lZ=9H1xBi}=efRJD?%#KGZrFI+ z>)v$m@LhMm^WE?HcVBw`Yk#@)H~({b<|DIbfAN>TyyKp0w(ofScR&5vKmO|1zwzY>36^X(pO%3)4{uby0*|Q}R;Egxma_fbUe*dMnoILyNmlyx+ zh5z*5zW)-m*B(5BiGEM%p>O0KdTpU6pKp2aiKgrGr}u8?nEOVyyO8Ec+xpy|Tx~X8 zTT@#M4mG#dzO|6at*fug7P7Tj_PAvma`|jflWtm*AI`Sa*5r$Yx7B89*EAl=y(YUY zo6fb=G&c8z&_86~QM)GStZQ#*Z@9OnzGiLB;lh^u zZS`Ao4Y_o7XRtN5wkF8VJwevS@*8v8va^L7vd!5W1`CDjY94y2rK_-`Wm`5Z_BPKw zl6&Zvx`Q=8cUQKfJ6D|hZhlAp`r1rWSKZui4a_#o{rTF4{M<|VxliRcHT?23_5WeZ zn)4sZ4%R(*cl+E^g}JA0-kYnh87kaXXsDSDHe~P0y`ygKy|sa}WN-HMI@-{M@g%Jb0#ff8TXAZ_LeoC^z><*`91Oi@)YNgIiKH=`=&mK-rmk z+|y#ZCD)p7YbCmyS({y#U!U8QzBhY1^K|CVGS4@Bt?th=U(ftS`f~nTneT*4xxY#O z?=%vyGx)`H!?oAn^rnL!`ITS!*EO|u12^9Ew!dBcvs`=E+ur_%d%yD4%dJ26fe-&m zHI=^U;PKJB?*7!L&%f`Jb%Pf^da<_t`kN;2`Og2i>*&XS`P#m>esca-f96u)3)z#PZ?H(Gw{q=7=^p>~2P4sr;*yxGV zGxz`Odp`KsZ~gAVrNtdLr^-uR!M8H+EdBF*7JQ86(mS@#J+wZ%vw2-^Q{9IAmi%jT zP1nu+R?Vi|rd(fPPmrFw@ZexwM}1-L(S6xtg}VNZd~dcVpWZ)|dqci2m(A4`>T36g z*XA1P2C~EXwY9m1+Cv8hcQ@{?t$Fas#s?pKQ*J}^Ynr-i>uX-yaBbb$;O6pmHP`3s zYu;Rw&KI-!xu1V$>GneX+;6rsedg_Tt#coK z@O9bu-O{|~eTTOE+}Gy5zWELL`dsGx{0%kf+*|WKdom9;ZOt8Tcw2pA_U_z``_?yZ z&DBAfHFF<-@7DrVINR{nEe$#PUDH?C@KX)B8?)=$yZX}2o$v2Xm0#$=8btoe3<@#t zs?DIKo>!@n=hv;OzMfnc)Xt8b8OBIWm7iXRwY^KBe#?T}q;qkF^V>9R&w97vmot{J+uSZ?rVosl( zpuy1{Gov#zSj}bxUs}JaxAOe@pzD$!`V!A-7iVex6?~cV8&-Z+akoCP0qx$b5v5Xk zI$PlhQup&FDF0rp;x28d0Bw47=Ir>ab@%dyATx}X`{srqI5v51_}t{|==2PZ>!R z-pFPs{*wWt4x^e^@xB)~2F1$^Vm-OdAWhyoc-t7P-*N2J=&{q-B0GeF*x8O8?KzHA z4sjVaQvN?eL9t z<6ovH$a&GfOq@M~db!GdGkgCu2eSE><6|eGqN@l3U~*ok;qjCwdmn$!Zo5eCA{4zn zk^8g!cEGsgE1H;`05Vqv+sotQ;VjnS%*ZjpXC|CEHFCgX^$( zb+GQx$n@yMEaRjJKV~`^mH0L-9YXZ!^0;>XZtn-iEAZE&JNGa zAW0tfFBA9ALLL6)oI-k!`j=x9$6(^ z;j`BwY8bX$lYL<6Dh?m^b5&v>dFCX(SQyR=CqMVac zh(!MaaT3Xia*pxMlYIm$@rt(6g+u%~A+y*QY~ArzcztHa$&qtAUZVic)a3Z-k>is{ z!I2ZA+s=&LABjUF+V4^6@zFEGQ&Wug{AT}h_9$K49CTfPx2~o3kf+4iTVtv67`gjN zeQhH5aGd)zxtHnP&P47z;@r!dgPki;K0A32;m{GdEZpLRNq7@FH%bJ5*IiizUb-%L z?aC@|nZ)-$IePGfqnn7&C#N^d`CgWL97=<-E^G;|U0KtK>B%!uPZE;zsVxp*XGBGp zwlHWwVu}Q4N#Fh@Wa5HWm$w8PR@Uo$RXT$=3RQ0nnpfzl3tNM(eyWp#6B1Ny4r%7Y z%Ugr>SFG06y0|qcUgATM>*M?}Q7^Jhr2Y;G#_60N5)}J8my`J1wo2-7O!ybJVXRTF z!Fs+VIHtS4t~ENxp&Yn>tL90BXX_A3Pe7Ph}K zj(mPQDrR(M7$gw=_b=n)Fv2&Z7h&bw{>9A2@A{XCadN)59eK>iWkOuy2{2N>z@O7K z^E-l#uNj$8B%Lt9X`&q`!jbW5BpW(F2@-#oc3hdLU)TYFsrKqb_4EAB@rUZ%5nS!7 zKRXdOpw?D2@@PNCVV4sY^E~;#QG)B|0=b7sx`osz_aeVt?qYv%%Sr-Mdzc@?zz#ET zVq|=HnCX|Z$7b(2J8=}Q8$I54&CKZdiLH*4;j8(bL03|7B6KE?O^+OVz}Zf?zbjiY zlS1qUe~q0vd*+_wqf?VJW2OO?b_Sb{jZ6@AmP#ExMx!CGqxX-^%qof|bvrpDt@*KC zFc1?SwlxXP^za7FZ>}H;bTya_i=P$&$ z3%i5NI6MMa_67|{w$_K1WhqO0EvP#;5cI9At9J@V2Wx0VCg44?1ka7i z%D6ZHJ`r!%(9fvPe;)Vw61kVi71u|(UypMy4+L8Y4q~r(tXQ?01UxoAIx=x~Dz?g8 zdnnvNq{*`S{!?7vW8}_}EA0}s_7`#P(}Os8 zRoP=_G1w=tmoAZ~4{0jU+ z<_8<(#sjoE&=JY5nAQl_PlC#&8?3*M{^YYbuV`ZO?8#H%31)aO zoG;uMY&d>)is=BwXA(7>Jqpkib^$6k28GL^i+Et^-?&ojEt2a-xOihQPM7UJ679d$ zM4HOzFSHV?i#_FI1HEh+LQywWL}Q6hd_Qgqws}l?^k`DUX0eDftxBW zCi~(F=Wh;nB7*R*j!uqDA9u`QdXsr5q61N#As+e+v;8IxQ|0HWbc#x^N>sWfu5{_< z;40r2VgVKCN1PXP<;Pf%(bZ2q1BrUJQ;$=U3uF&0`&?X&W;+uSVT%wQJIV6eqU`B7dx7j# ztf1bp8CHkPPRgc=teSh|x1*sh^GQ$Atn!NU9x=LU&$%z8f*V$UZAKSqthvQf7mj=TN5vO}`NMD_>b>?N|VV>Z@l zbeagyj67ict3iR&XiVYkeN5$nn=i89ElxB7a@0v_g(wUZhM$2NJir!9)@^*>0uFJq^H*g7IAxXw_{7EW+MzVJ&;>?jDXn|$Trj8~= kodVHQ4AUx}e)*Z=?k diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index 5a165c62e5848..bb52bb3ca685d 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -24,6 +24,13 @@ #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] +#[macro_export] +macro_rules! map { + ($( $name:expr => $value:expr ),*) => ( + vec![ $( ( $name, $value ) ),* ].into_iter().collect() + ) +} + #[cfg(feature = "std")] include!("../with_std.rs"); diff --git a/substrate/runtime-io/with_std.rs b/substrate/runtime-io/with_std.rs index 8c1bad8d7fc52..35c203b7c4d5c 100644 --- a/substrate/runtime-io/with_std.rs +++ b/substrate/runtime-io/with_std.rs @@ -18,7 +18,7 @@ extern crate environmental; extern crate substrate_state_machine; -extern crate substrate_primitives as primitives; +#[macro_use] extern crate substrate_primitives as primitives; extern crate triehash; extern crate ed25519; @@ -156,12 +156,6 @@ macro_rules! impl_stubs { mod std_tests { use super::*; - macro_rules! map { - ($( $name:expr => $value:expr ),*) => ( - vec![ $( ( $name, $value ) ),* ].into_iter().collect() - ) - } - #[test] fn storage_works() { let mut t = TestExternalities::new(); diff --git a/substrate/runtime-std/src/lib.rs b/substrate/runtime-std/src/lib.rs index 0128ebd31ae61..cfea085139d41 100644 --- a/substrate/runtime-std/src/lib.rs +++ b/substrate/runtime-std/src/lib.rs @@ -26,6 +26,13 @@ #![cfg_attr(feature = "std", doc = "Polkadot runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Polkadot's runtime standard library as compiled without Rust's standard library.")] +#[macro_export] +macro_rules! map { + ($( $name:expr => $value:expr ),*) => ( + vec![ $( ( $name, $value ) ),* ].into_iter().collect() + ) +} + #[cfg(feature = "std")] include!("../with_std.rs"); diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml new file mode 100644 index 0000000000000..a0871116e7182 --- /dev/null +++ b/substrate/runtime/timestamp/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "substrate-runtime-timestamp" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } + +[dev-dependencies] +substrate-codec = { path = "../../codec", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } + +[features] +default = ["std"] +std = [ + "substrate-runtime-std/std", + "substrate-runtime-support/std", + "serde_derive", + "serde/std", + "substrate-codec/std", + "substrate-runtime-io/std", +] diff --git a/demo/runtime/src/runtime/timestamp.rs b/substrate/runtime/timestamp/src/lib.rs similarity index 79% rename from demo/runtime/src/runtime/timestamp.rs rename to substrate/runtime/timestamp/src/lib.rs index 2357d5c2ec04c..56ba0be4f9035 100644 --- a/demo/runtime/src/runtime/timestamp.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -16,6 +16,16 @@ //! Timestamp manager: just handles the current timestamp. +#![cfg_attr(not(feature = "std"), no_std)] + +#[macro_use] extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[cfg(test)] extern crate substrate_runtime_io as runtime_io; +#[cfg(test)] extern crate substrate_codec as codec; + +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] extern crate serde; + use runtime_support::storage::StorageValue; use runtime_support::PublicPass; @@ -43,10 +53,8 @@ mod tests { use super::public::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::Joiner; use runtime_support::storage::StorageValue; - use runtime::timestamp; - use codec::{Joiner, KeyedVec}; - use demo_primitives::AccountId; use runtime_support::PublicPass; #[test] From 1ce4e976cbf4c3df7cdd5ca1c8b25c106778e319 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 21 Mar 2018 13:27:31 +0800 Subject: [PATCH 05/76] fix warnings. --- substrate/runtime-io/src/lib.rs | 7 ------- substrate/runtime-io/with_std.rs | 5 ++--- substrate/runtime/timestamp/src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index bb52bb3ca685d..5a165c62e5848 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -24,13 +24,6 @@ #![cfg_attr(feature = "std", doc = "Substrate runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Substrate's runtime standard library as compiled without Rust's standard library.")] -#[macro_export] -macro_rules! map { - ($( $name:expr => $value:expr ),*) => ( - vec![ $( ( $name, $value ) ),* ].into_iter().collect() - ) -} - #[cfg(feature = "std")] include!("../with_std.rs"); diff --git a/substrate/runtime-io/with_std.rs b/substrate/runtime-io/with_std.rs index 35c203b7c4d5c..764cb3b188e70 100644 --- a/substrate/runtime-io/with_std.rs +++ b/substrate/runtime-io/with_std.rs @@ -14,11 +14,10 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[macro_use] -extern crate environmental; +#[macro_use] extern crate environmental; extern crate substrate_state_machine; -#[macro_use] extern crate substrate_primitives as primitives; +#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives; extern crate triehash; extern crate ed25519; diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 56ba0be4f9035..4cc1fbdb63d1b 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -18,7 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[macro_use] extern crate substrate_runtime_std as rstd; +#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; #[cfg(test)] extern crate substrate_codec as codec; From d8a16f1d494acb86faa32d7a62607bf30659cd00 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 22 Mar 2018 10:51:29 +0800 Subject: [PATCH 06/76] Borked timestamp example --- demo/runtime/src/runtime/session.rs | 5 +- substrate/runtime/system/Cargo.toml | 26 ++ substrate/runtime/system/src/lib.rs | 378 +++++++++++++++++++++++++ substrate/runtime/timestamp/Cargo.toml | 2 +- substrate/runtime/timestamp/src/lib.rs | 108 ++++++- 5 files changed, 504 insertions(+), 15 deletions(-) create mode 100644 substrate/runtime/system/Cargo.toml create mode 100644 substrate/runtime/system/src/lib.rs diff --git a/demo/runtime/src/runtime/session.rs b/demo/runtime/src/runtime/session.rs index 514f36169d427..4bf47c35052b8 100644 --- a/demo/runtime/src/runtime/session.rs +++ b/demo/runtime/src/runtime/session.rs @@ -19,10 +19,9 @@ use rstd::prelude::*; use codec::KeyedVec; -use runtime_support::{storage, StorageValue, StorageMap}; +use runtime_support::{storage, StorageValue, StorageMap, PrivPass, PublicPass}; use demo_primitives::{AccountId, SessionKey, BlockNumber}; -use runtime::{system, staking}; -use runtime_support::{PrivPass, PublicPass}; +use runtime::system; use consensus; storage_items!{ diff --git a/substrate/runtime/system/Cargo.toml b/substrate/runtime/system/Cargo.toml new file mode 100644 index 0000000000000..522932be2e412 --- /dev/null +++ b/substrate/runtime/system/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "substrate-runtime-system" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } + +[dev-dependencies] +substrate-codec = { path = "../../codec", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } + +[features] +default = ["std"] +std = [ + "substrate-runtime-std/std", + "substrate-runtime-support/std", + "serde_derive", + "serde/std", + "substrate-codec/std", + "substrate-runtime-io/std", +] diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs new file mode 100644 index 0000000000000..a9634243e6d3e --- /dev/null +++ b/substrate/runtime/system/src/lib.rs @@ -0,0 +1,378 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code +//! and depositing logs. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[cfg(test)] extern crate substrate_runtime_io as runtime_io; +#[cfg(test)] extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; + +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] extern crate serde; + +#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +extern crate safe_mix; + +use rstd::prelude::*; +use rstd::mem; +use runtime_io::{print, storage_root, enumerated_trie_root}; +use codec::Slicable; +use runtime_support::{Hashable, StorageValue, StorageMap}; +use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; +use primitives::block::{generic, Number as BlockNumber, Header, Log}; +use runtime::{staking, session}; +use runtime::staking::public_pass_from_payment; +use safe_mix::TripletMix; + +type TxOrder = u64; + +storage_items! { + pub Nonce get(nonce): b"sys:non" => default map [ AuthorityId => TxOrder ]; + pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; + RandomSeed get(random_seed): b"sys:rnd" => required Hash; + // The current block number being processed. Set by `execute_block`. + Number get(block_number): b"sys:num" => required BlockNumber; + ParentHash get(parent_hash): b"sys:pha" => required Hash; + TransactionsRoot get(transactions_root): b"sys:txr" => required Hash; + Digest: b"sys:dig" => default block::Digest; +} + +pub trait Checkable { + type CheckedType; + fn check(self) -> Option; +} + +pub trait Dispatchable { + type AccountIdType; + type TxOrderType; + fn nonce(&self) -> Self::TxOrder; + fn sender(&self) -> &Self::AccountId; + fn dispatch(self); +} + +impl Dispatchable for CheckedTransaction { + type TxOrderType; + fn nonce(&self) -> Self::TxOrder { + + } + + fn sender(&self) -> &Self::AccountId; + fn dispatch(self); +} + +impl Checkable for UncheckedTransaction { + type CheckedType = CheckedTransaction; + + fn check(self) -> Option { + + } +} + +pub struct Internal + PartialEq + Eq + Clone, Checked: Dispatchable>; + +impl Internal + PartialEq + Eq + Clone, Checked: Dispatchable> { + type Block = generic::Block; + + /// Deposits a log and ensures it matches the blocks log data. + pub fn deposit_log(log: Log) { + let mut l = Digest::get(); + l.logs.push(log); + Digest::put(l); + } + + /// Actually execute all transitioning for `block`. + pub fn execute_block(mut block: Block) { + initialise_block(&block.header); + + // any initial checks + initial_checks(&block); + + // execute transactions + block.transactions.iter().cloned().for_each(execute_transaction); + + // post-transactional book-keeping. + staking::internal::check_new_era(); + session::internal::check_rotate_session(); + + // any final checks + final_checks(&block); + + // any stuff that we do after taking the storage root. + post_finalise(&block.header); + } + + /// Start the execution of a particular block. + pub fn initialise_block(mut header: &Header) { + // populate environment from header. + Number::put(header.number); + ParentHash::put(header.parent_hash); + TransactionsRoot::put(header.transaction_root); + RandomSeed::put(calculate_random()); + } + + /// Finalise the block - it is up the caller to ensure that all header fields are valid + /// except state-root. + pub fn finalise_block() -> Header { + staking::internal::check_new_era(); + session::internal::check_rotate_session(); + + RandomSeed::kill(); + let header = Header { + number: Number::take(), + digest: Digest::take(), + parent_hash: ParentHash::take(), + transaction_root: TransactionsRoot::take(), + state_root: storage_root().into(), + }; + + post_finalise(&header); + + header + } + + /// Execute a transaction outside of the block execution function. + /// This doesn't attempt to validate anything regarding the block. + pub fn execute_transaction(utx: UncheckedTransaction) { + // Verify the signature is good. + let tx = match transaction::check(utx) { + Ok(tx) => tx, + Err(_) => panic!("All transactions should be properly signed"), + }; + + { + // check nonce + let expected_nonce: TxOrder = Nonce::get(&tx.signed); + assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); + + // increment nonce in storage + Nonce::insert(&tx.signed, &(expected_nonce + 1)); + } + + // decode parameters and dispatch +// let tx = tx.drain().transaction; +// tx.function.dispatch(public_pass_from_payment(&tx.signed)); + tx.dispatch(); + } + + fn initial_checks(block: &Block) { + let ref header = block.header; + + // check parent_hash is correct. + assert!( + header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, + "Parent hash should be valid." + ); + + // check transaction trie root represents the transactions. + let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let txs_root = enumerated_trie_root(&txs).into(); + info_expect_equal_hash(&header.transaction_root, &txs_root); + assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); + } + + fn final_checks(block: &Block) { + let ref header = block.header; + + // check digest + assert!(header.digest == Digest::get()); + + // remove temporaries. + kill_temps(); + + // check storage root. + let storage_root = storage_root().into(); + info_expect_equal_hash(&header.state_root, &storage_root); + assert!(header.state_root == storage_root, "Storage root must match that calculated."); + } + + fn kill_temps() { + Number::kill(); + ParentHash::kill(); + RandomSeed::kill(); + Digest::kill(); + TransactionsRoot::kill(); + } + + fn post_finalise(header: &Header) { + // store the header hash in storage; we can't do it before otherwise there would be a + // cyclic dependency. + BlockHashAt::insert(&header.number, &header.blake2_256().into()); + } + + fn calculate_random() -> Hash { + let c = block_number() - 1; + (0..81) + .map(|i| if c >= i { block_hash(c - i) } else { Default::default() }) + .triplet_mix() + } + + #[cfg(feature = "std")] + fn info_expect_equal_hash(given: &Hash, expected: &Hash) { + use primitives::hexdisplay::HexDisplay; + if given != expected { + println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); + } + } + + #[cfg(not(feature = "std"))] + fn info_expect_equal_hash(given: &Hash, expected: &Hash) { + if given != expected { + print("Hash not equal"); + print(&given.0[..]); + print(&expected.0[..]); + } + } +} + +#[cfg(any(feature = "std", test))] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use codec::Joiner; + + pub fn externalities() -> TestExternalities { + map![ + twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode(), + twox_128(Number::key()).to_vec() => 1u64.encode(), + twox_128(ParentHash::key()).to_vec() => [69u8; 32].encode(), + twox_128(RandomSeed::key()).to_vec() => [0u8; 32].encode() + ] + } + + pub fn set_block_number(n: BlockNumber) { + Number::put(n); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::internal::*; + + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use runtime_support::StorageValue; + use codec::{Joiner, KeyedVec, Slicable}; + use keyring::Keyring::*; + use primitives::hexdisplay::HexDisplay; + use demo_primitives::{Header, Digest}; + use transaction::{UncheckedTransaction, Transaction}; + use runtime::staking; + use dispatch::public::Call as PubCall; + use runtime::staking::public::Call as StakingCall; + + #[test] + fn staking_balance_transfer_dispatch_works() { + let mut t: TestExternalities = map![ + twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() + ]; + + let tx = UncheckedTransaction { + transaction: Transaction { + signed: One.into(), + nonce: 0, + function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), + }, + signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), + }; + + with_externalities(&mut t, || { + internal::initialise_block(&Header::from_block_number(1)); + internal::execute_transaction(tx); + assert_eq!(staking::balance(&One), 32); + assert_eq!(staking::balance(&Two), 69); + }); + } + + fn new_test_ext() -> TestExternalities { + staking::testing::externalities(2, 2, 0) + } + + #[test] + fn block_import_works() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), + transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_state_root_fails() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_transaction_root_fails() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), + transaction_root: [0u8; 32].into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } +} diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml index a0871116e7182..aad16b218b83f 100644 --- a/substrate/runtime/timestamp/Cargo.toml +++ b/substrate/runtime/timestamp/Cargo.toml @@ -9,9 +9,9 @@ serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-codec = { path = "../../codec", default_features = false } [dev-dependencies] -substrate-codec = { path = "../../codec", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } [features] diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 4cc1fbdb63d1b..a9ba759f294df 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -21,7 +21,7 @@ #[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; -#[cfg(test)] extern crate substrate_codec as codec; +extern crate substrate_codec as codec; #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; @@ -29,44 +29,130 @@ use runtime_support::storage::StorageValue; use runtime_support::PublicPass; -pub type Timestamp = u64; +pub trait Trait { + type Timestamp: codec::Slicable; + type PublicAux; + type PrivAux; +} +pub struct Module(::std::marker::PhantomData); +// TODO: create from storage_items macro. +/* storage_items! { + trait Trait; pub Now: b"tim:val" => required Timestamp; } +*/ +pub struct Now(::std::marker::PhantomData); +impl ::runtime_support::storage::generator::StorageValue for Now { + type Query = T::Timestamp; + + /// Get the storage key. + fn key() -> &'static [u8] { + b"tim:val" + } + + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.require(>::key()) + } + + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.take_or_panic(>::key()) + } +} +// TODO: all `Storage*` functions should take `self` parameter to avoid need for obscure `>::` +// syntax. this can be cleaned up once we get `type`s in `impl`s. +/*impl Module { + pub const NOW: Now = Now(::std::marker::PhantomData::); +}*/ + +/* +// This would be nice but not currently supported. +impl Module { + type Now = super::Now; +}*/ + +pub trait StorageItems { + type NowS; +} +impl StorageItems for Module { + type NowS = Now; +} +impl Module { + pub fn get() -> T::Timestamp { >::get() } +// pub fn get() -> T::Timestamp { Self::NOW.get() } +} + +// TODO: implement `Callable` and `Dispatch` in `impl_dispatch` macro. +/* impl_dispatch! { + trait Trait; pub mod public; - fn set(self, now: Timestamp) = 0; + fn set(_, now: Timestamp) = 0; +} +*/ + +pub trait Dispatchable { + type AuxType; + fn dispatch(self, aux: &Self::AuxType); } -impl<'a> public::Dispatch for PublicPass<'a> { +pub mod public { + use super::Trait; + pub enum Callable { set(T::Timestamp) } + pub trait Dispatch { fn set(aux: &T::PublicAux, now: T::Timestamp); } + + impl super::Dispatchable for Callable where super::Module: Dispatch { + type AuxType = T::PublicAux; + fn dispatch(self, aux: &Self::AuxType) { + match self { + Callable::set(a) => >::set(aux, a), + } + } + } +} + +impl public::Dispatch for Module { /// Set the current time. - fn set(self, now: Timestamp) { - Now::put(&now); + fn set(_aux: &T::PublicAux, now: T::Timestamp) { + >::put(now); +// Self::NOW.put(now); } } #[cfg(test)] mod tests { use super::*; - use super::public::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::Joiner; use runtime_support::storage::StorageValue; use runtime_support::PublicPass; + struct TraitImpl; + impl super::Trait for TraitImpl { + type Timestamp = u64; + type PublicAux = u64; + type PrivAux = (); + } + type Timestamp = super::Module; + #[test] fn timestamp_works() { + let mut t: TestExternalities = map![ - twox_128(Now::key()).to_vec() => vec![].and(&42u64) + twox_128(>::key()).to_vec() => vec![].and(&42u64) ]; with_externalities(&mut t, || { - assert_eq!(Now::get(), 42); - PublicPass::nobody().set(69); - assert_eq!(Now::get(), 69); + assert_eq!(>::get(), 42); +// assert_eq!(Timestamp::NOW.get(), 42); + >::set(69).dispatch(&0); + assert_eq!(::NowS::get(), 69); +// assert_eq!(Timestamp::NOW.get(), 69); }); } } From ed929e23e5fe1f5b34d5ad8edd1f5cfd4161b27e Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 22 Mar 2018 13:34:56 +0800 Subject: [PATCH 07/76] Fix build --- substrate/runtime/timestamp/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index a9ba759f294df..333879e64a0b9 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -150,7 +150,7 @@ mod tests { with_externalities(&mut t, || { assert_eq!(>::get(), 42); // assert_eq!(Timestamp::NOW.get(), 42); - >::set(69).dispatch(&0); + public::Callable::set::(69).dispatch(&0); assert_eq!(::NowS::get(), 69); // assert_eq!(Timestamp::NOW.get(), 69); }); From 834e98278f13eebb69d7b0f9d37822fbdf0baba1 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 23 Mar 2018 14:12:15 +0900 Subject: [PATCH 08/76] Timestamp as skeleton for traity runtime. --- substrate/runtime/timestamp/src/lib.rs | 31 ++++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 333879e64a0b9..cb20557c2260a 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -62,23 +62,23 @@ impl ::runtime_support::storage::generator::StorageValue storage.take_or_panic(>::key()) } } -// TODO: all `Storage*` functions should take `self` parameter to avoid need for obscure `>::` -// syntax. this can be cleaned up once we get `type`s in `impl`s. +// TODO: consider this idiom. /*impl Module { pub const NOW: Now = Now(::std::marker::PhantomData::); }*/ +// TODO: revisit this idiom once we get `type`s in `impl`s. /* // This would be nice but not currently supported. impl Module { type Now = super::Now; }*/ -pub trait StorageItems { - type NowS; +pub trait Store { + type Now; } -impl StorageItems for Module { - type NowS = Now; +impl Store for Module { + type Now = Now; } impl Module { @@ -97,6 +97,7 @@ impl_dispatch! { pub trait Dispatchable { type AuxType; + type TraitType; fn dispatch(self, aux: &Self::AuxType); } @@ -106,6 +107,7 @@ pub mod public { pub trait Dispatch { fn set(aux: &T::PublicAux, now: T::Timestamp); } impl super::Dispatchable for Callable where super::Module: Dispatch { + type TraitType = T; type AuxType = T::PublicAux; fn dispatch(self, aux: &Self::AuxType) { match self { @@ -118,8 +120,13 @@ pub mod public { impl public::Dispatch for Module { /// Set the current time. fn set(_aux: &T::PublicAux, now: T::Timestamp) { - >::put(now); -// Self::NOW.put(now); + ::Now::put(now); + } +} + +impl Module { + pub fn dispatch>(d: D, aux: &D::AuxType) { + d.dispatch(aux); } } @@ -144,14 +151,14 @@ mod tests { fn timestamp_works() { let mut t: TestExternalities = map![ - twox_128(>::key()).to_vec() => vec![].and(&42u64) + twox_128(::Now::key()).to_vec() => vec![].and(&42u64) ]; with_externalities(&mut t, || { - assert_eq!(>::get(), 42); + assert_eq!(::Now::get(), 42); // assert_eq!(Timestamp::NOW.get(), 42); - public::Callable::set::(69).dispatch(&0); - assert_eq!(::NowS::get(), 69); + Timestamp::dispatch(public::Callable::set(69), &0); + assert_eq!(::Now::get(), 69); // assert_eq!(Timestamp::NOW.get(), 69); }); } From 8646e8b0af6a2a82d780ba37eaaa82442cbc3603 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 23 Mar 2018 15:37:06 +0900 Subject: [PATCH 09/76] New storage macro. --- substrate/runtime-std/with_std.rs | 1 + substrate/runtime-std/without_std.rs | 1 + .../runtime-support/src/storage/generator.rs | 428 ++++++++++++++++++ substrate/runtime/timestamp/src/lib.rs | 51 +-- 4 files changed, 436 insertions(+), 45 deletions(-) diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index 2cfd266f48271..c878b1f0bdba0 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -26,6 +26,7 @@ pub use std::ptr; pub use std::rc; pub use std::slice; pub use std::vec; +pub use std::marker; pub mod collections { pub use std::collections::btree_map; } diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index 5fc2d7526b3ff..fb65b0a242d18 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -38,3 +38,4 @@ pub use core::ops; pub use core::ptr; pub use core::slice; pub use core::fmt; +pub use core::marker; diff --git a/substrate/runtime-support/src/storage/generator.rs b/substrate/runtime-support/src/storage/generator.rs index b77b58d418124..a196a69bacb3f 100644 --- a/substrate/runtime-support/src/storage/generator.rs +++ b/substrate/runtime-support/src/storage/generator.rs @@ -50,6 +50,8 @@ use codec; use rstd::vec::Vec; #[doc(hidden)] pub use rstd::borrow::Borrow; +#[doc(hidden)] +pub use rstd::marker::PhantomData; /// Abstraction around storage. pub trait Storage { @@ -447,6 +449,432 @@ macro_rules! storage_items { () => () } +#[macro_export] +#[doc(hidden)] +macro_rules! __decl_storage_item { + // generator for values. + (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { + __decl_storage_item!{ ($($vis)*) ($traittype as $traitinstance) () ($gettype) ($getter) ($taker) $name : $key => $ty } +// pub fn $get_fn() -> $gettype { <$name as $crate::storage::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) } + }; + (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { + $($vis)* struct $name<$traitinstance: $traittype>($crate::storage::generator::PhantomData<$traitinstance>); + + impl<$traitinstance: $traittype> $crate::storage::generator::StorageValue<$ty> for $name<$traitinstance> { + type Query = $gettype; + + /// Get the storage key. + fn key() -> &'static [u8] { + $key + } + + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.$getter($key) + } + + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.$taker($key) + } + } + }; + // generator for maps. + (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) ($get_fn:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { + __decl_storage_item!{ ($($vis)*) ($traittype as $traitinstance) ($gettype) ($getter) ($taker) $name : $prefix => map [$kty => $ty] } +// pub fn $get_fn>(key: K) -> $gettype { +// <$name as $crate::storage::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) +// } + }; + (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { + $($vis)* struct $name<$traitinstance: $traittype>($crate::storage::generator::PhantomData<$traitinstance>); + + impl<$traitinstance: $traittype> $crate::storage::generator::StorageMap<$kty, $ty> for $name<$traitinstance> { + type Query = $gettype; + + /// Get the prefix key in storage. + fn prefix() -> &'static [u8] { + $prefix + } + + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &$kty) -> Vec { + let mut key = $prefix.to_vec(); + key.extend($crate::codec::Slicable::encode(x)); + key + } + + /// Load the value associated with the given key from the map. + fn get(key: &$kty, storage: &S) -> Self::Query { + let key = <$name<$traitinstance> as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + storage.$getter(&key[..]) + } + + /// Take the value, reading and removing it. + fn take(key: &$kty, storage: &S) -> Self::Query { + let key = <$name<$traitinstance> as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + storage.$taker(&key[..]) + } + } + }; +} + +// TODO: revisit this idiom once we get `type`s in `impl`s. +/*impl Module { + type Now = super::Now; +}*/ + +/// Declares strongly-typed wrappers around codec-compatible types in storage. +/// +/// For now we implement a convenience trait with pre-specialised associated types, one for each +/// storage item. This allows you to gain access to publicly visisible storage items from a +/// module type. Currently you must disambiguate by using `::Item` rather than +/// the simpler `Module::Item`. Hopefully the rust guys with fix this soon. +#[macro_export] +macro_rules! decl_storage { + ( + trait $traittype:ident as $traitinstance:ident; + store $storetype:ident for $modulename:ident; + $($t:tt)* + ) => { + __decl_storage_items!($traittype $traitinstance $($t)*); + trait $storetype { + __decl_store_items!($($t)*); + } + impl<$traitinstance: $traittype> $storetype for $modulename<$traitinstance> { + __impl_store_items!($traitinstance $($t)*); + } + }; + ( + trait $traittype:ident as $traitinstance:ident; + pub store $storetype:ident for $modulename:ident; + $($t:tt)* + ) => { + __decl_storage_items!($traittype $traitinstance $($t)*); + pub trait $storetype { + __decl_store_items!($($t)*); + } + impl<$traitinstance: $traittype> $storetype for $modulename<$traitinstance> { + __impl_store_items!($traitinstance $($t)*); + } + } +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __decl_store_item { + ($name:ident) => { type $name; } +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __decl_store_items { + // simple values + ($name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + + ($name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + + // maps + ($name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + + ($name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_store_item!($name); __decl_store_items!($($t)*); + }; + + // exit + () => () +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_store_item { + ($name:ident $traitinstance:ident) => { type $name = $name<$traitinstance>; } +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_store_items { + // simple values + ($traitinstance:ident $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + + // maps + ($traitinstance:ident $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __impl_store_item!($name $traitinstance); + __impl_store_items!($traitinstance $($t)*); + }; + + // exit + ($traitinstance:ident) => () +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __decl_storage_items { + // simple values + ($traittype:ident $traitinstance:ident $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $key => $ty); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + + // maps + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + __decl_storage_items!($traittype $traitinstance $($t)*); + }; + + // exit + ($traittype:ident $traitinstance:ident) => () +} + #[cfg(test)] mod tests { use std::collections::HashMap; diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index cb20557c2260a..6c066b5866e1d 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -30,60 +30,21 @@ use runtime_support::storage::StorageValue; use runtime_support::PublicPass; pub trait Trait { - type Timestamp: codec::Slicable; + type Timestamp: codec::Slicable + Default; type PublicAux; type PrivAux; } pub struct Module(::std::marker::PhantomData); // TODO: create from storage_items macro. -/* -storage_items! { - trait Trait; - pub Now: b"tim:val" => required Timestamp; +decl_storage! { + trait Trait as T; + pub store Store for Module; + pub Now: b"tim:val" => required T::Timestamp; + Then: b"tim:then" => default T::Timestamp; } -*/ -pub struct Now(::std::marker::PhantomData); -impl ::runtime_support::storage::generator::StorageValue for Now { - type Query = T::Timestamp; - - /// Get the storage key. - fn key() -> &'static [u8] { - b"tim:val" - } - - /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { - storage.require(>::key()) - } - - /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { - storage.take_or_panic(>::key()) - } -} -// TODO: consider this idiom. -/*impl Module { - pub const NOW: Now = Now(::std::marker::PhantomData::); -}*/ - -// TODO: revisit this idiom once we get `type`s in `impl`s. -/* -// This would be nice but not currently supported. -impl Module { - type Now = super::Now; -}*/ - -pub trait Store { - type Now; -} -impl Store for Module { - type Now = Now; -} - impl Module { pub fn get() -> T::Timestamp { >::get() } -// pub fn get() -> T::Timestamp { Self::NOW.get() } } // TODO: implement `Callable` and `Dispatch` in `impl_dispatch` macro. From 7cc28060d933292afdc60a68d1165205871d1d6f Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 23 Mar 2018 17:11:21 +0900 Subject: [PATCH 10/76] Dispatch module has traity API. --- substrate/runtime-support/src/dispatch.rs | 210 ++++++++++++++++++++++ substrate/runtime/timestamp/src/lib.rs | 60 ++----- 2 files changed, 223 insertions(+), 47 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index eda4e496439e3..82c1577d0dfb5 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -60,6 +60,216 @@ impl PrivPass { pub fn test() -> PrivPass { PrivPass(()) } } +/* +impl_dispatch! { + trait Trait as T; + pub mod public for Module; + aux T::PublicAux; + fn set(_, now: T::Timestamp) = 0; +} +*/ + +pub trait Dispatchable { + type AuxType; + type TraitType; + fn dispatch(self, aux: &Self::AuxType); +} + +/// Declare a struct for this module, then implement dispatch logic to create a pairing of several +/// dispatch traits and enums. +#[macro_export] +macro_rules! decl_module { + ( + trait $trait_name:ident as $trait_instance:ident; + pub mod $mod_name:ident for $mod_type:ident; + $($rest:tt)* + ) => { + pub struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + decl_dispatch! { + trait $trait_name as $trait_instance; + pub mod $mod_name for $mod_type; + $($rest)* + } + } +} + +/// Implement several dispatch modules to create a pairing of a dispatch trait and enum. +#[macro_export] +macro_rules! decl_dispatch { + ( + trait $trait_name:ident as $trait_instance:ident; + pub mod $mod_name:ident for $mod_type:ident; + + aux $aux_type:ty { + $( + fn $fn_name:ident(_ + $( + , $param_name:ident : $param:ty + )* + ) + = $id:expr ; + )* + } + $($rest:tt)* + ) => { + __decl_dispatch_module! { + trait $trait_name as $trait_instance; + pub mod $mod_name for $mod_type; + aux $aux_type; + $( + fn $fn_name(_, $($param_name: $param),*)= $id; + )* + } + decl_dispatch! { + trait $trait_name as $trait_instance; + pub mod $mod_name for $mod_type; + $($rest)* + } + }; + ( + trait $trait_name:ident as $trait_instance:ident; + pub mod $mod_name:ident for $mod_type:ident; + ) => { + impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { + pub fn dispatch>(d: D, aux: &D::AuxType) { + d.dispatch(aux); + } + } + } +} + +#[macro_export] +macro_rules! __decl_dispatch_fns { + ($aux_type:ty => $fn_name:ident ( $( $param_name:ident $param_type:ty )* ) $($rest:tt)*) => { + fn $fn_name (aux: &$aux_type, $( $param_name: $param_type ),* ); + __decl_dispatch_fns!($aux_type => $($rest)*); + }; + ($aux_type:ty =>) => () +} + +#[macro_export] +/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. +macro_rules! __decl_dispatch_module { + ( + trait $trait_name:ident as $trait_instance:ident; + pub mod $mod_name:ident for $mod_type:ident; + aux $aux_type:ty; + + $( + fn $fn_name:ident(_ + $( + , $param_name:ident : $param:ty + )* + ) + = $id:expr ; + )* + ) => { + pub mod $mod_name { + use super::*; + + #[derive(Clone, Copy, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[repr(u32)] + #[allow(non_camel_case_types)] + enum Id { + $( + #[allow(non_camel_case_types)] + $fn_name = $id, + )* + } + + impl Id { + /// Derive `Some` value from a `u8`, or `None` if it's invalid. + fn from_u8(value: u8) -> Option { + match value { + $( + $id => Some(Id::$fn_name), + )* + _ => None, + } + } + } + + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[allow(missing_docs)] + pub enum Call<$trait_instance: $trait_name> { + $( + #[allow(non_camel_case_types)] + $fn_name ( $( $param ),* ) + ,)* + } + //pub enum Callable { set(T::Timestamp) } + + pub trait Dispatch<$trait_instance: $trait_name>: Sized { + __decl_dispatch_fns!{ $aux_type => $( $fn_name ( $( $param_name $param )* ) )* } + } + //pub trait Dispatch { fn set(aux: &T::PublicAux, now: T::Timestamp); } + + impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable + for Call<$trait_instance> + where $mod_type<$trait_instance>: Dispatch<$trait_instance> + //impl super::Dispatchable for Callable where super::Module: Dispatch { + { + type TraitType = $trait_instance; + type AuxType = $aux_type; + //type TraitType = T; + //type AuxType = T::PublicAux; + fn dispatch(self, aux: &Self::AuxType) { + //fn dispatch(self, aux: &Self::AuxType) { + match self { + $( + Call::$fn_name( $( $param_name ),* ) => + <$mod_type<$trait_instance>>::$fn_name( aux, $( $param_name ),* ), + //Callable::set(a) => >::set(aux, a), + )* + } + } + } + + impl<$trait_instance: $trait_name> $crate::dispatch::Slicable for Call<$trait_instance> { + fn decode(input: &mut I) -> Option { + let id = u8::decode(input).and_then(Id::from_u8)?; + Some(match id { + $( + Id::$fn_name => { + $( + let $param_name = $crate::dispatch::Slicable::decode(input)?; + )* + Call :: $fn_name( $( $param_name ),* ) + } + )* + }) + } + + fn encode(&self) -> $crate::dispatch::Vec { + let mut v = $crate::dispatch::Vec::new(); + match *self { + $( + Call::$fn_name( + $( + ref $param_name + ),* + ) => { + (Id::$fn_name as u8).using_encoded(|s| v.extend(s)); + $( + $param_name.using_encoded(|s| v.extend(s)); + )* + } + )* + } + v + } + + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::NonTrivialSlicable for Call<$trait_instance> {} + } + } +} + /// Implement a dispatch module to create a pairing of a dispatch trait and enum. #[macro_export] macro_rules! impl_dispatch { diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 6c066b5866e1d..f5d97ab917feb 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -27,55 +27,30 @@ extern crate substrate_codec as codec; #[cfg(feature = "std")] extern crate serde; use runtime_support::storage::StorageValue; -use runtime_support::PublicPass; pub trait Trait { - type Timestamp: codec::Slicable + Default; + type Timestamp: codec::Slicable + Default + serde::Serialize; type PublicAux; type PrivAux; } -pub struct Module(::std::marker::PhantomData); -// TODO: create from storage_items macro. decl_storage! { trait Trait as T; pub store Store for Module; pub Now: b"tim:val" => required T::Timestamp; - Then: b"tim:then" => default T::Timestamp; -} -impl Module { - pub fn get() -> T::Timestamp { >::get() } + pub Then: b"tim:then" => default T::Timestamp; } -// TODO: implement `Callable` and `Dispatch` in `impl_dispatch` macro. -/* -impl_dispatch! { - trait Trait; - pub mod public; - fn set(_, now: Timestamp) = 0; -} -*/ - -pub trait Dispatchable { - type AuxType; - type TraitType; - fn dispatch(self, aux: &Self::AuxType); +decl_module! { + trait Trait as T; + pub mod public for Module; + aux T::PublicAux { + fn set(_, now: T::Timestamp) = 0; + } } -pub mod public { - use super::Trait; - pub enum Callable { set(T::Timestamp) } - pub trait Dispatch { fn set(aux: &T::PublicAux, now: T::Timestamp); } - - impl super::Dispatchable for Callable where super::Module: Dispatch { - type TraitType = T; - type AuxType = T::PublicAux; - fn dispatch(self, aux: &Self::AuxType) { - match self { - Callable::set(a) => >::set(aux, a), - } - } - } +impl Module { + pub fn get() -> T::Timestamp { >::get() } } impl public::Dispatch for Module { @@ -85,12 +60,6 @@ impl public::Dispatch for Module { } } -impl Module { - pub fn dispatch>(d: D, aux: &D::AuxType) { - d.dispatch(aux); - } -} - #[cfg(test)] mod tests { use super::*; @@ -98,15 +67,14 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::Joiner; use runtime_support::storage::StorageValue; - use runtime_support::PublicPass; struct TraitImpl; - impl super::Trait for TraitImpl { + impl Trait for TraitImpl { type Timestamp = u64; type PublicAux = u64; type PrivAux = (); } - type Timestamp = super::Module; + type Timestamp = Module; #[test] fn timestamp_works() { @@ -117,10 +85,8 @@ mod tests { with_externalities(&mut t, || { assert_eq!(::Now::get(), 42); -// assert_eq!(Timestamp::NOW.get(), 42); - Timestamp::dispatch(public::Callable::set(69), &0); + Timestamp::dispatch(public::Call::set(69), &0); assert_eq!(::Now::get(), 69); -// assert_eq!(Timestamp::NOW.get(), 69); }); } } From 836da8770519d545f5115a12a58eedda943bf8e7 Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 12:30:27 +0900 Subject: [PATCH 11/76] Move consensus module to new API --- Cargo.lock | 1 + substrate/runtime-support/src/dispatch.rs | 19 +++++---- substrate/runtime/consensus/Cargo.toml | 1 + substrate/runtime/consensus/src/lib.rs | 52 +++++++++++++---------- substrate/runtime/timestamp/src/lib.rs | 10 ++--- 5 files changed, 48 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1eace7c9aa8cb..5780127f41c13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1764,6 +1764,7 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 82c1577d0dfb5..089c263d1c4cf 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -17,6 +17,7 @@ //! Dispatch system. Just dispatches calls. pub use rstd::prelude::Vec; +pub use rstd::marker::PhantomData; use rstd::ops; pub use codec::{Slicable, Input, NonTrivialSlicable}; @@ -81,13 +82,13 @@ pub trait Dispatchable { macro_rules! decl_module { ( trait $trait_name:ident as $trait_instance:ident; - pub mod $mod_name:ident for $mod_type:ident; + struct $mod_type:ident; $($rest:tt)* ) => { - pub struct $mod_type<$trait_instance: $trait_name>(::std::marker::PhantomData<$trait_instance>); + pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); decl_dispatch! { trait $trait_name as $trait_instance; - pub mod $mod_name for $mod_type; + struct $mod_type; $($rest)* } } @@ -98,9 +99,8 @@ macro_rules! decl_module { macro_rules! decl_dispatch { ( trait $trait_name:ident as $trait_instance:ident; - pub mod $mod_name:ident for $mod_type:ident; - - aux $aux_type:ty { + struct $mod_type:ident; + pub mod $mod_name:ident aux $aux_type:ty { $( fn $fn_name:ident(_ $( @@ -122,13 +122,13 @@ macro_rules! decl_dispatch { } decl_dispatch! { trait $trait_name as $trait_instance; - pub mod $mod_name for $mod_type; + struct $mod_type; $($rest)* } }; ( trait $trait_name:ident as $trait_instance:ident; - pub mod $mod_name:ident for $mod_type:ident; + struct $mod_type:ident; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { pub fn dispatch>(d: D, aux: &D::AuxType) { @@ -198,6 +198,7 @@ macro_rules! __decl_dispatch_module { #[allow(non_camel_case_types)] $fn_name ( $( $param ),* ) ,)* + __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), } //pub enum Callable { set(T::Timestamp) } @@ -222,6 +223,7 @@ macro_rules! __decl_dispatch_module { Call::$fn_name( $( $param_name ),* ) => <$mod_type<$trait_instance>>::$fn_name( aux, $( $param_name ),* ), //Callable::set(a) => >::set(aux, a), + Call::__PhantomItem(_) => unreachable!(), )* } } @@ -257,6 +259,7 @@ macro_rules! __decl_dispatch_module { )* } )* + Call::__PhantomItem(_) => unreachable!(), } v } diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml index 720e90591c515..e8087c9faed70 100644 --- a/substrate/runtime/consensus/Cargo.toml +++ b/substrate/runtime/consensus/Cargo.toml @@ -9,6 +9,7 @@ serde = { version = "1.0", default_features = false } serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-codec = { path = "../../codec", default_features = false } [features] default = ["std"] diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index cd1bafa8d06e2..e94daf5c564b3 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -20,6 +20,7 @@ #[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_codec as codec; #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; @@ -27,41 +28,41 @@ use rstd::prelude::*; use runtime_support::storage; use runtime_support::storage::unhashed::StorageVec; -use runtime_support::dispatch::PrivPass; - -pub type SessionKey = [u8; 32]; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; -struct AuthorityStorageVec {} -impl StorageVec for AuthorityStorageVec { - type Item = SessionKey; +struct AuthorityStorageVec(std::marker::PhantomData); +impl StorageVec for AuthorityStorageVec { + type Item = S; const PREFIX: &'static[u8] = AUTHORITY_AT; } pub const CODE: &'static[u8] = b":code"; -/// Get the current set of authorities. These are the session keys. -pub fn authorities() -> Vec { - AuthorityStorageVec::items() +pub trait Trait { + type SessionKey: codec::Slicable + Default; + type PrivAux; } -impl_dispatch! { - pub mod privileged; - fn set_code(self, new: Vec) = 0; +decl_module! { + trait Trait as T; + struct Module; + pub mod privileged aux T::PrivAux { + fn set_code(_, new: Vec) = 0; + } } -impl privileged::Dispatch for PrivPass { - /// Set the new code. - fn set_code(self, new: Vec) { - internal::set_code(new); +impl Module { + /// Get the current set of authorities. These are the session keys. + pub fn authorities() -> Vec { + AuthorityStorageVec::::items() } } -pub mod internal { - use super::*; +pub struct Internal(rstd::marker::PhantomData); +impl Internal { /// Set the new code. pub fn set_code(new: Vec) { storage::unhashed::put_raw(CODE, &new); @@ -70,12 +71,19 @@ pub mod internal { /// Set the current set of authorities' session keys. /// /// Called by `next_session` only. - pub fn set_authorities(authorities: &[SessionKey]) { - AuthorityStorageVec::set_items(authorities); + pub fn set_authorities(authorities: &[T::SessionKey]) { + AuthorityStorageVec::::set_items(authorities); } /// Set a single authority by index. - pub fn set_authority(index: u32, key: &SessionKey) { - AuthorityStorageVec::set_item(index, key); + pub fn set_authority(index: u32, key: &T::SessionKey) { + AuthorityStorageVec::::set_item(index, key); + } +} + +impl privileged::Dispatch for Module { + /// Set the new code. + fn set_code(_aux: &T::PrivAux, new: Vec) { + Internal::::set_code(new); } } diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index f5d97ab917feb..1888da65206e0 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -31,7 +31,6 @@ use runtime_support::storage::StorageValue; pub trait Trait { type Timestamp: codec::Slicable + Default + serde::Serialize; type PublicAux; - type PrivAux; } decl_storage! { @@ -43,14 +42,16 @@ decl_storage! { decl_module! { trait Trait as T; - pub mod public for Module; - aux T::PublicAux { + struct Module; + pub mod public aux T::PublicAux { fn set(_, now: T::Timestamp) = 0; } } impl Module { - pub fn get() -> T::Timestamp { >::get() } + pub fn get() -> T::Timestamp { + ::Now::get() + } } impl public::Dispatch for Module { @@ -72,7 +73,6 @@ mod tests { impl Trait for TraitImpl { type Timestamp = u64; type PublicAux = u64; - type PrivAux = (); } type Timestamp = Module; From bc5ae7f5fb3ce969ff5e99325c1d7a413000ce4f Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 14:56:18 +0900 Subject: [PATCH 12/76] Refactoring and outer dispatch --- Cargo.lock | 1 + demo/runtime/src/dispatch.rs | 6 +- demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime2.rs | 77 +++++++ substrate/runtime-support/Cargo.toml | 2 + substrate/runtime-support/src/dispatch.rs | 252 +++++++++++++--------- substrate/runtime-support/src/lib.rs | 2 + substrate/runtime/consensus/src/lib.rs | 22 +- substrate/runtime/timestamp/Cargo.toml | 3 +- substrate/runtime/timestamp/src/lib.rs | 24 +-- 10 files changed, 258 insertions(+), 132 deletions(-) create mode 100644 demo/runtime/src/runtime2.rs diff --git a/Cargo.lock b/Cargo.lock index 5780127f41c13..c4c2481b0f70f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1798,6 +1798,7 @@ version = "0.1.0" dependencies = [ "ed25519 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/demo/runtime/src/dispatch.rs b/demo/runtime/src/dispatch.rs index 8cc32a518ed17..5836b3e44d36f 100644 --- a/demo/runtime/src/dispatch.rs +++ b/demo/runtime/src/dispatch.rs @@ -16,7 +16,7 @@ //! Dispatch system. Just dispatches calls. -use {runtime, runtime_support, consensus, timestamp}; +use {runtime, runtime_support}; impl_meta_dispatch! { pub mod public; @@ -24,7 +24,7 @@ impl_meta_dispatch! { trait runtime_support::PublicPass; Session(mod runtime::session) = 1; Staking(mod runtime::staking) = 2; - Timestamp(mod timestamp) = 3; +// Timestamp(mod timestamp) = 3; Democracy(mod runtime::democracy) = 5; Council(mod runtime::council) = 6; CouncilVote(mod runtime::council_vote) = 7; @@ -34,7 +34,7 @@ impl_meta_dispatch! { pub mod privileged; path privileged; trait runtime_support::PrivPass; - Consensus(mod consensus) = 0; +// Consensus(mod consensus) = 0; Session(mod runtime::session) = 1; Staking(mod runtime::staking) = 2; Democracy(mod runtime::democracy) = 5; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 103a22ea3ea3a..5892b0f02d73c 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -46,5 +46,6 @@ pub mod block; pub mod transaction; pub mod runtime; pub mod api; +pub mod runtime2; #[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime2.rs b/demo/runtime/src/runtime2.rs new file mode 100644 index 0000000000000..da9fa149093a3 --- /dev/null +++ b/demo/runtime/src/runtime2.rs @@ -0,0 +1,77 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Dispatch system. Just dispatches calls. + +use {consensus, timestamp, demo_primitives}; + +type PublicAux = demo_primitives::AccountId; +type PrivAux = (); + +#[derive(Clone, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Debug))] +struct Concrete; + +impl timestamp::Trait for Concrete { + type Value = u64; + type PublicAux = PublicAux; +} +type Timestamp = timestamp::Module; + +impl consensus::Trait for Concrete { + type SessionKey = demo_primitives::AccountId; + type PrivAux = PrivAux; +} +type Consensus = consensus::Module; + +impl_outer_dispatch! { + pub enum PubCall where aux: PublicAux; + Timestamp = 3; +} + +impl_outer_dispatch! { + pub enum PrivCall where aux: PrivAux; + Consensus = 0; +} + +/* +impl_meta_dispatch! { + pub mod public; + path public; + trait runtime_support::PublicPass; + Session(mod runtime::session) = 1; + Staking(mod runtime::staking) = 2; + Timestamp(mod timestamp) = 3; + Democracy(mod runtime::democracy) = 5; + Council(mod runtime::council) = 6; + CouncilVote(mod runtime::council_vote) = 7; +} + +impl_meta_dispatch! { + pub mod privileged; + path privileged; + trait runtime_support::PrivPass; + Consensus(mod consensus) = 0; + Session(mod runtime::session) = 1; + Staking(mod runtime::staking) = 2; + Democracy(mod runtime::democracy) = 5; + Council(mod runtime::council) = 6; + CouncilVote(mod runtime::council_vote) = 7; +} + +pub use self::privileged::Call as PrivCall; +pub use self::public::Call as PubCall; +*/ diff --git a/substrate/runtime-support/Cargo.toml b/substrate/runtime-support/Cargo.toml index 03099b8919351..a32a82ba3898e 100644 --- a/substrate/runtime-support/Cargo.toml +++ b/substrate/runtime-support/Cargo.toml @@ -6,6 +6,7 @@ authors = ["Parity Technologies "] [dependencies] ed25519 = { path = "../ed25519", optional = true } hex-literal = { version = "0.1.0", optional = true } +serde = { version = "1.0", default_features = false } substrate-runtime-std = { path = "../runtime-std", default_features = false } substrate-runtime-io = { path = "../runtime-io", default_features = false } substrate-primitives = { path = "../primitives", default_features = false } @@ -16,6 +17,7 @@ default = ["std"] std = [ "ed25519", "hex-literal", + "serde/std", "substrate-primitives/std", "substrate-runtime-io/std", "substrate-codec/std", diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 089c263d1c4cf..e94a5bf7d84bb 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -76,19 +76,23 @@ pub trait Dispatchable { fn dispatch(self, aux: &Self::AuxType); } +pub trait Callable { + type CallType: Dispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; +} + /// Declare a struct for this module, then implement dispatch logic to create a pairing of several /// dispatch traits and enums. #[macro_export] macro_rules! decl_module { ( trait $trait_name:ident as $trait_instance:ident; - struct $mod_type:ident; + pub struct $mod_type:ident; $($rest:tt)* ) => { pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); decl_dispatch! { trait $trait_name as $trait_instance; - struct $mod_type; + impl for $mod_type; $($rest)* } } @@ -99,10 +103,10 @@ macro_rules! decl_module { macro_rules! decl_dispatch { ( trait $trait_name:ident as $trait_instance:ident; - struct $mod_type:ident; - pub mod $mod_name:ident aux $aux_type:ty { + impl for $mod_type:ident; + pub enum $call_type:ident where aux: $aux_type:ty { $( - fn $fn_name:ident(_ + fn $fn_name:ident(aux $( , $param_name:ident : $param:ty )* @@ -114,21 +118,21 @@ macro_rules! decl_dispatch { ) => { __decl_dispatch_module! { trait $trait_name as $trait_instance; - pub mod $mod_name for $mod_type; - aux $aux_type; + impl for $mod_type; + pub enum $call_type where aux: $aux_type; $( - fn $fn_name(_, $($param_name: $param),*)= $id; + fn $fn_name(aux, $($param_name: $param),*)= $id; )* } decl_dispatch! { trait $trait_name as $trait_instance; - struct $mod_type; + impl for $mod_type; $($rest)* } }; ( trait $trait_name:ident as $trait_instance:ident; - struct $mod_type:ident; + impl for $mod_type:ident; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { pub fn dispatch>(d: D, aux: &D::AuxType) { @@ -152,11 +156,10 @@ macro_rules! __decl_dispatch_fns { macro_rules! __decl_dispatch_module { ( trait $trait_name:ident as $trait_instance:ident; - pub mod $mod_name:ident for $mod_type:ident; - aux $aux_type:ty; - + impl for $mod_type:ident; + pub enum $call_type:ident where aux: $aux_type:ty; $( - fn $fn_name:ident(_ + fn $fn_name:ident(aux $( , $param_name:ident : $param:ty )* @@ -164,115 +167,160 @@ macro_rules! __decl_dispatch_module { = $id:expr ; )* ) => { - pub mod $mod_name { - use super::*; + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[allow(missing_docs)] + pub enum $call_type<$trait_instance: $trait_name> { + $( + #[allow(non_camel_case_types)] + $fn_name ( $( $param ),* ) + ,)* + __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), + } - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] - #[repr(u32)] - #[allow(non_camel_case_types)] - enum Id { - $( - #[allow(non_camel_case_types)] - $fn_name = $id, - )* +/* pub trait Dispatch<$trait_instance: $trait_name>: Sized { + __decl_dispatch_fns!{ $aux_type => $( $fn_name ( $( $param_name $param )* ) )* } + }*/ + + impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable + for $call_type<$trait_instance> +// where $mod_type<$trait_instance>: Dispatch<$trait_instance> + { + type TraitType = $trait_instance; + type AuxType = $aux_type; + fn dispatch(self, aux: &Self::AuxType) { + match self { + $( + $call_type::$fn_name( $( $param_name ),* ) => + <$mod_type<$trait_instance>>::$fn_name( aux, $( $param_name ),* ), + $call_type::__PhantomItem(_) => unreachable!(), + )* + } } + } - impl Id { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - match value { - $( - $id => Some(Id::$fn_name), - )* - _ => None, - } + impl<$trait_instance: $trait_name> $crate::dispatch::Callable<$aux_type> + for $mod_type<$trait_instance> + where $trait_instance: Clone + PartialEq + Eq + { + type CallType = $call_type<$trait_instance>; + } + + impl<$trait_instance: $trait_name> $crate::dispatch::Slicable for $call_type<$trait_instance> { + fn decode(input: &mut I) -> Option { + match u8::decode(input)? { + $( + $id => { + $( + let $param_name = $crate::dispatch::Slicable::decode(input)?; + )* + Some($call_type:: $fn_name( $( $param_name ),* )) + } + )* + _ => None, } } - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] - #[allow(missing_docs)] - pub enum Call<$trait_instance: $trait_name> { - $( - #[allow(non_camel_case_types)] - $fn_name ( $( $param ),* ) - ,)* - __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), + fn encode(&self) -> $crate::dispatch::Vec { + let mut v = $crate::dispatch::Vec::new(); + match *self { + $( + $call_type::$fn_name( + $( + ref $param_name + ),* + ) => { + ($id as u8).using_encoded(|s| v.extend(s)); + $( + $param_name.using_encoded(|s| v.extend(s)); + )* + } + )* + $call_type::__PhantomItem(_) => unreachable!(), + } + v } - //pub enum Callable { set(T::Timestamp) } - pub trait Dispatch<$trait_instance: $trait_name>: Sized { - __decl_dispatch_fns!{ $aux_type => $( $fn_name ( $( $param_name $param )* ) )* } + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) } - //pub trait Dispatch { fn set(aux: &T::PublicAux, now: T::Timestamp); } - - impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable - for Call<$trait_instance> - where $mod_type<$trait_instance>: Dispatch<$trait_instance> - //impl super::Dispatchable for Callable where super::Module: Dispatch { - { - type TraitType = $trait_instance; - type AuxType = $aux_type; - //type TraitType = T; - //type AuxType = T::PublicAux; - fn dispatch(self, aux: &Self::AuxType) { - //fn dispatch(self, aux: &Self::AuxType) { - match self { - $( - Call::$fn_name( $( $param_name ),* ) => - <$mod_type<$trait_instance>>::$fn_name( aux, $( $param_name ),* ), - //Callable::set(a) => >::set(aux, a), - Call::__PhantomItem(_) => unreachable!(), - )* - } + } + impl<$trait_instance: $trait_name> $crate::dispatch::NonTrivialSlicable for $call_type<$trait_instance> {} + } +} + +/// Implement a meta-dispatch module to dispatch to other dispatchers. +#[macro_export] +macro_rules! impl_outer_dispatch { + ( + pub enum $call_type:ident where aux: $aux:ty; + $( + $camelcase:ident = $id:expr ; + )* + ) => { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[allow(missing_docs)] + pub enum $call_type { + $( + $camelcase ( <$camelcase as $crate::dispatch::Callable<$aux>>::CallType ) + ,)* + } + + impl $crate::dispatch::Dispatchable for $call_type { + type AuxType = $aux; + type TraitType = $call_type; + fn dispatch(self, aux: &$aux) { + match self { + $( + $call_type::$camelcase(call) => $camelcase::dispatch(call, &aux), + )* } } + } - impl<$trait_instance: $trait_name> $crate::dispatch::Slicable for Call<$trait_instance> { - fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(Id::from_u8)?; - Some(match id { - $( - Id::$fn_name => { - $( - let $param_name = $crate::dispatch::Slicable::decode(input)?; - )* - Call :: $fn_name( $( $param_name ),* ) - } - )* - }) + impl $crate::dispatch::Slicable for $call_type { + fn decode(input: &mut I) -> Option { + match u8::decode(input)? { + $( + $id => + Some($call_type::$camelcase( $crate::dispatch::Slicable::decode(input)? )), + )* + _ => None, } + } - fn encode(&self) -> $crate::dispatch::Vec { - let mut v = $crate::dispatch::Vec::new(); - match *self { - $( - Call::$fn_name( - $( - ref $param_name - ),* - ) => { - (Id::$fn_name as u8).using_encoded(|s| v.extend(s)); - $( - $param_name.using_encoded(|s| v.extend(s)); - )* - } - )* - Call::__PhantomItem(_) => unreachable!(), - } - v + fn encode(&self) -> $crate::dispatch::Vec { + let mut v = $crate::dispatch::Vec::new(); + match *self { + $( + $call_type::$camelcase( ref sub ) => { + ($id as u8).using_encoded(|s| v.extend(s)); + sub.using_encoded(|s| v.extend(s)); + } + )* } + v + } - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } + fn using_encoded R>(&self, f: F) -> R { + f(self.encode().as_slice()) } - impl<$trait_instance: $trait_name> $crate::dispatch::NonTrivialSlicable for Call<$trait_instance> {} } + impl $crate::dispatch::NonTrivialSlicable for $call_type {} } } + +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////// + + /// Implement a dispatch module to create a pairing of a dispatch trait and enum. #[macro_export] macro_rules! impl_dispatch { diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 219a78d3945ff..5b87c155094dd 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -18,6 +18,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "std")] extern crate serde; + extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index e94daf5c564b3..3412a7e167604 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -32,7 +32,7 @@ use runtime_support::storage::unhashed::StorageVec; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; -struct AuthorityStorageVec(std::marker::PhantomData); +struct AuthorityStorageVec(rstd::marker::PhantomData); impl StorageVec for AuthorityStorageVec { type Item = S; const PREFIX: &'static[u8] = AUTHORITY_AT; @@ -40,16 +40,16 @@ impl StorageVec for AuthorityStorageVec { pub const CODE: &'static[u8] = b":code"; -pub trait Trait { +pub trait Trait: PartialEq + Eq + Clone { type SessionKey: codec::Slicable + Default; type PrivAux; } decl_module! { trait Trait as T; - struct Module; - pub mod privileged aux T::PrivAux { - fn set_code(_, new: Vec) = 0; + pub struct Module; + pub enum PrivCall where aux: T::PrivAux { + fn set_code(aux, new: Vec) = 0; } } @@ -58,6 +58,11 @@ impl Module { pub fn authorities() -> Vec { AuthorityStorageVec::::items() } + + /// Set the new code. + fn set_code(_aux: &T::PrivAux, new: Vec) { + Internal::::set_code(new); + } } pub struct Internal(rstd::marker::PhantomData); @@ -80,10 +85,3 @@ impl Internal { AuthorityStorageVec::::set_item(index, key); } } - -impl privileged::Dispatch for Module { - /// Set the new code. - fn set_code(_aux: &T::PrivAux, new: Vec) { - Internal::::set_code(new); - } -} diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml index aad16b218b83f..70617555d688d 100644 --- a/substrate/runtime/timestamp/Cargo.toml +++ b/substrate/runtime/timestamp/Cargo.toml @@ -12,7 +12,7 @@ substrate-runtime-support = { path = "../../runtime-support", default_features = substrate-codec = { path = "../../codec", default_features = false } [dev-dependencies] -substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = true } [features] default = ["std"] @@ -22,5 +22,4 @@ std = [ "serde_derive", "serde/std", "substrate-codec/std", - "substrate-runtime-io/std", ] diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 1888da65206e0..7175dd3d5115f 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -28,35 +28,33 @@ extern crate substrate_codec as codec; use runtime_support::storage::StorageValue; -pub trait Trait { - type Timestamp: codec::Slicable + Default + serde::Serialize; +pub trait Trait {//}: PartialEq + Eq + Clone { + type Value: codec::Slicable + Default + serde::Serialize + Clone + Eq; type PublicAux; } decl_storage! { trait Trait as T; pub store Store for Module; - pub Now: b"tim:val" => required T::Timestamp; - pub Then: b"tim:then" => default T::Timestamp; + pub Now: b"tim:val" => required T::Value; + pub Then: b"tim:then" => default T::Value; } decl_module! { trait Trait as T; - struct Module; - pub mod public aux T::PublicAux { - fn set(_, now: T::Timestamp) = 0; + pub struct Module; + pub enum Call where aux: T::PublicAux { + fn set(aux, now: T::Value) = 0; } } impl Module { - pub fn get() -> T::Timestamp { + pub fn get() -> T::Value { ::Now::get() } -} -impl public::Dispatch for Module { /// Set the current time. - fn set(_aux: &T::PublicAux, now: T::Timestamp) { + fn set(_aux: &T::PublicAux, now: T::Value) { ::Now::put(now); } } @@ -71,7 +69,7 @@ mod tests { struct TraitImpl; impl Trait for TraitImpl { - type Timestamp = u64; + type Value = u64; type PublicAux = u64; } type Timestamp = Module; @@ -85,7 +83,7 @@ mod tests { with_externalities(&mut t, || { assert_eq!(::Now::get(), 42); - Timestamp::dispatch(public::Call::set(69), &0); + Timestamp::dispatch(Call::set(69), &0); assert_eq!(::Now::get(), 69); }); } From b8ed8744aa828a23d6871f3a106a1f7954faa252 Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 16:14:04 +0900 Subject: [PATCH 13/76] Avoid unnecessary derives. --- demo/runtime/src/runtime2.rs | 1 - substrate/runtime-std/src/lib.rs | 2 + substrate/runtime-std/with_std.rs | 4 +- substrate/runtime-std/without_std.rs | 12 +- substrate/runtime-support/src/dispatch.rs | 116 ++++++++++++++---- substrate/runtime-support/src/lib.rs | 3 +- .../runtime-support/src/storage/generator.rs | 6 +- substrate/runtime/consensus/src/lib.rs | 5 +- substrate/runtime/system/src/lib.rs | 6 +- substrate/runtime/timestamp/src/lib.rs | 24 ++-- 10 files changed, 128 insertions(+), 51 deletions(-) diff --git a/demo/runtime/src/runtime2.rs b/demo/runtime/src/runtime2.rs index da9fa149093a3..b414689a456ff 100644 --- a/demo/runtime/src/runtime2.rs +++ b/demo/runtime/src/runtime2.rs @@ -21,7 +21,6 @@ use {consensus, timestamp, demo_primitives}; type PublicAux = demo_primitives::AccountId; type PrivAux = (); -#[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] struct Concrete; diff --git a/substrate/runtime-std/src/lib.rs b/substrate/runtime-std/src/lib.rs index cfea085139d41..b98bfb43c3bf8 100644 --- a/substrate/runtime-std/src/lib.rs +++ b/substrate/runtime-std/src/lib.rs @@ -45,4 +45,6 @@ include!("../without_std.rs"); pub mod prelude { pub use ::vec::Vec; pub use ::boxed::Box; + pub use ::cmp::{Eq, PartialEq}; + pub use ::clone::Clone; } diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index c878b1f0bdba0..06237f604b9a1 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -17,16 +17,18 @@ pub use std::borrow; pub use std::boxed; pub use std::cell; +pub use std::clone; pub use std::cmp; pub use std::fmt; pub use std::iter; +pub use std::marker; pub use std::mem; pub use std::ops; pub use std::ptr; pub use std::rc; pub use std::slice; pub use std::vec; -pub use std::marker; + pub mod collections { pub use std::collections::btree_map; } diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index fb65b0a242d18..c1cf26a77552f 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -25,17 +25,19 @@ extern crate pwasm_alloc; pub use alloc::boxed; pub use alloc::rc; pub use alloc::vec; -pub mod collections { - pub use alloc::btree_map; -} pub use core::borrow; pub use core::cell; +pub use core::clone; pub use core::cmp; +pub use core::fmt; pub use core::intrinsics; pub use core::iter; +pub use core::marker; pub use core::mem; pub use core::ops; pub use core::ptr; pub use core::slice; -pub use core::fmt; -pub use core::marker; + +pub mod collections { + pub use alloc::btree_map; +} diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index e94a5bf7d84bb..734eb15e7052d 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -16,9 +16,12 @@ //! Dispatch system. Just dispatches calls. -pub use rstd::prelude::Vec; +pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; +#[cfg(feature = "std")] +pub use std::fmt; pub use rstd::marker::PhantomData; use rstd::ops; +use serde; pub use codec::{Slicable, Input, NonTrivialSlicable}; /// Default public dispatch; assumes a 32-byte ID. @@ -80,19 +83,42 @@ pub trait Callable { type CallType: Dispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; } +#[cfg(feature = "std")] +pub trait Parameter: Slicable + serde::Serialize + Clone + Eq + fmt::Debug {} + +#[cfg(feature = "std")] +impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq + fmt::Debug { +} + +#[cfg(not(feature = "std"))] +pub trait Parameter: Slicable + serde::Serialize + Clone + Eq {} + +#[cfg(not(feature = "std"))] +impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq { +} + + /// Declare a struct for this module, then implement dispatch logic to create a pairing of several /// dispatch traits and enums. #[macro_export] macro_rules! decl_module { ( - trait $trait_name:ident as $trait_instance:ident; - pub struct $mod_type:ident; + pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; $($rest:tt)* ) => { pub struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); decl_dispatch! { - trait $trait_name as $trait_instance; - impl for $mod_type; + impl for $mod_type<$trait_instance: $trait_name>; + $($rest)* + } + }; + ( + struct $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + $($rest:tt)* + ) => { + struct $mod_type<$trait_instance: $trait_name>($crate::dispatch::PhantomData<$trait_instance>); + decl_dispatch! { + impl for $mod_type<$trait_instance: $trait_name>; $($rest)* } } @@ -102,8 +128,7 @@ macro_rules! decl_module { #[macro_export] macro_rules! decl_dispatch { ( - trait $trait_name:ident as $trait_instance:ident; - impl for $mod_type:ident; + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; pub enum $call_type:ident where aux: $aux_type:ty { $( fn $fn_name:ident(aux @@ -117,22 +142,19 @@ macro_rules! decl_dispatch { $($rest:tt)* ) => { __decl_dispatch_module! { - trait $trait_name as $trait_instance; - impl for $mod_type; + impl for $mod_type<$trait_instance: $trait_name>; pub enum $call_type where aux: $aux_type; $( fn $fn_name(aux, $($param_name: $param),*)= $id; )* } decl_dispatch! { - trait $trait_name as $trait_instance; - impl for $mod_type; + impl for $mod_type<$trait_instance: $trait_name>; $($rest)* } }; ( - trait $trait_name:ident as $trait_instance:ident; - impl for $mod_type:ident; + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { pub fn dispatch>(d: D, aux: &D::AuxType) { @@ -155,8 +177,7 @@ macro_rules! __decl_dispatch_fns { /// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. macro_rules! __decl_dispatch_module { ( - trait $trait_name:ident as $trait_instance:ident; - impl for $mod_type:ident; + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; pub enum $call_type:ident where aux: $aux_type:ty; $( fn $fn_name:ident(aux @@ -167,8 +188,7 @@ macro_rules! __decl_dispatch_module { = $id:expr ; )* ) => { - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[cfg_attr(feature = "std", derive(Serialize))] #[allow(missing_docs)] pub enum $call_type<$trait_instance: $trait_name> { $( @@ -178,13 +198,66 @@ macro_rules! __decl_dispatch_module { __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), } -/* pub trait Dispatch<$trait_instance: $trait_name>: Sized { - __decl_dispatch_fns!{ $aux_type => $( $fn_name ( $( $param_name $param )* ) )* } - }*/ + // manual implementation of clone/eq/partialeq because using derive erroneously requires + // clone/eq/partialeq from T. + impl<$trait_instance: $trait_name> $crate::dispatch::Clone + for $call_type<$trait_instance> + { + fn clone(&self) -> Self { + match *self { + $( + $call_type::$fn_name( $( ref $param_name ),* ) => + $call_type::$fn_name( $( $param_name.clone() ),* ) + ,)* + $call_type::__PhantomItem(_) => unreachable!(), + } + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::PartialEq + for $call_type<$trait_instance> + { + fn eq(&self, other: &Self) -> bool { + match *self {$( + $call_type::$fn_name( $( ref $param_name ),* ) => { + let self_params = ( $( $param_name, )* ); + if let $call_type::$fn_name( $( ref $param_name ),* ) = *other { + self_params == ( $( $param_name, )* ) + } else { + if let $call_type::__PhantomItem(_) = *other { + unreachable!() + } else { + false + } + } + } + $call_type::__PhantomItem(_) => unreachable!(), + )*} + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::Eq + for $call_type<$trait_instance> + {} + + #[cfg(feature = "std")] + impl<$trait_instance: $trait_name> $crate::dispatch::fmt::Debug + for $call_type<$trait_instance> + { + fn fmt(&self, f: &mut $crate::dispatch::fmt::Formatter) -> Result<(), $crate::dispatch::fmt::Error> { + match *self { + $( + $call_type::$fn_name( $( ref $param_name ),* ) => + write!(f, "{}{:?}", + stringify!($fn_name), + ( $( $param_name.clone(), )* ) + ) + ,)* + $call_type::__PhantomItem(_) => unreachable!(), + } + } + } impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable for $call_type<$trait_instance> -// where $mod_type<$trait_instance>: Dispatch<$trait_instance> { type TraitType = $trait_instance; type AuxType = $aux_type; @@ -201,7 +274,6 @@ macro_rules! __decl_dispatch_module { impl<$trait_instance: $trait_name> $crate::dispatch::Callable<$aux_type> for $mod_type<$trait_instance> - where $trait_instance: Clone + PartialEq + Eq { type CallType = $call_type<$trait_instance>; } diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 5b87c155094dd..f7bc38aeaf8a6 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -34,4 +34,5 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{PrivPass, PublicPass}; +pub use self::dispatch::{PrivPass, PublicPass}; // TODO: REMOVE +pub use self::dispatch::{Parameter, Dispatchable, Callable}; diff --git a/substrate/runtime-support/src/storage/generator.rs b/substrate/runtime-support/src/storage/generator.rs index a196a69bacb3f..acf9355e2f737 100644 --- a/substrate/runtime-support/src/storage/generator.rs +++ b/substrate/runtime-support/src/storage/generator.rs @@ -533,8 +533,7 @@ macro_rules! __decl_storage_item { #[macro_export] macro_rules! decl_storage { ( - trait $traittype:ident as $traitinstance:ident; - store $storetype:ident for $modulename:ident; + trait $storetype:ident for $modulename:ident<$traitinstance:ident: $traittype:ident>; $($t:tt)* ) => { __decl_storage_items!($traittype $traitinstance $($t)*); @@ -546,8 +545,7 @@ macro_rules! decl_storage { } }; ( - trait $traittype:ident as $traitinstance:ident; - pub store $storetype:ident for $modulename:ident; + pub trait $storetype:ident for $modulename:ident<$traitinstance:ident: $traittype:ident>; $($t:tt)* ) => { __decl_storage_items!($traittype $traitinstance $($t)*); diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 3412a7e167604..ff59467ac1311 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -40,14 +40,13 @@ impl StorageVec for AuthorityStorageVec { pub const CODE: &'static[u8] = b":code"; -pub trait Trait: PartialEq + Eq + Clone { +pub trait Trait { type SessionKey: codec::Slicable + Default; type PrivAux; } decl_module! { - trait Trait as T; - pub struct Module; + pub struct Module; pub enum PrivCall where aux: T::PrivAux { fn set_code(aux, new: Vec) = 0; } diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index a9634243e6d3e..c9cf1a7a7c86c 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -44,7 +44,11 @@ use safe_mix::TripletMix; type TxOrder = u64; -storage_items! { + + +decl_storage! { + pub trait Store for Module; + pub Nonce get(nonce): b"sys:non" => default map [ AuthorityId => TxOrder ]; pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; RandomSeed get(random_seed): b"sys:rnd" => required Hash; diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 7175dd3d5115f..f714cdc46d8fc 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -22,32 +22,30 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; - #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; -#[cfg(feature = "std")] extern crate serde; +//#[cfg(feature = "std")] extern crate serde; use runtime_support::storage::StorageValue; +use runtime_support::Parameter; -pub trait Trait {//}: PartialEq + Eq + Clone { - type Value: codec::Slicable + Default + serde::Serialize + Clone + Eq; +pub trait Trait { + type Value: Parameter + Default; type PublicAux; } -decl_storage! { - trait Trait as T; - pub store Store for Module; - pub Now: b"tim:val" => required T::Value; - pub Then: b"tim:then" => default T::Value; -} - decl_module! { - trait Trait as T; - pub struct Module; + pub struct Module; pub enum Call where aux: T::PublicAux { fn set(aux, now: T::Value) = 0; } } +decl_storage! { + pub trait Store for Module; + pub Now: b"tim:val" => required T::Value; + pub Then: b"tim:then" => default T::Value; +} + impl Module { pub fn get() -> T::Value { ::Now::get() From 5696b65d8ed7fa65012be57994589d9d506ffc4f Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 19:05:56 +0900 Subject: [PATCH 14/76] Abstract the low-level half of system. --- Cargo.lock | 19 +- Cargo.toml | 2 + demo/runtime/Cargo.toml | 2 + demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime2.rs | 63 +-- substrate/runtime-support/Cargo.toml | 2 + substrate/runtime-support/src/lib.rs | 4 + .../runtime-support/src/storage/generator.rs | 222 +++++++--- substrate/runtime/consensus/Cargo.toml | 2 - substrate/runtime/consensus/src/lib.rs | 12 - substrate/runtime/executive/Cargo.toml | 26 ++ substrate/runtime/executive/src/lib.rs | 393 ++++++++++++++++++ substrate/runtime/system/Cargo.toml | 14 +- substrate/runtime/system/src/lib.rs | 307 ++++---------- substrate/runtime/timestamp/Cargo.toml | 2 - substrate/runtime/timestamp/src/lib.rs | 9 +- 16 files changed, 751 insertions(+), 329 deletions(-) create mode 100644 substrate/runtime/executive/Cargo.toml create mode 100644 substrate/runtime/executive/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index c4c2481b0f70f..d88ae001ec1cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -265,6 +265,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", "substrate-runtime-timestamp 0.1.0", ] @@ -1763,7 +1764,6 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", @@ -1799,19 +1799,34 @@ dependencies = [ "ed25519 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-runtime-system" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + [[package]] name = "substrate-runtime-timestamp" version = "0.1.0" dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", diff --git a/Cargo.toml b/Cargo.toml index 84e93cecd5468..8223b537ce741 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,8 @@ members = [ "substrate/runtime-std", "substrate/runtime-support", "substrate/runtime/consensus", + "substrate/runtime/system", + "substrate/runtime/timestamp", "substrate/serializer", "substrate/state-machine", "substrate/test-runtime", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 9a36cc60a84c3..349c7c2e433cc 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -17,6 +17,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } integer-sqrt = "0.1.0" @@ -30,6 +31,7 @@ std = [ "substrate-runtime-support/std", "substrate-primitives/std", "substrate-runtime-consensus/std", + "substrate-runtime-system/std", "substrate-runtime-timestamp/std", "demo-primitives/std", "serde_derive", diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 5892b0f02d73c..c47132a4e33f0 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -23,6 +23,7 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; diff --git a/demo/runtime/src/runtime2.rs b/demo/runtime/src/runtime2.rs index b414689a456ff..68a3aa1bf448e 100644 --- a/demo/runtime/src/runtime2.rs +++ b/demo/runtime/src/runtime2.rs @@ -16,7 +16,18 @@ //! Dispatch system. Just dispatches calls. -use {consensus, timestamp, demo_primitives}; +use codec::Slicable; +use runtime_support::Hashable; +use {consensus, timestamp, system, demo_primitives, primitives}; + +// TODO: move into runtime support. +struct BlakeTwo256; +impl system::Hashing for BlakeTwo256 { + type Output = primitives::H256; + fn hash_of(s: &S) -> Self::Output { + Self::Output::from(s.blake2_256()) + } +} type PublicAux = demo_primitives::AccountId; type PrivAux = (); @@ -36,41 +47,33 @@ impl consensus::Trait for Concrete { } type Consensus = consensus::Module; +impl system::Trait for Concrete { + type TxOrder = demo_primitives::TxOrder; + type BlockNumber = demo_primitives::BlockNumber; + type Hash = demo_primitives::Hash; + type Hashing = BlakeTwo256; + type Digest = demo_primitives::block::Digest; + type AccountId = demo_primitives::AccountId; +} +type System = system::Module; + + impl_outer_dispatch! { pub enum PubCall where aux: PublicAux; +// Session = 1; +// Staking = 2; Timestamp = 3; +// Democracy = 5; +// Council = 6; +// CouncilVote = 7; } impl_outer_dispatch! { pub enum PrivCall where aux: PrivAux; Consensus = 0; +// Session = 1; +// Staking = 2; +// Democracy = 5; +// Council = 6; +// CouncilVote = 7; } - -/* -impl_meta_dispatch! { - pub mod public; - path public; - trait runtime_support::PublicPass; - Session(mod runtime::session) = 1; - Staking(mod runtime::staking) = 2; - Timestamp(mod timestamp) = 3; - Democracy(mod runtime::democracy) = 5; - Council(mod runtime::council) = 6; - CouncilVote(mod runtime::council_vote) = 7; -} - -impl_meta_dispatch! { - pub mod privileged; - path privileged; - trait runtime_support::PrivPass; - Consensus(mod consensus) = 0; - Session(mod runtime::session) = 1; - Staking(mod runtime::staking) = 2; - Democracy(mod runtime::democracy) = 5; - Council(mod runtime::council) = 6; - CouncilVote(mod runtime::council_vote) = 7; -} - -pub use self::privileged::Call as PrivCall; -pub use self::public::Call as PubCall; -*/ diff --git a/substrate/runtime-support/Cargo.toml b/substrate/runtime-support/Cargo.toml index a32a82ba3898e..bef5065ef0f4a 100644 --- a/substrate/runtime-support/Cargo.toml +++ b/substrate/runtime-support/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] ed25519 = { path = "../ed25519", optional = true } hex-literal = { version = "0.1.0", optional = true } serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../runtime-std", default_features = false } substrate-runtime-io = { path = "../runtime-io", default_features = false } substrate-primitives = { path = "../primitives", default_features = false } @@ -18,6 +19,7 @@ std = [ "ed25519", "hex-literal", "serde/std", + "serde_derive", "substrate-primitives/std", "substrate-runtime-io/std", "substrate-codec/std", diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index f7bc38aeaf8a6..564841c27ef35 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -19,6 +19,10 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +#[allow(unused_imports)] #[macro_use] // can be removed when fixed: https://github.com/rust-lang/rust/issues/43497 +extern crate serde_derive; +#[cfg(feature = "std")] pub use serde_derive::*; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; diff --git a/substrate/runtime-support/src/storage/generator.rs b/substrate/runtime-support/src/storage/generator.rs index acf9355e2f737..d91e860f9ee51 100644 --- a/substrate/runtime-support/src/storage/generator.rs +++ b/substrate/runtime-support/src/storage/generator.rs @@ -386,52 +386,52 @@ macro_rules! storage_items { }; // maps - ($name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - ($name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - ($name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!(() ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; @@ -453,9 +453,8 @@ macro_rules! storage_items { #[doc(hidden)] macro_rules! __decl_storage_item { // generator for values. - (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { + (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) ($get_fn:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { __decl_storage_item!{ ($($vis)*) ($traittype as $traitinstance) () ($gettype) ($getter) ($taker) $name : $key => $ty } -// pub fn $get_fn() -> $gettype { <$name as $crate::storage::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) } }; (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { $($vis)* struct $name<$traitinstance: $traittype>($crate::storage::generator::PhantomData<$traitinstance>); @@ -481,10 +480,7 @@ macro_rules! __decl_storage_item { }; // generator for maps. (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) ($get_fn:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { - __decl_storage_item!{ ($($vis)*) ($traittype as $traitinstance) ($gettype) ($getter) ($taker) $name : $prefix => map [$kty => $ty] } -// pub fn $get_fn>(key: K) -> $gettype { -// <$name as $crate::storage::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) -// } + __decl_storage_item!{ ($($vis)*) ($traittype as $traitinstance) () ($gettype) ($getter) ($taker) $name : $prefix => map [$kty => $ty] } }; (($($vis:tt)*) ($traittype:ident as $traitinstance:ident) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { $($vis)* struct $name<$traitinstance: $traittype>($crate::storage::generator::PhantomData<$traitinstance>); @@ -543,6 +539,9 @@ macro_rules! decl_storage { impl<$traitinstance: $traittype> $storetype for $modulename<$traitinstance> { __impl_store_items!($traitinstance $($t)*); } + impl<$traitinstance: $traittype> $modulename<$traitinstance> { + __impl_store_fns!($traitinstance $($t)*); + } }; ( pub trait $storetype:ident for $modulename:ident<$traitinstance:ident: $traittype:ident>; @@ -555,6 +554,9 @@ macro_rules! decl_storage { impl<$traitinstance: $traittype> $storetype for $modulename<$traitinstance> { __impl_store_items!($traitinstance $($t)*); } + impl<$traitinstance: $traittype> $modulename<$traitinstance> { + __impl_store_fns!($traitinstance $($t)*); + } } } @@ -607,41 +609,41 @@ macro_rules! __decl_store_items { }; // maps - ($name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - ($name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - ($name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; - (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_store_item!($name); __decl_store_items!($($t)*); }; @@ -649,6 +651,118 @@ macro_rules! __decl_store_items { () => () } +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_store_fn { + ($traitinstance:ident $name:ident $get_fn:ident ($gettype:ty) $key:expr => $ty:ty) => { + pub fn $get_fn() -> $gettype { + <$name<$traitinstance> as $crate::storage::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) + } + }; + ($traitinstance:ident $name:ident $get_fn:ident ($gettype:ty) $prefix:expr => map [$kty:ty => $ty:ty]) => { + pub fn $get_fn>(key: K) -> $gettype { + <$name<$traitinstance> as $crate::storage::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) + } + } +} + +#[macro_export] +#[doc(hidden)] +macro_rules! __impl_store_fns { + // simple values + ($traitinstance:ident $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn (Option<$ty>) $gettype $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn (Option<$ty>) $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $key => $ty); + __impl_store_fns!($traitinstance $($t)*); + }; + + // maps + ($traitinstance:ident $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fns!($traitinstance $($t)*); + }; + + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn (Option<$ty>) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn (Option<$ty>) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { + __impl_store_fn!($traitinstance $name $getfn ($ty) $prefix:expr => map [$kty => $ty]); + __impl_store_fns!($traitinstance $($t)*); + }; + + // exit + ($traitinstance:ident) => () +} + #[macro_export] #[doc(hidden)] macro_rules! __impl_store_item { @@ -710,52 +824,52 @@ macro_rules! __impl_store_items { }; // maps - ($traitinstance:ident $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; - ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __impl_store_item!($name $traitinstance); __impl_store_items!($traitinstance $($t)*); }; @@ -819,52 +933,52 @@ macro_rules! __decl_storage_items { }; // maps - ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!(() ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; - ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + ($traittype:ident $traitinstance:ident pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty:ty => $ty:ty]; $($t:tt)*) => { __decl_storage_item!((pub) ($traittype as $traitinstance) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); __decl_storage_items!($traittype $traitinstance $($t)*); }; diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml index e8087c9faed70..f5c42ef8fd628 100644 --- a/substrate/runtime/consensus/Cargo.toml +++ b/substrate/runtime/consensus/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-codec = { path = "../../codec", default_features = false } @@ -16,6 +15,5 @@ default = ["std"] std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", - "serde_derive", "serde/std", ] diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index ff59467ac1311..7287f60ff31b3 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -22,9 +22,6 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; -#[cfg(feature = "std")] extern crate serde; - use rstd::prelude::*; use runtime_support::storage; use runtime_support::storage::unhashed::StorageVec; @@ -60,15 +57,6 @@ impl Module { /// Set the new code. fn set_code(_aux: &T::PrivAux, new: Vec) { - Internal::::set_code(new); - } -} - -pub struct Internal(rstd::marker::PhantomData); - -impl Internal { - /// Set the new code. - pub fn set_code(new: Vec) { storage::unhashed::put_raw(CODE, &new); } diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml new file mode 100644 index 0000000000000..3f7a3fa4f4fad --- /dev/null +++ b/substrate/runtime/executive/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "substrate-runtime-system" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } + +[dev-dependencies] +substrate-codec = { path = "../../codec", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } + +[features] +default = ["std"] +std = [ + "substrate-runtime-std/std", + "substrate-runtime-support/std", + "serde/std", + "substrate-codec/std", + "substrate-runtime-io/std", + "substrate-runtime-consensus/std", +] diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs new file mode 100644 index 0000000000000..dbcb88ac60329 --- /dev/null +++ b/substrate/runtime/executive/src/lib.rs @@ -0,0 +1,393 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code +//! and depositing logs. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[cfg(test)] extern crate substrate_runtime_io as runtime_io; +#[cfg(test)] extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; + +#[cfg(feature = "std")] extern crate serde; + +#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +extern crate safe_mix; + +use rstd::prelude::*; +use rstd::mem; +use runtime_io::{print, storage_root, enumerated_trie_root}; +use codec::Slicable; +use runtime_support::{Hashable, StorageValue, StorageMap}; + +use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; +use primitives::block::{generic, Number as BlockNumber, Header, Log}; + +use runtime::{staking, session}; +use runtime::staking::public_pass_from_payment; + +use safe_mix::TripletMix; +use consensus; + +pub trait Trait { + type TxOrder: Parameter + Default + PartialOrd + Ord; + type BlockNumber: Parameter; + type Hash: Parameter + BitOr + BitAnd; + type Digest: Parameter + Default; + type Consensus: consensus::Trait; +} + +decl_module! { + pub struct Module; +} + +decl_storage! { + pub trait Store for Module; + + pub Nonce get(nonce): b"sys:non" => default map [ T::Consensus::SessionId => TxOrder ]; + pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; + RandomSeed get(random_seed): b"sys:rnd" => required Hash; + // The current block number being processed. Set by `execute_block`. + Number get(block_number): b"sys:num" => required BlockNumber; + ParentHash get(parent_hash): b"sys:pha" => required Hash; + TransactionsRoot get(transactions_root): b"sys:txr" => required Hash; + Digest: b"sys:dig" => default block::Digest; +} + +pub trait Checkable { + type CheckedType; + fn check(self) -> Option; +} + +pub trait Dispatchable { + type AccountIdType; + type TxOrderType; + fn nonce(&self) -> Self::TxOrder; + fn sender(&self) -> &Self::AccountId; + fn dispatch(self); +} + +impl Dispatchable for CheckedTransaction { + type TxOrderType; + fn nonce(&self) -> Self::TxOrder { + + } + + fn sender(&self) -> &Self::AccountId; + fn dispatch(self); +} + +impl Checkable for UncheckedTransaction { + type CheckedType = CheckedTransaction; + + fn check(self) -> Option { + + } +} + +pub struct Internal + PartialEq + Eq + Clone, Checked: Dispatchable>; + +impl Internal + PartialEq + Eq + Clone, Checked: Dispatchable> { + type Block = generic::Block; + + /// Deposits a log and ensures it matches the blocks log data. + pub fn deposit_log(log: Log) { + let mut l = Digest::get(); + l.logs.push(log); + Digest::put(l); + } + + /// Actually execute all transitioning for `block`. + pub fn execute_block(mut block: Block) { + initialise_block(&block.header); + + // any initial checks + initial_checks(&block); + + // execute transactions + block.transactions.iter().cloned().for_each(execute_transaction); + + // post-transactional book-keeping. + staking::internal::check_new_era(); + session::internal::check_rotate_session(); + + // any final checks + final_checks(&block); + + // any stuff that we do after taking the storage root. + post_finalise(&block.header); + } + + /// Start the execution of a particular block. + pub fn initialise_block(mut header: &Header) { + // populate environment from header. + Number::put(header.number); + ParentHash::put(header.parent_hash); + TransactionsRoot::put(header.transaction_root); + RandomSeed::put(calculate_random()); + } + + /// Finalise the block - it is up the caller to ensure that all header fields are valid + /// except state-root. + pub fn finalise_block() -> Header { + staking::internal::check_new_era(); + session::internal::check_rotate_session(); + + RandomSeed::kill(); + let header = Header { + number: Number::take(), + digest: Digest::take(), + parent_hash: ParentHash::take(), + transaction_root: TransactionsRoot::take(), + state_root: storage_root().into(), + }; + + post_finalise(&header); + + header + } + + /// Execute a transaction outside of the block execution function. + /// This doesn't attempt to validate anything regarding the block. + pub fn execute_transaction(utx: UncheckedTransaction) { + // Verify the signature is good. + let tx = match transaction::check(utx) { + Ok(tx) => tx, + Err(_) => panic!("All transactions should be properly signed"), + }; + + { + // check nonce + let expected_nonce: TxOrder = Nonce::get(&tx.signed); + assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); + + // increment nonce in storage + Nonce::insert(&tx.signed, &(expected_nonce + 1)); + } + + // decode parameters and dispatch +// let tx = tx.drain().transaction; +// tx.function.dispatch(public_pass_from_payment(&tx.signed)); + tx.dispatch(); + } + + fn initial_checks(block: &Block) { + let ref header = block.header; + + // check parent_hash is correct. + assert!( + header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, + "Parent hash should be valid." + ); + + // check transaction trie root represents the transactions. + let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let txs_root = enumerated_trie_root(&txs).into(); + info_expect_equal_hash(&header.transaction_root, &txs_root); + assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); + } + + fn final_checks(block: &Block) { + let ref header = block.header; + + // check digest + assert!(header.digest == Digest::get()); + + // remove temporaries. + kill_temps(); + + // check storage root. + let storage_root = storage_root().into(); + info_expect_equal_hash(&header.state_root, &storage_root); + assert!(header.state_root == storage_root, "Storage root must match that calculated."); + } + + fn kill_temps() { + Number::kill(); + ParentHash::kill(); + RandomSeed::kill(); + Digest::kill(); + TransactionsRoot::kill(); + } + + fn post_finalise(header: &Header) { + // store the header hash in storage; we can't do it before otherwise there would be a + // cyclic dependency. + BlockHashAt::insert(&header.number, &header.blake2_256().into()); + } + + fn calculate_random() -> Hash { + let c = block_number() - 1; + (0..81) + .map(|i| if c >= i { block_hash(c - i) } else { Default::default() }) + .triplet_mix() + } + + #[cfg(feature = "std")] + fn info_expect_equal_hash(given: &Hash, expected: &Hash) { + use primitives::hexdisplay::HexDisplay; + if given != expected { + println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); + } + } + + #[cfg(not(feature = "std"))] + fn info_expect_equal_hash(given: &Hash, expected: &Hash) { + if given != expected { + print("Hash not equal"); + print(&given.0[..]); + print(&expected.0[..]); + } + } +} + +#[cfg(any(feature = "std", test))] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use codec::Joiner; + + pub fn externalities() -> TestExternalities { + map![ + twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode(), + twox_128(Number::key()).to_vec() => 1u64.encode(), + twox_128(ParentHash::key()).to_vec() => [69u8; 32].encode(), + twox_128(RandomSeed::key()).to_vec() => [0u8; 32].encode() + ] + } + + pub fn set_block_number(n: BlockNumber) { + Number::put(n); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::internal::*; + + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use runtime_support::StorageValue; + use codec::{Joiner, KeyedVec, Slicable}; + use keyring::Keyring::*; + use primitives::hexdisplay::HexDisplay; + use demo_primitives::{Header, Digest}; + use transaction::{UncheckedTransaction, Transaction}; + use runtime::staking; + use dispatch::public::Call as PubCall; + use runtime::staking::public::Call as StakingCall; + + #[test] + fn staking_balance_transfer_dispatch_works() { + let mut t: TestExternalities = map![ + twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() + ]; + + let tx = UncheckedTransaction { + transaction: Transaction { + signed: One.into(), + nonce: 0, + function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), + }, + signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), + }; + + with_externalities(&mut t, || { + internal::initialise_block(&Header::from_block_number(1)); + internal::execute_transaction(tx); + assert_eq!(staking::balance(&One), 32); + assert_eq!(staking::balance(&Two), 69); + }); + } + + fn new_test_ext() -> TestExternalities { + staking::testing::externalities(2, 2, 0) + } + + #[test] + fn block_import_works() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), + transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_state_root_fails() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } + + #[test] + #[should_panic] + fn block_import_of_bad_transaction_root_fails() { + let mut t = new_test_ext(); + + let h = Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), + transaction_root: [0u8; 32].into(), + digest: Digest { logs: vec![], }, + }; + + let b = Block { + header: h, + transactions: vec![], + }; + + with_externalities(&mut t, || { + execute_block(b); + }); + } +} diff --git a/substrate/runtime/system/Cargo.toml b/substrate/runtime/system/Cargo.toml index 522932be2e412..a6dfa5db10034 100644 --- a/substrate/runtime/system/Cargo.toml +++ b/substrate/runtime/system/Cargo.toml @@ -6,21 +6,23 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } -substrate-runtime-std = { path = "../../runtime-std", default_features = false } -substrate-runtime-support = { path = "../../runtime-support", default_features = false } - -[dev-dependencies] substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} [features] default = ["std"] std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", - "serde_derive", "serde/std", + "safe-mix/std", "substrate-codec/std", + "substrate-primitives/std", "substrate-runtime-io/std", + "substrate-runtime-consensus/std", ] diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index c9cf1a7a7c86c..0c075c4fdac7d 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -14,275 +14,151 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code -//! and depositing logs. +//! System manager: Handles lowest level stuff like depositing logs, basic set up and take down of +//! temporary storage entries, access to old block hashes. #![cfg_attr(not(feature = "std"), no_std)] -#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; +#[cfg_attr(any(feature = "std", test), macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; -#[cfg(test)] extern crate substrate_runtime_io as runtime_io; -#[cfg(test)] extern crate substrate_codec as codec; +extern crate substrate_runtime_io as runtime_io; +extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate safe_mix; use rstd::prelude::*; -use rstd::mem; -use runtime_io::{print, storage_root, enumerated_trie_root}; +//use runtime_io::print; use codec::Slicable; -use runtime_support::{Hashable, StorageValue, StorageMap}; -use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; -use primitives::block::{generic, Number as BlockNumber, Header, Log}; -use runtime::{staking, session}; -use runtime::staking::public_pass_from_payment; +use runtime_support::{StorageValue, StorageMap, Parameter}; +use primitives::block; use safe_mix::TripletMix; -type TxOrder = u64; - - - -decl_storage! { - pub trait Store for Module; - - pub Nonce get(nonce): b"sys:non" => default map [ AuthorityId => TxOrder ]; - pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; - RandomSeed get(random_seed): b"sys:rnd" => required Hash; - // The current block number being processed. Set by `execute_block`. - Number get(block_number): b"sys:num" => required BlockNumber; - ParentHash get(parent_hash): b"sys:pha" => required Hash; - TransactionsRoot get(transactions_root): b"sys:txr" => required Hash; - Digest: b"sys:dig" => default block::Digest; -} +#[cfg(any(feature = "std", test))] +use runtime_io::{twox_128, TestExternalities}; -pub trait Checkable { - type CheckedType; - fn check(self) -> Option; +pub trait Hashing { + type Output; + fn hash_of(s: &S) -> Self::Output; } -pub trait Dispatchable { - type AccountIdType; - type TxOrderType; - fn nonce(&self) -> Self::TxOrder; - fn sender(&self) -> &Self::AccountId; - fn dispatch(self); +// TODO: move to a module that uses it. +pub trait CheckEqual { + fn check_equal(&self, other: &Self); } - -impl Dispatchable for CheckedTransaction { - type TxOrderType; - fn nonce(&self) -> Self::TxOrder { - +impl CheckEqual for primitives::Hash { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + use primitives::hexdisplay::HexDisplay; + if &self.0 != &other.0 { + println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); + } } - fn sender(&self) -> &Self::AccountId; - fn dispatch(self); -} - -impl Checkable for UncheckedTransaction { - type CheckedType = CheckedTransaction; - - fn check(self) -> Option { - + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != *other { + print("Hash not equal"); + print(&self.0[..]); + print(&other.0[..]); + } } } -pub struct Internal + PartialEq + Eq + Clone, Checked: Dispatchable>; - -impl Internal + PartialEq + Eq + Clone, Checked: Dispatchable> { - type Block = generic::Block; - - /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: Log) { - let mut l = Digest::get(); - l.logs.push(log); - Digest::put(l); - } - - /// Actually execute all transitioning for `block`. - pub fn execute_block(mut block: Block) { - initialise_block(&block.header); - - // any initial checks - initial_checks(&block); +pub trait Trait { + type TxOrder: Parameter + Default + PartialOrd + Ord; + type BlockNumber: Parameter + PartialOrd + Ord + rstd::ops::Sub + From; + type Hash: Parameter + rstd::ops::BitOr + rstd::ops::BitAnd + Default + Copy + CheckEqual; + type Hashing: Hashing; + type Digest: Parameter + Default; + type AccountId: Parameter; +} - // execute transactions - block.transactions.iter().cloned().for_each(execute_transaction); +decl_module! { + pub struct Module; +} - // post-transactional book-keeping. - staking::internal::check_new_era(); - session::internal::check_rotate_session(); +decl_storage! { + trait Store for Module; - // any final checks - final_checks(&block); + pub Nonce get(nonce): b"sys:non" => default map [ T::AccountId => T::TxOrder ]; + pub BlockHashAt get(block_hash): b"sys:old" => required map [ T::BlockNumber => T::Hash ]; - // any stuff that we do after taking the storage root. - post_finalise(&block.header); - } + RandomSeed get(random_seed): b"sys:rnd" => required T::Hash; + // The current block number being processed. Set by `execute_block`. + Number get(block_number): b"sys:num" => required T::BlockNumber; + ParentHash get(parent_hash): b"sys:pha" => required T::Hash; + TransactionsRoot get(transactions_root): b"sys:txr" => required T::Hash; + Digest: b"sys:dig" => default block::Digest; +} +impl Module { /// Start the execution of a particular block. - pub fn initialise_block(mut header: &Header) { - // populate environment from header. - Number::put(header.number); - ParentHash::put(header.parent_hash); - TransactionsRoot::put(header.transaction_root); - RandomSeed::put(calculate_random()); + pub fn initialise(number: T::BlockNumber, parent_hash: T::Hash, txs_root: T::Hash) { + // populate environment. + >::put(number); + >::put(parent_hash); + >::put(txs_root); + >::put(Self::calculate_random()); } - /// Finalise the block - it is up the caller to ensure that all header fields are valid - /// except state-root. - pub fn finalise_block() -> Header { - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - RandomSeed::kill(); - let header = Header { - number: Number::take(), - digest: Digest::take(), - parent_hash: ParentHash::take(), - transaction_root: TransactionsRoot::take(), - state_root: storage_root().into(), - }; - - post_finalise(&header); - - header - } - - /// Execute a transaction outside of the block execution function. - /// This doesn't attempt to validate anything regarding the block. - pub fn execute_transaction(utx: UncheckedTransaction) { - // Verify the signature is good. - let tx = match transaction::check(utx) { - Ok(tx) => tx, - Err(_) => panic!("All transactions should be properly signed"), - }; - - { - // check nonce - let expected_nonce: TxOrder = Nonce::get(&tx.signed); - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); - - // increment nonce in storage - Nonce::insert(&tx.signed, &(expected_nonce + 1)); - } - - // decode parameters and dispatch -// let tx = tx.drain().transaction; -// tx.function.dispatch(public_pass_from_payment(&tx.signed)); - tx.dispatch(); - } - - fn initial_checks(block: &Block) { - let ref header = block.header; - - // check parent_hash is correct. - assert!( - header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, - "Parent hash should be valid." - ); - - // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root(&txs).into(); - info_expect_equal_hash(&header.transaction_root, &txs_root); - assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); - } - - fn final_checks(block: &Block) { - let ref header = block.header; - - // check digest - assert!(header.digest == Digest::get()); - - // remove temporaries. - kill_temps(); - - // check storage root. - let storage_root = storage_root().into(); - info_expect_equal_hash(&header.state_root, &storage_root); - assert!(header.state_root == storage_root, "Storage root must match that calculated."); + /// Remove temporary "environment" entries in storage. + pub fn finalise() { + >::kill(); + >::kill(); + >::kill(); + >::kill(); + >::kill(); } - fn kill_temps() { - Number::kill(); - ParentHash::kill(); - RandomSeed::kill(); - Digest::kill(); - TransactionsRoot::kill(); + /// Deposits a log and ensures it matches the blocks log data. + pub fn deposit_log(log: block::Log) { + let mut l = >::get(); + l.logs.push(log); + >::put(l); } - fn post_finalise(header: &Header) { + /// Records a particular block number and hash combination. + pub fn record_block_hash(number: T::BlockNumber, header: &H) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - BlockHashAt::insert(&header.number, &header.blake2_256().into()); + >::insert(&number, &T::Hashing::hash_of(header)); } - fn calculate_random() -> Hash { - let c = block_number() - 1; + /// Calculate the current block's random seed. + fn calculate_random() -> T::Hash { + let c = Self::block_number() - T::BlockNumber::from(1u64); (0..81) - .map(|i| if c >= i { block_hash(c - i) } else { Default::default() }) + .map(T::BlockNumber::from) + .map(|i| if c >= i { Self::block_hash(c.clone() - i) } else { Default::default() }) .triplet_mix() } - #[cfg(feature = "std")] - fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - use primitives::hexdisplay::HexDisplay; - if given != expected { - println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); - } - } - - #[cfg(not(feature = "std"))] - fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - if given != expected { - print("Hash not equal"); - print(&given.0[..]); - print(&expected.0[..]); - } - } -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::Joiner; - + /// Get the basic externalities for this module, useful for tests. + #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { map![ - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode(), - twox_128(Number::key()).to_vec() => 1u64.encode(), - twox_128(ParentHash::key()).to_vec() => [69u8; 32].encode(), - twox_128(RandomSeed::key()).to_vec() => [0u8; 32].encode() + twox_128(&>::key_for(T::BlockNumber::from(0u64))).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode + twox_128(>::key()).to_vec() => T::BlockNumber::from(1u64).encode(), + twox_128(>::key()).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode + twox_128(>::key()).to_vec() => T::Hash::default().encode() ] } - pub fn set_block_number(n: BlockNumber) { - Number::put(n); + /// Set the block number to something in particular. Can be used as an alternative to + /// `initialise` for tests that don't need to bother with the other environment entries. + #[cfg(any(feature = "std", test))] + pub fn set_block_number(n: T::BlockNumber) { + >::put(n); } } #[cfg(test)] mod tests { +/* use super::*; - use super::internal::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use runtime_support::StorageValue; - use codec::{Joiner, KeyedVec, Slicable}; - use keyring::Keyring::*; - use primitives::hexdisplay::HexDisplay; - use demo_primitives::{Header, Digest}; - use transaction::{UncheckedTransaction, Transaction}; - use runtime::staking; - use dispatch::public::Call as PubCall; - use runtime::staking::public::Call as StakingCall; - #[test] fn staking_balance_transfer_dispatch_works() { let mut t: TestExternalities = map![ @@ -379,4 +255,5 @@ mod tests { execute_block(b); }); } + */ } diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml index 70617555d688d..d3bfc099a0d8a 100644 --- a/substrate/runtime/timestamp/Cargo.toml +++ b/substrate/runtime/timestamp/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } -serde_derive = { version = "1.0", optional = true } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-codec = { path = "../../codec", default_features = false } @@ -19,7 +18,6 @@ default = ["std"] std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", - "serde_derive", "serde/std", "substrate-codec/std", ] diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index f714cdc46d8fc..58d5a91698dda 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -22,10 +22,8 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; -//#[cfg(feature = "std")] extern crate serde; -use runtime_support::storage::StorageValue; +use runtime_support::StorageValue; use runtime_support::Parameter; pub trait Trait { @@ -42,8 +40,7 @@ decl_module! { decl_storage! { pub trait Store for Module; - pub Now: b"tim:val" => required T::Value; - pub Then: b"tim:then" => default T::Value; + pub Now get(now): b"tim:val" => required T::Value; } impl Module { @@ -82,7 +79,7 @@ mod tests { with_externalities(&mut t, || { assert_eq!(::Now::get(), 42); Timestamp::dispatch(Call::set(69), &0); - assert_eq!(::Now::get(), 69); + assert_eq!(Timestamp::now(), 69); }); } } From 73822e5196afa8e95276a0b4d41558d5a2ee574d Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 19:09:48 +0900 Subject: [PATCH 15/76] nicer outer dispatch syntax. --- demo/runtime/src/runtime2.rs | 30 ++++++++++++----------- substrate/runtime-support/src/dispatch.rs | 13 +++++++--- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/demo/runtime/src/runtime2.rs b/demo/runtime/src/runtime2.rs index 68a3aa1bf448e..af11136039622 100644 --- a/demo/runtime/src/runtime2.rs +++ b/demo/runtime/src/runtime2.rs @@ -59,21 +59,23 @@ type System = system::Module; impl_outer_dispatch! { - pub enum PubCall where aux: PublicAux; -// Session = 1; -// Staking = 2; - Timestamp = 3; -// Democracy = 5; -// Council = 6; -// CouncilVote = 7; + pub enum PubCall where aux: PublicAux { +// Session = 1, +// Staking = 2, + Timestamp = 3, +// Democracy = 5, +// Council = 6, +// CouncilVote = 7, + } } impl_outer_dispatch! { - pub enum PrivCall where aux: PrivAux; - Consensus = 0; -// Session = 1; -// Staking = 2; -// Democracy = 5; -// Council = 6; -// CouncilVote = 7; + pub enum PrivCall where aux: PrivAux { + Consensus = 0, +// Session = 1, +// Staking = 2, +// Democracy = 5, +// Council = 6, +// CouncilVote = 7, + } } diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 734eb15e7052d..1a6c3f3be121d 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -324,11 +324,14 @@ macro_rules! __decl_dispatch_module { /// Implement a meta-dispatch module to dispatch to other dispatchers. #[macro_export] macro_rules! impl_outer_dispatch { + () => {}; ( - pub enum $call_type:ident where aux: $aux:ty; - $( - $camelcase:ident = $id:expr ; - )* + pub enum $call_type:ident where aux: $aux:ty { + $( + $camelcase:ident = $id:expr, + )* + } + $( $rest:tt )* ) => { #[derive(Clone, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] @@ -380,6 +383,8 @@ macro_rules! impl_outer_dispatch { } } impl $crate::dispatch::NonTrivialSlicable for $call_type {} + + impl_outer_dispatch{$($rest)*} } } From 77db293bebdf347f91e1661dd387d9eedcad3f35 Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 19:18:09 +0900 Subject: [PATCH 16/76] Make runtime compile again (albeit in a heavily simplified state) --- demo/runtime/src/api.rs | 9 ++++----- demo/runtime/src/block.rs | 2 +- demo/runtime/src/lib.rs | 8 +++----- .../src/{runtime => runtime-old}/council.rs | 0 .../src/{runtime => runtime-old}/council_vote.rs | 0 .../src/{runtime => runtime-old}/democracy.rs | 0 demo/runtime/src/{runtime => runtime-old}/mod.rs | 0 .../src/{runtime => runtime-old}/session.rs | 0 .../src/{runtime => runtime-old}/staking.rs | 0 .../runtime/src/{runtime => runtime-old}/system.rs | 0 demo/runtime/src/{runtime2.rs => runtime.rs} | 14 +++++--------- demo/runtime/src/transaction.rs | 6 +++--- substrate/runtime-support/src/dispatch.rs | 2 +- 13 files changed, 17 insertions(+), 24 deletions(-) rename demo/runtime/src/{runtime => runtime-old}/council.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/council_vote.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/democracy.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/mod.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/session.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/staking.rs (100%) rename demo/runtime/src/{runtime => runtime-old}/system.rs (100%) rename demo/runtime/src/{runtime2.rs => runtime.rs} (89%) diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index ea53296142ed1..a22d823a5da56 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -14,15 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -use runtime::{system, session}; -use consensus; +use runtime; impl_stubs!( - execute_block => |block| system::internal::execute_block(block), + authorities => |()| runtime::Consensus::authorities() +/* execute_block => |block| system::internal::execute_block(block), initialise_block => |header| system::internal::initialise_block(&header), execute_transaction => |utx| system::internal::execute_transaction(utx), finalise_block => |()| system::internal::finalise_block(), validator_count => |()| session::validator_count(), - validators => |()| session::validators(), - authorities => |()| consensus::authorities() + validators => |()| session::validators(),*/ ); diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index 182f9ca89b67e..fec33bdf62637 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -27,7 +27,7 @@ pub type Body = Vec; /// A block on the chain. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Block { /// The block header. pub header: Header, diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index c47132a4e33f0..b62dcf74ff0d3 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -35,18 +35,16 @@ extern crate safe_mix; #[cfg(feature = "std")] extern crate rustc_hex; extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[macro_use] extern crate substrate_primitives as primitives; +#[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] extern crate substrate_primitives as primitives; extern crate demo_primitives; #[cfg(test)] #[macro_use] extern crate hex_literal; extern crate integer_sqrt; -pub mod dispatch; +pub mod runtime; pub mod block; pub mod transaction; -pub mod runtime; pub mod api; -pub mod runtime2; -#[cfg(feature = "std")] pub mod genesismap; +//#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime/council.rs b/demo/runtime/src/runtime-old/council.rs similarity index 100% rename from demo/runtime/src/runtime/council.rs rename to demo/runtime/src/runtime-old/council.rs diff --git a/demo/runtime/src/runtime/council_vote.rs b/demo/runtime/src/runtime-old/council_vote.rs similarity index 100% rename from demo/runtime/src/runtime/council_vote.rs rename to demo/runtime/src/runtime-old/council_vote.rs diff --git a/demo/runtime/src/runtime/democracy.rs b/demo/runtime/src/runtime-old/democracy.rs similarity index 100% rename from demo/runtime/src/runtime/democracy.rs rename to demo/runtime/src/runtime-old/democracy.rs diff --git a/demo/runtime/src/runtime/mod.rs b/demo/runtime/src/runtime-old/mod.rs similarity index 100% rename from demo/runtime/src/runtime/mod.rs rename to demo/runtime/src/runtime-old/mod.rs diff --git a/demo/runtime/src/runtime/session.rs b/demo/runtime/src/runtime-old/session.rs similarity index 100% rename from demo/runtime/src/runtime/session.rs rename to demo/runtime/src/runtime-old/session.rs diff --git a/demo/runtime/src/runtime/staking.rs b/demo/runtime/src/runtime-old/staking.rs similarity index 100% rename from demo/runtime/src/runtime/staking.rs rename to demo/runtime/src/runtime-old/staking.rs diff --git a/demo/runtime/src/runtime/system.rs b/demo/runtime/src/runtime-old/system.rs similarity index 100% rename from demo/runtime/src/runtime/system.rs rename to demo/runtime/src/runtime-old/system.rs diff --git a/demo/runtime/src/runtime2.rs b/demo/runtime/src/runtime.rs similarity index 89% rename from demo/runtime/src/runtime2.rs rename to demo/runtime/src/runtime.rs index af11136039622..c0a412d8de3f5 100644 --- a/demo/runtime/src/runtime2.rs +++ b/demo/runtime/src/runtime.rs @@ -21,7 +21,7 @@ use runtime_support::Hashable; use {consensus, timestamp, system, demo_primitives, primitives}; // TODO: move into runtime support. -struct BlakeTwo256; +pub struct BlakeTwo256; impl system::Hashing for BlakeTwo256 { type Output = primitives::H256; fn hash_of(s: &S) -> Self::Output { @@ -32,20 +32,19 @@ impl system::Hashing for BlakeTwo256 { type PublicAux = demo_primitives::AccountId; type PrivAux = (); -#[cfg_attr(feature = "std", derive(Debug))] -struct Concrete; +pub struct Concrete; impl timestamp::Trait for Concrete { type Value = u64; type PublicAux = PublicAux; } -type Timestamp = timestamp::Module; +pub type Timestamp = timestamp::Module; impl consensus::Trait for Concrete { type SessionKey = demo_primitives::AccountId; type PrivAux = PrivAux; } -type Consensus = consensus::Module; +pub type Consensus = consensus::Module; impl system::Trait for Concrete { type TxOrder = demo_primitives::TxOrder; @@ -55,8 +54,7 @@ impl system::Trait for Concrete { type Digest = demo_primitives::block::Digest; type AccountId = demo_primitives::AccountId; } -type System = system::Module; - +pub type System = system::Module; impl_outer_dispatch! { pub enum PubCall where aux: PublicAux { @@ -67,9 +65,7 @@ impl_outer_dispatch! { // Council = 6, // CouncilVote = 7, } -} -impl_outer_dispatch! { pub enum PrivCall where aux: PrivAux { Consensus = 0, // Session = 1, diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index ffa18911292ec..bb04e51c1e977 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -20,14 +20,14 @@ use rstd::prelude::*; use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; -use dispatch::PubCall; +use runtime::PubCall; #[cfg(feature = "std")] use std::fmt; /// A vetted and verified transaction from the external world. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Transaction { /// Who signed it (note this is not a signature). pub signed: AccountId, @@ -61,7 +61,7 @@ impl ::codec::NonTrivialSlicable for Transaction {} /// A transactions right from the external world. Unchecked. #[derive(Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Serialize))] pub struct UncheckedTransaction { /// The actual transaction information. pub transaction: Transaction, diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 1a6c3f3be121d..4845fb4b04955 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -384,7 +384,7 @@ macro_rules! impl_outer_dispatch { } impl $crate::dispatch::NonTrivialSlicable for $call_type {} - impl_outer_dispatch{$($rest)*} + impl_outer_dispatch!{ $($rest)* } } } From b9a0302bfef1e0b25a71fd50b8056b47f240a54b Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 24 Mar 2018 20:31:50 +0900 Subject: [PATCH 17/76] Reworking runtime and the upper levels of system. --- Cargo.lock | 16 ++ Cargo.toml | 1 + demo/runtime/Cargo.toml | 2 + demo/runtime/src/lib.rs | 5 + demo/runtime/src/runtime.rs | 2 +- demo/runtime/src/transaction.rs | 38 ++++- substrate/runtime/executive/Cargo.toml | 8 +- substrate/runtime/executive/src/lib.rs | 223 +++++++++---------------- substrate/runtime/system/src/lib.rs | 9 +- 9 files changed, 144 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d88ae001ec1cb..fb5a5b13df7b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -262,6 +262,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", + "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", @@ -1769,6 +1770,21 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "substrate-runtime-executive" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-io" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 8223b537ce741..e6babb5f0d445 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ members = [ "substrate/runtime-std", "substrate/runtime-support", "substrate/runtime/consensus", + "substrate/runtime/executive", "substrate/runtime/system", "substrate/runtime/timestamp", "substrate/serializer", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 349c7c2e433cc..dc746daa67807 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -17,6 +17,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-executive = { path = "../../substrate/runtime/executive" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } @@ -31,6 +32,7 @@ std = [ "substrate-runtime-support/std", "substrate-primitives/std", "substrate-runtime-consensus/std", + "substrate-runtime-executive/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", "demo-primitives/std", diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index b62dcf74ff0d3..ed4b377659504 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -23,6 +23,7 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_executive as executive; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; @@ -47,4 +48,8 @@ pub mod block; pub mod transaction; pub mod api; +type Executive = executive::Executive< + //... the type params... +>; + //#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index c0a412d8de3f5..62fa6f8ed23cc 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -57,7 +57,7 @@ impl system::Trait for Concrete { pub type System = system::Module; impl_outer_dispatch! { - pub enum PubCall where aux: PublicAux { + pub enum Call where aux: PublicAux { // Session = 1, // Staking = 2, Timestamp = 3, diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index bb04e51c1e977..3ebbefe6fe704 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -21,6 +21,7 @@ use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; use runtime::PubCall; +use executive::{Checkable, Executable}; #[cfg(feature = "std")] use std::fmt; @@ -127,11 +128,6 @@ impl CheckedTransaction { pub fn signature(&self) -> &Signature { &self.0.signature } - - /// Get the inner object. - pub fn drain(self) -> UncheckedTransaction { - self.0 - } } impl ops::Deref for CheckedTransaction { @@ -154,6 +150,32 @@ pub fn check(tx: UncheckedTransaction) -> Result Result { + check(self) + } +} + +impl Executable for CheckedTransaction { + type TxOrderType = TxOrder; + type AccountIdType = AccountId; + + fn nonce(&self) -> Self::TxOrderType { + self.0.nonce + } + + fn sender(&self) -> &Self::AccountIdType { + self.0.signed + } + + fn execute(self) { + let tx = self.0.transaction; + //TODO: take payment e.g. public_pass_from_payment + tx.function.dispatch(&tx.signed); + } +} #[cfg(test)] mod tests { @@ -161,8 +183,8 @@ mod tests { use primitives; use codec::Slicable; use primitives::hexdisplay::HexDisplay; - use dispatch::public::Call; - use timestamp::public::Call as TimestampCall; + use timestamp; + use runtime::Call; #[test] fn serialize_unchecked() { @@ -170,7 +192,7 @@ mod tests { transaction: Transaction { signed: [1; 32], nonce: 999u64, - function: Call::Timestamp(TimestampCall::set(135135)), + function: Call::Timestamp(timestamp::Call::set(135135)), }, signature: primitives::hash::H512([0; 64]), }; diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index 3f7a3fa4f4fad..59da8ef7e3e03 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -1,17 +1,19 @@ [package] -name = "substrate-runtime-system" +name = "substrate-runtime-executive" version = "0.1.0" authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-consensus = { path = "../consensus", default_features = false } +substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] -substrate-codec = { path = "../../codec", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } [features] @@ -21,6 +23,8 @@ std = [ "substrate-runtime-support/std", "serde/std", "substrate-codec/std", + "substrate-primitives/std", "substrate-runtime-io/std", "substrate-runtime-consensus/std", + "substrate-runtime-system/std", ] diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index dbcb88ac60329..61e2b88dab05f 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -45,31 +45,6 @@ use runtime::staking::public_pass_from_payment; use safe_mix::TripletMix; use consensus; -pub trait Trait { - type TxOrder: Parameter + Default + PartialOrd + Ord; - type BlockNumber: Parameter; - type Hash: Parameter + BitOr + BitAnd; - type Digest: Parameter + Default; - type Consensus: consensus::Trait; -} - -decl_module! { - pub struct Module; -} - -decl_storage! { - pub trait Store for Module; - - pub Nonce get(nonce): b"sys:non" => default map [ T::Consensus::SessionId => TxOrder ]; - pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; - RandomSeed get(random_seed): b"sys:rnd" => required Hash; - // The current block number being processed. Set by `execute_block`. - Number get(block_number): b"sys:num" => required BlockNumber; - ParentHash get(parent_hash): b"sys:pha" => required Hash; - TransactionsRoot get(transactions_root): b"sys:txr" => required Hash; - Digest: b"sys:dig" => default block::Digest; -} - pub trait Checkable { type CheckedType; fn check(self) -> Option; @@ -78,71 +53,96 @@ pub trait Checkable { pub trait Dispatchable { type AccountIdType; type TxOrderType; - fn nonce(&self) -> Self::TxOrder; - fn sender(&self) -> &Self::AccountId; + fn nonce(&self) -> Self::TxOrderType; + fn sender(&self) -> &Self::AccountIdType; fn dispatch(self); } -impl Dispatchable for CheckedTransaction { - type TxOrderType; - fn nonce(&self) -> Self::TxOrder { - - } - - fn sender(&self) -> &Self::AccountId; - fn dispatch(self); +pub trait Blocky: Sized { + type Number: Sized; + type Hash: Sized; + type Digest: Sized; + type Transaction: Sized; + type Header: Sized + Slicable; + fn number(&self) -> Self::Number; + fn transactions_root(&self) -> &Self::Hash; + fn state_root(&self) -> &Self::Hash; + fn parent_hash(&self) -> &Self::Hash; + fn digest(&self) -> &Self::Digest; + fn transactions(&self) -> Iterator<&Transaction>; + fn to_header( + number: Self::Number, + transactions_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self::Header; } -impl Checkable for UncheckedTransaction { - type CheckedType = CheckedTransaction; - - fn check(self) -> Option { +pub struct Executive< + Unchecked: Checkable + PartialEq + Eq + Clone + Slicable, + Checked: Dispatchable, + System: system::Trait, + Block: Blocky, +>(PhantomData<(Unchecked, Checked, System, Block)>); + +impl< + Unchecked: Checkable + PartialEq + Eq + Clone + Slicable, + Checked: Dispatchable, + System: system::Trait, + Block: Blocky< + Transaction = Self::Unchecked, + Number = Self::System::Number, + Hash = Self::System::Hash, + Digest = Self::System::Digest + >, +> Executive { +// type Block = generic::Block; +// type System = system::Module + /// Start the execution of a particular block. + pub fn initialise_block(block: &Block) { + system::initialise(block.number(), block.parent_hash(), block.transactions_root()); } -} - -pub struct Internal + PartialEq + Eq + Clone, Checked: Dispatchable>; -impl Internal + PartialEq + Eq + Clone, Checked: Dispatchable> { - type Block = generic::Block; + fn initial_checks(block: &Block) { + // check parent_hash is correct. + assert!( + header.number() > System::Number::from(0u64) && >::block_hash(header.number - System::Number::from(1u64)) == *block.parent_hash(), + "Parent hash should be valid." + ); - /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: Log) { - let mut l = Digest::get(); - l.logs.push(log); - Digest::put(l); + // check transaction trie root represents the transactions. + let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = txs.iter().map(Vec::as_slice).collect::>(); + let txs_root = enumerated_trie_root(&txs).into(); + info_expect_equal_hash(&header.transaction_root, &txs_root); + assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); } /// Actually execute all transitioning for `block`. pub fn execute_block(mut block: Block) { - initialise_block(&block.header); + initialise_block(&block); // any initial checks initial_checks(&block); // execute transactions - block.transactions.iter().cloned().for_each(execute_transaction); + block.transactions().cloned().for_each(execute_transaction); // post-transactional book-keeping. - staking::internal::check_new_era(); - session::internal::check_rotate_session(); + // TODO: some way of getting these in in a modular way. +// staking::internal::check_new_era(); +// session::internal::check_rotate_session(); // any final checks final_checks(&block); // any stuff that we do after taking the storage root. - post_finalise(&block.header); - } - - /// Start the execution of a particular block. - pub fn initialise_block(mut header: &Header) { - // populate environment from header. - Number::put(header.number); - ParentHash::put(header.parent_hash); - TransactionsRoot::put(header.transaction_root); - RandomSeed::put(calculate_random()); + post_finalise(&block); } - +/* + // TODO fix. /// Finalise the block - it is up the caller to ensure that all header fields are valid /// except state-root. pub fn finalise_block() -> Header { @@ -162,122 +162,50 @@ impl Internal + header } - +*/ /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn execute_transaction(utx: UncheckedTransaction) { // Verify the signature is good. - let tx = match transaction::check(utx) { + let tx = match utx.check() { Ok(tx) => tx, Err(_) => panic!("All transactions should be properly signed"), }; { // check nonce - let expected_nonce: TxOrder = Nonce::get(&tx.signed); + let expected_nonce = >::nonce(tx.sender()); assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); // increment nonce in storage - Nonce::insert(&tx.signed, &(expected_nonce + 1)); + >::inc_nonce(tx.sender()); } // decode parameters and dispatch -// let tx = tx.drain().transaction; -// tx.function.dispatch(public_pass_from_payment(&tx.signed)); tx.dispatch(); } - fn initial_checks(block: &Block) { - let ref header = block.header; - - // check parent_hash is correct. - assert!( - header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, - "Parent hash should be valid." - ); - - // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root(&txs).into(); - info_expect_equal_hash(&header.transaction_root, &txs_root); - assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); - } fn final_checks(block: &Block) { - let ref header = block.header; - // check digest - assert!(header.digest == Digest::get()); + assert!(block.digest() == &>::digest()); // remove temporaries. - kill_temps(); + >::kill_temps(); // check storage root. let storage_root = storage_root().into(); - info_expect_equal_hash(&header.state_root, &storage_root); - assert!(header.state_root == storage_root, "Storage root must match that calculated."); +// info_expect_equal_hash(block.state_root(), &storage_root); // TODO use the check_equal trait. + assert!(block.state_root() == &storage_root, "Storage root must match that calculated."); } - fn kill_temps() { - Number::kill(); - ParentHash::kill(); - RandomSeed::kill(); - Digest::kill(); - TransactionsRoot::kill(); - } - - fn post_finalise(header: &Header) { + fn post_finalise(block: &Block) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - BlockHashAt::insert(&header.number, &header.blake2_256().into()); - } - - fn calculate_random() -> Hash { - let c = block_number() - 1; - (0..81) - .map(|i| if c >= i { block_hash(c - i) } else { Default::default() }) - .triplet_mix() - } - - #[cfg(feature = "std")] - fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - use primitives::hexdisplay::HexDisplay; - if given != expected { - println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); - } - } - - #[cfg(not(feature = "std"))] - fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - if given != expected { - print("Hash not equal"); - print(&given.0[..]); - print(&expected.0[..]); - } - } -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::Joiner; - - pub fn externalities() -> TestExternalities { - map![ - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode(), - twox_128(Number::key()).to_vec() => 1u64.encode(), - twox_128(ParentHash::key()).to_vec() => [69u8; 32].encode(), - twox_128(RandomSeed::key()).to_vec() => [0u8; 32].encode() - ] - } - - pub fn set_block_number(n: BlockNumber) { - Number::put(n); + >::record_block_hash(block.number(), &block.to_header()) } } - +/* #[cfg(test)] mod tests { use super::*; @@ -391,3 +319,4 @@ mod tests { }); } } +*/ diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 0c075c4fdac7d..43a82341d658a 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -68,7 +68,7 @@ impl CheckEqual for primitives::Hash { } pub trait Trait { - type TxOrder: Parameter + Default + PartialOrd + Ord; + type TxOrder: Parameter + Default + PartialOrd + Ord + rstd::ops::Add + From; type BlockNumber: Parameter + PartialOrd + Ord + rstd::ops::Sub + From; type Hash: Parameter + rstd::ops::BitOr + rstd::ops::BitAnd + Default + Copy + CheckEqual; type Hashing: Hashing; @@ -91,7 +91,7 @@ decl_storage! { Number get(block_number): b"sys:num" => required T::BlockNumber; ParentHash get(parent_hash): b"sys:pha" => required T::Hash; TransactionsRoot get(transactions_root): b"sys:txr" => required T::Hash; - Digest: b"sys:dig" => default block::Digest; + Digest: b"sys:dig" => default block::Digest; // TODO: change to T::Digest (will require traitification) } impl Module { @@ -153,6 +153,11 @@ impl Module { pub fn set_block_number(n: T::BlockNumber) { >::put(n); } + + /// Increment a particular account's nonce by 1. + pub fn inc_nonce(who: &T::AccountId) { + >::insert(who, Self::nonce(who) + T::TxOrder::from(1u64)); + } } #[cfg(test)] From 794d80901abe945da00ca80e595c56fb056eed7a Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 15:12:21 +0900 Subject: [PATCH 18/76] Initial reworking of runtime: - Introduced executive module; - Introduced trait primitives module; - Provided an API endpoint. --- Cargo.lock | 11 ++- Cargo.toml | 1 + demo/primitives/Cargo.toml | 2 + demo/primitives/src/{block.rs => header.rs} | 23 +++++ demo/primitives/src/lib.rs | 7 +- demo/runtime/Cargo.toml | 2 + demo/runtime/src/api.rs | 5 +- demo/runtime/src/block.rs | 21 +++-- demo/runtime/src/lib.rs | 9 +- demo/runtime/src/runtime.rs | 8 +- demo/runtime/src/transaction.rs | 15 ++-- substrate/runtime/executive/Cargo.toml | 6 +- substrate/runtime/executive/src/lib.rs | 95 +++++++-------------- substrate/runtime/primitives/Cargo.toml | 13 +++ substrate/runtime/primitives/src/lib.rs | 79 +++++++++++++++++ substrate/runtime/system/src/lib.rs | 18 ++-- 16 files changed, 216 insertions(+), 99 deletions(-) rename demo/primitives/src/{block.rs => header.rs} (86%) create mode 100644 substrate/runtime/primitives/Cargo.toml create mode 100644 substrate/runtime/primitives/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index fb5a5b13df7b7..b592d3a67b059 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -242,6 +242,7 @@ dependencies = [ "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-serializer 0.1.0", ] @@ -264,6 +265,7 @@ dependencies = [ "substrate-runtime-consensus 0.1.0", "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", @@ -1777,9 +1779,9 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", - "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", @@ -1799,6 +1801,13 @@ dependencies = [ "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-runtime-primitives" +version = "0.1.0" +dependencies = [ + "substrate-codec 0.1.0", +] + [[package]] name = "substrate-runtime-std" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index e6babb5f0d445..2cd869d858457 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,6 +40,7 @@ members = [ "substrate/runtime-support", "substrate/runtime/consensus", "substrate/runtime/executive", + "substrate/runtime/primitives", "substrate/runtime/system", "substrate/runtime/timestamp", "substrate/serializer", diff --git a/demo/primitives/Cargo.toml b/demo/primitives/Cargo.toml index a8365cf41fb51..1a359e06e7463 100644 --- a/demo/primitives/Cargo.toml +++ b/demo/primitives/Cargo.toml @@ -9,6 +9,7 @@ serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../substrate/codec", default_features = false } substrate-primitives = { path = "../../substrate/primitives", default_features = false } substrate-runtime-std = { path = "../../substrate/runtime-std", default_features = false } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives", default_features = false } [dev-dependencies] substrate-serializer = { path = "../../substrate/serializer" } @@ -20,6 +21,7 @@ std = [ "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", + "substrate-runtime-primitives/std", "serde_derive", "serde/std", ] diff --git a/demo/primitives/src/block.rs b/demo/primitives/src/header.rs similarity index 86% rename from demo/primitives/src/block.rs rename to demo/primitives/src/header.rs index f5119ac4b3f22..9e6ae35a148a6 100644 --- a/demo/primitives/src/block.rs +++ b/demo/primitives/src/header.rs @@ -23,6 +23,7 @@ use rstd::vec::Vec; use codec::{Input, Slicable}; pub use primitives::block::Id; +pub use runtime_primitives::Headery; /// Used to refer to a block number. pub type Number = u64; @@ -96,6 +97,28 @@ impl Header { } } +impl Headery for Header { + type Number = Number; + type Hash = HeaderHash; + type Digest = Digest; + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.transaction_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + Header { + number, transaction_root: extrinsics_root, state_root, parent_hash, digest + } + } +} + impl Slicable for Header { fn decode(input: &mut I) -> Option { Some(Header { diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index c65d4a63ef700..08b1e917a6e0d 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -29,6 +29,7 @@ extern crate serde_derive; extern crate serde; extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_primitives as primitives; #[cfg(test)] extern crate substrate_serializer; @@ -44,10 +45,10 @@ macro_rules! try_opt { } } -pub mod block; +pub mod header; -pub use self::block::{Header, Log, Digest}; -pub use self::block::Number as BlockNumber; +pub use self::header::{Header, Log, Digest}; +pub use self::header::Number as BlockNumber; /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index dc746daa67807..7397d4f529f58 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -18,6 +18,7 @@ substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } @@ -33,6 +34,7 @@ std = [ "substrate-primitives/std", "substrate-runtime-consensus/std", "substrate-runtime-executive/std", + "substrate-runtime-primitives/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", "demo-primitives/std", diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index a22d823a5da56..d7789e62c8502 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -15,11 +15,12 @@ // along with Substrate Demo. If not, see . use runtime; +use Executive; impl_stubs!( - authorities => |()| runtime::Consensus::authorities() + authorities => |()| runtime::Consensus::authorities(), + initialise_block => |header| Executive::initialise_block(&header) /* execute_block => |block| system::internal::execute_block(block), - initialise_block => |header| system::internal::initialise_block(&header), execute_transaction => |utx| system::internal::execute_transaction(utx), finalise_block => |()| system::internal::finalise_block(), validator_count => |()| session::validator_count(), diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index fec33bdf62637..96bc463a55d20 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -17,13 +17,11 @@ //! Block and header type definitions. use rstd::prelude::*; +use rstd::slice::Iter; use codec::{Input, Slicable}; use transaction::UncheckedTransaction; - -pub use demo_primitives::block::{Header, Digest, Log, Number, HeaderHash}; - -/// The block "body": A bunch of transactions. -pub type Body = Vec; +use runtime_primitives::Blocky; +pub use demo_primitives::header::{Header, Digest, Log, Number, HeaderHash}; /// A block on the chain. #[derive(PartialEq, Eq, Clone)] @@ -32,7 +30,18 @@ pub struct Block { /// The block header. pub header: Header, /// All relay-chain transactions. - pub transactions: Body, + pub transactions: Vec, // TODO: rename extrinsics. +} + +impl Blocky for Block { + type Extrinsic = UncheckedTransaction; + type Header = Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.transactions[..] + } } impl Slicable for Block { diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index ed4b377659504..b4bf42b2425a0 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -22,6 +22,8 @@ #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as runtime_primitives; + extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_executive as executive; extern crate substrate_runtime_system as system; @@ -48,8 +50,11 @@ pub mod block; pub mod transaction; pub mod api; -type Executive = executive::Executive< - //... the type params... +pub type Executive = executive::Executive< + transaction::UncheckedTransaction, + transaction::CheckedTransaction, + runtime::Concrete, + block::Block, >; //#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 62fa6f8ed23cc..bfdc352f139ea 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -29,8 +29,8 @@ impl system::Hashing for BlakeTwo256 { } } -type PublicAux = demo_primitives::AccountId; -type PrivAux = (); +pub type PublicAux = demo_primitives::AccountId; +pub type PrivAux = (); pub struct Concrete; @@ -47,11 +47,11 @@ impl consensus::Trait for Concrete { pub type Consensus = consensus::Module; impl system::Trait for Concrete { - type TxOrder = demo_primitives::TxOrder; + type Index = demo_primitives::TxOrder; type BlockNumber = demo_primitives::BlockNumber; type Hash = demo_primitives::Hash; type Hashing = BlakeTwo256; - type Digest = demo_primitives::block::Digest; + type Digest = demo_primitives::header::Digest; type AccountId = demo_primitives::AccountId; } pub type System = system::Module; diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index 3ebbefe6fe704..0701bbed72eae 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -20,8 +20,9 @@ use rstd::prelude::*; use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; -use runtime::PubCall; -use executive::{Checkable, Executable}; +use runtime::Call; +use runtime_primitives::{Checkable, Executable}; +use runtime_support::Dispatchable; #[cfg(feature = "std")] use std::fmt; @@ -35,7 +36,7 @@ pub struct Transaction { /// The number of transactions have come before from the same signer. pub nonce: TxOrder, /// The function that should be called. - pub function: PubCall, + pub function: Call, } impl Slicable for Transaction { @@ -159,15 +160,15 @@ impl Checkable for UncheckedTransaction { } impl Executable for CheckedTransaction { - type TxOrderType = TxOrder; + type IndexType = TxOrder; type AccountIdType = AccountId; - fn nonce(&self) -> Self::TxOrderType { - self.0.nonce + fn index(&self) -> &Self::IndexType { + &self.0.transaction.nonce } fn sender(&self) -> &Self::AccountIdType { - self.0.signed + &self.0.transaction.signed } fn execute(self) { diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index 59da8ef7e3e03..a5521424f775d 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -7,14 +7,14 @@ authors = ["Parity Technologies "] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } substrate-codec = { path = "../../codec", default_features = false } -substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } substrate-runtime-consensus = { path = "../consensus", default_features = false } substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] -substrate-runtime-io = { path = "../../runtime-io", default_features = false } [features] default = ["std"] @@ -23,7 +23,7 @@ std = [ "substrate-runtime-support/std", "serde/std", "substrate-codec/std", - "substrate-primitives/std", + "substrate-runtime-primitives/std", "substrate-runtime-io/std", "substrate-runtime-consensus/std", "substrate-runtime-system/std", diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 61e2b88dab05f..d9bb41cf69ceb 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -22,89 +22,60 @@ #[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; -#[cfg(test)] extern crate substrate_codec as codec; -extern crate substrate_primitives as primitives; +extern crate substrate_codec as codec; +extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_system as system; #[cfg(feature = "std")] extern crate serde; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; -extern crate safe_mix; +//extern crate safe_mix; use rstd::prelude::*; -use rstd::mem; -use runtime_io::{print, storage_root, enumerated_trie_root}; +use rstd::marker::PhantomData; +use primitives::{Headery, Blocky, Checkable, Executable}; +//use runtime_io::{print, storage_root, enumerated_trie_root}; use codec::Slicable; -use runtime_support::{Hashable, StorageValue, StorageMap}; +//use runtime_support::{Hashable, StorageValue, StorageMap}; -use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; -use primitives::block::{generic, Number as BlockNumber, Header, Log}; +//use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; +//use primitives::block::{generic, Number as BlockNumber, Header, Log}; -use runtime::{staking, session}; -use runtime::staking::public_pass_from_payment; - -use safe_mix::TripletMix; -use consensus; - -pub trait Checkable { - type CheckedType; - fn check(self) -> Option; -} - -pub trait Dispatchable { - type AccountIdType; - type TxOrderType; - fn nonce(&self) -> Self::TxOrderType; - fn sender(&self) -> &Self::AccountIdType; - fn dispatch(self); -} - -pub trait Blocky: Sized { - type Number: Sized; - type Hash: Sized; - type Digest: Sized; - type Transaction: Sized; - type Header: Sized + Slicable; - fn number(&self) -> Self::Number; - fn transactions_root(&self) -> &Self::Hash; - fn state_root(&self) -> &Self::Hash; - fn parent_hash(&self) -> &Self::Hash; - fn digest(&self) -> &Self::Digest; - fn transactions(&self) -> Iterator<&Transaction>; - fn to_header( - number: Self::Number, - transactions_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self::Header; -} +//use safe_mix::TripletMix; pub struct Executive< - Unchecked: Checkable + PartialEq + Eq + Clone + Slicable, - Checked: Dispatchable, - System: system::Trait, - Block: Blocky, + Unchecked, + Checked, + System, + Block, >(PhantomData<(Unchecked, Checked, System, Block)>); impl< - Unchecked: Checkable + PartialEq + Eq + Clone + Slicable, - Checked: Dispatchable, + Unchecked: Checkable< + CheckedType = Checked + > + PartialEq + Eq + Clone + Slicable, + Checked: Executable< + IndexType = System::Index, + AccountIdType = System::AccountId + >, System: system::Trait, + Header: Headery< + Number = System::BlockNumber, + Hash = System::Hash, + Digest = System::Digest + >, Block: Blocky< - Transaction = Self::Unchecked, - Number = Self::System::Number, - Hash = Self::System::Hash, - Digest = Self::System::Digest + Extrinsic = Unchecked, + Header = Header >, > Executive { // type Block = generic::Block; // type System = system::Module /// Start the execution of a particular block. - pub fn initialise_block(block: &Block) { - system::initialise(block.number(), block.parent_hash(), block.transactions_root()); + pub fn initialise_block(header: &Header) { + >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); } - +/* fn initial_checks(block: &Block) { // check parent_hash is correct. assert!( @@ -203,7 +174,7 @@ impl< // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. >::record_block_hash(block.number(), &block.to_header()) - } + }*/ } /* #[cfg(test)] diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml new file mode 100644 index 0000000000000..bf41167a8c6a6 --- /dev/null +++ b/substrate/runtime/primitives/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "substrate-runtime-primitives" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +substrate-codec = { path = "../../codec", default_features = false } + +[features] +default = ["std"] +std = [ + "substrate-codec/std", +] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs new file mode 100644 index 0000000000000..e57dbd6b292b9 --- /dev/null +++ b/substrate/runtime/primitives/src/lib.rs @@ -0,0 +1,79 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code +//! and depositing logs. + +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate substrate_codec as codec; + +use codec::Slicable; + +/// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, +/// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and +/// `parent_hash`, as well as a `digest` and a block `number`. +/// +/// You can also create a `new` one from those fields. +pub trait Headery: Sized + Slicable { + type Number: Sized; + type Hash: Sized; + type Digest: Sized; + fn number(&self) -> &Self::Number; + fn extrinsics_root(&self) -> &Self::Hash; + fn state_root(&self) -> &Self::Hash; + fn parent_hash(&self) -> &Self::Hash; + fn digest(&self) -> &Self::Digest; + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self; +} + +/// Something which fulfills the abstract idea of a Substrate block. It has types for an +/// `Extrinsic` piece of information as well as a `Header`. +/// +/// You can get an iterator over each of the `extrinsics` and retrieve the `header`. +pub trait Blocky { + type Extrinsic: Sized; + type Header: Headery; + fn header(&self) -> &Self::Header; + fn extrinsics(&self) -> &[Self::Extrinsic]; +} + +/// A "checkable" piece of information, used by the standard Substrate Executive in order to +/// check the validity of a piece of extrinsic information, usually by verifying the signature. +pub trait Checkable: Sized { + type CheckedType: Sized; + fn check(self) -> Result; +} + +/// An "executable" piece of information, used by the standard Substrate Executive in order to +/// enact a piece of extrinsic information by marshalling and dispatching to a named functioon +/// call. +/// +/// Also provides information on to whom this information is attributable and an index that allows +/// each piece of attributable information to be disambiguated. +pub trait Executable { + type AccountIdType; + type IndexType; + fn index(&self) -> &Self::IndexType; + fn sender(&self) -> &Self::AccountIdType; + fn execute(self); +} diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 43a82341d658a..370ccd9933084 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -68,7 +68,7 @@ impl CheckEqual for primitives::Hash { } pub trait Trait { - type TxOrder: Parameter + Default + PartialOrd + Ord + rstd::ops::Add + From; + type Index: Parameter + Default + PartialOrd + Ord + rstd::ops::Add + From; type BlockNumber: Parameter + PartialOrd + Ord + rstd::ops::Sub + From; type Hash: Parameter + rstd::ops::BitOr + rstd::ops::BitAnd + Default + Copy + CheckEqual; type Hashing: Hashing; @@ -83,8 +83,8 @@ decl_module! { decl_storage! { trait Store for Module; - pub Nonce get(nonce): b"sys:non" => default map [ T::AccountId => T::TxOrder ]; - pub BlockHashAt get(block_hash): b"sys:old" => required map [ T::BlockNumber => T::Hash ]; + pub AccountIndex get(account_index): b"sys:non" => default map [ T::AccountId => T::Index ]; + pub BlockHash get(block_hash): b"sys:old" => required map [ T::BlockNumber => T::Hash ]; RandomSeed get(random_seed): b"sys:rnd" => required T::Hash; // The current block number being processed. Set by `execute_block`. @@ -96,7 +96,7 @@ decl_storage! { impl Module { /// Start the execution of a particular block. - pub fn initialise(number: T::BlockNumber, parent_hash: T::Hash, txs_root: T::Hash) { + pub fn initialise(number: &T::BlockNumber, parent_hash: &T::Hash, txs_root: &T::Hash) { // populate environment. >::put(number); >::put(parent_hash); @@ -124,7 +124,7 @@ impl Module { pub fn record_block_hash(number: T::BlockNumber, header: &H) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - >::insert(&number, &T::Hashing::hash_of(header)); + >::insert(&number, &T::Hashing::hash_of(header)); } /// Calculate the current block's random seed. @@ -140,7 +140,7 @@ impl Module { #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { map![ - twox_128(&>::key_for(T::BlockNumber::from(0u64))).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode + twox_128(&>::key_for(T::BlockNumber::from(0u64))).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode twox_128(>::key()).to_vec() => T::BlockNumber::from(1u64).encode(), twox_128(>::key()).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode twox_128(>::key()).to_vec() => T::Hash::default().encode() @@ -155,8 +155,8 @@ impl Module { } /// Increment a particular account's nonce by 1. - pub fn inc_nonce(who: &T::AccountId) { - >::insert(who, Self::nonce(who) + T::TxOrder::from(1u64)); + pub fn inc_index(who: &T::AccountId) { + >::insert(who, Self::account_index(who) + T::Index::from(1u64)); } } @@ -169,7 +169,7 @@ mod tests { let mut t: TestExternalities = map![ twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() + twox_128(&BlockHash::key_for(&0)).to_vec() => [69u8; 32].encode() ]; let tx = UncheckedTransaction { From 7cb07201dd3b3b0772504c83b311b813f26e1e78 Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 16:53:23 +0900 Subject: [PATCH 19/76] Expose an additional function in system --- Cargo.lock | 11 +++++ demo/primitives/src/header.rs | 9 +++- demo/runtime/src/block.rs | 1 - demo/runtime/src/lib.rs | 4 +- demo/runtime/src/runtime.rs | 11 +++-- demo/runtime/src/transaction.rs | 6 +-- substrate/runtime-std/with_std.rs | 1 + substrate/runtime-std/without_std.rs | 1 + substrate/runtime/executive/src/lib.rs | 23 +++++----- substrate/runtime/primitives/Cargo.toml | 8 ++++ substrate/runtime/primitives/src/lib.rs | 56 +++++++++++++++++++++++ substrate/runtime/system/Cargo.toml | 2 + substrate/runtime/system/src/lib.rs | 59 +++++++------------------ 13 files changed, 130 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b592d3a67b059..02ed4a140238a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -978,6 +978,11 @@ name = "num-traits" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" @@ -1805,7 +1810,11 @@ dependencies = [ name = "substrate-runtime-primitives" version = "0.1.0" dependencies = [ + "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", ] [[package]] @@ -1842,6 +1851,7 @@ dependencies = [ "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] @@ -2344,6 +2354,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum num-traits 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9936036cc70fe4a8b2d338ab665900323290efb03983c86cbe235ae800ad8017" +"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" "checksum ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2c49021782e5233cd243168edfa8037574afed4eba4bbaf538b3d8d1789d8c" diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs index 9e6ae35a148a6..c72217153c8ca 100644 --- a/demo/primitives/src/header.rs +++ b/demo/primitives/src/header.rs @@ -23,7 +23,7 @@ use rstd::vec::Vec; use codec::{Input, Slicable}; pub use primitives::block::Id; -pub use runtime_primitives::Headery; +pub use runtime_primitives::{Digesty, Headery}; /// Used to refer to a block number. pub type Number = u64; @@ -66,6 +66,13 @@ impl Slicable for Digest { } } +impl Digesty for Digest { + type Item = Log; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + /// Header for a block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index 96bc463a55d20..9c3671ed2585b 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -17,7 +17,6 @@ //! Block and header type definitions. use rstd::prelude::*; -use rstd::slice::Iter; use codec::{Input, Slicable}; use transaction::UncheckedTransaction; use runtime_primitives::Blocky; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index b4bf42b2425a0..9a47ec5a02abe 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -38,10 +38,10 @@ extern crate safe_mix; #[cfg(feature = "std")] extern crate rustc_hex; extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] extern crate substrate_primitives as primitives; +#[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] extern crate substrate_primitives; extern crate demo_primitives; -#[cfg(test)] #[macro_use] extern crate hex_literal; +//#[cfg(test)] #[macro_use] extern crate hex_literal; extern crate integer_sqrt; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index bfdc352f139ea..06f545379c3a8 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -18,15 +18,19 @@ use codec::Slicable; use runtime_support::Hashable; -use {consensus, timestamp, system, demo_primitives, primitives}; +use runtime_io::enumerated_trie_root; +use {consensus, timestamp, system, demo_primitives, runtime_primitives}; // TODO: move into runtime support. pub struct BlakeTwo256; -impl system::Hashing for BlakeTwo256 { - type Output = primitives::H256; +impl runtime_primitives::Hashing for BlakeTwo256 { + type Output = demo_primitives::Hash; fn hash_of(s: &S) -> Self::Output { Self::Output::from(s.blake2_256()) } + fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output { + enumerated_trie_root(items).into() + } } pub type PublicAux = demo_primitives::AccountId; @@ -51,6 +55,7 @@ impl system::Trait for Concrete { type BlockNumber = demo_primitives::BlockNumber; type Hash = demo_primitives::Hash; type Hashing = BlakeTwo256; + type Log = demo_primitives::header::Log; type Digest = demo_primitives::header::Digest; type AccountId = demo_primitives::AccountId; } diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index 0701bbed72eae..c8bc0213dc1a1 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -181,9 +181,9 @@ impl Executable for CheckedTransaction { #[cfg(test)] mod tests { use super::*; - use primitives; + use substrate_primitives; use codec::Slicable; - use primitives::hexdisplay::HexDisplay; + use substrate_primitives::hexdisplay::HexDisplay; use timestamp; use runtime::Call; @@ -195,7 +195,7 @@ mod tests { nonce: 999u64, function: Call::Timestamp(timestamp::Call::set(135135)), }, - signature: primitives::hash::H512([0; 64]), + signature: substrate_primitives::hash::H512([0; 64]), }; // 71000000 // 0101010101010101010101010101010101010101010101010101010101010101 diff --git a/substrate/runtime-std/with_std.rs b/substrate/runtime-std/with_std.rs index 06237f604b9a1..92f6654bbb94e 100644 --- a/substrate/runtime-std/with_std.rs +++ b/substrate/runtime-std/with_std.rs @@ -23,6 +23,7 @@ pub use std::fmt; pub use std::iter; pub use std::marker; pub use std::mem; +pub use std::num; pub use std::ops; pub use std::ptr; pub use std::rc; diff --git a/substrate/runtime-std/without_std.rs b/substrate/runtime-std/without_std.rs index c1cf26a77552f..2d05e93887315 100644 --- a/substrate/runtime-std/without_std.rs +++ b/substrate/runtime-std/without_std.rs @@ -34,6 +34,7 @@ pub use core::intrinsics; pub use core::iter; pub use core::marker; pub use core::mem; +pub use core::num; pub use core::ops; pub use core::ptr; pub use core::slice; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index d9bb41cf69ceb..e8b0ea94c12bc 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -21,7 +21,7 @@ #[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; -#[cfg(test)] extern crate substrate_runtime_io as runtime_io; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; @@ -32,8 +32,8 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; -use primitives::{Headery, Blocky, Checkable, Executable}; -//use runtime_io::{print, storage_root, enumerated_trie_root}; +use primitives::{Zero, One, Headery, Blocky, Checkable, Executable, CheckEqual, Hashing}; +use runtime_io::{storage_root, enumerated_trie_root}; use codec::Slicable; //use runtime_support::{Hashable, StorageValue, StorageMap}; @@ -75,22 +75,25 @@ impl< pub fn initialise_block(header: &Header) { >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); } -/* + fn initial_checks(block: &Block) { + let header = block.header(); + // check parent_hash is correct. + let n = header.number().clone(); assert!( - header.number() > System::Number::from(0u64) && >::block_hash(header.number - System::Number::from(1u64)) == *block.parent_hash(), + n > Header::Number::zero() && >::block_hash(n - Header::Number::one()) == *header.parent_hash(), "Parent hash should be valid." ); // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); + let txs = block.extrinsics().iter().map(Slicable::encode).collect::>(); let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root(&txs).into(); - info_expect_equal_hash(&header.transaction_root, &txs_root); - assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); + let txs_root = System::Hashing::enumerated_trie_root(&txs); + header.extrinsics_root().check_equal(&txs_root); + assert!(header.extrinsics_root() == &txs_root, "Transaction trie root must be valid."); } - +/* /// Actually execute all transitioning for `block`. pub fn execute_block(mut block: Block) { initialise_block(&block); diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml index bf41167a8c6a6..df313849d7b75 100644 --- a/substrate/runtime/primitives/Cargo.toml +++ b/substrate/runtime/primitives/Cargo.toml @@ -4,10 +4,18 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] +num-traits = { version = "0.2", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", optional = true } substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } [features] default = ["std"] std = [ + "num-traits/std", + "substrate-runtime-std/std", + "substrate-runtime-io", "substrate-codec/std", + "substrate-primitives/std", ] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index e57dbd6b292b9..0bad727cb3dba 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -19,9 +19,41 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate num_traits; +extern crate substrate_runtime_std as rstd; +#[cfg(not(feature = "std"))] extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; +extern crate substrate_primitives; use codec::Slicable; +pub use num_traits::identities::{Zero, One}; +use rstd::ops::{Add, Sub, AddAssign, SubAssign}; + +pub trait Hashing { + type Output; + fn hash_of(s: &S) -> Self::Output; + fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output; +} + +pub trait SimpleArithmetic: + Zero + One + + Add + AddAssign + + Sub + SubAssign + + PartialOrd + Ord +{} +impl + AddAssign + + Sub + SubAssign + + PartialOrd + Ord +> SimpleArithmetic for T {} + +/// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are +/// each `Slicable`. +pub trait Digesty { + type Item: Sized; + fn push(&mut self, item: Self::Item); +} /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and @@ -77,3 +109,27 @@ pub trait Executable { fn sender(&self) -> &Self::AccountIdType; fn execute(self); } + +/// Something that can be checked for equality and printed out to a debug channel if bad. +pub trait CheckEqual { + fn check_equal(&self, other: &Self); +} + +impl CheckEqual for substrate_primitives::H256 { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + use substrate_primitives::hexdisplay::HexDisplay; + if &self.0 != &other.0 { + println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); + } + } + + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != *other { + runtime_io::print("Hash not equal"); + runtime_io::print(&self.0[..]); + runtime_io::print(&other.0[..]); + } + } +} diff --git a/substrate/runtime/system/Cargo.toml b/substrate/runtime/system/Cargo.toml index a6dfa5db10034..d483340aadad9 100644 --- a/substrate/runtime/system/Cargo.toml +++ b/substrate/runtime/system/Cargo.toml @@ -11,6 +11,7 @@ substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } substrate-runtime-consensus = { path = "../consensus", default_features = false } safe-mix = { path = "../../../safe-mix", default_features = false} @@ -25,4 +26,5 @@ std = [ "substrate-primitives/std", "substrate-runtime-io/std", "substrate-runtime-consensus/std", + "substrate-runtime-primitives/std", ] diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 370ccd9933084..15f75ab98d8f7 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -23,56 +23,29 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; -extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as primitives; #[cfg(feature = "std")] extern crate serde; extern crate safe_mix; use rstd::prelude::*; +use primitives::{Digesty, CheckEqual, SimpleArithmetic, Zero, One, Hashing}; //use runtime_io::print; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; -use primitives::block; use safe_mix::TripletMix; #[cfg(any(feature = "std", test))] use runtime_io::{twox_128, TestExternalities}; -pub trait Hashing { - type Output; - fn hash_of(s: &S) -> Self::Output; -} - -// TODO: move to a module that uses it. -pub trait CheckEqual { - fn check_equal(&self, other: &Self); -} -impl CheckEqual for primitives::Hash { - #[cfg(feature = "std")] - fn check_equal(&self, other: &Self) { - use primitives::hexdisplay::HexDisplay; - if &self.0 != &other.0 { - println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); - } - } - - #[cfg(not(feature = "std"))] - fn check_equal(&self, other: &Self) { - if self != *other { - print("Hash not equal"); - print(&self.0[..]); - print(&other.0[..]); - } - } -} - pub trait Trait { - type Index: Parameter + Default + PartialOrd + Ord + rstd::ops::Add + From; - type BlockNumber: Parameter + PartialOrd + Ord + rstd::ops::Sub + From; + type Index: Parameter + Default + SimpleArithmetic; + type BlockNumber: Parameter + SimpleArithmetic; type Hash: Parameter + rstd::ops::BitOr + rstd::ops::BitAnd + Default + Copy + CheckEqual; type Hashing: Hashing; - type Digest: Parameter + Default; + type Log; + type Digest: Parameter + Default + Digesty; type AccountId: Parameter; } @@ -91,7 +64,7 @@ decl_storage! { Number get(block_number): b"sys:num" => required T::BlockNumber; ParentHash get(parent_hash): b"sys:pha" => required T::Hash; TransactionsRoot get(transactions_root): b"sys:txr" => required T::Hash; - Digest: b"sys:dig" => default block::Digest; // TODO: change to T::Digest (will require traitification) + Digest: b"sys:dig" => default T::Digest; } impl Module { @@ -114,9 +87,9 @@ impl Module { } /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: block::Log) { + pub fn deposit_log(item: T::Log) { let mut l = >::get(); - l.logs.push(log); + l.push(item); >::put(l); } @@ -129,10 +102,12 @@ impl Module { /// Calculate the current block's random seed. fn calculate_random() -> T::Hash { - let c = Self::block_number() - T::BlockNumber::from(1u64); (0..81) - .map(T::BlockNumber::from) - .map(|i| if c >= i { Self::block_hash(c.clone() - i) } else { Default::default() }) + .scan( + { let mut n = Self::block_number().clone(); n -= T::BlockNumber::one(); n }, + |c, _| { if *c > T::BlockNumber::zero() { *c -= T::BlockNumber::one() }; Some(c.clone()) + }) + .map(Self::block_hash) .triplet_mix() } @@ -140,8 +115,8 @@ impl Module { #[cfg(any(feature = "std", test))] pub fn externalities() -> TestExternalities { map![ - twox_128(&>::key_for(T::BlockNumber::from(0u64))).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode - twox_128(>::key()).to_vec() => T::BlockNumber::from(1u64).encode(), + twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode + twox_128(>::key()).to_vec() => T::BlockNumber::one().encode(), twox_128(>::key()).to_vec() => [69u8; 32].encode(), // TODO: replace with Hash::default().encode twox_128(>::key()).to_vec() => T::Hash::default().encode() ] @@ -156,7 +131,7 @@ impl Module { /// Increment a particular account's nonce by 1. pub fn inc_index(who: &T::AccountId) { - >::insert(who, Self::account_index(who) + T::Index::from(1u64)); + >::insert(who, Self::account_index(who) + T::Index::one()); } } From 490b63e921077c5b73d5cea0af1383a3a0db13a0 Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 17:09:34 +0900 Subject: [PATCH 20/76] Another couple of functions traitified in executive. --- demo/runtime/Cargo.toml | 2 +- demo/runtime/src/runtime.rs | 7 +++++-- substrate/runtime/executive/src/lib.rs | 23 +++++++++++------------ substrate/runtime/primitives/src/lib.rs | 12 ++++++++++++ substrate/runtime/system/src/lib.rs | 10 +++++----- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 7397d4f529f58..4784bd372cc29 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -28,10 +28,10 @@ integer-sqrt = "0.1.0" default = ["std"] std = [ "substrate-codec/std", + "substrate-primitives/std", "substrate-runtime-std/std", "substrate-runtime-io/std", "substrate-runtime-support/std", - "substrate-primitives/std", "substrate-runtime-consensus/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 06f545379c3a8..2d90120caec40 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -18,10 +18,10 @@ use codec::Slicable; use runtime_support::Hashable; -use runtime_io::enumerated_trie_root; +use runtime_io::{enumerated_trie_root, storage_root}; use {consensus, timestamp, system, demo_primitives, runtime_primitives}; -// TODO: move into runtime support. +// TODO: move into runtime support/io. pub struct BlakeTwo256; impl runtime_primitives::Hashing for BlakeTwo256 { type Output = demo_primitives::Hash; @@ -31,6 +31,9 @@ impl runtime_primitives::Hashing for BlakeTwo256 { fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output { enumerated_trie_root(items).into() } + fn storage_root() -> Self::Output { + storage_root().into() + } } pub type PublicAux = demo_primitives::AccountId; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index e8b0ea94c12bc..01d753c294aef 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -33,7 +33,6 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; use primitives::{Zero, One, Headery, Blocky, Checkable, Executable, CheckEqual, Hashing}; -use runtime_io::{storage_root, enumerated_trie_root}; use codec::Slicable; //use runtime_support::{Hashable, StorageValue, StorageMap}; @@ -115,7 +114,7 @@ impl< // any stuff that we do after taking the storage root. post_finalise(&block); } -/* + // TODO fix. /// Finalise the block - it is up the caller to ensure that all header fields are valid /// except state-root. @@ -136,7 +135,7 @@ impl< header } -*/ + /// Execute a transaction outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn execute_transaction(utx: UncheckedTransaction) { @@ -159,25 +158,25 @@ impl< tx.dispatch(); } - - fn final_checks(block: &Block) { +*/ + fn final_checks(header: &Header) { // check digest - assert!(block.digest() == &>::digest()); + assert!(header.digest() == &>::digest()); // remove temporaries. - >::kill_temps(); + >::finalise(); // check storage root. - let storage_root = storage_root().into(); -// info_expect_equal_hash(block.state_root(), &storage_root); // TODO use the check_equal trait. - assert!(block.state_root() == &storage_root, "Storage root must match that calculated."); + let storage_root = System::Hashing::storage_root(); + header.state_root().check_equal(&storage_root); + assert!(header.state_root() == &storage_root, "Storage root must match that calculated."); } fn post_finalise(block: &Block) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - >::record_block_hash(block.number(), &block.to_header()) - }*/ + >::record_block_hash(block.header()) + } } /* #[cfg(test)] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 0bad727cb3dba..768abb50cc392 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -33,6 +33,7 @@ pub trait Hashing { type Output; fn hash_of(s: &S) -> Self::Output; fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output; + fn storage_root() -> Self::Output; } pub trait SimpleArithmetic: @@ -48,6 +49,17 @@ impl + Ord > SimpleArithmetic for T {} +pub trait SimpleBitOps: + Sized + + rstd::ops::BitOr + + rstd::ops::BitAnd +{} +impl + + rstd::ops::BitAnd +> SimpleBitOps for T {} + /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. pub trait Digesty { diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 15f75ab98d8f7..d94cb7d594b7a 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -30,7 +30,7 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; -use primitives::{Digesty, CheckEqual, SimpleArithmetic, Zero, One, Hashing}; +use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Hashing, Headery}; //use runtime_io::print; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; @@ -42,7 +42,7 @@ use runtime_io::{twox_128, TestExternalities}; pub trait Trait { type Index: Parameter + Default + SimpleArithmetic; type BlockNumber: Parameter + SimpleArithmetic; - type Hash: Parameter + rstd::ops::BitOr + rstd::ops::BitAnd + Default + Copy + CheckEqual; + type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; type Log; type Digest: Parameter + Default + Digesty; @@ -64,7 +64,7 @@ decl_storage! { Number get(block_number): b"sys:num" => required T::BlockNumber; ParentHash get(parent_hash): b"sys:pha" => required T::Hash; TransactionsRoot get(transactions_root): b"sys:txr" => required T::Hash; - Digest: b"sys:dig" => default T::Digest; + Digest get(digest): b"sys:dig" => default T::Digest; } impl Module { @@ -94,10 +94,10 @@ impl Module { } /// Records a particular block number and hash combination. - pub fn record_block_hash(number: T::BlockNumber, header: &H) { + pub fn record_block_hash>(header: &H) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - >::insert(&number, &T::Hashing::hash_of(header)); + >::insert(header.number(), &T::Hashing::hash_of(header)); } /// Calculate the current block's random seed. From 5d8ad4b3d5ba676de9e0096ed37a2d254b1818ad Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 17:17:47 +0900 Subject: [PATCH 21/76] another function in executive traitified. --- demo/runtime/src/api.rs | 4 ++-- demo/runtime/src/transaction.rs | 6 +++--- substrate/runtime/executive/src/lib.rs | 19 +++++++++---------- substrate/runtime/primitives/src/lib.rs | 4 ++-- substrate/runtime/system/src/lib.rs | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index d7789e62c8502..3ac63d5761fbf 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -19,9 +19,9 @@ use Executive; impl_stubs!( authorities => |()| runtime::Consensus::authorities(), - initialise_block => |header| Executive::initialise_block(&header) + initialise_block => |header| Executive::initialise_block(&header), + apply_extrinsic => |utx| Executive::apply_extrinsic(utx) /* execute_block => |block| system::internal::execute_block(block), - execute_transaction => |utx| system::internal::execute_transaction(utx), finalise_block => |()| system::internal::finalise_block(), validator_count => |()| session::validator_count(), validators => |()| session::validators(),*/ diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index c8bc0213dc1a1..d6434a1554ff7 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -21,7 +21,7 @@ use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; use runtime::Call; -use runtime_primitives::{Checkable, Executable}; +use runtime_primitives::{Checkable, Applyable}; use runtime_support::Dispatchable; #[cfg(feature = "std")] @@ -159,7 +159,7 @@ impl Checkable for UncheckedTransaction { } } -impl Executable for CheckedTransaction { +impl Applyable for CheckedTransaction { type IndexType = TxOrder; type AccountIdType = AccountId; @@ -171,7 +171,7 @@ impl Executable for CheckedTransaction { &self.0.transaction.signed } - fn execute(self) { + fn apply(self) { let tx = self.0.transaction; //TODO: take payment e.g. public_pass_from_payment tx.function.dispatch(&tx.signed); diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 01d753c294aef..5ce483a4575ec 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -32,7 +32,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; -use primitives::{Zero, One, Headery, Blocky, Checkable, Executable, CheckEqual, Hashing}; +use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Hashing}; use codec::Slicable; //use runtime_support::{Hashable, StorageValue, StorageMap}; @@ -52,7 +52,7 @@ impl< Unchecked: Checkable< CheckedType = Checked > + PartialEq + Eq + Clone + Slicable, - Checked: Executable< + Checked: Applyable< IndexType = System::Index, AccountIdType = System::AccountId >, @@ -135,10 +135,10 @@ impl< header } - - /// Execute a transaction outside of the block execution function. +*/ + /// Apply outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. - pub fn execute_transaction(utx: UncheckedTransaction) { + pub fn apply_extrinsic(utx: Unchecked) { // Verify the signature is good. let tx = match utx.check() { Ok(tx) => tx, @@ -147,18 +147,17 @@ impl< { // check nonce - let expected_nonce = >::nonce(tx.sender()); - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); + let expected_nonce = >::account_index(tx.sender()); + assert!(tx.index() == &expected_nonce, "All transactions should have the correct nonce"); // increment nonce in storage - >::inc_nonce(tx.sender()); + >::inc_account_index(tx.sender()); } // decode parameters and dispatch - tx.dispatch(); + tx.apply(); } -*/ fn final_checks(header: &Header) { // check digest assert!(header.digest() == &>::digest()); diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 768abb50cc392..f5b3ad207f74b 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -114,12 +114,12 @@ pub trait Checkable: Sized { /// /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. -pub trait Executable { +pub trait Applyable { type AccountIdType; type IndexType; fn index(&self) -> &Self::IndexType; fn sender(&self) -> &Self::AccountIdType; - fn execute(self); + fn apply(self); } /// Something that can be checked for equality and printed out to a debug channel if bad. diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index d94cb7d594b7a..8886e1f1106b1 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -130,7 +130,7 @@ impl Module { } /// Increment a particular account's nonce by 1. - pub fn inc_index(who: &T::AccountId) { + pub fn inc_account_index(who: &T::AccountId) { >::insert(who, Self::account_index(who) + T::Index::one()); } } From ac9f45e239e5ad456b3c5a18e37b87d5b2f02786 Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 17:39:36 +0900 Subject: [PATCH 22/76] One more function traitified. --- demo/runtime/src/lib.rs | 4 +++ demo/runtime/src/runtime.rs | 1 + substrate/runtime/executive/src/lib.rs | 46 +++++++++---------------- substrate/runtime/primitives/src/lib.rs | 15 ++++++++ substrate/runtime/system/src/lib.rs | 26 ++++++++------ 5 files changed, 52 insertions(+), 40 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 9a47ec5a02abe..95be69ff6ae2e 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -55,6 +55,10 @@ pub type Executive = executive::Executive< transaction::CheckedTransaction, runtime::Concrete, block::Block, + ( +// staking::internal::check_new_era(); +// session::internal::check_rotate_session(); + ), >; //#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 2d90120caec40..cb726faa0d7f2 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -61,6 +61,7 @@ impl system::Trait for Concrete { type Log = demo_primitives::header::Log; type Digest = demo_primitives::header::Digest; type AccountId = demo_primitives::AccountId; + type Header = demo_primitives::header::Header; } pub type System = system::Module; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 5ce483a4575ec..94a6bbc564589 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -32,7 +32,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; -use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Hashing}; +use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Hashing, Executable}; use codec::Slicable; //use runtime_support::{Hashable, StorageValue, StorageMap}; @@ -46,7 +46,8 @@ pub struct Executive< Checked, System, Block, ->(PhantomData<(Unchecked, Checked, System, Block)>); + Finalisation, +>(PhantomData<(Unchecked, Checked, System, Block, Finalisation)>); impl< Unchecked: Checkable< @@ -57,21 +58,17 @@ impl< AccountIdType = System::AccountId >, System: system::Trait, - Header: Headery< - Number = System::BlockNumber, - Hash = System::Hash, - Digest = System::Digest - >, Block: Blocky< Extrinsic = Unchecked, - Header = Header + Header = System::Header >, -> Executive { + Finalisation: Executable, +> Executive { // type Block = generic::Block; // type System = system::Module /// Start the execution of a particular block. - pub fn initialise_block(header: &Header) { + pub fn initialise_block(header: &System::Header) { >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); } @@ -81,7 +78,7 @@ impl< // check parent_hash is correct. let n = header.number().clone(); assert!( - n > Header::Number::zero() && >::block_hash(n - Header::Number::one()) == *header.parent_hash(), + n > System::BlockNumber::zero() && >::block_hash(n - System::BlockNumber::one()) == *header.parent_hash(), "Parent hash should be valid." ); @@ -114,28 +111,19 @@ impl< // any stuff that we do after taking the storage root. post_finalise(&block); } - +*/ // TODO fix. /// Finalise the block - it is up the caller to ensure that all header fields are valid /// except state-root. - pub fn finalise_block() -> Header { - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - RandomSeed::kill(); - let header = Header { - number: Number::take(), - digest: Digest::take(), - parent_hash: ParentHash::take(), - transaction_root: TransactionsRoot::take(), - state_root: storage_root().into(), - }; + pub fn finalise_block() -> System::Header { + Finalisation::execute(); - post_finalise(&header); + let header = >::finalise(); + Self::post_finalise(&header); header } -*/ + /// Apply outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. pub fn apply_extrinsic(utx: Unchecked) { @@ -158,7 +146,7 @@ impl< tx.apply(); } - fn final_checks(header: &Header) { + fn final_checks(header: &System::Header) { // check digest assert!(header.digest() == &>::digest()); @@ -171,10 +159,10 @@ impl< assert!(header.state_root() == &storage_root, "Storage root must match that calculated."); } - fn post_finalise(block: &Block) { + fn post_finalise(header: &System::Header) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - >::record_block_hash(block.header()) + >::record_block_hash(header) } } /* diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index f5b3ad207f74b..10ebade6515d8 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -60,6 +60,21 @@ impl > SimpleBitOps for T {} +/// Something that can be executed. +pub trait Executable { + fn execute(); +} + +impl Executable for () { + fn execute() {} +} +impl Executable for (A, B) { + fn execute() { + A::execute(); + B::execute(); + } +} + /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Slicable`. pub trait Digesty { diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 8886e1f1106b1..b1916227654fa 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -47,6 +47,7 @@ pub trait Trait { type Log; type Digest: Parameter + Default + Digesty; type AccountId: Parameter; + type Header: Headery; } decl_module! { @@ -63,7 +64,7 @@ decl_storage! { // The current block number being processed. Set by `execute_block`. Number get(block_number): b"sys:num" => required T::BlockNumber; ParentHash get(parent_hash): b"sys:pha" => required T::Hash; - TransactionsRoot get(transactions_root): b"sys:txr" => required T::Hash; + ExtrinsicsRoot get(extrinsics_root): b"sys:txr" => required T::Hash; Digest get(digest): b"sys:dig" => default T::Digest; } @@ -73,17 +74,20 @@ impl Module { // populate environment. >::put(number); >::put(parent_hash); - >::put(txs_root); + >::put(txs_root); >::put(Self::calculate_random()); } /// Remove temporary "environment" entries in storage. - pub fn finalise() { - >::kill(); - >::kill(); + pub fn finalise() -> T::Header { >::kill(); - >::kill(); - >::kill(); + + let number = >::take(); + let parent_hash = >::take(); + let digest = >::take(); + let extrinsics_root = >::take(); + let storage_root = T::Hashing::storage_root(); + T::Header::new(number, extrinsics_root, storage_root, parent_hash, digest) } /// Deposits a log and ensures it matches the blocks log data. @@ -176,7 +180,7 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }; @@ -199,7 +203,7 @@ mod tests { parent_hash: [69u8; 32].into(), number: 1, state_root: [0u8; 32].into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }; @@ -215,14 +219,14 @@ mod tests { #[test] #[should_panic] - fn block_import_of_bad_transaction_root_fails() { + fn block_import_of_bad_extrinsics_root_fails() { let mut t = new_test_ext(); let h = Header { parent_hash: [69u8; 32].into(), number: 1, state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), - transaction_root: [0u8; 32].into(), + extrinsics_root: [0u8; 32].into(), digest: Digest { logs: vec![], }, }; From d0a46723b4d382c0129e1d4b01873777a03557fe Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 17:45:54 +0900 Subject: [PATCH 23/76] Finish traitifying executive! --- demo/runtime/src/api.rs | 8 ++++---- demo/runtime/src/block.rs | 3 +++ substrate/runtime/executive/src/lib.rs | 25 ++++++++++--------------- substrate/runtime/primitives/src/lib.rs | 2 ++ 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index 3ac63d5761fbf..8ad1deba75e9d 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -20,9 +20,9 @@ use Executive; impl_stubs!( authorities => |()| runtime::Consensus::authorities(), initialise_block => |header| Executive::initialise_block(&header), - apply_extrinsic => |utx| Executive::apply_extrinsic(utx) -/* execute_block => |block| system::internal::execute_block(block), - finalise_block => |()| system::internal::finalise_block(), - validator_count => |()| session::validator_count(), + apply_extrinsic => |extrinsic| Executive::apply_extrinsic(extrinsic), + execute_block => |block| Executive::execute_block(block), + finalise_block => |()| Executive::finalise_block() + /*validator_count => |()| session::validator_count(), validators => |()| session::validators(),*/ ); diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index 9c3671ed2585b..77c5a3dda2230 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -41,6 +41,9 @@ impl Blocky for Block { fn extrinsics(&self) -> &[Self::Extrinsic] { &self.transactions[..] } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.transactions) + } } impl Slicable for Block { diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 94a6bbc564589..b0f6299577116 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -64,9 +64,6 @@ impl< >, Finalisation: Executable, > Executive { -// type Block = generic::Block; -// type System = system::Module - /// Start the execution of a particular block. pub fn initialise_block(header: &System::Header) { >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); @@ -89,30 +86,28 @@ impl< header.extrinsics_root().check_equal(&txs_root); assert!(header.extrinsics_root() == &txs_root, "Transaction trie root must be valid."); } -/* + /// Actually execute all transitioning for `block`. - pub fn execute_block(mut block: Block) { - initialise_block(&block); + pub fn execute_block(block: Block) { + Self::initialise_block(block.header()); // any initial checks - initial_checks(&block); + Self::initial_checks(&block); // execute transactions - block.transactions().cloned().for_each(execute_transaction); + let (header, extrinsics) = block.deconstruct(); + extrinsics.into_iter().for_each(Self::apply_extrinsic); // post-transactional book-keeping. - // TODO: some way of getting these in in a modular way. -// staking::internal::check_new_era(); -// session::internal::check_rotate_session(); + Finalisation::execute(); // any final checks - final_checks(&block); + Self::final_checks(&header); // any stuff that we do after taking the storage root. - post_finalise(&block); + Self::post_finalise(&header); } -*/ - // TODO fix. + /// Finalise the block - it is up the caller to ensure that all header fields are valid /// except state-root. pub fn finalise_block() -> System::Header { diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 10ebade6515d8..6ec67371ee90b 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -25,6 +25,7 @@ extern crate substrate_runtime_std as rstd; extern crate substrate_codec as codec; extern crate substrate_primitives; +use rstd::prelude::*; use codec::Slicable; pub use num_traits::identities::{Zero, One}; use rstd::ops::{Add, Sub, AddAssign, SubAssign}; @@ -114,6 +115,7 @@ pub trait Blocky { type Header: Headery; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; + fn deconstruct(self) -> (Self::Header, Vec); } /// A "checkable" piece of information, used by the standard Substrate Executive in order to From 18f5283e98593ffdef5bc7630c7eaae1b24e4e07 Mon Sep 17 00:00:00 2001 From: Gav Date: Sun, 25 Mar 2018 22:18:48 +0900 Subject: [PATCH 24/76] Traitify session module. --- Cargo.lock | 20 +- Cargo.toml | 1 + demo/runtime/Cargo.toml | 2 + demo/runtime/src/dispatch.rs | 46 ---- demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime-old/session.rs | 16 -- demo/runtime/src/runtime.rs | 26 +- demo/runtime/src/transaction.rs | 2 +- substrate/codec/src/slicable.rs | 106 ++------ substrate/primitives/src/bft.rs | 24 +- substrate/runtime-support/src/dispatch.rs | 305 ++++++++++++++-------- substrate/runtime-support/src/lib.rs | 3 +- substrate/runtime/consensus/src/lib.rs | 14 +- substrate/runtime/executive/src/lib.rs | 2 +- substrate/runtime/primitives/src/lib.rs | 15 +- substrate/runtime/session/Cargo.toml | 32 +++ substrate/runtime/session/src/lib.rs | 280 ++++++++++++++++++++ substrate/runtime/system/Cargo.toml | 10 +- substrate/runtime/system/src/lib.rs | 6 +- substrate/runtime/timestamp/Cargo.toml | 2 + substrate/runtime/timestamp/src/lib.rs | 14 +- 21 files changed, 614 insertions(+), 313 deletions(-) delete mode 100644 demo/runtime/src/dispatch.rs create mode 100644 substrate/runtime/session/Cargo.toml create mode 100644 substrate/runtime/session/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 02ed4a140238a..54b0ab0484eef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -266,6 +266,7 @@ dependencies = [ "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", @@ -1817,6 +1818,23 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-runtime-session" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-std" version = "0.1.0" @@ -1849,7 +1867,6 @@ dependencies = [ "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", - "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -1864,6 +1881,7 @@ dependencies = [ "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] diff --git a/Cargo.toml b/Cargo.toml index 2cd869d858457..69e8b4d7d95a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ members = [ "substrate/runtime/consensus", "substrate/runtime/executive", "substrate/runtime/primitives", + "substrate/runtime/session", "substrate/runtime/system", "substrate/runtime/timestamp", "substrate/serializer", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 4784bd372cc29..1532a62c48073 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -19,6 +19,7 @@ substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } +substrate-runtime-session = { path = "../../substrate/runtime/session" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } @@ -35,6 +36,7 @@ std = [ "substrate-runtime-consensus/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", + "substrate-runtime-session/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", "demo-primitives/std", diff --git a/demo/runtime/src/dispatch.rs b/demo/runtime/src/dispatch.rs deleted file mode 100644 index 5836b3e44d36f..0000000000000 --- a/demo/runtime/src/dispatch.rs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Dispatch system. Just dispatches calls. - -use {runtime, runtime_support}; - -impl_meta_dispatch! { - pub mod public; - path public; - trait runtime_support::PublicPass; - Session(mod runtime::session) = 1; - Staking(mod runtime::staking) = 2; -// Timestamp(mod timestamp) = 3; - Democracy(mod runtime::democracy) = 5; - Council(mod runtime::council) = 6; - CouncilVote(mod runtime::council_vote) = 7; -} - -impl_meta_dispatch! { - pub mod privileged; - path privileged; - trait runtime_support::PrivPass; -// Consensus(mod consensus) = 0; - Session(mod runtime::session) = 1; - Staking(mod runtime::staking) = 2; - Democracy(mod runtime::democracy) = 5; - Council(mod runtime::council) = 6; - CouncilVote(mod runtime::council_vote) = 7; -} - -pub use self::privileged::Call as PrivCall; -pub use self::public::Call as PubCall; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 95be69ff6ae2e..36330e990a0f2 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -26,6 +26,7 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_executive as executive; +extern crate substrate_runtime_session as session; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; diff --git a/demo/runtime/src/runtime-old/session.rs b/demo/runtime/src/runtime-old/session.rs index 4bf47c35052b8..80ed2db066744 100644 --- a/demo/runtime/src/runtime-old/session.rs +++ b/demo/runtime/src/runtime-old/session.rs @@ -17,13 +17,6 @@ //! Session manager: is told the validators and allows them to manage their session keys for the //! consensus module. -use rstd::prelude::*; -use codec::KeyedVec; -use runtime_support::{storage, StorageValue, StorageMap, PrivPass, PublicPass}; -use demo_primitives::{AccountId, SessionKey, BlockNumber}; -use runtime::system; -use consensus; - storage_items!{ // The current set of validators. pub Validators get(validators): b"ses:val" => required Vec; @@ -45,10 +38,6 @@ pub fn validator_count() -> u32 { Validators::get().len() as u32 // TODO: can probably optimised } -impl_dispatch! { - pub mod public; - fn set_key(self, key: SessionKey) = 0; -} impl<'a> public::Dispatch for PublicPass<'a> { /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next @@ -59,11 +48,6 @@ impl<'a> public::Dispatch for PublicPass<'a> { } } -impl_dispatch! { - pub mod privileged; - fn set_length(self, new: BlockNumber) = 0; - fn force_new_session(self) = 1; -} impl privileged::Dispatch for PrivPass { /// Set a new era length. Won't kick in until the next era change (at current length). diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index cb726faa0d7f2..fd8866c3d8e97 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -19,7 +19,8 @@ use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root}; -use {consensus, timestamp, system, demo_primitives, runtime_primitives}; +use {consensus, timestamp, system, session, demo_primitives, runtime_primitives}; +use runtime_primitives::HasPublicAux; // TODO: move into runtime support/io. pub struct BlakeTwo256; @@ -36,20 +37,19 @@ impl runtime_primitives::Hashing for BlakeTwo256 { } } -pub type PublicAux = demo_primitives::AccountId; -pub type PrivAux = (); - pub struct Concrete; +impl HasPublicAux for Concrete { + type PublicAux = demo_primitives::AccountId; +} + impl timestamp::Trait for Concrete { type Value = u64; - type PublicAux = PublicAux; } pub type Timestamp = timestamp::Module; impl consensus::Trait for Concrete { type SessionKey = demo_primitives::AccountId; - type PrivAux = PrivAux; } pub type Consensus = consensus::Module; @@ -58,16 +58,20 @@ impl system::Trait for Concrete { type BlockNumber = demo_primitives::BlockNumber; type Hash = demo_primitives::Hash; type Hashing = BlakeTwo256; - type Log = demo_primitives::header::Log; type Digest = demo_primitives::header::Digest; type AccountId = demo_primitives::AccountId; type Header = demo_primitives::header::Header; } pub type System = system::Module; +impl session::Trait for Concrete { + type PublicAux = ::PublicAux; +} +pub type Session = session::Module; + impl_outer_dispatch! { - pub enum Call where aux: PublicAux { -// Session = 1, + pub enum Call where aux: ::PublicAux { + Session = 1, // Staking = 2, Timestamp = 3, // Democracy = 5, @@ -75,9 +79,9 @@ impl_outer_dispatch! { // CouncilVote = 7, } - pub enum PrivCall where aux: PrivAux { + pub enum PrivCall { Consensus = 0, -// Session = 1, + Session = 1, // Staking = 2, // Democracy = 5, // Council = 6, diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/transaction.rs index d6434a1554ff7..d417f0f3dfb1c 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/transaction.rs @@ -22,7 +22,7 @@ use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; use runtime::Call; use runtime_primitives::{Checkable, Applyable}; -use runtime_support::Dispatchable; +use runtime_support::AuxDispatchable; #[cfg(feature = "std")] use std::fmt; diff --git a/substrate/codec/src/slicable.rs b/substrate/codec/src/slicable.rs index 3a312df9ce4a3..4b515e896b03a 100644 --- a/substrate/codec/src/slicable.rs +++ b/substrate/codec/src/slicable.rs @@ -24,6 +24,16 @@ use super::joiner::Joiner; pub trait Input { /// Read into the provided input slice. Returns the number of bytes read. fn read(&mut self, into: &mut [u8]) -> usize; + + /// Read a single byte from the input. + fn read_byte(&mut self) -> Option { + let mut buf = [0u8]; + match self.read(&mut buf[..]) { + 0 => None, + 1 => Some(buf[0]), + _ => unreachable!(), + } + } } impl<'a> Input for &'a [u8] { @@ -57,20 +67,20 @@ pub trait NonTrivialSlicable: Slicable {} impl Slicable for Option { fn decode(input: &mut I) -> Option { - u8::decode(input).and_then(|v| match v { + match input.read_byte()? { 0 => Some(Some(false)), 1 => Some(Some(true)), 2 => Some(None), _ => None, - }) + } } fn using_encoded R>(&self, f: F) -> R { - match *self { + f(&[match *self { Some(false) => 0u8, Some(true) => 1u8, None => 2u8, - }.using_encoded(f) + }]) } } impl NonTrivialSlicable for Option {} @@ -108,89 +118,7 @@ impl Slicable for Vec { } } -// TODO: implement for all primitives. -impl Slicable for Vec { - fn decode(input: &mut I) -> Option { - u32::decode(input).and_then(move |len| { - let len = len as usize; - let mut vec = Vec::with_capacity(len); - for _ in 0..len { - vec.push(u64::decode(input)?); - } - Some(vec) - }) - } - - fn encode(&self) -> Vec { - let len = self.len(); - assert!(len <= u32::max_value() as usize, "Attempted to serialize vec with too many elements."); - - // TODO: optimise - no need to create a new vec and copy - can just reserve and encode in place - let mut r: Vec = Vec::new().and(&(len as u32)); - for i in self.iter() { - r.extend(&i.encode()); - } - r - } -} - -// TODO: use a BitVec-like representation. -impl Slicable for Vec { - fn decode(input: &mut I) -> Option { - >::decode(input).map(|a| a.into_iter().map(|b| b != 0).collect()) - } - - fn encode(&self) -> Vec { - >::encode(&self.iter().map(|&b| if b {1} else {0}).collect()) - } -} - -macro_rules! impl_vec_simple_array { - ($($size:expr),*) => { - $( - impl Slicable for Vec<[T; $size]> - where [T; $size]: Slicable - { - fn decode(input: &mut I) -> Option { - u32::decode(input).and_then(move |len| { - let mut r = Vec::with_capacity(len as usize); - for _ in 0..len { - r.push(match Slicable::decode(input) { - Some(x) => x, - None => return None, - }); - } - - Some(r) - }) - } - - fn using_encoded R>(&self, f: F) -> R { - f(&self.encode()) - } - - fn encode(&self) -> Vec { - use rstd::iter::Extend; - - let len = self.len(); - assert!(len <= u32::max_value() as usize, "Attempted to serialize vec with too many elements."); - - let mut r: Vec = Vec::new().and(&(len as u32)); - for item in self { - r.extend(item.encode()); - } - r - } - } - )* - } -} - -impl_vec_simple_array!(1, 2, 4, 8, 16, 32, 64); - -impl NonTrivialSlicable for Vec where Vec: Slicable {} - -impl Slicable for Vec { +impl Slicable for Vec { fn decode(input: &mut I) -> Option { u32::decode(input).and_then(move |len| { let mut r = Vec::with_capacity(len as usize); @@ -219,6 +147,8 @@ impl Slicable for Vec { } } +impl NonTrivialSlicable for Vec where Vec: Slicable {} + impl Slicable for () { fn decode(_: &mut I) -> Option<()> { Some(()) @@ -399,7 +329,7 @@ macro_rules! impl_non_endians { } impl_endians!(u16, u32, u64, usize, i16, i32, i64, isize); -impl_non_endians!(u8, i8, [u8; 1], [u8; 2], [u8; 3], [u8; 4], [u8; 5], [u8; 6], [u8; 7], [u8; 8], +impl_non_endians!(i8, [u8; 1], [u8; 2], [u8; 3], [u8; 4], [u8; 5], [u8; 6], [u8; 7], [u8; 8], [u8; 10], [u8; 12], [u8; 14], [u8; 16], [u8; 20], [u8; 24], [u8; 28], [u8; 32], [u8; 40], [u8; 48], [u8; 56], [u8; 64], [u8; 80], [u8; 96], [u8; 112], [u8; 128], bool); diff --git a/substrate/primitives/src/bft.rs b/substrate/primitives/src/bft.rs index 717ff8a4242ad..43f8903aae3b3 100644 --- a/substrate/primitives/src/bft.rs +++ b/substrate/primitives/src/bft.rs @@ -23,7 +23,7 @@ use ::{AuthorityId, Signature}; #[derive(Clone, Copy, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Debug))] -#[repr(u8)] +#[repr(i8)] enum ActionKind { Propose = 1, ProposeHeader = 2, @@ -83,27 +83,27 @@ impl Slicable for Action { } fn decode(value: &mut I) -> Option { - match u8::decode(value) { - Some(x) if x == ActionKind::Propose as u8 => { + match i8::decode(value) { + Some(x) if x == ActionKind::Propose as i8 => { let (round, block) = try_opt!(Slicable::decode(value)); Some(Action::Propose(round, block)) } - Some(x) if x == ActionKind::ProposeHeader as u8 => { + Some(x) if x == ActionKind::ProposeHeader as i8 => { let (round, hash) = try_opt!(Slicable::decode(value)); Some(Action::ProposeHeader(round, hash)) } - Some(x) if x == ActionKind::Prepare as u8 => { + Some(x) if x == ActionKind::Prepare as i8 => { let (round, hash) = try_opt!(Slicable::decode(value)); Some(Action::Prepare(round, hash)) } - Some(x) if x == ActionKind::Commit as u8 => { + Some(x) if x == ActionKind::Commit as i8 => { let (round, hash) = try_opt!(Slicable::decode(value)); Some(Action::Commit(round, hash)) } - Some(x) if x == ActionKind::AdvanceRound as u8 => { + Some(x) if x == ActionKind::AdvanceRound as i8 => { Slicable::decode(value).map(Action::AdvanceRound) } _ => None, @@ -169,7 +169,7 @@ impl Slicable for Justification { } // single-byte code to represent misbehavior kind. -#[repr(u8)] +#[repr(i8)] enum MisbehaviorCode { /// BFT: double prepare. BftDoublePrepare = 0x11, @@ -178,7 +178,7 @@ enum MisbehaviorCode { } impl MisbehaviorCode { - fn from_u8(x: u8) -> Option { + fn from_i8(x: i8) -> Option { match x { 0x11 => Some(MisbehaviorCode::BftDoublePrepare), 0x12 => Some(MisbehaviorCode::BftDoubleCommit), @@ -220,7 +220,7 @@ impl Slicable for MisbehaviorReport { match self.misbehavior { MisbehaviorKind::BftDoublePrepare(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { - (MisbehaviorCode::BftDoublePrepare as u8).using_encoded(|s| v.extend(s)); + (MisbehaviorCode::BftDoublePrepare as i8).using_encoded(|s| v.extend(s)); round.using_encoded(|s| v.extend(s)); h_a.using_encoded(|s| v.extend(s)); s_a.using_encoded(|s| v.extend(s)); @@ -228,7 +228,7 @@ impl Slicable for MisbehaviorReport { s_b.using_encoded(|s| v.extend(s)); } MisbehaviorKind::BftDoubleCommit(ref round, (ref h_a, ref s_a), (ref h_b, ref s_b)) => { - (MisbehaviorCode::BftDoubleCommit as u8).using_encoded(|s| v.extend(s)); + (MisbehaviorCode::BftDoubleCommit as i8).using_encoded(|s| v.extend(s)); round.using_encoded(|s| v.extend(s)); h_a.using_encoded(|s| v.extend(s)); s_a.using_encoded(|s| v.extend(s)); @@ -245,7 +245,7 @@ impl Slicable for MisbehaviorReport { let parent_number = ::block::Number::decode(input)?; let target = AuthorityId::decode(input)?; - let misbehavior = match u8::decode(input).and_then(MisbehaviorCode::from_u8)? { + let misbehavior = match i8::decode(input).and_then(MisbehaviorCode::from_i8)? { MisbehaviorCode::BftDoublePrepare => { MisbehaviorKind::BftDoublePrepare( u32::decode(input)?, diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 4845fb4b04955..0612a6a1a8905 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -20,66 +20,25 @@ pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; #[cfg(feature = "std")] pub use std::fmt; pub use rstd::marker::PhantomData; -use rstd::ops; use serde; pub use codec::{Slicable, Input, NonTrivialSlicable}; -/// Default public dispatch; assumes a 32-byte ID. -pub struct PublicPass<'a> (&'a [u8; 32]); - -const NOBODY: [u8; 32] = [0u8; 32]; - -impl<'a> PublicPass<'a> { - /// New instance. - pub fn unchecked_new(who: &[u8; 32]) -> PublicPass { - PublicPass(who) - } - - /// New instance. - pub fn nobody() -> PublicPass<'static> { - PublicPass(&NOBODY) - } - - /// New instance. - pub fn test(who: &[u8; 32]) -> PublicPass { - PublicPass(who) - } -} - -impl<'a> ops::Deref for PublicPass<'a> { - type Target = [u8; 32]; - fn deref(&self) -> &[u8; 32] { - self.0 - } -} - -/// Default privileged dispatch. -pub struct PrivPass (()); - -impl PrivPass { - /// New instance. - pub fn unchecked_new() -> PrivPass { PrivPass(()) } - - /// New instance. - pub fn test() -> PrivPass { PrivPass(()) } -} - -/* -impl_dispatch! { - trait Trait as T; - pub mod public for Module; - aux T::PublicAux; - fn set(_, now: T::Timestamp) = 0; +pub trait Dispatchable { + type TraitType; + fn dispatch(self); } -*/ -pub trait Dispatchable { +pub trait AuxDispatchable { type AuxType; type TraitType; fn dispatch(self, aux: &Self::AuxType); } -pub trait Callable { +pub trait AuxCallable { + type CallType: AuxDispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; +} + +pub trait Callable { type CallType: Dispatchable + Slicable + ::serde::Serialize + Clone + PartialEq + Eq; } @@ -87,15 +46,13 @@ pub trait Callable { pub trait Parameter: Slicable + serde::Serialize + Clone + Eq + fmt::Debug {} #[cfg(feature = "std")] -impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq + fmt::Debug { -} +impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq + fmt::Debug {} #[cfg(not(feature = "std"))] pub trait Parameter: Slicable + serde::Serialize + Clone + Eq {} #[cfg(not(feature = "std"))] -impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq { -} +impl Parameter for T where T: Slicable + serde::Serialize + Clone + Eq {} /// Declare a struct for this module, then implement dispatch logic to create a pairing of several @@ -127,6 +84,34 @@ macro_rules! decl_module { /// Implement several dispatch modules to create a pairing of a dispatch trait and enum. #[macro_export] macro_rules! decl_dispatch { + // WITHOUT AUX + ( + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + pub enum $call_type:ident { + $( + fn $fn_name:ident( + $( + $param_name:ident : $param:ty + ),* + ) + = $id:expr ; + )* + } + $($rest:tt)* + ) => { + __decl_dispatch_module_without_aux! { + impl for $mod_type<$trait_instance: $trait_name>; + pub enum $call_type; + $( + fn $fn_name( $( $param_name: $param ),* ) = $id; + )* + } + decl_dispatch! { + impl for $mod_type<$trait_instance: $trait_name>; + $($rest)* + } + }; + // WITH AUX ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; pub enum $call_type:ident where aux: $aux_type:ty { @@ -141,11 +126,11 @@ macro_rules! decl_dispatch { } $($rest:tt)* ) => { - __decl_dispatch_module! { + __decl_dispatch_module_with_aux! { impl for $mod_type<$trait_instance: $trait_name>; pub enum $call_type where aux: $aux_type; $( - fn $fn_name(aux, $($param_name: $param),*)= $id; + fn $fn_name(aux $(, $param_name: $param )*)= $id; )* } decl_dispatch! { @@ -153,29 +138,66 @@ macro_rules! decl_dispatch { $($rest)* } }; + // BASE CASE ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { - pub fn dispatch>(d: D, aux: &D::AuxType) { + pub fn aux_dispatch>(d: D, aux: &D::AuxType) { d.dispatch(aux); } + pub fn dispatch>(d: D) { + d.dispatch(); + } } } } #[macro_export] -macro_rules! __decl_dispatch_fns { - ($aux_type:ty => $fn_name:ident ( $( $param_name:ident $param_type:ty )* ) $($rest:tt)*) => { - fn $fn_name (aux: &$aux_type, $( $param_name: $param_type ),* ); - __decl_dispatch_fns!($aux_type => $($rest)*); - }; - ($aux_type:ty =>) => () +/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. +macro_rules! __decl_dispatch_module_without_aux { + ( + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + pub enum $call_type:ident; + $( + fn $fn_name:ident( + $( + $param_name:ident : $param:ty + ),* + ) + = $id:expr ; + )* + ) => { + __decl_dispatch_module_common! { + impl for $mod_type<$trait_instance: $trait_name>; + pub enum $call_type; + $( fn $fn_name( $( $param_name : $param ),* ) = $id ; )* + } + impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable + for $call_type<$trait_instance> + { + type TraitType = $trait_instance; + fn dispatch(self) { + match self { + $( + $call_type::$fn_name( $( $param_name ),* ) => + <$mod_type<$trait_instance>>::$fn_name( $( $param_name ),* ), + )* + $call_type::__PhantomItem(_) => { panic!("__PhantomItem should never be used.") }, + } + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::Callable + for $mod_type<$trait_instance> + { + type CallType = $call_type<$trait_instance>; + } + } } #[macro_export] /// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. -macro_rules! __decl_dispatch_module { +macro_rules! __decl_dispatch_module_with_aux { ( impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; pub enum $call_type:ident where aux: $aux_type:ty; @@ -187,15 +209,58 @@ macro_rules! __decl_dispatch_module { ) = $id:expr ; )* + ) => { + __decl_dispatch_module_common! { + impl for $mod_type<$trait_instance: $trait_name>; + pub enum $call_type; + $( fn $fn_name( $( $param_name : $param ),* ) = $id ; )* + } + impl<$trait_instance: $trait_name> $crate::dispatch::AuxDispatchable + for $call_type<$trait_instance> + { + type TraitType = $trait_instance; + type AuxType = $aux_type; + fn dispatch(self, aux: &Self::AuxType) { + match self { + $( + $call_type::$fn_name( $( $param_name ),* ) => + <$mod_type<$trait_instance>>::$fn_name( aux $(, $param_name )* ), + )* + $call_type::__PhantomItem(_) => { panic!("__PhantomItem should never be used.") }, + } + } + } + impl<$trait_instance: $trait_name> $crate::dispatch::AuxCallable + for $mod_type<$trait_instance> + { + type CallType = $call_type<$trait_instance>; + } + }; +} + +#[macro_export] +/// Implement a single dispatch modules to create a pairing of a dispatch trait and enum. +macro_rules! __decl_dispatch_module_common { + ( + impl for $mod_type:ident<$trait_instance:ident: $trait_name:ident>; + pub enum $call_type:ident; + $( + fn $fn_name:ident( + $( + $param_name:ident : $param:ty + ),* + ) + = $id:expr ; + )* ) => { #[cfg_attr(feature = "std", derive(Serialize))] #[allow(missing_docs)] pub enum $call_type<$trait_instance: $trait_name> { + __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), $( #[allow(non_camel_case_types)] - $fn_name ( $( $param ),* ) - ,)* - __PhantomItem($crate::dispatch::PhantomData<$trait_instance>), + $fn_name ( $( $param ),* ), + )* } // manual implementation of clone/eq/partialeq because using derive erroneously requires @@ -217,21 +282,23 @@ macro_rules! __decl_dispatch_module { for $call_type<$trait_instance> { fn eq(&self, other: &Self) -> bool { - match *self {$( - $call_type::$fn_name( $( ref $param_name ),* ) => { - let self_params = ( $( $param_name, )* ); - if let $call_type::$fn_name( $( ref $param_name ),* ) = *other { + match *self { + $( + $call_type::$fn_name( $( ref $param_name ),* ) => { + let self_params = ( $( $param_name, )* ); + if let $call_type::$fn_name( $( ref $param_name ),* ) = *other { self_params == ( $( $param_name, )* ) - } else { - if let $call_type::__PhantomItem(_) = *other { - unreachable!() } else { - false + if let $call_type::__PhantomItem(_) = *other { + unreachable!() + } else { + false + } } } - } + )* $call_type::__PhantomItem(_) => unreachable!(), - )*} + } } } impl<$trait_instance: $trait_name> $crate::dispatch::Eq @@ -256,31 +323,9 @@ macro_rules! __decl_dispatch_module { } } - impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable - for $call_type<$trait_instance> - { - type TraitType = $trait_instance; - type AuxType = $aux_type; - fn dispatch(self, aux: &Self::AuxType) { - match self { - $( - $call_type::$fn_name( $( $param_name ),* ) => - <$mod_type<$trait_instance>>::$fn_name( aux, $( $param_name ),* ), - $call_type::__PhantomItem(_) => unreachable!(), - )* - } - } - } - - impl<$trait_instance: $trait_name> $crate::dispatch::Callable<$aux_type> - for $mod_type<$trait_instance> - { - type CallType = $call_type<$trait_instance>; - } - impl<$trait_instance: $trait_name> $crate::dispatch::Slicable for $call_type<$trait_instance> { fn decode(input: &mut I) -> Option { - match u8::decode(input)? { + match input.read_byte()? { $( $id => { $( @@ -302,7 +347,7 @@ macro_rules! __decl_dispatch_module { ref $param_name ),* ) => { - ($id as u8).using_encoded(|s| v.extend(s)); + v.push($id as u8); $( $param_name.using_encoded(|s| v.extend(s)); )* @@ -324,7 +369,7 @@ macro_rules! __decl_dispatch_module { /// Implement a meta-dispatch module to dispatch to other dispatchers. #[macro_export] macro_rules! impl_outer_dispatch { - () => {}; + () => (); ( pub enum $call_type:ident where aux: $aux:ty { $( @@ -338,25 +383,63 @@ macro_rules! impl_outer_dispatch { #[allow(missing_docs)] pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::Callable<$aux>>::CallType ) + $camelcase ( <$camelcase as $crate::dispatch::AuxCallable>::CallType ) ,)* } - - impl $crate::dispatch::Dispatchable for $call_type { + impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } + impl $crate::dispatch::AuxDispatchable for $call_type { type AuxType = $aux; type TraitType = $call_type; fn dispatch(self, aux: &$aux) { match self { $( - $call_type::$camelcase(call) => $camelcase::dispatch(call, &aux), + $call_type::$camelcase(call) => call.dispatch(&aux), )* } } } + impl_outer_dispatch!{ $($rest)* } + }; + ( + pub enum $call_type:ident { + $( + $camelcase:ident = $id:expr, + )* + } + $( $rest:tt )* + ) => { + #[derive(Clone, PartialEq, Eq)] + #[cfg_attr(feature = "std", derive(Serialize, Debug))] + #[allow(missing_docs)] + pub enum $call_type { + $( + $camelcase ( <$camelcase as $crate::dispatch::Callable>::CallType ) + ,)* + } + impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } + impl $crate::dispatch::Dispatchable for $call_type { + type TraitType = $call_type; + fn dispatch(self) { + match self { + $( + $call_type::$camelcase(call) => call.dispatch(), + )* + } + } + } + impl_outer_dispatch!{ $($rest)* } + } +} +/// Implement a meta-dispatch module to dispatch to other dispatchers. +#[macro_export] +macro_rules! impl_outer_dispatch_common { + ( + $call_type:ident, $( $camelcase:ident = $id:expr, )* + ) => { impl $crate::dispatch::Slicable for $call_type { fn decode(input: &mut I) -> Option { - match u8::decode(input)? { + match input.read_byte()? { $( $id => Some($call_type::$camelcase( $crate::dispatch::Slicable::decode(input)? )), @@ -370,7 +453,7 @@ macro_rules! impl_outer_dispatch { match *self { $( $call_type::$camelcase( ref sub ) => { - ($id as u8).using_encoded(|s| v.extend(s)); + v.push($id as u8); sub.using_encoded(|s| v.extend(s)); } )* @@ -383,8 +466,6 @@ macro_rules! impl_outer_dispatch { } } impl $crate::dispatch::NonTrivialSlicable for $call_type {} - - impl_outer_dispatch!{ $($rest)* } } } @@ -467,7 +548,7 @@ macro_rules! impl_dispatch { impl $crate::dispatch::Slicable for Call { fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(Id::from_u8)?; + let id = input.read_byte().and_then(Id::from_u8)?; Some(match id { $( Id::$fn_name => { @@ -567,7 +648,7 @@ macro_rules! impl_meta_dispatch { impl $crate::dispatch::Slicable for Call { fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(Id::from_u8)?; + let id = input.read_byte().and_then(Id::from_u8)?; Some(match id { $( Id::$camelcase => diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 564841c27ef35..ad1e8a0f6300a 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -38,5 +38,4 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{PrivPass, PublicPass}; // TODO: REMOVE -pub use self::dispatch::{Parameter, Dispatchable, Callable}; +pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable}; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 7287f60ff31b3..588ab45238e09 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -23,7 +23,7 @@ extern crate substrate_codec as codec; use rstd::prelude::*; -use runtime_support::storage; +use runtime_support::{storage, Parameter}; use runtime_support::storage::unhashed::StorageVec; pub const AUTHORITY_AT: &'static[u8] = b":auth:"; @@ -38,14 +38,14 @@ impl StorageVec for AuthorityStorageVec { pub const CODE: &'static[u8] = b":code"; pub trait Trait { - type SessionKey: codec::Slicable + Default; - type PrivAux; + type SessionKey: Parameter + Default; } decl_module! { pub struct Module; - pub enum PrivCall where aux: T::PrivAux { - fn set_code(aux, new: Vec) = 0; + pub enum PrivCall { + fn set_code(new: Vec) = 0; + fn dummy() = 1; } } @@ -56,10 +56,12 @@ impl Module { } /// Set the new code. - fn set_code(_aux: &T::PrivAux, new: Vec) { + fn set_code(new: Vec) { storage::unhashed::put_raw(CODE, &new); } + fn dummy() {} + /// Set the current set of authorities' session keys. /// /// Called by `next_session` only. diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index b0f6299577116..578b22136ef1f 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -20,7 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] #[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 6ec67371ee90b..78f84bace2f41 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -28,7 +28,11 @@ extern crate substrate_primitives; use rstd::prelude::*; use codec::Slicable; pub use num_traits::identities::{Zero, One}; -use rstd::ops::{Add, Sub, AddAssign, SubAssign}; +use rstd::ops::{Add, Sub, Rem, AddAssign, SubAssign, RemAssign}; + +pub trait HasPublicAux { + type PublicAux; +} pub trait Hashing { type Output; @@ -37,16 +41,25 @@ pub trait Hashing { fn storage_root() -> Self::Output; } +pub trait RefInto { + fn into(&self) -> &T; +} +impl RefInto for T { + fn into(&self) -> &T { &self } +} + pub trait SimpleArithmetic: Zero + One + Add + AddAssign + Sub + SubAssign + + Rem + RemAssign + PartialOrd + Ord {} impl + AddAssign + Sub + SubAssign + + Rem + RemAssign + PartialOrd + Ord > SimpleArithmetic for T {} diff --git a/substrate/runtime/session/Cargo.toml b/substrate/runtime/session/Cargo.toml new file mode 100644 index 0000000000000..c5d69ea34fb05 --- /dev/null +++ b/substrate/runtime/session/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "substrate-runtime-session" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } +substrate-runtime-system = { path = "../system", default_features = false } + +[features] +default = ["std"] +std = [ + "serde/std", + "safe-mix/std", + "substrate-codec/std", + "substrate-primitives/std", + "substrate-runtime-std/std", + "substrate-runtime-io/std", + "substrate-runtime-support/std", + "substrate-runtime-primitives/std", + "substrate-runtime-consensus/std", + "substrate-runtime-system/std", +] diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs new file mode 100644 index 0000000000000..7517f4af3b394 --- /dev/null +++ b/substrate/runtime/session/src/lib.rs @@ -0,0 +1,280 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Session manager: is told the validators and allows them to manage their session keys for the +//! consensus module. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "std")] extern crate serde; + +extern crate substrate_codec as codec; +extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_io as runtime_io; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_system as system; + +use rstd::prelude::*; +//use runtime_io::{twox_128, TestExternalities}; +use primitives::{Zero, One, RefInto}; +use runtime_support::{StorageValue, StorageMap}; + +pub trait Trait: consensus::Trait + system::Trait { + type PublicAux: RefInto; +} + +decl_module! { + pub struct Module; + pub enum Call where aux: T::PublicAux { + fn set_key(aux, key: T::SessionKey) = 0; + } + pub enum PrivCall { + fn set_length(new: T::BlockNumber) = 0; + fn force_new_session() = 1; + } +} +decl_storage! { + trait Store for Module; + + // The current set of validators. + pub Validators get(validators): b"ses:val" => required Vec; + // Current length of the session. + pub SessionLength get(length): b"ses:len" => required T::BlockNumber; + // Current index of the session. + pub CurrentIndex get(current_index): b"ses:ind" => required T::BlockNumber; + + // Block at which the session length last changed. + LastLengthChange: b"ses:llc" => T::BlockNumber; + // The next key for a given validator. + NextKeyFor: b"ses:nxt:" => map [ T::AccountId => T::SessionKey ]; + // The next session length. + NextSessionLength: b"ses:nln" => T::BlockNumber; +} + +impl Module { + /// The number of validators currently. + pub fn validator_count() -> u32 { + >::get().len() as u32 // TODO: can probably optimised + } + + /// The last length change, if there was one, zero if not. + pub fn last_length_change() -> T::BlockNumber { + >::get().unwrap_or_else(T::BlockNumber::zero) + } + + /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next + /// session. + fn set_key(aux: &T::PublicAux, key: T::SessionKey) { + // set new value for next session + >::insert(RefInto::into(aux), key) + } + + /// Set a new era length. Won't kick in until the next era change (at current length). + fn set_length(new: T::BlockNumber) { + >::put(new); + } + + /// Forces a new session. + fn force_new_session() { + Self::rotate_session(); + } + + // INTERNAL API (available to other runtime modules) + + /// Set the current set of validators. + /// + /// Called by `staking::next_era()` only. `next_session` should be called after this in order to + /// update the session keys to the next validator set. + pub fn set_validators<'a>(new: &'a[T::AccountId]) + where T::SessionKey: From<&'a T::AccountId> + { + >::put(&new.to_vec()); // TODO: optimise. + >::set_authorities( + &new.iter().map(Into::into).collect::>() + ); + } + + /// Hook to be called after transaction processing. + pub fn check_rotate_session() { + // do this last, after the staking system has had chance to switch out the authorities for the + // new set. + // check block number and call next_session if necessary. + let block_number = >::block_number(); + if ((block_number - Self::last_length_change()) % Self::length()).is_zero() { + Self::rotate_session(); + } + } + + /// Move onto next session: register the new authority set. + pub fn rotate_session() { + // Increment current session index. + >::put(>::get() + One::one()); + + // Enact era length change. + if let Some(next_len) = >::take() { + let block_number = >::block_number(); + >::put(next_len); + >::put(block_number); + } + + // Update any changes in session keys. + Self::validators().iter().enumerate().for_each(|(i, v)| { + if let Some(n) = >::take(v) { + >::set_authority(i as u32, &n); + } + }); + } +} +/* +#[cfg(any(feature = "std", test))] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use codec::{Joiner, KeyedVec}; + use keyring::Keyring::*; + use runtime::system; + + pub fn externalities(session_length: u64) -> TestExternalities { + let three = [3u8; 32]; + + let extras: TestExternalities = map![ + twox_128(SessionLength::key()).to_vec() => vec![].and(&session_length), + twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), + twox_128(Validators::key()).to_vec() => vec![].and(&vec![One.into(), Two.into(), three]) + ]; + system::testing::externalities().into_iter().chain(extras.into_iter()).collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::public::*; + use super::privileged::Dispatch as PrivDispatch; + use super::internal::*; + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::{KeyedVec, Joiner}; + use keyring::Keyring; + use demo_primitives::AccountId; + use runtime::session; + use consensus; + + fn simple_setup() -> TestExternalities { + map![ + twox_128(SessionLength::key()).to_vec() => vec![].and(&2u64), + twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), + // the validators (10, 20, ...) + twox_128(Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), + // initial session keys (11, 21, ...) + b":auth:len".to_vec() => vec![].and(&2u32), + 0u32.to_keyed_vec(b":auth:") => vec![11; 32], + 1u32.to_keyed_vec(b":auth:") => vec![21; 32] + ] + } + + #[test] + fn simple_setup_should_work() { + let mut t = simple_setup(); + with_externalities(&mut t, || { + assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + assert_eq!(length(), 2u64); + assert_eq!(validators(), vec![[10u8; 32], [20u8; 32]]); + }); + } + + #[test] + fn session_length_change_should_work() { + let mut t = simple_setup(); + with_externalities(&mut t, || { + // Block 1: Change to length 3; no visible change. + system::testing::set_block_number(1); + PrivPass::test().set_length(3); + check_rotate_session(); + assert_eq!(length(), 2); + assert_eq!(current_index(), 0); + + // Block 2: Length now changed to 3. Index incremented. + system::testing::set_block_number(2); + PrivPass::test().set_length(3); + check_rotate_session(); + assert_eq!(length(), 3); + assert_eq!(current_index(), 1); + + // Block 3: Length now changed to 3. Index incremented. + system::testing::set_block_number(3); + check_rotate_session(); + assert_eq!(length(), 3); + assert_eq!(current_index(), 1); + + // Block 4: Change to length 2; no visible change. + system::testing::set_block_number(4); + PrivPass::test().set_length(2); + check_rotate_session(); + assert_eq!(length(), 3); + assert_eq!(current_index(), 1); + + // Block 5: Length now changed to 2. Index incremented. + system::testing::set_block_number(5); + check_rotate_session(); + assert_eq!(length(), 2); + assert_eq!(current_index(), 2); + + // Block 6: No change. + system::testing::set_block_number(6); + check_rotate_session(); + assert_eq!(length(), 2); + assert_eq!(current_index(), 2); + + // Block 7: Next index. + system::testing::set_block_number(7); + check_rotate_session(); + assert_eq!(length(), 2); + assert_eq!(current_index(), 3); + }); + } + + #[test] + fn session_change_should_work() { + let mut t = simple_setup(); + with_externalities(&mut t, || { + // Block 1: No change + system::testing::set_block_number(1); + check_rotate_session(); + assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + + // Block 2: Session rollover, but no change. + system::testing::set_block_number(2); + check_rotate_session(); + assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + + // Block 3: Set new key for validator 2; no visible change. + system::testing::set_block_number(3); + PublicPass::test(&[20; 32]).set_key([22; 32]); + assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + + check_rotate_session(); + assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + + // Block 4: Session rollover, authority 2 changes. + system::testing::set_block_number(4); + check_rotate_session(); + assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]); + }); + } +} +*/ diff --git a/substrate/runtime/system/Cargo.toml b/substrate/runtime/system/Cargo.toml index d483340aadad9..89d4e48e201b8 100644 --- a/substrate/runtime/system/Cargo.toml +++ b/substrate/runtime/system/Cargo.toml @@ -6,25 +6,23 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } -substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-primitives = { path = "../primitives", default_features = false } -substrate-runtime-consensus = { path = "../consensus", default_features = false } -safe-mix = { path = "../../../safe-mix", default_features = false} [features] default = ["std"] std = [ - "substrate-runtime-std/std", - "substrate-runtime-support/std", "serde/std", "safe-mix/std", "substrate-codec/std", "substrate-primitives/std", + "substrate-runtime-std/std", "substrate-runtime-io/std", - "substrate-runtime-consensus/std", + "substrate-runtime-support/std", "substrate-runtime-primitives/std", ] diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index b1916227654fa..7c816b5bc0d56 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -31,7 +31,6 @@ extern crate safe_mix; use rstd::prelude::*; use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Hashing, Headery}; -//use runtime_io::print; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -44,8 +43,7 @@ pub trait Trait { type BlockNumber: Parameter + SimpleArithmetic; type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; - type Log; - type Digest: Parameter + Default + Digesty; + type Digest: Parameter + Default + Digesty; type AccountId: Parameter; type Header: Headery; } @@ -91,7 +89,7 @@ impl Module { } /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(item: T::Log) { + pub fn deposit_log(item: ::Item) { let mut l = >::get(); l.push(item); >::put(l); diff --git a/substrate/runtime/timestamp/Cargo.toml b/substrate/runtime/timestamp/Cargo.toml index d3bfc099a0d8a..f9382e24be470 100644 --- a/substrate/runtime/timestamp/Cargo.toml +++ b/substrate/runtime/timestamp/Cargo.toml @@ -8,6 +8,7 @@ hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } substrate-codec = { path = "../../codec", default_features = false } [dev-dependencies] @@ -18,6 +19,7 @@ default = ["std"] std = [ "substrate-runtime-std/std", "substrate-runtime-support/std", + "substrate-runtime-primitives/std", "serde/std", "substrate-codec/std", ] diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index 58d5a91698dda..bbd3fbeaed81f 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -21,14 +21,14 @@ #[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_io as runtime_io; +extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_codec as codec; -use runtime_support::StorageValue; -use runtime_support::Parameter; +use runtime_support::{StorageValue, Parameter}; +use runtime_primitives::HasPublicAux; -pub trait Trait { +pub trait Trait: HasPublicAux { type Value: Parameter + Default; - type PublicAux; } decl_module! { @@ -63,9 +63,11 @@ mod tests { use runtime_support::storage::StorageValue; struct TraitImpl; + impl HasPublicAux for TraitImpl { + type PublicAux = u64; + } impl Trait for TraitImpl { type Value = u64; - type PublicAux = u64; } type Timestamp = Module; @@ -78,7 +80,7 @@ mod tests { with_externalities(&mut t, || { assert_eq!(::Now::get(), 42); - Timestamp::dispatch(Call::set(69), &0); + Timestamp::aux_dispatch(Call::set(69), &0); assert_eq!(Timestamp::now(), 69); }); } From 193ae03b05009d0aa8578ef4b170384defaed939 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 01:51:15 +0900 Subject: [PATCH 25/76] Cleanups and ensure session gets run. --- substrate/runtime/executive/src/lib.rs | 11 +---------- substrate/runtime/session/src/lib.rs | 8 +++++++- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 578b22136ef1f..f08ce75a1b675 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -14,8 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code -//! and depositing logs. +//! Executive: Handles all of the top-level stuff; essentially just executing blocks/extrinsics. #![cfg_attr(not(feature = "std"), no_std)] @@ -28,18 +27,10 @@ extern crate substrate_runtime_system as system; #[cfg(feature = "std")] extern crate serde; -//extern crate safe_mix; - use rstd::prelude::*; use rstd::marker::PhantomData; use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Hashing, Executable}; use codec::Slicable; -//use runtime_support::{Hashable, StorageValue, StorageMap}; - -//use primitives::{AuthorityId, Hash, BlockNumber, Header, Log}; -//use primitives::block::{generic, Number as BlockNumber, Header, Log}; - -//use safe_mix::TripletMix; pub struct Executive< Unchecked, diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 7517f4af3b394..dba4b579e9032 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -31,7 +31,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, RefInto}; +use primitives::{Zero, One, RefInto, Executable}; use runtime_support::{StorageValue, StorageMap}; pub trait Trait: consensus::Trait + system::Trait { @@ -140,6 +140,12 @@ impl Module { }); } } + +impl Executable for Module { + fn execute() { + Self::check_rotate_session(); + } +} /* #[cfg(any(feature = "std", test))] pub mod testing { From 6bb981954c5ce1fe5b58cfdcc341207dc95bae3b Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 18:58:05 +0900 Subject: [PATCH 26/76] First part of traitification of staking module. --- Cargo.lock | 17 + Cargo.toml | 1 + demo/runtime/src/lib.rs | 4 +- substrate/runtime/primitives/src/lib.rs | 2 +- substrate/runtime/staking/Cargo.toml | 32 + substrate/runtime/staking/src/lib.rs | 891 ++++++++++++++++++++++++ substrate/runtime/system/src/lib.rs | 6 +- 7 files changed, 947 insertions(+), 6 deletions(-) create mode 100644 substrate/runtime/staking/Cargo.toml create mode 100644 substrate/runtime/staking/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 54b0ab0484eef..559e79a29eefb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1835,6 +1835,23 @@ dependencies = [ "substrate-runtime-system 0.1.0", ] +[[package]] +name = "substrate-runtime-staking" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-std" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 69e8b4d7d95a1..f98916e663abc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,7 @@ members = [ "substrate/runtime/executive", "substrate/runtime/primitives", "substrate/runtime/session", + "substrate/runtime/staking", "substrate/runtime/system", "substrate/runtime/timestamp", "substrate/serializer", diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 36330e990a0f2..28dc95a9982cd 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -57,8 +57,8 @@ pub type Executive = executive::Executive< runtime::Concrete, block::Block, ( -// staking::internal::check_new_era(); -// session::internal::check_rotate_session(); + (),//runtime::Staking + runtime::Session ), >; diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 78f84bace2f41..6c461d2979569 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -27,7 +27,7 @@ extern crate substrate_primitives; use rstd::prelude::*; use codec::Slicable; -pub use num_traits::identities::{Zero, One}; +pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Rem, AddAssign, SubAssign, RemAssign}; pub trait HasPublicAux { diff --git a/substrate/runtime/staking/Cargo.toml b/substrate/runtime/staking/Cargo.toml new file mode 100644 index 0000000000000..c464875625043 --- /dev/null +++ b/substrate/runtime/staking/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "substrate-runtime-staking" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +serde = { version = "1.0", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-system = { path = "../system", default_features = false } +substrate-runtime-session = { path = "../session", default_features = false } + +[features] +default = ["std"] +std = [ + "serde/std", + "safe-mix/std", + "substrate-codec/std", + "substrate-primitives/std", + "substrate-runtime-std/std", + "substrate-runtime-io/std", + "substrate-runtime-support/std", + "substrate-runtime-primitives/std", + "substrate-runtime-session/std", + "substrate-runtime-system/std", +] diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs new file mode 100644 index 0000000000000..22da35c92a052 --- /dev/null +++ b/substrate/runtime/staking/src/lib.rs @@ -0,0 +1,891 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Staking manager: Handles balances and periodically determines the best set of validators. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "std")] extern crate serde; + +extern crate substrate_codec as codec; +extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_io as runtime_io; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_session as session; +extern crate substrate_runtime_system as system; + +use rstd::prelude::*; +use rstd::collections::btree_map::BTreeMap; +//use runtime_io::{twox_128, TestExternalities}; +use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; +use runtime_support::{StorageValue, StorageMap, Parameter}; + +#[cfg(test)] +#[derive(Debug, PartialEq, Clone)] +pub enum LockStatus { + Liquid, + LockedUntil(BlockNumber), + Staked, +} + +#[cfg(not(test))] +#[derive(PartialEq, Clone)] +pub enum LockStatus { + Liquid, + LockedUntil(BlockNumber), + Staked, +} + +pub trait Trait: system::Trait + session::Trait { + /// The balance of an account. + type Balance: Parameter + SimpleArithmetic + Default; +} + +decl_module! { + pub struct Module; + pub enum Call where aux: T::PublicAux { + fn transfer(aux, dest: T::AccountId, value: T::Balance) = 0; + fn stake(aux) = 1; + fn unstake(aux) = 2; + } + pub enum PrivCall { + fn set_sessions_per_era(new: T::BlockNumber) = 0; + fn set_bonding_duration(new: T::BlockNumber) = 1; + fn set_validator_count(new: u32) = 2; + fn force_new_era() = 3; + } +} + +decl_storage! { + trait Store for Module; + + // The length of the bonding duration in eras. + pub BondingDuration get(bonding_duration): b"sta:loc" => required T::BlockNumber; + // The length of a staking era in sessions. + pub ValidatorCount get(validator_count): b"sta:vac" => required u32; + // The length of a staking era in sessions. + pub SessionsPerEra get(sessions_per_era): b"sta:spe" => required T::BlockNumber; + // The total amount of stake on the system. + pub TotalStake get(total_stake): b"sta:tot" => required T::Balance; + // The fee to be paid for making a transaction. + pub TransactionFee get(transaction_fee): b"sta:fee" => required T::Balance; + + // The current era index. + pub CurrentEra get(current_era): b"sta:era" => required T::BlockNumber; + // All the accounts with a desire to stake. + pub Intention: b"sta:wil:" => Vec; + // The next value of sessions per era. + pub NextSessionsPerEra get(next_sessions_per_era): b"sta:nse" => T::BlockNumber; + // The block number at which the era length last changed. + pub LastEraLengthChange get(last_era_length_change): b"sta:lec" => default T::BlockNumber; + + // The balance of a given account. + pub FreeBalance get(free_balance): b"sta:bal:" => default map [ T::AccountId => T::Balance ]; + + // The amount of the balance of a given account that is exterally reserved; this can still get + // slashed, but gets slashed last of all. + pub ReservedBalance get(reserved_balance): b"sta:lbo:" => default map [ T::AccountId => T::Balance ]; + + // The block at which the `who`'s funds become entirely liquid. + pub Bondage get(bondage): b"sta:bon:" => default map [ T::AccountId => T::BlockNumber ]; + + // The code associated with an account. + pub CodeOf: b"sta:cod:" => default map [ T::AccountId => Vec ]; // TODO Vec values should be optimised to not do a length prefix. + + // The storage items associated with an account/key. + pub StorageOf: b"sta:sto:" => map [ (T::AccountId, Vec) => Vec ]; // TODO: keys should also be able to take AsRef to ensure Vecs can be passed as &[u8] +} + +impl Module { + + // PUBLIC IMMUTABLES + + /// The length of a staking era in blocks. + pub fn era_length() -> T::BlockNumber { + Self::sessions_per_era() * >::length() + } + + /// The combined balance of `who`. + pub fn balance(who: &T::AccountId) -> T::Balance { + Self::free_balance(who) + Self::reserved_balance(who) + } + + /// Some result as `slash(who, value)` (but without the side-effects) asuming there are no + /// balance changes in the meantime. + pub fn can_slash(who: &T::AccountId, value: T::Balance) -> bool { + Self::balance(who) >= value + } + + /// The block at which the `who`'s funds become entirely liquid. + pub fn unlock_block(who: &T::AccountId) -> LockStatus { + match Self::bondage(who) { + i if i == T::BlockNumber::max_value() => LockStatus::Staked, + i if i <= >::block_number() => LockStatus::Liquid, + i => LockStatus::LockedUntil(i), + } + } + + /// Create a smart-contract account. + pub fn create(aux: &T::PublicAux, code: &[u8], value: T::Balance) { + // commit anything that made it this far to storage + if let Some(commit) = Self::effect_create(RefInto::into(aux), code, value, DirectExt) { + Self::commit_state(commit); + } + } + + /// New PublicPass instance through making a payment. + pub fn make_payment(transactor: &T::AccountId) { + let b = Self::free_balance(transactor); + let transaction_fee = Self::transaction_fee(); + assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); + >::insert(transactor, b - transaction_fee); + } + + // PUBLIC DISPATCH + + /// Transfer some unlocked staking balance to another staker. + /// TODO: probably want to state gas-limit and gas-price. + fn transfer(aux: &T::PublicAux, dest: T::AccountId, value: T::Balance) { + // commit anything that made it this far to storage +/* if let Some(commit) = Self::effect_transfer(aux.into(), &dest, value, DirectExt) { + Self::commit_state(commit); + } +*/ } + + /// Declare the desire to stake for the transactor. + /// + /// Effects will be felt at the beginning of the next era. + fn stake(aux: &T::PublicAux) { +/* let mut intentions = Intention::items(); + // can't be in the list twice. + assert!(intentions.iter().find(|&t| t == aux.into()).is_none(), "Cannot stake if already staked."); + intentions.push(aux.into().clone()); + Intention::set_items(&intentions); + >::insert(aux.into(), u64::max_value()); +*/ } + + /// Retract the desire to stake for the transactor. + /// + /// Effects will be felt at the beginning of the next era. + fn unstake(aux: &T::PublicAux) { +/* let mut intentions = Intention::items(); + if let Some(position) = intentions.iter().position(|&t| t == *self) { + intentions.swap_remove(position); + } else { + panic!("Cannot unstake if not already staked."); + } + Intention::set_items(&intentions); + >::insert(aux.into(), >::get() + >::get()); +*/ } + + // PRIV DISPATCH + + /// Set the number of sessions in an era. + fn set_sessions_per_era(new: T::BlockNumber) { +// >::put(&new); + } + + /// The length of the bonding duration in eras. + fn set_bonding_duration(new: T::BlockNumber) { +// >::put(&new); + } + + /// The length of a staking era in sessions. + fn set_validator_count(new: u32) { +// >::put(&new); + } + + /// Force there to be a new era. This also forces a new session immediately after. + fn force_new_era() { +/* new_era(); + session::internal::rotate_session(); +*/ } + + // PUBLIC MUTABLES (DANGEROUS) +/* + /// Deduct from an unbonded balance. true if it happened. + pub fn deduct_unbonded(who: &T::AccountId, value: T::Balance) -> bool { + if let LockStatus::Liquid = Self::unlock_block(who) { + let b = Self::free_balance(who); + if b >= value { + >::insert(who, &(b - value)); + return true; + } + } + false + } + + /// Refund some balance. + pub fn refund(who: &T::AccountId, value: T::Balance) { + >::insert(who, &(Self::free_balance(who) + value)) + } + + /// Will slash any balance, but prefer free over reserved. + pub fn slash(who: &T::AccountId, value: T::Balance) -> bool { + let free_balance = Self::free_balance(who); + let free_slash = cmp::min(free_balance, value); + >::insert(who, &(free_balance - free_slash)); + if free_slash < value { + Self::slash_reserved(who, value - free_slash) + } else { + true + } + } + + /// Moves `value` from balance to reserved balance. + pub fn reserve_balance(who: &T::AccountId, value: T::Balance) { + let b = Self::free_balance(who); + assert!(b >= value); + >::insert(who, &(b - value)); + >::insert(who, &(Self::reserved_balance(who) + value)); + } + + /// Moves `value` from reserved balance to balance. + pub fn unreserve_balance(who: &T::AccountId, value: T::Balance) { + let b = Self::reserved_balance(who); + let value = cmp::min(b, value); + >::insert(who, &(b - value)); + >::insert(who, &(Self::free_balance(who) + value)); + } + + /// Moves `value` from reserved balance to balance. + pub fn slash_reserved(who: &T::AccountId, value: T::Balance) -> bool { + let b = Self::reserved_balance(who); + let slash = cmp::min(b, value); + >::insert(who, &(b - slash)); + value == slash + } + + /// Moves `value` from reserved balance to balance. + pub fn transfer_reserved_balance(slashed: &T::AccountId, beneficiary: &T::AccountId, value: T::Balance) -> bool { + let b = Self::reserved_balance(slashed); + let slash = cmp::min(b, value); + >::insert(slashed, &(b - slash)); + >::insert(beneficiary, &(Self::free_balance(beneficiary) + slash)); + slash == value + } + + /// The era has changed - enact new staking set. + /// + /// NOTE: This always happens immediately before a session change to ensure that new validators + /// get a chance to set their session keys. + fn new_era() { + // Increment current era. + >::put(&(>::get() + 1)); + + // Enact era length change. + if let Some(next_spe) = >::get() { + if next_spe != >::get() { + >::put(&next_spe); + >::put(&system::block_number()); + } + } + + // evaluate desired staking amounts and nominations and optimise to find the best + // combination of validators, then use session::internal::set_validators(). + // for now, this just orders would-be stakers by their balances and chooses the top-most + // >::get() of them. + let mut intentions = Intention::items() + .into_iter() + .map(|v| (Self::balance(&v), v)) + .collect::>(); + intentions.sort_unstable_by(|&(b1, _), &(b2, _)| b2.cmp(&b1)); + session::internal::set_validators( + &intentions.into_iter() + .map(|(_, v)| v) + .take(>::get() as usize) + .collect::>() + ); + } +*/ + // NON-PUBLIC + + /// Hook to be called after to transaction processing. + fn check_new_era() { + // check block number and call new_era if necessary. +/* if (>::block_number() - >::get()) % Self::era_length() == Zero::zero() { + new_era(); + } +*/ } +} + +impl Executable for Module { + fn execute() { + Self::check_new_era(); + } +} + +// Each identity's stake may be in one of three bondage states, given by an integer: +// - n | n <= >::get(): inactive: free to be transferred. +// - ~0: active: currently representing a validator. +// - n | n > >::get(): deactivating: recently representing a validator and not yet +// ready for transfer. + +#[derive(Default)] +pub struct ChangeEntry { + balance: Option, + code: Option>, + storage: BTreeMap, Option>>, +} + +impl ChangeEntry { + pub fn balance_changed(b: T::Balance) -> Self { + ChangeEntry { balance: Some(b), code: None, storage: Default::default() } + } +} + +type State = BTreeMap>; + +trait Externalities { + fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option>; + fn get_code(&self, account: &T::AccountId) -> Vec; + fn get_balance(&self, account: &T::AccountId) -> T::Balance; +} +/* +struct Ext where + F1 : Fn(&T::AccountId, &[u8]) -> Option>, + F3 : Fn(&T::AccountId) -> Vec, + F5 : Fn(&T::AccountId) -> T::Balance +{ + do_get_storage: F1, + do_get_code: F3, + do_get_balance: F5, +} +*/ +struct DirectExt; +impl Externalities for DirectExt { + fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option> { + >::get(&(account.clone(), location.to_vec())) + } + fn get_code(&self, account: &T::AccountId) -> Vec { + >::get(account) + } + fn get_balance(&self, account: &T::AccountId) -> T::Balance { + >::get(account) + } +} +/* +impl Externalities for Ext where + F1 : Fn(&T::AccountId, &[u8]) -> Option>, + F3 : Fn(&T::AccountId) -> Vec, + F5 : Fn(&T::AccountId) -> T::Balance +{ + fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option> { + (self.do_get_storage)(account, location) + } + fn get_code(&self, account: &T::AccountId) -> Vec { + (self.do_get_code)(account) + } + fn get_balance(&self, account: &T::AccountId) -> T::Balance { + (self.do_get_balance)(account) + } +} +*/ +impl Module { + fn commit_state(s: State) { +/* for (address, changed) in s.into_iter() { + if let Some(balance) = changed.balance { + >::insert(address, balance); + } + if let Some(code) = changed.code { + >::insert(&address, &code); + } + for (k, v) in changed.storage.into_iter() { + if let Some(value) = v { + >::insert(&(address, k), &value); + } else { + >::remove(&(address, k)); + } + } + }*/ + } + + fn merge_state(commit_state: State, local: &mut State) { +/* for (address, changed) in commit_state.into_iter() { + match local.entry(address) { + Entry::Occupied(e) => { + let mut value = e.into_mut(); + if changed.balance.is_some() { + value.balance = changed.balance; + } + if changed.code.is_some() { + value.code = changed.code; + } + value.storage.extend(changed.storage.into_iter()); + } + Entry::Vacant(e) => { + e.insert(changed); + } + } + }*/ + } + + fn effect_create>( + transactor: &T::AccountId, + code: &[u8], + value: T::Balance, + ext: E + ) -> Option> { + unimplemented!(); +/* let from_balance = ext.get_balance(transactor); + // TODO: a fee. + assert!(from_balance >= value); + + let mut dest_pre = blake2_256(code).to_vec(); // TODO: blake2_256 replaced by Hashing::... + dest_pre.extend(&transactor[..]); + let dest = blake2_256(&dest_pre); + + // early-out if degenerate. + if &dest == transactor { + return None; + } + + let mut local = BTreeMap::new(); + + // two inserts are safe + assert!(&dest != transactor); + local.insert(dest, ChangeEntry { balance: Some(value), code: Some(code.to_vec()), storage: Default::default() }); + local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); + + Some(local)*/ + } + + fn effect_transfer>( + transactor: &T::AccountId, + dest: &T::AccountId, + value: T::Balance, + ext: E + ) -> Option> { + unimplemented!(); +/* let from_balance = ext.get_balance(transactor); + assert!(from_balance >= value); + + let to_balance = ext.get_balance(dest); + assert!(>::get(transactor) <= >::get(dest)); + assert!(to_balance + value > to_balance); // no overflow + + // TODO: a fee, based upon gaslimit/gasprice. + // TODO: consider storing upper-bound for contract's gas limit in fixed-length runtime + // code in contract itself and use that. + + let local: RefCell> = RefCell::new(BTreeMap::new()); + + if transactor != dest { + let mut local = local.borrow_mut(); + local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); + local.insert(dest.clone(), ChangeEntry::balance_changed(to_balance + value)); + } + + let should_commit = { + // Our local ext: Should be used for any transfers and creates that happen internally. + let ext = || Ext { + do_get_storage: |account: &T::AccountId, location: &[u8]| + local.borrow().get(account) + .and_then(|a| a.storage.get(location)) + .cloned() + .unwrap_or_else(|| ext.get_storage(account, location)), + do_get_code: |account: &T::AccountId| + local.borrow().get(account) + .and_then(|a| a.code.clone()) + .unwrap_or_else(|| ext.get_code(account)), + do_get_balance: |account: &T::AccountId| + local.borrow().get(account) + .and_then(|a| a.balance) + .unwrap_or_else(|| ext.get_balance(account)), + }; + let mut transfer = |inner_dest: &T::AccountId, value: T::Balance| { + if let Some(commit_state) = Self::effect_transfer(dest, inner_dest, value, ext()) { + Self::merge_state(commit_state, &mut *local.borrow_mut()); + } + }; + let mut create = |code: &[u8], value: T::Balance| { + if let Some(commit_state) = Self::effect_create(dest, code, value, ext()) { + Self::merge_state(commit_state, &mut *local.borrow_mut()); + } + }; + let mut put_storage = |location: Vec, value: Option>| { + local.borrow_mut() + .entry(dest.clone()) + .or_insert(Default::default()) + .storage.insert(location, value); + }; + + // TODO: logging (logs are just appended into a notable storage-based vector and cleared every + // block). + // TODO: execute code with ext(), put_storage, create and transfer as externalities. + true + }; + + if should_commit { + Some(local.into_inner()) + } else { + None + }*/ + } +} +/* +#[cfg(any(feature = "std", test))] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use codec::{Joiner, KeyedVec}; + use keyring::Keyring::*; + use runtime::session; + use super::public::{Call, Dispatch}; + use super::privileged::{Dispatch as PrivDispatch, Call as PrivCall}; + + pub fn externalities(session_length: u64, sessions_per_era: u64, current_era: u64) -> TestExternalities { + let extras: TestExternalities = map![ + twox_128(&Intention::len_key()).to_vec() => vec![].and(&3u32), + twox_128(&Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), + twox_128(&Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), + twox_128(&Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&sessions_per_era), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&3u64), + twox_128(BondingDuration::key()).to_vec() => vec![].and(&0u64), + twox_128(TransactionFee::key()).to_vec() => vec![].and(&1u64), + twox_128(CurrentEra::key()).to_vec() => vec![].and(¤t_era), + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + ]; + session::testing::externalities(session_length).into_iter().chain(extras.into_iter()).collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use super::internal::*; + use super::privileged::*; + + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::{KeyedVec, Joiner}; + use keyring::Keyring::*; + use demo_primitives::AccountId; + use runtime::{staking, session}; + use runtime_support::PrivPass; + use runtime::staking::public::{Call, Dispatch}; + use runtime::staking::privileged::{Call as PCall, Dispatch as PDispatch}; + + #[test] + fn staking_should_work() { + let mut t: TestExternalities = map![ + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), + twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), + twox_128(BondingDuration::key()).to_vec() => vec![].and(&3u64), + twox_128(TotalStake::key()).to_vec() => vec![].and(&100u64), + twox_128(TransactionFee::key()).to_vec() => vec![].and(&0u64), + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), + twox_128(&FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), + twox_128(&FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), + twox_128(&FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64) + ]; + + with_externalities(&mut t, || { + assert_eq!(era_length(), 2u64); + assert_eq!(>::get(), 2); + assert_eq!(>::get(), 3); + assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); + + // Block 1: Add three validators. No obvious change. + system::testing::set_block_number(1); + public::Call::stake().dispatch(public_pass_from_payment(&Alice)); + public_pass_from_payment(&Bob).stake(); + public_pass_from_payment(&Dave).stake(); + check_new_era(); + assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); + + // Block 2: New validator set now. + system::testing::set_block_number(2); + check_new_era(); + assert_eq!(session::validators(), vec![Dave.to_raw_public(), Bob.into()]); + + // Block 3: Unstake highest, introduce another staker. No change yet. + system::testing::set_block_number(3); + public_pass_from_payment(&Charlie).stake(); + public_pass_from_payment(&Dave).unstake(); + check_new_era(); + + // Block 4: New era - validators change. + system::testing::set_block_number(4); + check_new_era(); + assert_eq!(session::validators(), vec![Charlie.to_raw_public(), Bob.into()]); + + // Block 5: Transfer stake from highest to lowest. No change yet. + system::testing::set_block_number(5); + public_pass_from_payment(&Dave).transfer(Alice.to_raw_public(), 40); + check_new_era(); + + // Block 6: Lowest now validator. + system::testing::set_block_number(6); + check_new_era(); + assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); + + // Block 7: Unstake three. No change yet. + system::testing::set_block_number(7); + public_pass_from_payment(&Charlie).unstake(); + check_new_era(); + assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); + + // Block 8: Back to one and two. + system::testing::set_block_number(8); + check_new_era(); + assert_eq!(session::validators(), vec![Alice.to_raw_public(), Bob.into()]); + }); + } + + #[test] + fn staking_eras_work() { + let mut t: TestExternalities = map![ + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), + twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64) + ]; + with_externalities(&mut t, || { + assert_eq!(era_length(), 2u64); + assert_eq!(>::get(), 2u64); + assert_eq!(>::get(), 0u64); + assert_eq!(>::get(), 0u64); + + // Block 1: No change. + system::testing::set_block_number(1); + check_new_era(); + assert_eq!(>::get(), 2u64); + assert_eq!(>::get(), 0u64); + assert_eq!(>::get(), 0u64); + + // Block 2: Simple era change. + system::testing::set_block_number(2); + check_new_era(); + assert_eq!(>::get(), 2u64); + assert_eq!(>::get(), 0u64); + assert_eq!(>::get(), 1u64); + + // Block 3: Schedule an era length change; no visible changes. + system::testing::set_block_number(3); + PrivPass::test().set_sessions_per_era(3); + check_new_era(); + assert_eq!(>::get(), 2u64); + assert_eq!(>::get(), 0u64); + assert_eq!(>::get(), 1u64); + + // Block 4: Era change kicks in. + system::testing::set_block_number(4); + check_new_era(); + assert_eq!(>::get(), 3u64); + assert_eq!(>::get(), 4u64); + assert_eq!(>::get(), 2u64); + + // Block 5: No change. + system::testing::set_block_number(5); + check_new_era(); + assert_eq!(>::get(), 3u64); + assert_eq!(>::get(), 4u64); + assert_eq!(>::get(), 2u64); + + // Block 6: No change. + system::testing::set_block_number(6); + check_new_era(); + assert_eq!(>::get(), 3u64); + assert_eq!(>::get(), 4u64); + assert_eq!(>::get(), 2u64); + + // Block 7: Era increment. + system::testing::set_block_number(7); + check_new_era(); + assert_eq!(>::get(), 3u64); + assert_eq!(>::get(), 4u64); + assert_eq!(>::get(), 3u64); + }); + } + + #[test] + fn staking_balance_works() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 42); + assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 0); + assert_eq!(balance(&Alice), 42); + assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 0); + assert_eq!(balance(&Bob), 0); + }); + } + + #[test] + fn staking_balance_transfer_works() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 112); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); + assert_eq!(balance(&Alice), 42); + assert_eq!(balance(&Bob), 69); + }); + } + + #[test] + #[should_panic] + fn staking_balance_transfer_when_bonded_panics() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + public_pass_from_payment(&Alice).stake(); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); + }); + } + + #[test] + fn reserving_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + + assert_eq!(balance(&Alice), 111); + assert_eq!(>::get(*Alice), 111); + assert_eq!(>::get(*Alice), 0); + + reserve_balance(&Alice, 69); + + assert_eq!(balance(&Alice), 111); + assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 69); + }); + } + + #[test] + #[should_panic] + fn staking_balance_transfer_when_reserved_panics() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 69); + public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); + }); + } + + #[test] + fn deducting_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + assert!(deduct_unbonded(&Alice, 69)); + assert_eq!(>::get(*Alice), 42); + }); + } + + #[test] + fn deducting_balance_should_fail_when_bonded() { + let mut t: TestExternalities = map![ + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&111u64), + twox_128(&BondageOf::key_for(*Alice)).to_vec() => vec![].and(&2u64) + ]; + with_externalities(&mut t, || { + system::testing::set_block_number(1); + assert_eq!(unlock_block(&Alice), LockStatus::LockedUntil(2)); + assert!(!deduct_unbonded(&Alice, 69)); + }); + } + + #[test] + fn refunding_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 42); + refund(&Alice, 69); + assert_eq!(>::get(*Alice), 111); + }); + } + + #[test] + fn slashing_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 69); + assert!(slash(&Alice, 69)); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 42); + }); + } + + #[test] + fn slashing_incomplete_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 42); + reserve_balance(&Alice, 21); + assert!(!slash(&Alice, 69)); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 0); + }); + } + + #[test] + fn unreserving_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 111); + unreserve_balance(&Alice, 42); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 42); + }); + } + + #[test] + fn slashing_reserved_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 111); + assert!(slash_reserved(&Alice, 42)); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); + }); + } + + #[test] + fn slashing_incomplete_reserved_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 42); + assert!(!slash_reserved(&Alice, 69)); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); + }); + } + + #[test] + fn transferring_reserved_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 111); + assert!(transfer_reserved_balance(&Alice, &Bob, 42)); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 42); + }); + } + + #[test] + fn transferring_incomplete_reserved_balance_should_work() { + with_externalities(&mut testing::externalities(1, 3, 1), || { + >::insert(*Alice, 111); + reserve_balance(&Alice, 42); + assert!(!transfer_reserved_balance(&Alice, &Bob, 69)); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 42); + }); + } +} +*/ diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 7c816b5bc0d56..79d2e8cfb7686 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -30,7 +30,7 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; -use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Hashing, Headery}; +use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Hashing, Headery}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -39,8 +39,8 @@ use safe_mix::TripletMix; use runtime_io::{twox_128, TestExternalities}; pub trait Trait { - type Index: Parameter + Default + SimpleArithmetic; - type BlockNumber: Parameter + SimpleArithmetic; + type Index: Parameter + Default + SimpleArithmetic + Copy; + type BlockNumber: Parameter + SimpleArithmetic + Default + Bounded + Copy; type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; type Digest: Parameter + Default + Digesty; From 3c174a536ae9dfa66f1a6c7683a3f9e931a02a07 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 19:17:51 +0900 Subject: [PATCH 27/76] Bit more of staking traitified. --- substrate/runtime/staking/src/lib.rs | 34 ++++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 22da35c92a052..47fdaeff60ff1 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -87,7 +87,7 @@ decl_storage! { // The current era index. pub CurrentEra get(current_era): b"sta:era" => required T::BlockNumber; // All the accounts with a desire to stake. - pub Intention: b"sta:wil:" => Vec; + pub Intentions: b"sta:wil:" => default Vec; // The next value of sessions per era. pub NextSessionsPerEra get(next_sessions_per_era): b"sta:nse" => T::BlockNumber; // The block number at which the era length last changed. @@ -161,52 +161,52 @@ impl Module { /// TODO: probably want to state gas-limit and gas-price. fn transfer(aux: &T::PublicAux, dest: T::AccountId, value: T::Balance) { // commit anything that made it this far to storage -/* if let Some(commit) = Self::effect_transfer(aux.into(), &dest, value, DirectExt) { + if let Some(commit) = Self::effect_transfer(RefInto::into(aux), &dest, value, DirectExt) { Self::commit_state(commit); } -*/ } + } /// Declare the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. fn stake(aux: &T::PublicAux) { -/* let mut intentions = Intention::items(); + let mut intentions = >::get(); // can't be in the list twice. - assert!(intentions.iter().find(|&t| t == aux.into()).is_none(), "Cannot stake if already staked."); - intentions.push(aux.into().clone()); - Intention::set_items(&intentions); - >::insert(aux.into(), u64::max_value()); -*/ } + assert!(intentions.iter().find(|&t| t == RefInto::into(aux)).is_none(), "Cannot stake if already staked."); + intentions.push(RefInto::into(aux).clone()); + >::put(intentions); + >::insert(RefInto::into(aux), T::BlockNumber::max_value()); + } /// Retract the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. fn unstake(aux: &T::PublicAux) { -/* let mut intentions = Intention::items(); - if let Some(position) = intentions.iter().position(|&t| t == *self) { + let mut intentions = >::get(); + if let Some(position) = intentions.iter().position(|t| t == RefInto::into(aux)) { intentions.swap_remove(position); } else { panic!("Cannot unstake if not already staked."); } - Intention::set_items(&intentions); - >::insert(aux.into(), >::get() + >::get()); -*/ } + >::put(intentions); + >::insert(RefInto::into(aux), Self::current_era() + Self::bonding_duration()); + } // PRIV DISPATCH /// Set the number of sessions in an era. fn set_sessions_per_era(new: T::BlockNumber) { -// >::put(&new); + >::put(&new); } /// The length of the bonding duration in eras. fn set_bonding_duration(new: T::BlockNumber) { -// >::put(&new); + >::put(&new); } /// The length of a staking era in sessions. fn set_validator_count(new: u32) { -// >::put(&new); + >::put(&new); } /// Force there to be a new era. This also forces a new session immediately after. From 46a6e7863808eae27bbc5e71a65f189b2c1ce751 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 21:18:08 +0900 Subject: [PATCH 28/76] Additional stuff in staking. Fix up session. --- demo/runtime/src/runtime.rs | 3 ++- substrate/runtime/primitives/src/lib.rs | 9 +++++++++ substrate/runtime/session/src/lib.rs | 9 ++++----- substrate/runtime/staking/src/lib.rs | 20 ++++++++++---------- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index fd8866c3d8e97..573a30b32043c 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -20,7 +20,7 @@ use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root}; use {consensus, timestamp, system, session, demo_primitives, runtime_primitives}; -use runtime_primitives::HasPublicAux; +use runtime_primitives::{Identity, HasPublicAux}; // TODO: move into runtime support/io. pub struct BlakeTwo256; @@ -66,6 +66,7 @@ pub type System = system::Module; impl session::Trait for Concrete { type PublicAux = ::PublicAux; + type Conversion = Identity; } pub type Session = session::Module; diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 6c461d2979569..ac1c7dda49c4b 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -30,6 +30,15 @@ use codec::Slicable; pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Rem, AddAssign, SubAssign, RemAssign}; +pub trait Convert { + fn convert(a: A) -> B; +} + +pub struct Identity; +impl Convert for Identity { + fn convert(a: T) -> T { a } +} + pub trait HasPublicAux { type PublicAux; } diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index dba4b579e9032..2ca709841b75d 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -31,11 +31,12 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, RefInto, Executable}; +use primitives::{Zero, One, RefInto, Executable, Convert}; use runtime_support::{StorageValue, StorageMap}; pub trait Trait: consensus::Trait + system::Trait { type PublicAux: RefInto; + type Conversion: Convert; } decl_module! { @@ -100,12 +101,10 @@ impl Module { /// /// Called by `staking::next_era()` only. `next_session` should be called after this in order to /// update the session keys to the next validator set. - pub fn set_validators<'a>(new: &'a[T::AccountId]) - where T::SessionKey: From<&'a T::AccountId> - { + pub fn set_validators(new: &[T::AccountId]) { >::put(&new.to_vec()); // TODO: optimise. >::set_authorities( - &new.iter().map(Into::into).collect::>() + &new.iter().cloned().map(T::Conversion::convert).collect::>() ); } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 47fdaeff60ff1..5b604d3dd2543 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -211,9 +211,9 @@ impl Module { /// Force there to be a new era. This also forces a new session immediately after. fn force_new_era() { -/* new_era(); - session::internal::rotate_session(); -*/ } + Self::new_era(); + >::rotate_session(); + } // PUBLIC MUTABLES (DANGEROUS) /* @@ -278,20 +278,20 @@ impl Module { >::insert(beneficiary, &(Self::free_balance(beneficiary) + slash)); slash == value } - +*/ /// The era has changed - enact new staking set. /// /// NOTE: This always happens immediately before a session change to ensure that new validators /// get a chance to set their session keys. fn new_era() { // Increment current era. - >::put(&(>::get() + 1)); + >::put(&(>::get() + One::one())); // Enact era length change. if let Some(next_spe) = >::get() { if next_spe != >::get() { >::put(&next_spe); - >::put(&system::block_number()); + >::put(&>::block_number()); } } @@ -299,19 +299,19 @@ impl Module { // combination of validators, then use session::internal::set_validators(). // for now, this just orders would-be stakers by their balances and chooses the top-most // >::get() of them. - let mut intentions = Intention::items() + let mut intentions = >::get() .into_iter() .map(|v| (Self::balance(&v), v)) .collect::>(); - intentions.sort_unstable_by(|&(b1, _), &(b2, _)| b2.cmp(&b1)); - session::internal::set_validators( + intentions.sort_unstable_by(|&(ref b1, _), &(ref b2, _)| b2.cmp(&b1)); + >::set_validators( &intentions.into_iter() .map(|(_, v)| v) .take(>::get() as usize) .collect::>() ); } -*/ + // NON-PUBLIC /// Hook to be called after to transaction processing. From 5caac6a4aefdbb5dfedd4af76ba63a1ed211e8a9 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 21:40:07 +0900 Subject: [PATCH 29/76] Penultimate part of staking module. --- demo/runtime/src/runtime.rs | 10 +- substrate/runtime/staking/src/lib.rs | 176 ++++++++++++++------------- substrate/runtime/system/src/lib.rs | 2 +- 3 files changed, 101 insertions(+), 87 deletions(-) diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 573a30b32043c..04ec7a3667e86 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -18,7 +18,7 @@ use codec::Slicable; use runtime_support::Hashable; -use runtime_io::{enumerated_trie_root, storage_root}; +use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; use {consensus, timestamp, system, session, demo_primitives, runtime_primitives}; use runtime_primitives::{Identity, HasPublicAux}; @@ -36,6 +36,14 @@ impl runtime_primitives::Hashing for BlakeTwo256 { storage_root().into() } } +impl ContractAddressFor for BlakeTwo256 { + fn contract_address_for(code: &[u8], origin: &demo_primitives::AccountId) -> demo_primitives::AccountId { + let mut dest_pre = blake2_256(code).to_vec(); + dest_pre.extend(&origin[..]); + blake2_256(&dest_pre) + } +} + pub struct Concrete; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 5b604d3dd2543..7a4cf938e9ddd 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -29,9 +29,12 @@ extern crate substrate_runtime_session as session; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use rstd::collections::btree_map::BTreeMap; +use rstd::cmp; +use rstd::cell::RefCell; +use rstd::marker::PhantomData; +use rstd::collections::btree_map::{BTreeMap, Entry}; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; +use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, Convert}; use runtime_support::{StorageValue, StorageMap, Parameter}; #[cfg(test)] @@ -50,9 +53,14 @@ pub enum LockStatus { Staked, } +pub trait ContractAddressFor { + fn contract_address_for(code: &[u8], origin: &AccountId) -> AccountId; +} + pub trait Trait: system::Trait + session::Trait { /// The balance of an account. - type Balance: Parameter + SimpleArithmetic + Default; + type Balance: Parameter + SimpleArithmetic + Default + Copy; + type DetermineContractAddress: ContractAddressFor; } decl_module! { @@ -216,13 +224,13 @@ impl Module { } // PUBLIC MUTABLES (DANGEROUS) -/* + /// Deduct from an unbonded balance. true if it happened. pub fn deduct_unbonded(who: &T::AccountId, value: T::Balance) -> bool { - if let LockStatus::Liquid = Self::unlock_block(who) { + if let LockStatus::Liquid = Self::unlock_block(who) { let b = Self::free_balance(who); if b >= value { - >::insert(who, &(b - value)); + >::insert(who, b - value); return true; } } @@ -231,14 +239,14 @@ impl Module { /// Refund some balance. pub fn refund(who: &T::AccountId, value: T::Balance) { - >::insert(who, &(Self::free_balance(who) + value)) + >::insert(who, Self::free_balance(who) + value) } /// Will slash any balance, but prefer free over reserved. pub fn slash(who: &T::AccountId, value: T::Balance) -> bool { let free_balance = Self::free_balance(who); let free_slash = cmp::min(free_balance, value); - >::insert(who, &(free_balance - free_slash)); + >::insert(who, &(free_balance - free_slash)); if free_slash < value { Self::slash_reserved(who, value - free_slash) } else { @@ -250,23 +258,23 @@ impl Module { pub fn reserve_balance(who: &T::AccountId, value: T::Balance) { let b = Self::free_balance(who); assert!(b >= value); - >::insert(who, &(b - value)); - >::insert(who, &(Self::reserved_balance(who) + value)); + >::insert(who, b - value); + >::insert(who, Self::reserved_balance(who) + value); } /// Moves `value` from reserved balance to balance. pub fn unreserve_balance(who: &T::AccountId, value: T::Balance) { let b = Self::reserved_balance(who); let value = cmp::min(b, value); - >::insert(who, &(b - value)); - >::insert(who, &(Self::free_balance(who) + value)); + >::insert(who, b - value); + >::insert(who, Self::free_balance(who) + value); } /// Moves `value` from reserved balance to balance. pub fn slash_reserved(who: &T::AccountId, value: T::Balance) -> bool { let b = Self::reserved_balance(who); let slash = cmp::min(b, value); - >::insert(who, &(b - slash)); + >::insert(who, b - slash); value == slash } @@ -274,11 +282,11 @@ impl Module { pub fn transfer_reserved_balance(slashed: &T::AccountId, beneficiary: &T::AccountId, value: T::Balance) -> bool { let b = Self::reserved_balance(slashed); let slash = cmp::min(b, value); - >::insert(slashed, &(b - slash)); - >::insert(beneficiary, &(Self::free_balance(beneficiary) + slash)); + >::insert(slashed, b - slash); + >::insert(beneficiary, Self::free_balance(beneficiary) + slash); slash == value } -*/ + /// The era has changed - enact new staking set. /// /// NOTE: This always happens immediately before a session change to ensure that new validators @@ -317,10 +325,10 @@ impl Module { /// Hook to be called after to transaction processing. fn check_new_era() { // check block number and call new_era if necessary. -/* if (>::block_number() - >::get()) % Self::era_length() == Zero::zero() { - new_era(); + if (>::block_number() - >::get()) % Self::era_length() == Zero::zero() { + Self::new_era(); } -*/ } + } } impl Executable for Module { @@ -355,7 +363,7 @@ trait Externalities { fn get_code(&self, account: &T::AccountId) -> Vec; fn get_balance(&self, account: &T::AccountId) -> T::Balance; } -/* + struct Ext where F1 : Fn(&T::AccountId, &[u8]) -> Option>, F3 : Fn(&T::AccountId) -> Vec, @@ -364,8 +372,9 @@ struct Ext where do_get_storage: F1, do_get_code: F3, do_get_balance: F5, + _unused: PhantomData, } -*/ + struct DirectExt; impl Externalities for DirectExt { fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option> { @@ -378,8 +387,8 @@ impl Externalities for DirectExt { >::get(account) } } -/* -impl Externalities for Ext where + +impl Externalities for Ext where F1 : Fn(&T::AccountId, &[u8]) -> Option>, F3 : Fn(&T::AccountId) -> Vec, F5 : Fn(&T::AccountId) -> T::Balance @@ -394,30 +403,30 @@ impl Externalities for Ext where (self.do_get_balance)(account) } } -*/ + impl Module { fn commit_state(s: State) { -/* for (address, changed) in s.into_iter() { + for (address, changed) in s.into_iter() { if let Some(balance) = changed.balance { - >::insert(address, balance); + >::insert(&address, balance); } if let Some(code) = changed.code { >::insert(&address, &code); } for (k, v) in changed.storage.into_iter() { if let Some(value) = v { - >::insert(&(address, k), &value); + >::insert((address.clone(), k), &value); } else { - >::remove(&(address, k)); + >::remove((address.clone(), k)); } } - }*/ + } } fn merge_state(commit_state: State, local: &mut State) { -/* for (address, changed) in commit_state.into_iter() { + for (address, changed) in commit_state.into_iter() { match local.entry(address) { - Entry::Occupied(e) => { + Entry::Occupied(e) => { let mut value = e.into_mut(); if changed.balance.is_some() { value.balance = changed.balance; @@ -427,11 +436,11 @@ impl Module { } value.storage.extend(changed.storage.into_iter()); } - Entry::Vacant(e) => { + Entry::Vacant(e) => { e.insert(changed); } } - }*/ + } } fn effect_create>( @@ -440,14 +449,11 @@ impl Module { value: T::Balance, ext: E ) -> Option> { - unimplemented!(); -/* let from_balance = ext.get_balance(transactor); + let from_balance = ext.get_balance(transactor); // TODO: a fee. assert!(from_balance >= value); - let mut dest_pre = blake2_256(code).to_vec(); // TODO: blake2_256 replaced by Hashing::... - dest_pre.extend(&transactor[..]); - let dest = blake2_256(&dest_pre); + let dest = T::DetermineContractAddress::contract_address_for(code, transactor); // early-out if degenerate. if &dest == transactor { @@ -458,10 +464,10 @@ impl Module { // two inserts are safe assert!(&dest != transactor); - local.insert(dest, ChangeEntry { balance: Some(value), code: Some(code.to_vec()), storage: Default::default() }); - local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); + local.insert(dest, ChangeEntry { balance: Some(value), code: Some(code.to_vec()), storage: Default::default() }); + local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); - Some(local)*/ + Some(local) } fn effect_transfer>( @@ -559,7 +565,7 @@ pub mod testing { twox_128(BondingDuration::key()).to_vec() => vec![].and(&0u64), twox_128(TransactionFee::key()).to_vec() => vec![].and(&1u64), twox_128(CurrentEra::key()).to_vec() => vec![].and(¤t_era), - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ]; session::testing::externalities(session_length).into_iter().chain(extras.into_iter()).collect() } @@ -591,10 +597,10 @@ mod tests { twox_128(BondingDuration::key()).to_vec() => vec![].and(&3u64), twox_128(TotalStake::key()).to_vec() => vec![].and(&100u64), twox_128(TransactionFee::key()).to_vec() => vec![].and(&0u64), - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), - twox_128(&FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), - twox_128(&FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), - twox_128(&FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64) + twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![].and(&10u64), + twox_128(&FreeBalance::key_for(*Bob)).to_vec() => vec![].and(&20u64), + twox_128(&FreeBalance::key_for(*Charlie)).to_vec() => vec![].and(&30u64), + twox_128(&FreeBalance::key_for(*Dave)).to_vec() => vec![].and(&40u64) ]; with_externalities(&mut t, || { @@ -724,7 +730,7 @@ mod tests { assert_eq!(>::get(*Alice), 0); assert_eq!(balance(&Alice), 42); assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 0); assert_eq!(balance(&Bob), 0); }); } @@ -732,7 +738,7 @@ mod tests { #[test] fn staking_balance_transfer_works() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 112); + >::insert(*Alice, 112); public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); assert_eq!(balance(&Alice), 42); assert_eq!(balance(&Bob), 69); @@ -743,7 +749,7 @@ mod tests { #[should_panic] fn staking_balance_transfer_when_bonded_panics() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); public_pass_from_payment(&Alice).stake(); public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); }); @@ -752,17 +758,17 @@ mod tests { #[test] fn reserving_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); assert_eq!(balance(&Alice), 111); - assert_eq!(>::get(*Alice), 111); - assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 111); + assert_eq!(>::get(*Alice), 0); reserve_balance(&Alice, 69); assert_eq!(balance(&Alice), 111); - assert_eq!(>::get(*Alice), 42); - assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 69); }); } @@ -770,7 +776,7 @@ mod tests { #[should_panic] fn staking_balance_transfer_when_reserved_panics() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 69); public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); }); @@ -779,16 +785,16 @@ mod tests { #[test] fn deducting_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); assert!(deduct_unbonded(&Alice, 69)); - assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 42); }); } #[test] fn deducting_balance_should_fail_when_bonded() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&111u64), + twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![].and(&111u64), twox_128(&BondageOf::key_for(*Alice)).to_vec() => vec![].and(&2u64) ]; with_externalities(&mut t, || { @@ -801,90 +807,90 @@ mod tests { #[test] fn refunding_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 42); + >::insert(*Alice, 42); refund(&Alice, 69); - assert_eq!(>::get(*Alice), 111); + assert_eq!(>::get(*Alice), 111); }); } #[test] fn slashing_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 69); assert!(slash(&Alice, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 42); }); } #[test] fn slashing_incomplete_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 42); + >::insert(*Alice, 42); reserve_balance(&Alice, 21); assert!(!slash(&Alice, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 0); }); } #[test] fn unreserving_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 111); unreserve_balance(&Alice, 42); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 42); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 42); }); } #[test] fn slashing_reserved_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 111); assert!(slash_reserved(&Alice, 42)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); }); } #[test] fn slashing_incomplete_reserved_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 42); assert!(!slash_reserved(&Alice, 69)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); }); } #[test] fn transferring_reserved_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 111); assert!(transfer_reserved_balance(&Alice, &Bob, 42)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 42); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 42); }); } #[test] fn transferring_incomplete_reserved_balance_should_work() { with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + >::insert(*Alice, 111); reserve_balance(&Alice, 42); assert!(!transfer_reserved_balance(&Alice, &Bob, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 42); + assert_eq!(>::get(*Alice), 0); + assert_eq!(>::get(*Alice), 69); + assert_eq!(>::get(*Bob), 0); + assert_eq!(>::get(*Bob), 42); }); } } diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 79d2e8cfb7686..df7bfccd62ead 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -44,7 +44,7 @@ pub trait Trait { type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; type Digest: Parameter + Default + Digesty; - type AccountId: Parameter; + type AccountId: Parameter + Ord; type Header: Headery; } From e115db4899f74140d4e34926863e9576332bc45d Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 21:44:17 +0900 Subject: [PATCH 30/76] Final part of staking (code) --- substrate/runtime/staking/src/lib.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 7a4cf938e9ddd..2a43965f99cfd 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -343,13 +343,23 @@ impl Executable for Module { // - n | n > >::get(): deactivating: recently representing a validator and not yet // ready for transfer. -#[derive(Default)] pub struct ChangeEntry { balance: Option, code: Option>, storage: BTreeMap, Option>>, } +// Cannot derive(Default) since it erroneously bounds T by Default. +impl Default for ChangeEntry { + fn default() -> Self { + ChangeEntry { + balance: Default::default(), + code: Default::default(), + storage: Default::default(), + } + } +} + impl ChangeEntry { pub fn balance_changed(b: T::Balance) -> Self { ChangeEntry { balance: Some(b), code: None, storage: Default::default() } @@ -476,12 +486,11 @@ impl Module { value: T::Balance, ext: E ) -> Option> { - unimplemented!(); -/* let from_balance = ext.get_balance(transactor); + let from_balance = ext.get_balance(transactor); assert!(from_balance >= value); let to_balance = ext.get_balance(dest); - assert!(>::get(transactor) <= >::get(dest)); + assert!(>::get(transactor) <= >::get(dest)); assert!(to_balance + value > to_balance); // no overflow // TODO: a fee, based upon gaslimit/gasprice. @@ -492,8 +501,8 @@ impl Module { if transactor != dest { let mut local = local.borrow_mut(); - local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); - local.insert(dest.clone(), ChangeEntry::balance_changed(to_balance + value)); + local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); + local.insert(dest.clone(), ChangeEntry::balance_changed(to_balance + value)); } let should_commit = { @@ -512,6 +521,7 @@ impl Module { local.borrow().get(account) .and_then(|a| a.balance) .unwrap_or_else(|| ext.get_balance(account)), + _unused: Default::default(), }; let mut transfer = |inner_dest: &T::AccountId, value: T::Balance| { if let Some(commit_state) = Self::effect_transfer(dest, inner_dest, value, ext()) { @@ -540,7 +550,7 @@ impl Module { Some(local.into_inner()) } else { None - }*/ + } } } /* @@ -795,7 +805,7 @@ mod tests { fn deducting_balance_should_fail_when_bonded() { let mut t: TestExternalities = map![ twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![].and(&111u64), - twox_128(&BondageOf::key_for(*Alice)).to_vec() => vec![].and(&2u64) + twox_128(&Bondage::key_for(*Alice)).to_vec() => vec![].and(&2u64) ]; with_externalities(&mut t, || { system::testing::set_block_number(1); From 237e8252c822355cc9c111aa2197cbf69af44a01 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 21:50:53 +0900 Subject: [PATCH 31/76] Update demo runtime to include staking. --- Cargo.lock | 1 + demo/runtime/Cargo.toml | 2 ++ demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime.rs | 4 ++-- substrate/runtime/staking/src/lib.rs | 10 ++++++---- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 559e79a29eefb..e63d2086ad6b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -267,6 +267,7 @@ dependencies = [ "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index 1532a62c48073..a1a5026a12ca0 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -20,6 +20,7 @@ substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-runtime-session = { path = "../../substrate/runtime/session" } +substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } @@ -37,6 +38,7 @@ std = [ "substrate-runtime-executive/std", "substrate-runtime-primitives/std", "substrate-runtime-session/std", + "substrate-runtime-staking/std", "substrate-runtime-system/std", "substrate-runtime-timestamp/std", "demo-primitives/std", diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 28dc95a9982cd..40e514afd9df4 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -27,6 +27,7 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_executive as executive; extern crate substrate_runtime_session as session; +extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 04ec7a3667e86..536c74c7dcfff 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -19,7 +19,7 @@ use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; -use {consensus, timestamp, system, session, demo_primitives, runtime_primitives}; +use {consensus, timestamp, system, session, staking, demo_primitives, runtime_primitives}; use runtime_primitives::{Identity, HasPublicAux}; // TODO: move into runtime support/io. @@ -36,7 +36,7 @@ impl runtime_primitives::Hashing for BlakeTwo256 { storage_root().into() } } -impl ContractAddressFor for BlakeTwo256 { +impl staking::ContractAddressFor for BlakeTwo256 { fn contract_address_for(code: &[u8], origin: &demo_primitives::AccountId) -> demo_primitives::AccountId { let mut dest_pre = blake2_256(code).to_vec(); dest_pre.extend(&origin[..]); diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 2a43965f99cfd..8f1fa480b6650 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -34,7 +34,7 @@ use rstd::cell::RefCell; use rstd::marker::PhantomData; use rstd::collections::btree_map::{BTreeMap, Entry}; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, Convert}; +use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; use runtime_support::{StorageValue, StorageMap, Parameter}; #[cfg(test)] @@ -366,6 +366,8 @@ impl ChangeEntry { } } +// Compiler bug: https://github.com/rust-lang/rust/issues/40640. Will cause a warning and there's +// not much we can do about it. type State = BTreeMap>; trait Externalities { @@ -523,17 +525,17 @@ impl Module { .unwrap_or_else(|| ext.get_balance(account)), _unused: Default::default(), }; - let mut transfer = |inner_dest: &T::AccountId, value: T::Balance| { + let mut _transfer = |inner_dest: &T::AccountId, value: T::Balance| { if let Some(commit_state) = Self::effect_transfer(dest, inner_dest, value, ext()) { Self::merge_state(commit_state, &mut *local.borrow_mut()); } }; - let mut create = |code: &[u8], value: T::Balance| { + let mut _create = |code: &[u8], value: T::Balance| { if let Some(commit_state) = Self::effect_create(dest, code, value, ext()) { Self::merge_state(commit_state, &mut *local.borrow_mut()); } }; - let mut put_storage = |location: Vec, value: Option>| { + let mut _put_storage = |location: Vec, value: Option>| { local.borrow_mut() .entry(dest.clone()) .or_insert(Default::default()) From 1c24cd61038e07e31a2e4bd8e9da772bb7b1199f Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 21:54:12 +0900 Subject: [PATCH 32/76] Final tweaks for staking integration. --- demo/runtime/src/runtime.rs | 15 +++++++++++---- substrate/runtime/session/src/lib.rs | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 536c74c7dcfff..4057869d59147 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -24,6 +24,7 @@ use runtime_primitives::{Identity, HasPublicAux}; // TODO: move into runtime support/io. pub struct BlakeTwo256; + impl runtime_primitives::Hashing for BlakeTwo256 { type Output = demo_primitives::Hash; fn hash_of(s: &S) -> Self::Output { @@ -36,6 +37,7 @@ impl runtime_primitives::Hashing for BlakeTwo256 { storage_root().into() } } + impl staking::ContractAddressFor for BlakeTwo256 { fn contract_address_for(code: &[u8], origin: &demo_primitives::AccountId) -> demo_primitives::AccountId { let mut dest_pre = blake2_256(code).to_vec(); @@ -44,7 +46,6 @@ impl staking::ContractAddressFor for BlakeTwo256 { } } - pub struct Concrete; impl HasPublicAux for Concrete { @@ -74,14 +75,20 @@ pub type System = system::Module; impl session::Trait for Concrete { type PublicAux = ::PublicAux; - type Conversion = Identity; + type ConvertAccountIdToSessionKey = Identity; } pub type Session = session::Module; +impl staking::Trait for Concrete { + type Balance = u64; + type DetermineContractAddress = BlakeTwo256; +} +pub type Staking = staking::Module; + impl_outer_dispatch! { pub enum Call where aux: ::PublicAux { Session = 1, -// Staking = 2, + Staking = 2, Timestamp = 3, // Democracy = 5, // Council = 6, @@ -91,7 +98,7 @@ impl_outer_dispatch! { pub enum PrivCall { Consensus = 0, Session = 1, -// Staking = 2, + Staking = 2, // Democracy = 5, // Council = 6, // CouncilVote = 7, diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 2ca709841b75d..58ccc8a6acd2e 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -36,7 +36,7 @@ use runtime_support::{StorageValue, StorageMap}; pub trait Trait: consensus::Trait + system::Trait { type PublicAux: RefInto; - type Conversion: Convert; + type ConvertAccountIdToSessionKey: Convert; } decl_module! { @@ -104,7 +104,7 @@ impl Module { pub fn set_validators(new: &[T::AccountId]) { >::put(&new.to_vec()); // TODO: optimise. >::set_authorities( - &new.iter().cloned().map(T::Conversion::convert).collect::>() + &new.iter().cloned().map(T::ConvertAccountIdToSessionKey::convert).collect::>() ); } From da1268cb640711903d3181535806d0491cfcc165 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 22:01:16 +0900 Subject: [PATCH 33/76] Remove old runtime files. --- demo/runtime/src/runtime-old/mod.rs | 30 - demo/runtime/src/runtime-old/session.rs | 243 ------- demo/runtime/src/runtime-old/staking.rs | 863 ------------------------ demo/runtime/src/runtime-old/system.rs | 338 ---------- 4 files changed, 1474 deletions(-) delete mode 100644 demo/runtime/src/runtime-old/mod.rs delete mode 100644 demo/runtime/src/runtime-old/session.rs delete mode 100644 demo/runtime/src/runtime-old/staking.rs delete mode 100644 demo/runtime/src/runtime-old/system.rs diff --git a/demo/runtime/src/runtime-old/mod.rs b/demo/runtime/src/runtime-old/mod.rs deleted file mode 100644 index 9f7484e5c9ae6..0000000000000 --- a/demo/runtime/src/runtime-old/mod.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! The Substrate Demo runtime. - -#[allow(unused)] -pub mod system; -#[allow(unused)] -pub mod staking; -#[allow(unused)] -pub mod session; -#[allow(unused)] -pub mod democracy; -#[allow(unused)] -pub mod council; -#[allow(unused)] -pub mod council_vote; diff --git a/demo/runtime/src/runtime-old/session.rs b/demo/runtime/src/runtime-old/session.rs deleted file mode 100644 index 80ed2db066744..0000000000000 --- a/demo/runtime/src/runtime-old/session.rs +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Session manager: is told the validators and allows them to manage their session keys for the -//! consensus module. - -storage_items!{ - // The current set of validators. - pub Validators get(validators): b"ses:val" => required Vec; - // Current length of the session. - pub SessionLength get(length): b"ses:len" => required BlockNumber; - // Current index of the session. - pub CurrentIndex get(current_index): b"ses:ind" => required BlockNumber; - - // Block at which the session length last changed. - LastLengthChange: b"ses:llc" => default BlockNumber; - // The next key for a given validator. - NextKeyFor: b"ses:nxt:" => map [ AccountId => SessionKey ]; - // The next session length. - NextSessionLength: b"ses:nln" => BlockNumber; -} - -/// The number of validators currently. -pub fn validator_count() -> u32 { - Validators::get().len() as u32 // TODO: can probably optimised -} - - -impl<'a> public::Dispatch for PublicPass<'a> { - /// Sets the session key of `_validator` to `_key`. This doesn't take effect until the next - /// session. - fn set_key(self, key: SessionKey) { - // set new value for next session - NextKeyFor::insert(*self, key) - } -} - - -impl privileged::Dispatch for PrivPass { - /// Set a new era length. Won't kick in until the next era change (at current length). - fn set_length(self, new: BlockNumber) { - NextSessionLength::put(new); - } - - /// Forces a new session. - fn force_new_session(self) { - internal::rotate_session(); - } -} - -// INTERNAL API (available to other runtime modules) - -pub mod internal { - use super::*; - - /// Set the current set of validators. - /// - /// Called by `staking::next_era()` only. `next_session` should be called after this in order to - /// update the session keys to the next validator set. - pub fn set_validators(new: &[AccountId]) { - Validators::put(&new.to_vec()); // TODO: optimise. - consensus::internal::set_authorities(new); - } - - /// Hook to be called after transaction processing. - pub fn check_rotate_session() { - // do this last, after the staking system has had chance to switch out the authorities for the - // new set. - // check block number and call next_session if necessary. - if (system::block_number() - LastLengthChange::get()) % length() == 0 { - rotate_session(); - } - } - - /// Move onto next session: register the new authority set. - pub fn rotate_session() { - // Increment current session index. - CurrentIndex::put(CurrentIndex::get() + 1); - - // Enact era length change. - if let Some(next_len) = NextSessionLength::take() { - SessionLength::put(next_len); - LastLengthChange::put(system::block_number()); - } - - // Update any changes in session keys. - validators().iter().enumerate().for_each(|(i, v)| { - if let Some(n) = NextKeyFor::take(v) { - consensus::internal::set_authority(i as u32, &n); - } - }); - } -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::{Joiner, KeyedVec}; - use keyring::Keyring::*; - use runtime::system; - - pub fn externalities(session_length: u64) -> TestExternalities { - let three = [3u8; 32]; - - let extras: TestExternalities = map![ - twox_128(SessionLength::key()).to_vec() => vec![].and(&session_length), - twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), - twox_128(Validators::key()).to_vec() => vec![].and(&vec![One.into(), Two.into(), three]) - ]; - system::testing::externalities().into_iter().chain(extras.into_iter()).collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::public::*; - use super::privileged::Dispatch as PrivDispatch; - use super::internal::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use demo_primitives::AccountId; - use runtime::session; - use consensus; - - fn simple_setup() -> TestExternalities { - map![ - twox_128(SessionLength::key()).to_vec() => vec![].and(&2u64), - twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), - // the validators (10, 20, ...) - twox_128(Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), - // initial session keys (11, 21, ...) - b":auth:len".to_vec() => vec![].and(&2u32), - 0u32.to_keyed_vec(b":auth:") => vec![11; 32], - 1u32.to_keyed_vec(b":auth:") => vec![21; 32] - ] - } - - #[test] - fn simple_setup_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - assert_eq!(length(), 2u64); - assert_eq!(validators(), vec![[10u8; 32], [20u8; 32]]); - }); - } - - #[test] - fn session_length_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - // Block 1: Change to length 3; no visible change. - system::testing::set_block_number(1); - PrivPass::test().set_length(3); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 0); - - // Block 2: Length now changed to 3. Index incremented. - system::testing::set_block_number(2); - PrivPass::test().set_length(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 3: Length now changed to 3. Index incremented. - system::testing::set_block_number(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 4: Change to length 2; no visible change. - system::testing::set_block_number(4); - PrivPass::test().set_length(2); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 5: Length now changed to 2. Index incremented. - system::testing::set_block_number(5); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); - - // Block 6: No change. - system::testing::set_block_number(6); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); - - // Block 7: Next index. - system::testing::set_block_number(7); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 3); - }); - } - - #[test] - fn session_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - // Block 1: No change - system::testing::set_block_number(1); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 2: Session rollover, but no change. - system::testing::set_block_number(2); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 3: Set new key for validator 2; no visible change. - system::testing::set_block_number(3); - PublicPass::test(&[20; 32]).set_key([22; 32]); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 4: Session rollover, authority 2 changes. - system::testing::set_block_number(4); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]); - }); - } -} diff --git a/demo/runtime/src/runtime-old/staking.rs b/demo/runtime/src/runtime-old/staking.rs deleted file mode 100644 index d1cdcd937fb29..0000000000000 --- a/demo/runtime/src/runtime-old/staking.rs +++ /dev/null @@ -1,863 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Staking manager: Handles balances and periodically determines the best set of validators. - -use rstd::prelude::*; -use rstd::{ops, cmp}; -use rstd::cell::RefCell; -use rstd::collections::btree_map::{BTreeMap, Entry}; -use runtime_io::{print, blake2_256}; -use codec::{Slicable, Input, KeyedVec}; -use runtime_support::{storage, StorageValue, StorageList, StorageMap, PublicPass, PrivPass}; -use demo_primitives::{BlockNumber, AccountId}; -use runtime::{system, session, democracy}; - -/// The balance of an account. -pub type Balance = u64; - -/// The amount of bonding period left in an account. Measured in eras. -pub type Bondage = u64; - -storage_items! { - // The length of the bonding duration in eras. - pub BondingDuration get(bonding_duration): b"sta:loc" => required BlockNumber; - // The length of a staking era in sessions. - pub ValidatorCount get(validator_count): b"sta:vac" => required u32; - // The length of a staking era in sessions. - pub SessionsPerEra get(sessions_per_era): b"sta:spe" => required BlockNumber; - // The total amount of stake on the system. - pub TotalStake get(total_stake): b"sta:tot" => required Balance; - // The fee to be paid for making a transaction. - pub TransactionFee get(transaction_fee): b"sta:fee" => required Balance; - - // The current era index. - pub CurrentEra get(current_era): b"sta:era" => required BlockNumber; - // All the accounts with a desire to stake. - pub Intention: b"sta:wil:" => list [ AccountId ]; - // The next value of sessions per era. - pub NextSessionsPerEra get(next_sessions_per_era): b"sta:nse" => BlockNumber; - // The block number at which the era length last changed. - pub LastEraLengthChange get(last_era_length_change): b"sta:lec" => default BlockNumber; - - // The balance of a given account. - pub FreeBalanceOf get(free_balance_of): b"sta:bal:" => default map [ AccountId => Balance ]; - - // The amount of the balance of a given account that is exterally reserved; this can still get - // slashed, but gets slashed last of all. - pub ReservedBalanceOf get(reserved_balance_of): b"sta:lbo:" => default map [ AccountId => Balance ]; - - // The block at which the `who`'s funds become entirely liquid. - pub BondageOf get(bondage_of): b"sta:bon:" => default map [ AccountId => Bondage ]; - - // The code associated with an account. - pub CodeOf: b"sta:cod:" => default map [ AccountId => Vec ]; // TODO Vec values should be optimised to not do a length prefix. - - // The storage items associated with an account/key. - pub StorageOf: b"sta:sto:" => map [ (AccountId, Vec) => Vec ]; // TODO: keys should also be able to take AsRef to ensure Vecs can be passed as &[u8] -} - -/// The length of a staking era in blocks. -pub fn era_length() -> BlockNumber { - SessionsPerEra::get() * session::length() -} - -/// The combined balance of `who`. -pub fn balance(who: &AccountId) -> Balance { - FreeBalanceOf::get(who) + ReservedBalanceOf::get(who) -} - -/// Some result as `slash(who, value)` (but without the side-effects) asuming there are no -/// balance changes in the meantime. -pub fn can_slash(who: &AccountId, value: Balance) -> bool { - balance(who) >= value -} - -#[derive(PartialEq, Copy, Clone)] -#[cfg_attr(test, derive(Debug))] -pub enum LockStatus { - Liquid, - LockedUntil(BlockNumber), - Staked, -} - -/// The block at which the `who`'s funds become entirely liquid. -pub fn unlock_block(who: &AccountId) -> LockStatus { - match BondageOf::get(who) { - i if i == Bondage::max_value() => LockStatus::Staked, - i if i <= system::block_number() => LockStatus::Liquid, - i => LockStatus::LockedUntil(i), - } -} - -/// Create a smart-contract account. -pub fn create(pass: PublicPass, code: &[u8], value: Balance) { - // commit anything that made it this far to storage - if let Some(commit) = private::effect_create(&pass, code, value, private::DirectExt) { - private::commit_state(commit); - } -} - -/// New PublicPass instance through making a payment. -pub fn public_pass_from_payment(transactor: &AccountId) -> PublicPass { - let b = FreeBalanceOf::get(transactor); - let transaction_fee = TransactionFee::get(); - assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); - FreeBalanceOf::insert(transactor, b - transaction_fee); - PublicPass::unchecked_new(transactor) -} - -impl_dispatch! { - pub mod public; - fn transfer(self, dest: AccountId, value: Balance) = 0; - fn stake(self) = 1; - fn unstake(self) = 2; -} - -impl<'a> public::Dispatch for PublicPass<'a> { - /// Transfer some unlocked staking balance to another staker. - /// TODO: probably want to state gas-limit and gas-price. - fn transfer(self, dest: AccountId, value: Balance) { - // commit anything that made it this far to storage - if let Some(commit) = private::effect_transfer(&self, &dest, value, private::DirectExt) { - private::commit_state(commit); - } - } - - /// Declare the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - fn stake(self) { - let mut intentions = Intention::items(); - // can't be in the list twice. - assert!(intentions.iter().find(|&t| *t == *self).is_none(), "Cannot stake if already staked."); - intentions.push(self.clone()); - Intention::set_items(&intentions); - BondageOf::insert(*self, u64::max_value()); - } - - /// Retract the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - fn unstake(self) { - let mut intentions = Intention::items(); - if let Some(position) = intentions.iter().position(|&t| t == *self) { - intentions.swap_remove(position); - } else { - panic!("Cannot unstake if not already staked."); - } - Intention::set_items(&intentions); - BondageOf::insert(*self, CurrentEra::get() + BondingDuration::get()); - } -} - -impl_dispatch! { - pub mod privileged; - fn set_sessions_per_era(self, new: BlockNumber) = 0; - fn set_bonding_duration(self, new: BlockNumber) = 1; - fn set_validator_count(self, new: u32) = 2; - fn force_new_era(self) = 3; -} - -impl privileged::Dispatch for PrivPass { - /// Set the number of sessions in an era. - fn set_sessions_per_era(self, new: BlockNumber) { - NextSessionsPerEra::put(&new); - } - - /// The length of the bonding duration in eras. - fn set_bonding_duration(self, new: BlockNumber) { - BondingDuration::put(&new); - } - - /// The length of a staking era in sessions. - fn set_validator_count(self, new: u32) { - ValidatorCount::put(&new); - } - - /// Force there to be a new era. This also forces a new session immediately after. - fn force_new_era(self) { - new_era(); - session::internal::rotate_session(); - } -} - -// Each identity's stake may be in one of three bondage states, given by an integer: -// - n | n <= CurrentEra::get(): inactive: free to be transferred. -// - ~0: active: currently representing a validator. -// - n | n > CurrentEra::get(): deactivating: recently representing a validator and not yet -// ready for transfer. - -mod private { - use super::*; - - #[derive(Default)] - pub struct ChangeEntry { - balance: Option, - code: Option>, - storage: BTreeMap, Option>>, - } - - impl ChangeEntry { - pub fn balance_changed(b: Balance) -> Self { - ChangeEntry { balance: Some(b), code: None, storage: Default::default() } - } - } - - type State = BTreeMap; - - pub trait Externalities { - fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option>; - fn get_code(&self, account: &AccountId) -> Vec; - fn get_balance(&self, account: &AccountId) -> Balance; - } - - struct Ext where - F1 : Fn(&AccountId, &[u8]) -> Option>, - F3 : Fn(&AccountId) -> Vec, - F5 : Fn(&AccountId) -> Balance - { - do_get_storage: F1, - do_get_code: F3, - do_get_balance: F5, - } - - pub struct DirectExt; - impl Externalities for DirectExt { - fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option> { - StorageOf::get(&(*account, location.to_vec())) - } - fn get_code(&self, account: &AccountId) -> Vec { - CodeOf::get(account) - } - fn get_balance(&self, account: &AccountId) -> Balance { - FreeBalanceOf::get(account) - } - } - - impl Externalities for Ext where - F1 : Fn(&AccountId, &[u8]) -> Option>, - F3 : Fn(&AccountId) -> Vec, - F5 : Fn(&AccountId) -> Balance - { - fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option> { - (self.do_get_storage)(account, location) - } - fn get_code(&self, account: &AccountId) -> Vec { - (self.do_get_code)(account) - } - fn get_balance(&self, account: &AccountId) -> Balance { - (self.do_get_balance)(account) - } - } - - pub fn commit_state(s: State) { - for (address, changed) in s.into_iter() { - if let Some(balance) = changed.balance { - FreeBalanceOf::insert(address, balance); - } - if let Some(code) = changed.code { - CodeOf::insert(&address, &code); - } - for (k, v) in changed.storage.into_iter() { - if let Some(value) = v { - StorageOf::insert(&(address, k), &value); - } else { - StorageOf::remove(&(address, k)); - } - } - } - } - - fn merge_state(commit_state: State, local: &mut State) { - for (address, changed) in commit_state.into_iter() { - match local.entry(address) { - Entry::Occupied(e) => { - let mut value = e.into_mut(); - if changed.balance.is_some() { - value.balance = changed.balance; - } - if changed.code.is_some() { - value.code = changed.code; - } - value.storage.extend(changed.storage.into_iter()); - } - Entry::Vacant(e) => { - e.insert(changed); - } - } - } - } - - pub fn effect_create( - transactor: &AccountId, - code: &[u8], - value: Balance, - ext: E - ) -> Option { - let from_balance = ext.get_balance(transactor); - // TODO: a fee. - assert!(from_balance >= value); - - let mut dest_pre = blake2_256(code).to_vec(); - dest_pre.extend(&transactor[..]); - let dest = blake2_256(&dest_pre); - - // early-out if degenerate. - if &dest == transactor { - return None; - } - - let mut local = BTreeMap::new(); - - // two inserts are safe - assert!(&dest != transactor); - local.insert(dest, ChangeEntry { balance: Some(value), code: Some(code.to_vec()), storage: Default::default() }); - local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); - - Some(local) - } - - pub fn effect_transfer( - transactor: &AccountId, - dest: &AccountId, - value: Balance, - ext: E - ) -> Option { - let from_balance = ext.get_balance(transactor); - assert!(from_balance >= value); - - let to_balance = ext.get_balance(dest); - assert!(BondageOf::get(transactor) <= BondageOf::get(dest)); - assert!(to_balance + value > to_balance); // no overflow - - // TODO: a fee, based upon gaslimit/gasprice. - // TODO: consider storing upper-bound for contract's gas limit in fixed-length runtime - // code in contract itself and use that. - - let local: RefCell = RefCell::new(BTreeMap::new()); - - if transactor != dest { - let mut local = local.borrow_mut(); - local.insert(transactor.clone(), ChangeEntry::balance_changed(from_balance - value)); - local.insert(dest.clone(), ChangeEntry::balance_changed(to_balance + value)); - } - - let should_commit = { - // Our local ext: Should be used for any transfers and creates that happen internally. - let ext = || Ext { - do_get_storage: |account: &AccountId, location: &[u8]| - local.borrow().get(account) - .and_then(|a| a.storage.get(location)) - .cloned() - .unwrap_or_else(|| ext.get_storage(account, location)), - do_get_code: |account: &AccountId| - local.borrow().get(account) - .and_then(|a| a.code.clone()) - .unwrap_or_else(|| ext.get_code(account)), - do_get_balance: |account: &AccountId| - local.borrow().get(account) - .and_then(|a| a.balance) - .unwrap_or_else(|| ext.get_balance(account)), - }; - let mut transfer = |inner_dest: &AccountId, value: Balance| { - if let Some(commit_state) = effect_transfer(dest, inner_dest, value, ext()) { - merge_state(commit_state, &mut *local.borrow_mut()); - } - }; - let mut create = |code: &[u8], value: Balance| { - if let Some(commit_state) = effect_create(dest, code, value, ext()) { - merge_state(commit_state, &mut *local.borrow_mut()); - } - }; - let mut put_storage = |location: Vec, value: Option>| { - local.borrow_mut() - .entry(dest.clone()) - .or_insert(Default::default()) - .storage.insert(location, value); - }; - - // TODO: logging (logs are just appended into a notable storage-based vector and cleared every - // block). - // TODO: execute code with ext(), put_storage, create and transfer as externalities. - true - }; - - if should_commit { - Some(local.into_inner()) - } else { - None - } - } -} - -pub mod internal { - use super::*; - - /// Hook to be called after to transaction processing. - pub fn check_new_era() { - // check block number and call new_era if necessary. - if (system::block_number() - LastEraLengthChange::get()) % era_length() == 0 { - new_era(); - } - } - - /// Deduct from an unbonded balance. true if it happened. - pub fn deduct_unbonded(who: &AccountId, value: Balance) -> bool { - if let LockStatus::Liquid = unlock_block(who) { - let b = FreeBalanceOf::get(who); - if b >= value { - FreeBalanceOf::insert(who, &(b - value)); - return true; - } - } - false - } - - /// Refund some balance. - pub fn refund(who: &AccountId, value: Balance) { - FreeBalanceOf::insert(who, &(FreeBalanceOf::get(who) + value)) - } - - /// Will slash any balance, but prefer free over reserved. - pub fn slash(who: &AccountId, value: Balance) -> bool { - let free_balance = FreeBalanceOf::get(who); - let free_slash = cmp::min(free_balance, value); - FreeBalanceOf::insert(who, &(free_balance - free_slash)); - if free_slash < value { - slash_reserved(who, value - free_slash) - } else { - true - } - } - - /// Moves `value` from balance to reserved balance. - pub fn reserve_balance(who: &AccountId, value: Balance) { - let b = FreeBalanceOf::get(who); - assert!(b >= value); - FreeBalanceOf::insert(who, &(b - value)); - ReservedBalanceOf::insert(who, &(ReservedBalanceOf::get(who) + value)); - } - - /// Moves `value` from reserved balance to balance. - pub fn unreserve_balance(who: &AccountId, value: Balance) { - let b = ReservedBalanceOf::get(who); - let value = cmp::min(b, value); - ReservedBalanceOf::insert(who, &(b - value)); - FreeBalanceOf::insert(who, &(FreeBalanceOf::get(who) + value)); - } - - /// Moves `value` from reserved balance to balance. - pub fn slash_reserved(who: &AccountId, value: Balance) -> bool { - let b = ReservedBalanceOf::get(who); - let slash = cmp::min(b, value); - ReservedBalanceOf::insert(who, &(b - slash)); - value == slash - } - - /// Moves `value` from reserved balance to balance. - pub fn transfer_reserved_balance(slashed: &AccountId, beneficiary: &AccountId, value: Balance) -> bool { - let b = ReservedBalanceOf::get(slashed); - let slash = cmp::min(b, value); - ReservedBalanceOf::insert(slashed, &(b - slash)); - FreeBalanceOf::insert(beneficiary, &(FreeBalanceOf::get(beneficiary) + slash)); - slash == value - } -} - -/// The era has changed - enact new staking set. -/// -/// NOTE: This always happens immediately before a session change to ensure that new validators -/// get a chance to set their session keys. -fn new_era() { - // Increment current era. - CurrentEra::put(&(CurrentEra::get() + 1)); - - // Enact era length change. - if let Some(next_spe) = NextSessionsPerEra::get() { - if next_spe != SessionsPerEra::get() { - SessionsPerEra::put(&next_spe); - LastEraLengthChange::put(&system::block_number()); - } - } - - // evaluate desired staking amounts and nominations and optimise to find the best - // combination of validators, then use session::internal::set_validators(). - // for now, this just orders would-be stakers by their balances and chooses the top-most - // ValidatorCount::get() of them. - let mut intentions = Intention::items() - .into_iter() - .map(|v| (balance(&v), v)) - .collect::>(); - intentions.sort_unstable_by(|&(b1, _), &(b2, _)| b2.cmp(&b1)); - session::internal::set_validators( - &intentions.into_iter() - .map(|(_, v)| v) - .take(ValidatorCount::get() as usize) - .collect::>() - ); -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::{Joiner, KeyedVec}; - use keyring::Keyring::*; - use runtime::session; - use super::public::{Call, Dispatch}; - use super::privileged::{Dispatch as PrivDispatch, Call as PrivCall}; - - pub fn externalities(session_length: u64, sessions_per_era: u64, current_era: u64) -> TestExternalities { - let extras: TestExternalities = map![ - twox_128(&Intention::len_key()).to_vec() => vec![].and(&3u32), - twox_128(&Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&sessions_per_era), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&3u64), - twox_128(BondingDuration::key()).to_vec() => vec![].and(&0u64), - twox_128(TransactionFee::key()).to_vec() => vec![].and(&1u64), - twox_128(CurrentEra::key()).to_vec() => vec![].and(¤t_era), - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - session::testing::externalities(session_length).into_iter().chain(extras.into_iter()).collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::internal::*; - use super::privileged::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use runtime::{staking, session}; - use runtime_support::PrivPass; - use runtime::staking::public::{Call, Dispatch}; - use runtime::staking::privileged::{Call as PCall, Dispatch as PDispatch}; - - #[test] - fn staking_should_work() { - let mut t: TestExternalities = map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), - twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), - twox_128(BondingDuration::key()).to_vec() => vec![].and(&3u64), - twox_128(TotalStake::key()).to_vec() => vec![].and(&100u64), - twox_128(TransactionFee::key()).to_vec() => vec![].and(&0u64), - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), - twox_128(&FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), - twox_128(&FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), - twox_128(&FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64) - ]; - - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(ValidatorCount::get(), 2); - assert_eq!(BondingDuration::get(), 3); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); - - // Block 1: Add three validators. No obvious change. - system::testing::set_block_number(1); - public::Call::stake().dispatch(public_pass_from_payment(&Alice)); - public_pass_from_payment(&Bob).stake(); - public_pass_from_payment(&Dave).stake(); - check_new_era(); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); - - // Block 2: New validator set now. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(session::validators(), vec![Dave.to_raw_public(), Bob.into()]); - - // Block 3: Unstake highest, introduce another staker. No change yet. - system::testing::set_block_number(3); - public_pass_from_payment(&Charlie).stake(); - public_pass_from_payment(&Dave).unstake(); - check_new_era(); - - // Block 4: New era - validators change. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(session::validators(), vec![Charlie.to_raw_public(), Bob.into()]); - - // Block 5: Transfer stake from highest to lowest. No change yet. - system::testing::set_block_number(5); - public_pass_from_payment(&Dave).transfer(Alice.to_raw_public(), 40); - check_new_era(); - - // Block 6: Lowest now validator. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); - - // Block 7: Unstake three. No change yet. - system::testing::set_block_number(7); - public_pass_from_payment(&Charlie).unstake(); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); - - // Block 8: Back to one and two. - system::testing::set_block_number(8); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Bob.into()]); - }); - } - - #[test] - fn staking_eras_work() { - let mut t: TestExternalities = map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), - twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64) - ]; - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(SessionsPerEra::get(), 2u64); - assert_eq!(LastEraLengthChange::get(), 0u64); - assert_eq!(CurrentEra::get(), 0u64); - - // Block 1: No change. - system::testing::set_block_number(1); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 2u64); - assert_eq!(LastEraLengthChange::get(), 0u64); - assert_eq!(CurrentEra::get(), 0u64); - - // Block 2: Simple era change. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 2u64); - assert_eq!(LastEraLengthChange::get(), 0u64); - assert_eq!(CurrentEra::get(), 1u64); - - // Block 3: Schedule an era length change; no visible changes. - system::testing::set_block_number(3); - PrivPass::test().set_sessions_per_era(3); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 2u64); - assert_eq!(LastEraLengthChange::get(), 0u64); - assert_eq!(CurrentEra::get(), 1u64); - - // Block 4: Era change kicks in. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 3u64); - assert_eq!(LastEraLengthChange::get(), 4u64); - assert_eq!(CurrentEra::get(), 2u64); - - // Block 5: No change. - system::testing::set_block_number(5); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 3u64); - assert_eq!(LastEraLengthChange::get(), 4u64); - assert_eq!(CurrentEra::get(), 2u64); - - // Block 6: No change. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 3u64); - assert_eq!(LastEraLengthChange::get(), 4u64); - assert_eq!(CurrentEra::get(), 2u64); - - // Block 7: Era increment. - system::testing::set_block_number(7); - check_new_era(); - assert_eq!(SessionsPerEra::get(), 3u64); - assert_eq!(LastEraLengthChange::get(), 4u64); - assert_eq!(CurrentEra::get(), 3u64); - }); - } - - #[test] - fn staking_balance_works() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 42); - assert_eq!(FreeBalanceOf::get(*Alice), 42); - assert_eq!(ReservedBalanceOf::get(*Alice), 0); - assert_eq!(balance(&Alice), 42); - assert_eq!(FreeBalanceOf::get(*Bob), 0); - assert_eq!(ReservedBalanceOf::get(*Bob), 0); - assert_eq!(balance(&Bob), 0); - }); - } - - #[test] - fn staking_balance_transfer_works() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 112); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); - assert_eq!(balance(&Alice), 42); - assert_eq!(balance(&Bob), 69); - }); - } - - #[test] - #[should_panic] - fn staking_balance_transfer_when_bonded_panics() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - public_pass_from_payment(&Alice).stake(); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); - }); - } - - #[test] - fn reserving_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - - assert_eq!(balance(&Alice), 111); - assert_eq!(FreeBalanceOf::get(*Alice), 111); - assert_eq!(ReservedBalanceOf::get(*Alice), 0); - - reserve_balance(&Alice, 69); - - assert_eq!(balance(&Alice), 111); - assert_eq!(FreeBalanceOf::get(*Alice), 42); - assert_eq!(ReservedBalanceOf::get(*Alice), 69); - }); - } - - #[test] - #[should_panic] - fn staking_balance_transfer_when_reserved_panics() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 69); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); - }); - } - - #[test] - fn deducting_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - assert!(deduct_unbonded(&Alice, 69)); - assert_eq!(FreeBalanceOf::get(*Alice), 42); - }); - } - - #[test] - fn deducting_balance_should_fail_when_bonded() { - let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&111u64), - twox_128(&BondageOf::key_for(*Alice)).to_vec() => vec![].and(&2u64) - ]; - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(unlock_block(&Alice), LockStatus::LockedUntil(2)); - assert!(!deduct_unbonded(&Alice, 69)); - }); - } - - #[test] - fn refunding_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 42); - refund(&Alice, 69); - assert_eq!(FreeBalanceOf::get(*Alice), 111); - }); - } - - #[test] - fn slashing_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 69); - assert!(slash(&Alice, 69)); - assert_eq!(FreeBalanceOf::get(*Alice), 0); - assert_eq!(ReservedBalanceOf::get(*Alice), 42); - }); - } - - #[test] - fn slashing_incomplete_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 42); - reserve_balance(&Alice, 21); - assert!(!slash(&Alice, 69)); - assert_eq!(FreeBalanceOf::get(*Alice), 0); - assert_eq!(ReservedBalanceOf::get(*Alice), 0); - }); - } - - #[test] - fn unreserving_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 111); - unreserve_balance(&Alice, 42); - assert_eq!(ReservedBalanceOf::get(*Alice), 69); - assert_eq!(FreeBalanceOf::get(*Alice), 42); - }); - } - - #[test] - fn slashing_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 111); - assert!(slash_reserved(&Alice, 42)); - assert_eq!(ReservedBalanceOf::get(*Alice), 69); - assert_eq!(FreeBalanceOf::get(*Alice), 0); - }); - } - - #[test] - fn slashing_incomplete_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 42); - assert!(!slash_reserved(&Alice, 69)); - assert_eq!(FreeBalanceOf::get(*Alice), 69); - assert_eq!(ReservedBalanceOf::get(*Alice), 0); - }); - } - - #[test] - fn transferring_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 111); - assert!(transfer_reserved_balance(&Alice, &Bob, 42)); - assert_eq!(ReservedBalanceOf::get(*Alice), 69); - assert_eq!(FreeBalanceOf::get(*Alice), 0); - assert_eq!(ReservedBalanceOf::get(*Bob), 0); - assert_eq!(FreeBalanceOf::get(*Bob), 42); - }); - } - - #[test] - fn transferring_incomplete_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - FreeBalanceOf::insert(*Alice, 111); - reserve_balance(&Alice, 42); - assert!(!transfer_reserved_balance(&Alice, &Bob, 69)); - assert_eq!(ReservedBalanceOf::get(*Alice), 0); - assert_eq!(FreeBalanceOf::get(*Alice), 69); - assert_eq!(ReservedBalanceOf::get(*Bob), 0); - assert_eq!(FreeBalanceOf::get(*Bob), 42); - }); - } -} diff --git a/demo/runtime/src/runtime-old/system.rs b/demo/runtime/src/runtime-old/system.rs deleted file mode 100644 index bcda0584ad681..0000000000000 --- a/demo/runtime/src/runtime-old/system.rs +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code -//! and depositing logs. - -use rstd::prelude::*; -use rstd::mem; -use runtime_io::{print, storage_root, enumerated_trie_root}; -use codec::{KeyedVec, Slicable}; -use runtime_support::{Hashable, storage, StorageValue, StorageMap}; -use demo_primitives::{AccountId, Hash, TxOrder, BlockNumber, Header, Log}; -use block::{self, Block}; -use transaction::UncheckedTransaction; -use runtime::{staking, session}; -use runtime::staking::public_pass_from_payment; -use dispatch; -use safe_mix::TripletMix; - -storage_items! { - pub Nonce get(nonce): b"sys:non" => default map [ AccountId => TxOrder ]; - pub BlockHashAt get(block_hash): b"sys:old" => required map [ BlockNumber => Hash ]; - RandomSeed get(random_seed): b"sys:rnd" => required Hash; - // The current block number being processed. Set by `execute_block`. - Number get(block_number): b"sys:num" => required BlockNumber; - ParentHash get(parent_hash): b"sys:pha" => required Hash; - TransactionsRoot get(transactions_root): b"sys:txr" => required Hash; - Digest: b"sys:dig" => default block::Digest; -} - -pub mod internal { - use super::*; - - struct CheckedTransaction(UncheckedTransaction); - - /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: Log) { - let mut l = Digest::get(); - l.logs.push(log); - Digest::put(l); - } - - /// Actually execute all transitioning for `block`. - pub fn execute_block(mut block: Block) { - initialise_block(&block.header); - - // any initial checks - initial_checks(&block); - - // execute transactions - block.transactions.iter().cloned().for_each(super::execute_transaction); - - // post-transactional book-keeping. - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - // any final checks - final_checks(&block); - - // any stuff that we do after taking the storage root. - post_finalise(&block.header); - } - - /// Start the execution of a particular block. - pub fn initialise_block(mut header: &Header) { - // populate environment from header. - Number::put(header.number); - ParentHash::put(header.parent_hash); - TransactionsRoot::put(header.transaction_root); - RandomSeed::put(calculate_random()); - } - - /// Execute a transaction outside of the block execution function. - /// This doesn't attempt to validate anything regarding the block. - pub fn execute_transaction(utx: UncheckedTransaction) { - super::execute_transaction(utx); - } - - /// Finalise the block - it is up the caller to ensure that all header fields are valid - /// except state-root. - pub fn finalise_block() -> Header { - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - RandomSeed::kill(); - let header = Header { - number: Number::take(), - digest: Digest::take(), - parent_hash: ParentHash::take(), - transaction_root: TransactionsRoot::take(), - state_root: storage_root().into(), - }; - - post_finalise(&header); - - header - } -} - -fn execute_transaction(utx: UncheckedTransaction) { - use ::transaction; - - // Verify the signature is good. - let tx = match transaction::check(utx) { - Ok(tx) => tx, - Err(_) => panic!("All transactions should be properly signed"), - }; - - { - // check nonce - let expected_nonce: TxOrder = Nonce::get(&tx.signed); - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); - - // increment nonce in storage - Nonce::insert(&tx.signed, &(expected_nonce + 1)); - } - - // decode parameters and dispatch - let tx = tx.drain().transaction; - tx.function.dispatch(public_pass_from_payment(&tx.signed)); -} - -fn initial_checks(block: &Block) { - let ref header = block.header; - - // check parent_hash is correct. - assert!( - header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, - "Parent hash should be valid." - ); - - // check transaction trie root represents the transactions. - let txs = block.transactions.iter().map(Slicable::encode).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root(&txs).into(); - info_expect_equal_hash(&header.transaction_root, &txs_root); - assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); -} - -fn final_checks(block: &Block) { - let ref header = block.header; - - // check digest - assert!(header.digest == Digest::get()); - - // remove temporaries. - kill_temps(); - - // check storage root. - let storage_root = storage_root().into(); - info_expect_equal_hash(&header.state_root, &storage_root); - assert!(header.state_root == storage_root, "Storage root must match that calculated."); -} - -fn kill_temps() { - Number::kill(); - ParentHash::kill(); - RandomSeed::kill(); - Digest::kill(); - TransactionsRoot::kill(); -} - -fn post_finalise(header: &Header) { - // store the header hash in storage; we can't do it before otherwise there would be a - // cyclic dependency. - BlockHashAt::insert(&header.number, &header.blake2_256().into()); -} - -fn calculate_random() -> Hash { - let c = block_number() - 1; - (0..81) - .map(|i| if c >= i { block_hash(c - i) } else { Default::default() }) - .triplet_mix() -} - -#[cfg(feature = "std")] -fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - use primitives::hexdisplay::HexDisplay; - if given != expected { - println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); - } -} - -#[cfg(not(feature = "std"))] -fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - if given != expected { - print("Hash not equal"); - print(&given.0[..]); - print(&expected.0[..]); - } -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::Joiner; - - pub fn externalities() -> TestExternalities { - map![ - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode(), - twox_128(Number::key()).to_vec() => 1u64.encode(), - twox_128(ParentHash::key()).to_vec() => [69u8; 32].encode(), - twox_128(RandomSeed::key()).to_vec() => [0u8; 32].encode() - ] - } - - pub fn set_block_number(n: BlockNumber) { - Number::put(n); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::internal::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use runtime_support::StorageValue; - use codec::{Joiner, KeyedVec, Slicable}; - use keyring::Keyring::*; - use primitives::hexdisplay::HexDisplay; - use demo_primitives::{Header, Digest}; - use transaction::{UncheckedTransaction, Transaction}; - use runtime::staking; - use dispatch::public::Call as PubCall; - use runtime::staking::public::Call as StakingCall; - - #[test] - fn staking_balance_transfer_dispatch_works() { - let mut t: TestExternalities = map![ - twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() - ]; - - let tx = UncheckedTransaction { - transaction: Transaction { - signed: One.into(), - nonce: 0, - function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), - }, - signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), - }; - - with_externalities(&mut t, || { - internal::initialise_block(&Header::from_block_number(1)); - internal::execute_transaction(tx); - assert_eq!(staking::balance(&One), 32); - assert_eq!(staking::balance(&Two), 69); - }); - } - - fn new_test_ext() -> TestExternalities { - staking::testing::externalities(2, 2, 0) - } - - #[test] - fn block_import_works() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_state_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_transaction_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), - transaction_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } -} From 244d2499c2b58c3fc4e159952fc25048a50d1428 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 23:00:08 +0900 Subject: [PATCH 34/76] Schedule staking. --- demo/runtime/src/lib.rs | 2 +- .../release/demo_runtime.compact.wasm | Bin 81065 -> 95680 bytes .../release/demo_runtime.wasm | Bin 81114 -> 95729 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 40e514afd9df4..f7d3efa84793f 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -58,7 +58,7 @@ pub type Executive = executive::Executive< runtime::Concrete, block::Block, ( - (),//runtime::Staking + runtime::Staking, runtime::Session ), >; diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 2256eeebdf1bb63a3e7cbd9c308e1d5d76126a05..95299e3537acfea2f2bc7c77bc1f4f601028c45b 100644 GIT binary patch delta 27030 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 U-?9-73;n6h=ksY{qiFO01ymK_`v3p{ delta 12615 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 Qb!+XPvy6!r(*DB#1vmc#tpET3 From 3533060ec9d3cb75a62d515a04ce6a06279dfb1f Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 26 Mar 2018 23:06:13 +0900 Subject: [PATCH 35/76] Minor fixes --- substrate/runtime/staking/src/lib.rs | 2 +- substrate/runtime/system/src/lib.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 8f1fa480b6650..be840b0f2a729 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -343,7 +343,7 @@ impl Executable for Module { // - n | n > >::get(): deactivating: recently representing a validator and not yet // ready for transfer. -pub struct ChangeEntry { +struct ChangeEntry { balance: Option, code: Option>, storage: BTreeMap, Option>>, diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index daf224659ae2e..d3593887b2ce3 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -30,6 +30,7 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; +#[cfg(any(feature = "std", test))] use codec::Slicable; use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Hashing, Headery}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; From ada68b6e4bed75b014f5508394ebb6cff6a622cf Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 01:42:09 +0900 Subject: [PATCH 36/76] First bits of democracy. --- Cargo.lock | 20 +++++ Cargo.toml | 1 + substrate/runtime/council/Cargo.toml | 35 +++++++++ substrate/runtime/council/src/lib.rs | 64 ++++++++++++++++ substrate/runtime/council/src/voting.rs | 0 substrate/runtime/democracy/Cargo.toml | 35 +++++++++ substrate/runtime/democracy/src/lib.rs | 68 +++++++++++++++++ .../runtime/democracy/src/vote_threshold.rs | 75 +++++++++++++++++++ substrate/runtime/primitives/Cargo.toml | 1 + substrate/runtime/primitives/src/lib.rs | 12 ++- substrate/runtime/staking/src/lib.rs | 1 + 11 files changed, 309 insertions(+), 3 deletions(-) create mode 100644 substrate/runtime/council/Cargo.toml create mode 100644 substrate/runtime/council/src/lib.rs create mode 100644 substrate/runtime/council/src/voting.rs create mode 100644 substrate/runtime/democracy/Cargo.toml create mode 100644 substrate/runtime/democracy/src/lib.rs create mode 100644 substrate/runtime/democracy/src/vote_threshold.rs diff --git a/Cargo.lock b/Cargo.lock index e63d2086ad6b3..0170e7d40164e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1779,6 +1779,25 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "substrate-runtime-democracy" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-executive" version = "0.1.0" @@ -1812,6 +1831,7 @@ dependencies = [ name = "substrate-runtime-primitives" version = "0.1.0" dependencies = [ + "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", diff --git a/Cargo.toml b/Cargo.toml index f98916e663abc..0a48dac86ad50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ members = [ "substrate/runtime-std", "substrate/runtime-support", "substrate/runtime/consensus", + "substrate/runtime/democracy", "substrate/runtime/executive", "substrate/runtime/primitives", "substrate/runtime/session", diff --git a/substrate/runtime/council/Cargo.toml b/substrate/runtime/council/Cargo.toml new file mode 100644 index 0000000000000..d469413d15fe0 --- /dev/null +++ b/substrate/runtime/council/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "substrate-runtime-council" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +integer-sqrt = "0.1.0" +serde = { version = "1.0", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-session = { path = "../session", default_features = false } +substrate-runtime-staking = { path = "../staking", default_features = false } +substrate-runtime-system = { path = "../system", default_features = false } + +[features] +default = ["std"] +std = [ + "serde/std", + "safe-mix/std", + "substrate-codec/std", + "substrate-primitives/std", + "substrate-runtime-std/std", + "substrate-runtime-io/std", + "substrate-runtime-support/std", + "substrate-runtime-primitives/std", + "substrate-runtime-session/std", + "substrate-runtime-staking/std", + "substrate-runtime-system/std", +] diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs new file mode 100644 index 0000000000000..fee4bffbd16cd --- /dev/null +++ b/substrate/runtime/council/src/lib.rs @@ -0,0 +1,64 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Staking manager: Handles balances and periodically determines the best set of validators. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "std")] extern crate serde; + +extern crate integer_sqrt; +extern crate substrate_codec as codec; +extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_io as runtime_io; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_session as session; +extern crate substrate_runtime_staking as staking; +extern crate substrate_runtime_system as system; + +use rstd::prelude::*; +use rstd::cmp; +use rstd::marker::PhantomData; +use integer_sqrt::IntegerSquareRoot; +//use runtime_io::{twox_128, TestExternalities}; +use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; +use runtime_support::{StorageValue, StorageMap, Parameter}; + +pub mod voting; + +pub trait Trait: staking::Trait { +} + +decl_module! { + pub struct Module; + pub enum Call where aux: T::PublicAux { + } + pub enum PrivCall { + } +} + +decl_storage! { + trait Store for Module; +} + +impl Module { +} + +impl Executable for Module { + fn execute() { + } +} diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/substrate/runtime/democracy/Cargo.toml b/substrate/runtime/democracy/Cargo.toml new file mode 100644 index 0000000000000..af39e9a8a18f0 --- /dev/null +++ b/substrate/runtime/democracy/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "substrate-runtime-democracy" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +hex-literal = "0.1.0" +integer-sqrt = "0.1.0" +serde = { version = "1.0", default_features = false } +safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-codec = { path = "../../codec", default_features = false } +substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-session = { path = "../session", default_features = false } +substrate-runtime-staking = { path = "../staking", default_features = false } +substrate-runtime-system = { path = "../system", default_features = false } + +[features] +default = ["std"] +std = [ + "serde/std", + "safe-mix/std", + "substrate-codec/std", + "substrate-primitives/std", + "substrate-runtime-std/std", + "substrate-runtime-io/std", + "substrate-runtime-support/std", + "substrate-runtime-primitives/std", + "substrate-runtime-session/std", + "substrate-runtime-staking/std", + "substrate-runtime-system/std", +] diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs new file mode 100644 index 0000000000000..8a141275c74aa --- /dev/null +++ b/substrate/runtime/democracy/src/lib.rs @@ -0,0 +1,68 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Democracy. + +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(feature = "std")] extern crate serde; + +extern crate substrate_codec as codec; +extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_io as runtime_io; +#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_session as session; +extern crate substrate_runtime_staking as staking; +extern crate substrate_runtime_system as system; + +use rstd::prelude::*; +use rstd::cmp; +use rstd::marker::PhantomData; +//use runtime_io::{twox_128, TestExternalities}; +use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; +use runtime_support::{StorageValue, StorageMap, Parameter}; + +mod vote_threshold; +pub use vote_threshold::VoteThreshold; + +/// A proposal index. +pub type PropIndex = u32; +/// A referendum index. +pub type ReferendumIndex = u32; + +pub trait Trait: staking::Trait { +} + +decl_module! { + pub struct Module; + pub enum Call where aux: T::PublicAux { + } + pub enum PrivCall { + } +} + +decl_storage! { + trait Store for Module; +} + +impl Module { +} + +impl Executable for Module { + fn execute() { + } +} diff --git a/substrate/runtime/democracy/src/vote_threshold.rs b/substrate/runtime/democracy/src/vote_threshold.rs new file mode 100644 index 0000000000000..bd6880f8425f5 --- /dev/null +++ b/substrate/runtime/democracy/src/vote_threshold.rs @@ -0,0 +1,75 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Voting thresholds. + +use primitives::IntegerSquareRoot; +use codec::{Input, Slicable}; +use rstd::ops::{Add, Mul, Div}; + +/// A means of determining if a vote is past pass threshold. +#[derive(Clone, Copy, PartialEq, Eq)] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +pub enum VoteThreshold { + /// A supermajority of approvals is needed to pass this vote. + SuperMajorityApprove, + /// A supermajority of rejects is needed to fail this vote. + SuperMajorityAgainst, + /// A simple majority of approvals is needed to pass this vote. + SimpleMajority, +} + +impl Slicable for VoteThreshold { + fn decode(input: &mut I) -> Option { + input.read_byte().and_then(|v| match v { + 0 => Some(VoteThreshold::SuperMajorityApprove), + 1 => Some(VoteThreshold::SuperMajorityAgainst), + 2 => Some(VoteThreshold::SimpleMajority), + _ => None, + }) + } + + fn using_encoded R>(&self, f: F) -> R { + f(&[match *self { + VoteThreshold::SuperMajorityApprove => 0u8, + VoteThreshold::SuperMajorityAgainst => 1u8, + VoteThreshold::SimpleMajority => 2u8, + }]) + } +} + +trait Approved { + /// Given `approve` votes for and `against` votes against from a total electorate size of + /// `electorate` (`electorate - (approve + against)` are abstainers), then returns true if the + /// overall outcome is in favour of approval. + fn approved(&self, approve: Balance, against: Balance, electorate: Balance) -> bool; +} + +impl + Mul + Div + Copy> Approved for VoteThreshold { + /// Given `approve` votes for and `against` votes against from a total electorate size of + /// `electorate` (`electorate - (approve + against)` are abstainers), then returns true if the + /// overall outcome is in favour of approval. + fn approved(&self, approve: Balance, against: Balance, electorate: Balance) -> bool { + let voters = approve + against; + match *self { + VoteThreshold::SuperMajorityApprove => + voters.integer_sqrt() * approve / electorate.integer_sqrt() > against, + VoteThreshold::SuperMajorityAgainst => + approve > voters.integer_sqrt() * against / electorate.integer_sqrt(), + VoteThreshold::SimpleMajority => approve > against, + } + } +} diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml index 6dcd47774d4e3..899bd0dcd6e1b 100644 --- a/substrate/runtime/primitives/Cargo.toml +++ b/substrate/runtime/primitives/Cargo.toml @@ -5,6 +5,7 @@ authors = ["Parity Technologies "] [dependencies] num-traits = { version = "0.2", default_features = false } +integer-sqrt = "0.1.0" substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-codec = { path = "../../codec", default_features = false } diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index c1944ed80ea06..88ec43465c5f1 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -20,6 +20,7 @@ #![cfg_attr(not(feature = "std"), no_std)] extern crate num_traits; +extern crate integer_sqrt; extern crate substrate_runtime_std as rstd; #[cfg(not(feature = "std"))] extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; @@ -27,8 +28,9 @@ extern crate substrate_primitives; use rstd::prelude::*; use codec::Slicable; +pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; -use rstd::ops::{Add, Sub, Rem, AddAssign, SubAssign, RemAssign}; +use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; pub trait Convert { fn convert(a: A) -> B; @@ -58,16 +60,20 @@ impl RefInto for T { } pub trait SimpleArithmetic: - Zero + One + + Zero + One + IntegerSquareRoot + Add + AddAssign + Sub + SubAssign + + Mul + MulAssign + + Div + DivAssign + Rem + RemAssign + PartialOrd + Ord {} impl + AddAssign + Sub + SubAssign + + Mul + MulAssign + + Div + DivAssign + Rem + RemAssign + PartialOrd + Ord > SimpleArithmetic for T {} diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index be840b0f2a729..d5daaf9c93105 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -28,6 +28,7 @@ extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_session as session; extern crate substrate_runtime_system as system; +#[cfg(test)] use std::fmt::Debug; use rstd::prelude::*; use rstd::cmp; use rstd::cell::RefCell; From 17791903d211196af9114c440f16760decea3f72 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 12:28:10 +0900 Subject: [PATCH 37/76] Democracy module integrated. --- Cargo.lock | 3 +- demo/runtime/Cargo.toml | 3 +- demo/runtime/src/api.rs | 13 +- demo/runtime/src/lib.rs | 14 +- demo/runtime/src/runtime-old/democracy.rs | 613 ------------------ demo/runtime/src/runtime.rs | 20 +- demo/runtime/wasm/Cargo.lock | 26 + demo/runtime/wasm/Cargo.toml | 2 + .../release/demo_runtime.compact.wasm | Bin 95680 -> 130582 bytes .../release/demo_runtime.wasm | Bin 95729 -> 130631 bytes substrate/runtime/democracy/Cargo.toml | 1 - substrate/runtime/democracy/src/lib.rs | 535 ++++++++++++++- .../runtime/democracy/src/vote_threshold.rs | 2 +- substrate/runtime/primitives/src/lib.rs | 31 +- substrate/runtime/session/src/lib.rs | 2 +- substrate/runtime/staking/src/lib.rs | 14 +- 16 files changed, 619 insertions(+), 660 deletions(-) delete mode 100644 demo/runtime/src/runtime-old/democracy.rs diff --git a/Cargo.lock b/Cargo.lock index 0170e7d40164e..2dc42a527f6e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -253,7 +253,6 @@ version = "0.1.0" dependencies = [ "demo-primitives 0.1.0", "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", @@ -263,6 +262,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", + "substrate-runtime-democracy 0.1.0", "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -1784,7 +1784,6 @@ name = "substrate-runtime-democracy" version = "0.1.0" dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index a1a5026a12ca0..e04492e5c2169 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -17,6 +17,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-democracy = { path = "../../substrate/runtime/democracy" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-runtime-session = { path = "../../substrate/runtime/session" } @@ -24,7 +25,6 @@ substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } demo-primitives = { path = "../primitives" } -integer-sqrt = "0.1.0" [features] default = ["std"] @@ -35,6 +35,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-consensus/std", + "substrate-runtime-democracy/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", "substrate-runtime-session/std", diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs index 8ad1deba75e9d..f9ed4f1af9492 100644 --- a/demo/runtime/src/api.rs +++ b/demo/runtime/src/api.rs @@ -15,14 +15,13 @@ // along with Substrate Demo. If not, see . use runtime; -use Executive; impl_stubs!( authorities => |()| runtime::Consensus::authorities(), - initialise_block => |header| Executive::initialise_block(&header), - apply_extrinsic => |extrinsic| Executive::apply_extrinsic(extrinsic), - execute_block => |block| Executive::execute_block(block), - finalise_block => |()| Executive::finalise_block() - /*validator_count => |()| session::validator_count(), - validators => |()| session::validators(),*/ + initialise_block => |header| runtime::Executive::initialise_block(&header), + apply_extrinsic => |extrinsic| runtime::Executive::apply_extrinsic(extrinsic), + execute_block => |block| runtime::Executive::execute_block(block), + finalise_block => |()| runtime::Executive::finalise_block(), + validator_count => |()| runtime::Session::validator_count(), + validators => |()| runtime::Session::validators() ); diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index f7d3efa84793f..060d8069c03f9 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -25,6 +25,7 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_democracy as democracy; extern crate substrate_runtime_executive as executive; extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; @@ -45,22 +46,9 @@ extern crate demo_primitives; //#[cfg(test)] #[macro_use] extern crate hex_literal; -extern crate integer_sqrt; - pub mod runtime; pub mod block; pub mod transaction; pub mod api; -pub type Executive = executive::Executive< - transaction::UncheckedTransaction, - transaction::CheckedTransaction, - runtime::Concrete, - block::Block, - ( - runtime::Staking, - runtime::Session - ), ->; - //#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime-old/democracy.rs b/demo/runtime/src/runtime-old/democracy.rs deleted file mode 100644 index ae74416ed708f..0000000000000 --- a/demo/runtime/src/runtime-old/democracy.rs +++ /dev/null @@ -1,613 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Democratic system: Handles administration of general stakeholder voting. - -use rstd::prelude::*; -use integer_sqrt::IntegerSquareRoot; -use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; -use runtime_support::{StorageValue, StorageMap, PublicPass, PrivPass}; -use demo_primitives::{AccountId, Hash, BlockNumber}; -use dispatch::PrivCall as Proposal; -use runtime::{staking, system, session}; -use runtime::staking::Balance; - -/// A proposal index. -pub type PropIndex = u32; -/// A referendum index. -pub type ReferendumIndex = u32; - -/// A means of determining if a vote is past pass threshold. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub enum VoteThreshold { - /// A supermajority of approvals is needed to pass this vote. - SuperMajorityApprove, - /// A supermajority of rejects is needed to fail this vote. - SuperMajorityAgainst, - /// A simple majority of approvals is needed to pass this vote. - SimpleMajority, -} - -impl Slicable for VoteThreshold { - fn decode(input: &mut I) -> Option { - input.read_byte().and_then(|v| match v { - 0 => Some(VoteThreshold::SuperMajorityApprove), - 1 => Some(VoteThreshold::SuperMajorityAgainst), - 2 => Some(VoteThreshold::SimpleMajority), - _ => None, - }) - } - - fn using_encoded R>(&self, f: F) -> R { - f(&[match *self { - VoteThreshold::SuperMajorityApprove => 0u8, - VoteThreshold::SuperMajorityAgainst => 1u8, - VoteThreshold::SimpleMajority => 2u8, - }]) - } -} -impl NonTrivialSlicable for VoteThreshold {} - -trait Approved { - /// Given `approve` votes for and `against` votes against from a total electorate size of - /// `electorate` (`electorate - (approve + against)` are abstainers), then returns true if the - /// overall outcome is in favour of approval. - fn approved(&self, approve: Balance, against: Balance, electorate: Balance) -> bool; -} - -impl Approved for VoteThreshold { - /// Given `approve` votes for and `against` votes against from a total electorate size of - /// `electorate` (`electorate - (approve + against)` are abstainers), then returns true if the - /// overall outcome is in favour of approval. - fn approved(&self, approve: Balance, against: Balance, electorate: Balance) -> bool { - let voters = approve + against; - match *self { - VoteThreshold::SuperMajorityApprove => - voters.integer_sqrt() * approve / electorate.integer_sqrt() > against, - VoteThreshold::SuperMajorityAgainst => - approve > voters.integer_sqrt() * against / electorate.integer_sqrt(), - VoteThreshold::SimpleMajority => approve > against, - } - } -} - -storage_items! { - // The number of (public) proposals that have been made so far. - pub PublicPropCount get(public_prop_count): b"dem:ppc" => default PropIndex; - // The public proposals. Unsorted. - pub PublicProps get(public_props): b"dem:pub" => default Vec<(PropIndex, Proposal, AccountId)>; - // Those who have locked a deposit. - pub DepositOf get(deposit_lockers): b"dem:dep:" => map [ PropIndex => (Balance, Vec) ]; - // How often (in blocks) new public referenda are launched. - pub LaunchPeriod get(launch_period): b"dem:lau" => required BlockNumber; - // The minimum amount to be used as a deposit for a public referendum proposal. - pub MinimumDeposit get(minimum_deposit): b"dem:min" => required Balance; - - // How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period): b"dem:per" => required BlockNumber; - - // The next free referendum index, aka the number of referendums started so far. - pub ReferendumCount get(next_free_ref_index): b"dem:rco" => default ReferendumIndex; - // The next referendum index that should be tallied. - pub NextTally get(next_tally): b"dem:nxt" => default ReferendumIndex; - // Information concerning any given referendum. - pub ReferendumInfoOf get(referendum_info): b"dem:pro:" => map [ ReferendumIndex => (BlockNumber, Proposal, VoteThreshold) ]; - - // Get the voters for the current proposal. - pub VotersFor get(voters_for): b"dem:vtr:" => default map [ ReferendumIndex => Vec ]; - - // Get the vote, if Some, of `who`. - pub VoteOf get(vote_of): b"dem:vot:" => map [ (ReferendumIndex, AccountId) => bool ]; -} - -// public proposals - -/// Get the amount locked in support of `proposal`; false if proposal isn't a valid proposal -/// index. -pub fn locked_for(proposal: PropIndex) -> Option { - deposit_lockers(proposal).map(|(d, l)| d * (l.len() as Balance)) -} - -/// Return true if `ref_index` is an on-going referendum. -pub fn is_active_referendum(ref_index: ReferendumIndex) -> bool { - ReferendumInfoOf::exists(ref_index) -} - -/// Get all referendums currently active. -pub fn active_referendums() -> Vec<(ReferendumIndex, BlockNumber, Proposal, VoteThreshold)> { - let next = NextTally::get(); - let last = ReferendumCount::get(); - (next..last).into_iter() - .filter_map(|i| referendum_info(i).map(|(n, p, t)| (i, n, p, t))) - .collect() -} - -/// Get all referendums ready for tally at block `n`. -pub fn maturing_referendums_at(n: BlockNumber) -> Vec<(ReferendumIndex, BlockNumber, Proposal, VoteThreshold)> { - let next = NextTally::get(); - let last = ReferendumCount::get(); - (next..last).into_iter() - .filter_map(|i| referendum_info(i).map(|(n, p, t)| (i, n, p, t))) - .take_while(|&(_, block_number, _, _)| block_number == n) - .collect() -} - -/// Get the voters for the current proposal. -pub fn tally(ref_index: ReferendumIndex) -> (staking::Balance, staking::Balance) { - voters_for(ref_index).iter() - .map(|a| (staking::balance(a), vote_of((ref_index, *a)).expect("all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed"))) - .map(|(bal, vote)| if vote { (bal, 0) } else { (0, bal) }) - .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)) -} - -impl_dispatch! { - pub mod public; - fn propose(self, proposal: Box, value: Balance) = 0; - fn second(self, proposal: PropIndex) = 1; - fn vote(self, ref_index: ReferendumIndex, approve_proposal: bool) = 2; -} - -impl<'a> public::Dispatch for PublicPass<'a> { - /// Propose a sensitive action to be taken. - fn propose(self, proposal: Box, value: Balance) { - assert!(value >= minimum_deposit()); - assert!(staking::internal::deduct_unbonded(&self, value)); - - let index = PublicPropCount::get(); - PublicPropCount::put(index + 1); - DepositOf::insert(index, (value, vec![*self])); - - let mut props = public_props(); - props.push((index, (*proposal).clone(), *self)); - PublicProps::put(props); - } - - /// Propose a sensitive action to be taken. - fn second(self, proposal: PropIndex) { - let mut deposit = DepositOf::get(proposal).expect("can only second an existing proposal"); - assert!(staking::internal::deduct_unbonded(&self, deposit.0)); - - deposit.1.push(*self); - DepositOf::insert(proposal, deposit); - } - - /// Vote in a referendum. If `approve_proposal` is true, the vote is to enact the proposal; - /// false would be a vote to keep the status quo.. - fn vote(self, ref_index: ReferendumIndex, approve_proposal: bool) { - if !is_active_referendum(ref_index) { - panic!("vote given for invalid referendum.") - } - if staking::balance(&self) == 0 { - panic!("transactor must have balance to signal approval."); - } - if !VoteOf::exists(&(ref_index, *self)) { - let mut voters = voters_for(ref_index); - voters.push(self.clone()); - VotersFor::insert(ref_index, voters); - } - VoteOf::insert(&(ref_index, *self), approve_proposal); - } -} - -impl_dispatch! { - pub mod privileged; - fn start_referendum(self, proposal: Box, vote_threshold: VoteThreshold) = 0; - fn cancel_referendum(self, ref_index: ReferendumIndex) = 1; -} - -impl privileged::Dispatch for PrivPass { - /// Start a referendum. - fn start_referendum(self, proposal: Box, vote_threshold: VoteThreshold) { - inject_referendum(system::block_number() + voting_period(), *proposal, vote_threshold); - } - - /// Remove a referendum. - fn cancel_referendum(self, ref_index: ReferendumIndex) { - clear_referendum(ref_index); - } -} - -pub mod internal { - use super::*; - use dispatch; - - /// Can be called directly by the council. - pub fn start_referendum(proposal: Proposal, vote_threshold: VoteThreshold) { - inject_referendum(system::block_number() + voting_period(), proposal, vote_threshold); - } - - /// Remove a referendum. - pub fn cancel_referendum(ref_index: ReferendumIndex) { - clear_referendum(ref_index); - } - - /// Current era is ending; we should finish up any proposals. - pub fn end_block(now: BlockNumber) { - // pick out another public referendum if it's time. - if now % launch_period() == 0 { - let mut public_props = public_props(); - if let Some((winner_index, _)) = public_props.iter() - .enumerate() - .max_by_key(|x| locked_for((x.1).0).expect("All current public proposals have an amount locked")) - { - let (prop_index, proposal, _) = public_props.swap_remove(winner_index); - let (deposit, depositors): (Balance, Vec) = - DepositOf::take(prop_index).expect("depositors always exist for current proposals"); - // refund depositors - for d in &depositors { - staking::internal::refund(d, deposit); - } - PublicProps::put(public_props); - inject_referendum(now + voting_period(), proposal, VoteThreshold::SuperMajorityApprove); - } - } - - // tally up votes for any expiring referenda. - for (index, _, proposal, vote_threshold) in maturing_referendums_at(now) { - let (approve, against) = tally(index); - let total_stake = staking::total_stake(); - clear_referendum(index); - if vote_threshold.approved(approve, against, total_stake) { - proposal.dispatch(PrivPass::unchecked_new()); - } - NextTally::put(index + 1); - } - } -} - -/// Start a referendum -fn inject_referendum( - end: BlockNumber, - proposal: Proposal, - vote_threshold: VoteThreshold -) -> ReferendumIndex { - let ref_index = next_free_ref_index(); - if ref_index > 0 && referendum_info(ref_index - 1).map(|i| i.0 > end).unwrap_or(false) { - panic!("Cannot inject a referendum that ends earlier than preceeding referendum"); - } - - ReferendumCount::put(ref_index + 1); - ReferendumInfoOf::insert(ref_index, (end, proposal, vote_threshold)); - ref_index -} - -/// Remove all info on a referendum. -fn clear_referendum(ref_index: ReferendumIndex) { - ReferendumInfoOf::remove(ref_index); - VotersFor::remove(ref_index); - for v in voters_for(ref_index) { - VoteOf::remove((ref_index, v)); - } -} - -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use runtime_support::{StorageList, StorageValue, StorageMap}; - use codec::Joiner; - use keyring::Keyring::*; - use runtime::{session, staking}; - - pub fn externalities() -> TestExternalities { - map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![Alice.to_raw_public(), Bob.into(), Charlie.into()]), - twox_128(&staking::Intention::len_key()).to_vec() => vec![].and(&3u32), - twox_128(&staking::Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&staking::Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&staking::Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(&staking::FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), - twox_128(&staking::FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), - twox_128(&staking::FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), - twox_128(&staking::FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64), - twox_128(&staking::FreeBalanceOf::key_for(*Eve)).to_vec() => vec![].and(&50u64), - twox_128(&staking::FreeBalanceOf::key_for(*Ferdie)).to_vec() => vec![].and(&60u64), - twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![].and(&1u64), - twox_128(staking::TotalStake::key()).to_vec() => vec![].and(&210u64), - twox_128(staking::SessionsPerEra::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::ValidatorCount::key()).to_vec() => vec![].and(&3u64), - twox_128(staking::CurrentEra::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::TransactionFee::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::BondingDuration::key()).to_vec() => vec![].and(&0u64), - - twox_128(LaunchPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(MinimumDeposit::key()).to_vec() => vec![].and(&1u64) - ] - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use dispatch::PrivCall as Proposal; - use runtime_support::PublicPass; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; - use runtime::{staking, session, democracy}; - - fn new_test_ext() -> TestExternalities { - testing::externalities() - } - - #[test] - fn params_should_work() { - with_externalities(&mut new_test_ext(), || { - assert_eq!(launch_period(), 1u64); - assert_eq!(voting_period(), 1u64); - assert_eq!(minimum_deposit(), 1u64); - assert_eq!(next_free_ref_index(), 0u32); - assert_eq!(staking::sessions_per_era(), 1u64); - assert_eq!(staking::total_stake(), 210u64); - }); - } - - // TODO: test VoteThreshold - - fn propose_sessions_per_era(who: &AccountId, value: u64, locked: Balance) { - PublicPass::test(who). - propose(Box::new(Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value))), locked); - } - - #[test] - fn locked_for_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 2u64); - propose_sessions_per_era(&Alice, 4, 4u64); - propose_sessions_per_era(&Alice, 3, 3u64); - assert_eq!(locked_for(0), Some(2)); - assert_eq!(locked_for(1), Some(4)); - assert_eq!(locked_for(2), Some(3)); - }); - } - - #[test] - fn single_proposal_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 1u64); - democracy::internal::end_block(system::block_number()); - - system::testing::set_block_number(2); - let r = 0; - PublicPass::test(&Alice).vote(r, true); - - assert_eq!(next_free_ref_index(), 1); - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(true)); - assert_eq!(tally(r), (10, 0)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 2u64); - }); - } - - #[test] - fn deposit_for_proposals_should_be_taken() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 5u64); - PublicPass::test(&Bob).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - assert_eq!(staking::balance(&Alice), 5u64); - assert_eq!(staking::balance(&Bob), 15u64); - assert_eq!(staking::balance(&Eve), 35u64); - }); - } - - #[test] - fn deposit_for_proposals_should_be_returned() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 5u64); - PublicPass::test(&Bob).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - democracy::internal::end_block(system::block_number()); - assert_eq!(staking::balance(&Alice), 10u64); - assert_eq!(staking::balance(&Bob), 20u64); - assert_eq!(staking::balance(&Eve), 50u64); - }); - } - - #[test] - #[should_panic] - fn proposal_with_deposit_below_minimum_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 0u64); - }); - } - - #[test] - #[should_panic] - fn poor_proposer_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 11u64); - }); - } - - #[test] - #[should_panic] - fn poor_seconder_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Bob, 2, 11u64); - PublicPass::test(&Alice).second(0); - }); - } - - fn propose_bonding_duration(who: &AccountId, value: u64, locked: Balance) { - PublicPass::test(who). - propose(Box::new(Proposal::Staking(staking::privileged::Call::set_bonding_duration(value))), locked); - } - - #[test] - fn runners_up_should_come_after() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(0); - propose_bonding_duration(&Alice, 2, 2u64); - propose_bonding_duration(&Alice, 4, 4u64); - propose_bonding_duration(&Alice, 3, 3u64); - democracy::internal::end_block(system::block_number()); - - system::testing::set_block_number(1); - PublicPass::test(&Alice).vote(0, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 4u64); - - system::testing::set_block_number(2); - PublicPass::test(&Alice).vote(1, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 3u64); - - system::testing::set_block_number(3); - PublicPass::test(&Alice).vote(2, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 2u64); - }); - } - - fn sessions_per_era_propsal(value: u64) -> Proposal { - Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) - } - - #[test] - fn simple_passing_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); - - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(true)); - assert_eq!(tally(r), (10, 0)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 2u64); - }); - } - - #[test] - fn cancel_referendum_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); - PrivPass::test().cancel_referendum(r); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 1u64); - }); - } - - #[test] - fn simple_failing_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, false); - - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(false)); - assert_eq!(tally(r), (0, 10)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 1u64); - }); - } - - #[test] - fn controversial_voting_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); - PublicPass::test(&Bob).vote(r, false); - PublicPass::test(&Charlie).vote(r, false); - PublicPass::test(&Dave).vote(r, true); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); - - assert_eq!(tally(r), (110, 100)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 2u64); - }); - } - - #[test] - fn controversial_low_turnout_voting_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); - - assert_eq!(tally(r), (60, 50)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 1u64); - }); - } - - #[test] - fn passing_low_turnout_voting_should_work() { - with_externalities(&mut new_test_ext(), || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::total_stake(), 210u64); - - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Dave).vote(r, true); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); - - assert_eq!(tally(r), (100, 50)); - - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - - assert_eq!(staking::era_length(), 2u64); - }); - } -} diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index a450b9f6e0512..d7c3a3c794c76 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -20,7 +20,8 @@ use rstd::prelude::*; use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; -use {consensus, timestamp, system, session, staking, demo_primitives, runtime_primitives}; +use {block, demo_primitives, transaction}; +use {runtime_primitives, consensus, timestamp, system, session, staking, democracy, executive}; use runtime_primitives::{Identity, HasPublicAux}; // TODO: move into runtime support/io. @@ -86,12 +87,17 @@ impl staking::Trait for Concrete { } pub type Staking = staking::Module; +impl democracy::Trait for Concrete { + type Proposal = PrivCall; +} +pub type Democracy = democracy::Module; + impl_outer_dispatch! { pub enum Call where aux: ::PublicAux { Session = 1, Staking = 2, Timestamp = 3, -// Democracy = 5, + Democracy = 5, // Council = 6, // CouncilVote = 7, } @@ -100,8 +106,16 @@ impl_outer_dispatch! { Consensus = 0, Session = 1, Staking = 2, -// Democracy = 5, + Democracy = 5, // Council = 6, // CouncilVote = 7, } } + +pub type Executive = executive::Executive< + transaction::UncheckedTransaction, + transaction::CheckedTransaction, + Concrete, + block::Block, + ((Democracy, Staking), Session), +>; diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 097bb4a8eec47..e429443c23fe7 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -110,6 +110,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", + "substrate-runtime-democracy 0.1.0", "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -258,6 +259,11 @@ name = "integer-sqrt" version = "0.1.0" source = "git+https://github.com/paritytech/integer-sqrt-rs.git#f4cf61482096dc98c1273f46a10849d182b4c23c" +[[package]] +name = "integer-sqrt" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "isatty" version = "0.1.6" @@ -654,6 +660,24 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "substrate-runtime-democracy" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-executive" version = "0.1.0" @@ -687,6 +711,7 @@ dependencies = [ name = "substrate-runtime-primitives" version = "0.1.0" dependencies = [ + "integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", @@ -957,6 +982,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" "checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" +"checksum integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7536fe7f78abedb82f609d87f46f0e0ca0ad31e84597deb8dabd8ed9ad047257" "checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" "checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index c052e02957914..f7713bccdf7ad 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -15,6 +15,7 @@ substrate-runtime-std = { path = "../../../substrate/runtime-std", default-featu substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } +substrate-runtime-democracy = { path = "../../../substrate/runtime/democracy", default-features = false } substrate-runtime-executive = { path = "../../../substrate/runtime/executive", default-features = false } substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives", default-features = false } substrate-runtime-session = { path = "../../../substrate/runtime/session", default-features = false } @@ -33,6 +34,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-consensus/std", + "substrate-runtime-democracy/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", "substrate-runtime-session/std", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 95299e3537acfea2f2bc7c77bc1f4f601028c45b..d1bbedcd78311949f8d4b11c401a64b3c412ae50 100644 GIT binary patch literal 130582 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 KB(`ke2LA#QffWn@ literal 95680 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�(oA}D5bJ}+2VS+ZZFq#nF)y(RH1SW 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 diff --git a/substrate/runtime/democracy/Cargo.toml b/substrate/runtime/democracy/Cargo.toml index af39e9a8a18f0..92ee4f32ee221 100644 --- a/substrate/runtime/democracy/Cargo.toml +++ b/substrate/runtime/democracy/Cargo.toml @@ -5,7 +5,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" -integer-sqrt = "0.1.0" serde = { version = "1.0", default_features = false } safe-mix = { path = "../../../safe-mix", default_features = false} substrate-codec = { path = "../../codec", default_features = false } diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 8a141275c74aa..0cc9c1cc46d5c 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -14,14 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -//! Democracy. +//! Democratic system: Handles administration of general stakeholder voting. #![cfg_attr(not(feature = "std"), no_std)] #[cfg(feature = "std")] extern crate serde; extern crate substrate_codec as codec; -extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; @@ -30,14 +30,13 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use rstd::cmp; -use rstd::marker::PhantomData; +//use rstd::cmp; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; -use runtime_support::{StorageValue, StorageMap, Parameter}; +use primitives::{Zero, Executable, RefInto, As}; +use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable}; mod vote_threshold; -pub use vote_threshold::VoteThreshold; +pub use vote_threshold::{Approved, VoteThreshold}; /// A proposal index. pub type PropIndex = u32; @@ -45,24 +44,546 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: staking::Trait { + type Proposal: Parameter + Dispatchable; } decl_module! { pub struct Module; pub enum Call where aux: T::PublicAux { + fn propose(aux, proposal: Box, value: T::Balance) = 0; + fn second(aux, proposal: PropIndex) = 1; + fn vote(aux, ref_index: ReferendumIndex, approve_proposal: bool) = 2; } pub enum PrivCall { + fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) = 0; + fn cancel_referendum(ref_index: ReferendumIndex) = 1; } } decl_storage! { trait Store for Module; + + // The number of (public) proposals that have been made so far. + pub PublicPropCount get(public_prop_count): b"dem:ppc" => default PropIndex; + // The public proposals. Unsorted. + pub PublicProps get(public_props): b"dem:pub" => default Vec<(PropIndex, T::Proposal, T::AccountId)>; + // Those who have locked a deposit. + pub DepositOf get(deposit_of): b"dem:dep:" => map [ PropIndex => (T::Balance, Vec) ]; + // How often (in blocks) new public referenda are launched. + pub LaunchPeriod get(launch_period): b"dem:lau" => required T::BlockNumber; + // The minimum amount to be used as a deposit for a public referendum proposal. + pub MinimumDeposit get(minimum_deposit): b"dem:min" => required T::Balance; + + // How often (in blocks) to check for new votes. + pub VotingPeriod get(voting_period): b"dem:per" => required T::BlockNumber; + + // The next free referendum index, aka the number of referendums started so far. + pub ReferendumCount get(referendum_count): b"dem:rco" => default ReferendumIndex; + // The next referendum index that should be tallied. + pub NextTally get(next_tally): b"dem:nxt" => default ReferendumIndex; + // Information concerning any given referendum. + pub ReferendumInfoOf get(referendum_info): b"dem:pro:" => map [ ReferendumIndex => (T::BlockNumber, T::Proposal, VoteThreshold) ]; + + // Get the voters for the current proposal. + pub VotersFor get(voters_for): b"dem:vtr:" => default map [ ReferendumIndex => Vec ]; + + // Get the vote, if Some, of `who`. + pub VoteOf get(vote_of): b"dem:vot:" => map [ (ReferendumIndex, T::AccountId) => bool ]; } impl Module { + + // exposed immutables. + + /// Get the amount locked in support of `proposal`; false if proposal isn't a valid proposal + /// index. + pub fn locked_for(proposal: PropIndex) -> Option { + Self::deposit_of(proposal).map(|(d, l)| d * T::Balance::sa(l.len())) + } + + /// Return true if `ref_index` is an on-going referendum. + pub fn is_active_referendum(ref_index: ReferendumIndex) -> bool { + >::exists(ref_index) + } + + /// Get all referendums currently active. + pub fn active_referendums() -> Vec<(ReferendumIndex, T::BlockNumber, T::Proposal, VoteThreshold)> { + let next = Self::next_tally(); + let last = Self::referendum_count(); + (next..last).into_iter() + .filter_map(|i| Self::referendum_info(i).map(|(n, p, t)| (i, n, p, t))) + .collect() + } + + /// Get all referendums ready for tally at block `n`. + pub fn maturing_referendums_at(n: T::BlockNumber) -> Vec<(ReferendumIndex, T::BlockNumber, T::Proposal, VoteThreshold)> { + let next = Self::next_tally(); + let last = Self::referendum_count(); + (next..last).into_iter() + .filter_map(|i| Self::referendum_info(i).map(|(n, p, t)| (i, n, p, t))) + .take_while(|&(_, block_number, _, _)| block_number == n) + .collect() + } + + /// Get the voters for the current proposal. + pub fn tally(ref_index: ReferendumIndex) -> (T::Balance, T::Balance) { + Self::voters_for(ref_index).iter() + .map(|a| (>::balance(a), Self::vote_of((ref_index, a.clone())).expect("all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed"))) + .map(|(bal, vote)| if vote { (bal, Zero::zero()) } else { (Zero::zero(), bal) }) + .fold((Zero::zero(), Zero::zero()), |(a, b), (c, d)| (a + c, b + d)) + } + + // dispatching. + + /// Propose a sensitive action to be taken. + fn propose(aux: &T::PublicAux, proposal: Box, value: T::Balance) { + assert!(value >= Self::minimum_deposit()); + assert!(>::deduct_unbonded(aux.ref_into(), value)); + + let index = Self::public_prop_count(); + >::put(index + 1); + >::insert(index, (value, vec![aux.ref_into().clone()])); + + let mut props = Self::public_props(); + props.push((index, (*proposal).clone(), aux.ref_into().clone())); + >::put(props); + } + + /// Propose a sensitive action to be taken. + fn second(aux: &T::PublicAux, proposal: PropIndex) { + let mut deposit = Self::deposit_of(proposal).expect("can only second an existing proposal"); + assert!(>::deduct_unbonded(aux.ref_into(), deposit.0)); + + deposit.1.push(aux.ref_into().clone()); + >::insert(proposal, deposit); + } + + /// Vote in a referendum. If `approve_proposal` is true, the vote is to enact the proposal; + /// false would be a vote to keep the status quo.. + fn vote(aux: &T::PublicAux, ref_index: ReferendumIndex, approve_proposal: bool) { + if !Self::is_active_referendum(ref_index) { + panic!("vote given for invalid referendum.") + } + if >::balance(aux.ref_into()).is_zero() { + panic!("transactor must have balance to signal approval."); + } + if !>::exists(&(ref_index, aux.ref_into().clone())) { + let mut voters = Self::voters_for(ref_index); + voters.push(aux.ref_into().clone()); + >::insert(ref_index, voters); + } + >::insert(&(ref_index, aux.ref_into().clone()), approve_proposal); + } + + /// Start a referendum. + fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) { + Self::inject_referendum(>::block_number() + Self::voting_period(), *proposal, vote_threshold); + } + + /// Remove a referendum. + fn cancel_referendum(ref_index: ReferendumIndex) { + Self::clear_referendum(ref_index); + } + + // exposed mutables. + + /// Start a referendum. Can be called directly by the council. + pub fn internal_start_referendum(proposal: T::Proposal, vote_threshold: VoteThreshold) { + >::inject_referendum(>::block_number() + >::voting_period(), proposal, vote_threshold); + } + + /// Remove a referendum. Can be called directly by the council. + pub fn internal_cancel_referendum(ref_index: ReferendumIndex) { + >::clear_referendum(ref_index); + } + + // private. + + /// Start a referendum + fn inject_referendum( + end: T::BlockNumber, + proposal: T::Proposal, + vote_threshold: VoteThreshold + ) -> ReferendumIndex { + let ref_index = Self::referendum_count(); + if ref_index > 0 && Self::referendum_info(ref_index - 1).map(|i| i.0 > end).unwrap_or(false) { + panic!("Cannot inject a referendum that ends earlier than preceeding referendum"); + } + + >::put(ref_index + 1); + >::insert(ref_index, (end, proposal, vote_threshold)); + ref_index + } + + /// Remove all info on a referendum. + fn clear_referendum(ref_index: ReferendumIndex) { + >::remove(ref_index); + >::remove(ref_index); + for v in Self::voters_for(ref_index) { + >::remove((ref_index, v)); + } + } + + /// Current era is ending; we should finish up any proposals. + fn end_block(now: T::BlockNumber) { + // pick out another public referendum if it's time. + if (now % Self::launch_period()).is_zero() { + let mut public_props = Self::public_props(); + if let Some((winner_index, _)) = public_props.iter() + .enumerate() + .max_by_key(|x| Self::locked_for((x.1).0).expect("All current public proposals have an amount locked")) + { + let (prop_index, proposal, _) = public_props.swap_remove(winner_index); + let (deposit, depositors): (T::Balance, Vec) = + >::take(prop_index).expect("depositors always exist for current proposals"); + // refund depositors + for d in &depositors { + >::refund(d, deposit); + } + >::put(public_props); + Self::inject_referendum(now + Self::voting_period(), proposal, VoteThreshold::SuperMajorityApprove); + } + } + + // tally up votes for any expiring referenda. + for (index, _, proposal, vote_threshold) in Self::maturing_referendums_at(now) { + let (approve, against) = Self::tally(index); + let total_stake = >::total_stake(); + Self::clear_referendum(index); + if vote_threshold.approved(approve, against, total_stake) { + proposal.dispatch(); + } + >::put(index + 1); + } + } } impl Executable for Module { fn execute() { + Self::end_block(>::block_number()); + } +} + +/* + + +#[cfg(test)] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use runtime_support::{StorageList, StorageValue, StorageMap}; + use codec::Joiner; + use keyring::Keyring::*; + use runtime::{session, staking}; + + pub fn externalities() -> TestExternalities { + map![ + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![Alice.to_raw_public(), Bob.into(), Charlie.into()]), + twox_128(&staking::Intention::len_key()).to_vec() => vec![].and(&3u32), + twox_128(&staking::Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), + twox_128(&staking::Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), + twox_128(&staking::Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), + twox_128(&staking::FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), + twox_128(&staking::FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), + twox_128(&staking::FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), + twox_128(&staking::FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64), + twox_128(&staking::FreeBalanceOf::key_for(*Eve)).to_vec() => vec![].and(&50u64), + twox_128(&staking::FreeBalanceOf::key_for(*Ferdie)).to_vec() => vec![].and(&60u64), + twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![].and(&1u64), + twox_128(staking::TotalStake::key()).to_vec() => vec![].and(&210u64), + twox_128(staking::SessionsPerEra::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::ValidatorCount::key()).to_vec() => vec![].and(&3u64), + twox_128(staking::CurrentEra::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::TransactionFee::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::BondingDuration::key()).to_vec() => vec![].and(&0u64), + + twox_128(LaunchPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(MinimumDeposit::key()).to_vec() => vec![].and(&1u64) + ] } } + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::{KeyedVec, Joiner}; + use keyring::Keyring::*; + use demo_primitives::AccountId; + use dispatch::PrivCall as T::Proposal; + use runtime_support::PublicPass; + use super::public::Dispatch; + use super::privileged::Dispatch as PrivDispatch; + use runtime::{staking, session, democracy}; + + fn new_test_ext() -> TestExternalities { + testing::externalities() + } + + #[test] + fn params_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(launch_period(), 1u64); + assert_eq!(voting_period(), 1u64); + assert_eq!(minimum_deposit(), 1u64); + assert_eq!(referendum_count(), 0u32); + assert_eq!(staking::sessions_per_era(), 1u64); + assert_eq!(staking::total_stake(), 210u64); + }); + } + + // TODO: test VoteThreshold + + fn propose_sessions_per_era(who: &AccountId, value: u64, locked: T::Balance) { + PublicPass::test(who). + propose(Box::new(T::Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value))), locked); + } + + #[test] + fn locked_for_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 2u64); + propose_sessions_per_era(&Alice, 4, 4u64); + propose_sessions_per_era(&Alice, 3, 3u64); + assert_eq!(locked_for(0), Some(2)); + assert_eq!(locked_for(1), Some(4)); + assert_eq!(locked_for(2), Some(3)); + }); + } + + #[test] + fn single_proposal_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 1u64); + democracy::internal::end_block(system::block_number()); + + system::testing::set_block_number(2); + let r = 0; + PublicPass::test(&Alice).vote(r, true); + + assert_eq!(referendum_count(), 1); + assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); + assert_eq!(vote_of((r, *Alice)), Some(true)); + assert_eq!(tally(r), (10, 0)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 2u64); + }); + } + + #[test] + fn deposit_for_proposals_should_be_taken() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 5u64); + PublicPass::test(&Bob).second(0); + PublicPass::test(&Eve).second(0); + PublicPass::test(&Eve).second(0); + PublicPass::test(&Eve).second(0); + assert_eq!(staking::balance(&Alice), 5u64); + assert_eq!(staking::balance(&Bob), 15u64); + assert_eq!(staking::balance(&Eve), 35u64); + }); + } + + #[test] + fn deposit_for_proposals_should_be_returned() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 5u64); + PublicPass::test(&Bob).second(0); + PublicPass::test(&Eve).second(0); + PublicPass::test(&Eve).second(0); + PublicPass::test(&Eve).second(0); + democracy::internal::end_block(system::block_number()); + assert_eq!(staking::balance(&Alice), 10u64); + assert_eq!(staking::balance(&Bob), 20u64); + assert_eq!(staking::balance(&Eve), 50u64); + }); + } + + #[test] + #[should_panic] + fn proposal_with_deposit_below_minimum_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 0u64); + }); + } + + #[test] + #[should_panic] + fn poor_proposer_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Alice, 2, 11u64); + }); + } + + #[test] + #[should_panic] + fn poor_seconder_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + propose_sessions_per_era(&Bob, 2, 11u64); + PublicPass::test(&Alice).second(0); + }); + } + + fn propose_bonding_duration(who: &AccountId, value: u64, locked: T::Balance) { + PublicPass::test(who). + propose(Box::new(T::Proposal::Staking(staking::privileged::Call::set_bonding_duration(value))), locked); + } + + #[test] + fn runners_up_should_come_after() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(0); + propose_bonding_duration(&Alice, 2, 2u64); + propose_bonding_duration(&Alice, 4, 4u64); + propose_bonding_duration(&Alice, 3, 3u64); + democracy::internal::end_block(system::block_number()); + + system::testing::set_block_number(1); + PublicPass::test(&Alice).vote(0, true); + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + assert_eq!(staking::bonding_duration(), 4u64); + + system::testing::set_block_number(2); + PublicPass::test(&Alice).vote(1, true); + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + assert_eq!(staking::bonding_duration(), 3u64); + + system::testing::set_block_number(3); + PublicPass::test(&Alice).vote(2, true); + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + assert_eq!(staking::bonding_duration(), 2u64); + }); + } + + fn sessions_per_era_propsal(value: u64) -> T::Proposal { + T::Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) + } + + #[test] + fn simple_passing_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Alice).vote(r, true); + + assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); + assert_eq!(vote_of((r, *Alice)), Some(true)); + assert_eq!(tally(r), (10, 0)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 2u64); + }); + } + + #[test] + fn cancel_referendum_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Alice).vote(r, true); + PrivPass::test().cancel_referendum(r); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 1u64); + }); + } + + #[test] + fn simple_failing_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Alice).vote(r, false); + + assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); + assert_eq!(vote_of((r, *Alice)), Some(false)); + assert_eq!(tally(r), (0, 10)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 1u64); + }); + } + + #[test] + fn controversial_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Alice).vote(r, true); + PublicPass::test(&Bob).vote(r, false); + PublicPass::test(&Charlie).vote(r, false); + PublicPass::test(&Dave).vote(r, true); + PublicPass::test(&Eve).vote(r, false); + PublicPass::test(&Ferdie).vote(r, true); + + assert_eq!(tally(r), (110, 100)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 2u64); + }); + } + + #[test] + fn controversial_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Eve).vote(r, false); + PublicPass::test(&Ferdie).vote(r, true); + + assert_eq!(tally(r), (60, 50)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 1u64); + }); + } + + #[test] + fn passing_low_turnout_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(staking::era_length(), 1u64); + assert_eq!(staking::total_stake(), 210u64); + + system::testing::set_block_number(1); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Dave).vote(r, true); + PublicPass::test(&Eve).vote(r, false); + PublicPass::test(&Ferdie).vote(r, true); + + assert_eq!(tally(r), (100, 50)); + + democracy::internal::end_block(system::block_number()); + staking::internal::check_new_era(); + + assert_eq!(staking::era_length(), 2u64); + }); + } +} + + +*/ diff --git a/substrate/runtime/democracy/src/vote_threshold.rs b/substrate/runtime/democracy/src/vote_threshold.rs index bd6880f8425f5..abfecb652d33f 100644 --- a/substrate/runtime/democracy/src/vote_threshold.rs +++ b/substrate/runtime/democracy/src/vote_threshold.rs @@ -51,7 +51,7 @@ impl Slicable for VoteThreshold { } } -trait Approved { +pub trait Approved { /// Given `approve` votes for and `against` votes against from a total electorate size of /// `electorate` (`electorate - (approve + against)` are abstainers), then returns true if the /// overall outcome is in favour of approval. diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 88ec43465c5f1..654792f43e975 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -36,6 +36,29 @@ pub trait Convert { fn convert(a: A) -> B; } +pub trait As { + fn as_(self) -> T; + fn sa(T) -> Self; +} + +macro_rules! impl_numerics { + ( $( $t:ty ),* ) => { + $( + impl_numerics!($t: u8, u16, u32, u64, usize, i8, i16, i32, i64, isize,); + )* + }; + ( $f:ty : $t:ty, $( $rest:ty, )* ) => { + impl As<$t> for $f { + fn as_(self) -> $t { self as $t } + fn sa(t: $t) -> Self { t as Self } + } + impl_numerics!($f: $( $rest, )*); + }; + ( $f:ty : ) => {} +} + +impl_numerics!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); + pub struct Identity; impl Convert for Identity { fn convert(a: T) -> T { a } @@ -53,14 +76,14 @@ pub trait Hashing { } pub trait RefInto { - fn into(&self) -> &T; + fn ref_into(&self) -> &T; } impl RefInto for T { - fn into(&self) -> &T { &self } + fn ref_into(&self) -> &T { &self } } pub trait SimpleArithmetic: - Zero + One + IntegerSquareRoot + + Zero + One + IntegerSquareRoot + As + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + @@ -69,7 +92,7 @@ pub trait SimpleArithmetic: PartialOrd + Ord {} impl + Add + AddAssign + Sub + SubAssign + Mul + MulAssign + diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 58ccc8a6acd2e..5fa4199b76e35 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -82,7 +82,7 @@ impl Module { /// session. fn set_key(aux: &T::PublicAux, key: T::SessionKey) { // set new value for next session - >::insert(RefInto::into(aux), key) + >::insert(aux.ref_into(), key) } /// Set a new era length. Won't kick in until the next era change (at current length). diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index d5daaf9c93105..f15704968ea80 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -151,7 +151,7 @@ impl Module { /// Create a smart-contract account. pub fn create(aux: &T::PublicAux, code: &[u8], value: T::Balance) { // commit anything that made it this far to storage - if let Some(commit) = Self::effect_create(RefInto::into(aux), code, value, DirectExt) { + if let Some(commit) = Self::effect_create(aux.ref_into(), code, value, DirectExt) { Self::commit_state(commit); } } @@ -170,7 +170,7 @@ impl Module { /// TODO: probably want to state gas-limit and gas-price. fn transfer(aux: &T::PublicAux, dest: T::AccountId, value: T::Balance) { // commit anything that made it this far to storage - if let Some(commit) = Self::effect_transfer(RefInto::into(aux), &dest, value, DirectExt) { + if let Some(commit) = Self::effect_transfer(aux.ref_into(), &dest, value, DirectExt) { Self::commit_state(commit); } } @@ -181,10 +181,10 @@ impl Module { fn stake(aux: &T::PublicAux) { let mut intentions = >::get(); // can't be in the list twice. - assert!(intentions.iter().find(|&t| t == RefInto::into(aux)).is_none(), "Cannot stake if already staked."); - intentions.push(RefInto::into(aux).clone()); + assert!(intentions.iter().find(|&t| t == aux.ref_into()).is_none(), "Cannot stake if already staked."); + intentions.push(aux.ref_into().clone()); >::put(intentions); - >::insert(RefInto::into(aux), T::BlockNumber::max_value()); + >::insert(aux.ref_into(), T::BlockNumber::max_value()); } /// Retract the desire to stake for the transactor. @@ -192,13 +192,13 @@ impl Module { /// Effects will be felt at the beginning of the next era. fn unstake(aux: &T::PublicAux) { let mut intentions = >::get(); - if let Some(position) = intentions.iter().position(|t| t == RefInto::into(aux)) { + if let Some(position) = intentions.iter().position(|t| t == aux.ref_into()) { intentions.swap_remove(position); } else { panic!("Cannot unstake if not already staked."); } >::put(intentions); - >::insert(RefInto::into(aux), Self::current_era() + Self::bonding_duration()); + >::insert(aux.ref_into(), Self::current_era() + Self::bonding_duration()); } // PRIV DISPATCH From 443bdcaca2e6b6a533781b7c334b3e6ef93e01b1 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 12:29:07 +0900 Subject: [PATCH 38/76] Fix warning. --- substrate/runtime/democracy/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 0cc9c1cc46d5c..c0fd170ad06f9 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -21,7 +21,7 @@ #[cfg(feature = "std")] extern crate serde; extern crate substrate_codec as codec; -#[macro_use] extern crate substrate_runtime_std as rstd; +#[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; From 86c605b1e3a986c7fb1bbcfa1edf429f3c77a7e7 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 13:22:45 +0900 Subject: [PATCH 39/76] Traitify and integrate council module --- Cargo.lock | 21 + Cargo.toml | 1 + demo/runtime/Cargo.toml | 2 + demo/runtime/src/lib.rs | 1 + demo/runtime/src/runtime-old/council.rs | 1311 ----------------- demo/runtime/src/runtime.rs | 12 +- demo/runtime/wasm/Cargo.lock | 21 + demo/runtime/wasm/Cargo.toml | 2 + .../release/demo_runtime.compact.wasm | Bin 130582 -> 202526 bytes .../release/demo_runtime.wasm | Bin 130631 -> 202576 bytes substrate/runtime/council/Cargo.toml | 2 + substrate/runtime/council/src/lib.rs | 1295 +++++++++++++++- substrate/runtime/council/src/voting.rs | 48 + substrate/runtime/system/src/lib.rs | 2 +- 14 files changed, 1392 insertions(+), 1326 deletions(-) delete mode 100644 demo/runtime/src/runtime-old/council.rs diff --git a/Cargo.lock b/Cargo.lock index 2dc42a527f6e9..efe1cbe720848 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -262,6 +262,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", + "substrate-runtime-council 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", @@ -1779,6 +1780,26 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "substrate-runtime-council" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-democracy 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-democracy" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 0a48dac86ad50..1f6a3a3478c82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,7 @@ members = [ "substrate/runtime-std", "substrate/runtime-support", "substrate/runtime/consensus", + "substrate/runtime/council", "substrate/runtime/democracy", "substrate/runtime/executive", "substrate/runtime/primitives", diff --git a/demo/runtime/Cargo.toml b/demo/runtime/Cargo.toml index e04492e5c2169..cb9988ffc9e01 100644 --- a/demo/runtime/Cargo.toml +++ b/demo/runtime/Cargo.toml @@ -17,6 +17,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } substrate-keyring = { path = "../../substrate/keyring" } substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-council = { path = "../../substrate/runtime/council" } substrate-runtime-democracy = { path = "../../substrate/runtime/democracy" } substrate-runtime-executive = { path = "../../substrate/runtime/executive" } substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } @@ -35,6 +36,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-consensus/std", + "substrate-runtime-council/std", "substrate-runtime-democracy/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 060d8069c03f9..fa67bf5707276 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -25,6 +25,7 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_council as council; extern crate substrate_runtime_democracy as democracy; extern crate substrate_runtime_executive as executive; extern crate substrate_runtime_session as session; diff --git a/demo/runtime/src/runtime-old/council.rs b/demo/runtime/src/runtime-old/council.rs deleted file mode 100644 index c8e9f12fde7d6..0000000000000 --- a/demo/runtime/src/runtime-old/council.rs +++ /dev/null @@ -1,1311 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Council system: Handles the voting in and maintenance of council members. - -use rstd::prelude::*; -use codec::KeyedVec; -use runtime_support::{StorageMap, StorageValue, PublicPass, PrivPass}; -use demo_primitives::{AccountId, Hash, BlockNumber}; -use runtime::{staking, system, session}; -use runtime::staking::Balance; - -// no polynomial attacks: -// -// all unbonded public operations should be constant time. -// all other public operations must be linear time in terms of prior public operations and: -// - those "valid" ones that cost nothing be limited to a constant number per single protected operation -// - the rest costing the same order as the computational complexity -// all protected operations must complete in at most O(public operations) -// -// we assume "beneficial" transactions will have the same access as attack transactions. -// -// any storage requirements should be bonded by the same order as the volume. - -// public operations: -// - express approvals (you pay in a "voter" bond the first time you do this; O(1); one extra DB entry, one DB change) -// - remove active voter (you get your "voter" bond back; O(1); one fewer DB entry, one DB change) -// - remove inactive voter (either you or the target is removed; if the target, you get their "voter" bond back; O(1); one fewer DB entry, one DB change) -// - submit candidacy (you pay a "candidate" bond; O(1); one extra DB entry, two DB changes) -// - present winner/runner-up (you may pay a "presentation" bond of O(voters) if the presentation is invalid; O(voters) compute; ) -// protected operations: -// - remove candidacy (remove all votes for a candidate) (one fewer DB entry, two DB changes) - -// to avoid a potentially problematic case of not-enough approvals prior to voting causing a -// back-to-back votes that have no way of ending, then there's a forced grace period between votes. -// to keep the system as stateless as possible (making it a bit easier to reason about), we just -// restrict when votes can begin to blocks that lie on boundaries (`voting_period`). - -// for an approval vote of C councilers: - -// top K runners-up are maintained between votes. all others are discarded. -// - candidate removed & bond returned when elected. -// - candidate removed & bond burned when discarded. - -// at the point that the vote ends (), all voters' balances are snapshotted. - -// for B blocks following, there's a counting period whereby each of the candidates that believe -// they fall in the top K+C voted can present themselves. they get the total stake -// recorded (based on the snapshot); an ordered list is maintained (the leaderboard). Noone may -// present themselves that, if elected, would result in being included twice on the council -// (important since existing councilers will will have their approval votes as it may be that they -// don't get removed), nor if existing presenters would mean they're not in the top K+C. - -// following B blocks, the top C candidates are elected and have their bond returned. the top C -// candidates and all other candidates beyond the top C+K are cleared. - -// vote-clearing happens lazily; for an approval to count, the most recent vote at the time of the -// voter's most recent vote must be no later than the most recent vote at the time that the -// candidate in the approval position was registered there. as candidates are removed from the -// register and others join in their place, this prevent an approval meant for an earlier candidate -// being used to elect a new candidate. - -// the candidate list increases as needed, but the contents (though not really the capacity) reduce -// after each vote as all but K entries are cleared. newly registering candidates must use cleared -// entries before they increase the capacity. - -pub type VoteIndex = u32; - -storage_items! { - // parameters - // How much should be locked up in order to submit one's candidacy. - pub CandidacyBond get(candidacy_bond): b"cou:cbo" => required Balance; - // How much should be locked up in order to be able to submit votes. - pub VotingBond get(voting_bond): b"cou:vbo" => required Balance; - // The punishment, per voter, if you provide an invalid presentation. - pub PresentSlashPerVoter get(present_slash_per_voter): b"cou:pss" => required Balance; - // How many runners-up should have their approvals persist until the next vote. - pub CarryCount get(carry_count): b"cou:cco" => required u32; - // How long to give each top candidate to present themselves after the vote ends. - pub PresentationDuration get(presentation_duration): b"cou:pdu" => required BlockNumber; - // How many votes need to go by after a voter's last vote before they can be reaped if their - // approvals are moot. - pub InactiveGracePeriod get(inactivity_grace_period): b"cou:vgp" => required VoteIndex; - // How often (in blocks) to check for new votes. - pub VotingPeriod get(voting_period): b"cou:per" => required BlockNumber; - // How long each position is active for. - pub TermDuration get(term_duration): b"cou:trm" => required BlockNumber; - // Number of accounts that should be sitting on the council. - pub DesiredSeats get(desired_seats): b"cou:sts" => required u32; - - // permanent state (always relevant, changes only at the finalisation of voting) - // The current council. When there's a vote going on, this should still be used for executive - // matters. - pub ActiveCouncil get(active_council): b"cou:act" => default Vec<(AccountId, BlockNumber)>; - // The total number of votes that have happened or are in progress. - pub VoteCount get(vote_index): b"cou:vco" => default VoteIndex; - - // persistent state (always relevant, changes constantly) - // The last cleared vote index that this voter was last active at. - pub ApprovalsOf get(approvals_of): b"cou:apr" => default map [ AccountId => Vec ]; - // The vote index and list slot that the candidate `who` was registered or `None` if they are not - // currently registered. - pub RegisterInfoOf get(candidate_reg_info): b"cou:reg" => map [ AccountId => (VoteIndex, u32) ]; - // The last cleared vote index that this voter was last active at. - pub LastActiveOf get(voter_last_active): b"cou:lac" => map [ AccountId => VoteIndex ]; - // The present voter list. - pub Voters get(voters): b"cou:vrs" => default Vec; - // The present candidate list. - pub Candidates get(candidates): b"cou:can" => default Vec; // has holes - pub CandidateCount get(candidate_count): b"cou:cnc" => default u32; - - // temporary state (only relevant during finalisation/presentation) - // The accounts holding the seats that will become free on the next tally. - pub NextFinalise get(next_finalise): b"cou:nxt" => (BlockNumber, u32, Vec); - // The stakes as they were at the point that the vote ended. - pub SnapshotedStakes get(snapshoted_stakes): b"cou:sss" => required Vec; - // Get the leaderboard if we;re in the presentation phase. - pub Leaderboard get(leaderboard): b"cou:win" => Vec<(Balance, AccountId)>; // ORDERED low -> high -} - -/// True if we're currently in a presentation period. -pub fn presentation_active() -> bool { - NextFinalise::exists() -} - -/// If `who` a candidate at the moment? -pub fn is_a_candidate(who: &AccountId) -> bool { - RegisterInfoOf::exists(who) -} - -/// Determine the block that a vote can happen on which is no less than `n`. -pub fn next_vote_from(n: BlockNumber) -> BlockNumber { - let voting_period = voting_period(); - (n + voting_period - 1) / voting_period * voting_period -} - -/// The block number on which the tally for the next election will happen. `None` only if the -/// desired seats of the council is zero. -pub fn next_tally() -> Option { - let desired_seats = desired_seats(); - if desired_seats == 0 { - None - } else { - let c = active_council(); - let (next_possible, count, coming) = - if let Some((tally_end, comers, leavers)) = next_finalise() { - // if there's a tally in progress, then next tally can begin immediately afterwards - (tally_end, c.len() - leavers.len() + comers as usize, comers) - } else { - (system::block_number(), c.len(), 0) - }; - if count < desired_seats as usize { - Some(next_possible) - } else { - // next tally begins once enough council members expire to bring members below desired. - if desired_seats <= coming { - // the entire amount of desired seats is less than those new members - we'll have - // to wait until they expire. - Some(next_possible + term_duration()) - } else { - Some(c[c.len() - (desired_seats - coming) as usize].1) - } - }.map(next_vote_from) - } -} - -impl_dispatch! { - pub mod public; - fn set_approvals(self, votes: Vec, index: VoteIndex) = 0; - fn reap_inactive_voter(self, signed_index: u32, who: AccountId, who_index: u32, assumed_vote_index: VoteIndex) = 1; - fn retract_voter(self, index: u32) = 2; - fn submit_candidacy(self, slot: u32) = 3; - fn present_winner(self, candidate: AccountId, total: Balance, index: VoteIndex) = 4; -} - -impl<'a> public::Dispatch for PublicPass<'a> { - /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots - /// are registered. - fn set_approvals(self, votes: Vec, index: VoteIndex) { - assert!(!presentation_active()); - assert_eq!(index, vote_index()); - if !LastActiveOf::exists(*self) { - // not yet a voter - deduct bond. - staking::internal::reserve_balance(&self, voting_bond()); - Voters::put({ - let mut v = Voters::get(); - v.push(self.clone()); - v - }); - } - ApprovalsOf::insert(*self, votes); - LastActiveOf::insert(*self, index); - } - - /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices - /// must now be either unregistered or registered to a candidate that registered the slot after - /// the voter gave their last approval set. - /// - /// May be called by anyone. Returns the voter deposit to `signed`. - fn reap_inactive_voter(self, signed_index: u32, who: AccountId, who_index: u32, assumed_vote_index: VoteIndex) { - assert!(!presentation_active(), "cannot reap during presentation period"); - assert!(voter_last_active(*self).is_some(), "reaper must be a voter"); - let last_active = voter_last_active(&who).expect("target for inactivity cleanup must be active"); - assert!(assumed_vote_index == vote_index(), "vote index not current"); - assert!(last_active < assumed_vote_index - inactivity_grace_period(), "cannot reap during grace perid"); - let voters = voters(); - let signed_index = signed_index as usize; - let who_index = who_index as usize; - assert!(signed_index < voters.len() && voters[signed_index] == *self, "bad reporter index"); - assert!(who_index < voters.len() && voters[who_index] == who, "bad target index"); - - // will definitely kill one of signed or who now. - - let valid = !approvals_of(&who).iter() - .zip(candidates().iter()) - .any(|(&appr, addr)| - appr && - *addr != AccountId::default() && - candidate_reg_info(addr) - .expect("all items in candidates list are registered").0 <= last_active); - - remove_voter( - if valid { &who } else { &self }, - if valid { who_index } else { signed_index }, - voters - ); - if valid { - staking::internal::transfer_reserved_balance(&who, &self, voting_bond()); - } else { - staking::internal::slash_reserved(&self, voting_bond()); - } - } - - /// Remove a voter. All votes are cancelled and the voter deposit is returned. - fn retract_voter(self, index: u32) { - assert!(!presentation_active(), "cannot retract when presenting"); - assert!(LastActiveOf::exists(*self), "cannot retract non-voter"); - let voters = voters(); - let index = index as usize; - assert!(index < voters.len(), "retraction index invalid"); - assert!(voters[index] == *self, "retraction index mismatch"); - remove_voter(&self, index, voters); - staking::internal::unreserve_balance(&self, voting_bond()); - } - - /// Submit oneself for candidacy. - /// - /// Account must have enough transferrable funds in it to pay the bond. - fn submit_candidacy(self, slot: u32) { - assert!(!is_a_candidate(&self), "duplicate candidate submission"); - assert!(staking::internal::deduct_unbonded(&self, candidacy_bond()), "candidate has not enough funds"); - - let slot = slot as usize; - let count = CandidateCount::get() as usize; - let candidates = Candidates::get(); - assert!( - (slot == count && count == candidates.len()) || - (slot < candidates.len() && candidates[slot] == AccountId::default()), - "invalid candidate slot" - ); - - let mut candidates = candidates; - if slot == candidates.len() { - candidates.push(self.clone()); - } else { - candidates[slot] = self.clone(); - } - Candidates::put(candidates); - CandidateCount::put(count as u32 + 1); - RegisterInfoOf::insert(*self, (vote_index(), slot as u32)); - } - - /// Claim that `signed` is one of the top carry_count() + current_vote().1 candidates. - /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` - /// `signed` should have at least - fn present_winner(self, candidate: AccountId, total: Balance, index: VoteIndex) { - assert_eq!(index, vote_index(), "index not current"); - let (_, _, expiring) = NextFinalise::get() - .expect("cannot present outside of presentation period"); - let stakes = SnapshotedStakes::get(); - let voters = Voters::get(); - let bad_presentation_punishment = present_slash_per_voter() * voters.len() as Balance; - assert!(staking::can_slash(&self, bad_presentation_punishment), "presenter must have sufficient slashable funds"); - - let mut leaderboard = leaderboard().expect("leaderboard must exist while present phase active"); - assert!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); - - if let Some(p) = active_council().iter().position(|&(ref c, _)| c == &candidate) { - assert!(p < expiring.len(), "candidate must not form a duplicated member if elected"); - } - - let (registered_since, candidate_index): (VoteIndex, u32) = - RegisterInfoOf::get(candidate).expect("presented candidate must be current"); - let actual_total = voters.iter() - .zip(stakes.iter()) - .filter_map(|(voter, stake)| - match voter_last_active(voter) { - Some(b) if b >= registered_since => - approvals_of(voter).get(candidate_index as usize) - .and_then(|approved| if *approved { Some(*stake) } else { None }), - _ => None, - }) - .sum(); - let dupe = leaderboard.iter().find(|&&(_, ref c)| c == &candidate).is_some(); - if total == actual_total && !dupe { - // insert into leaderboard - leaderboard[0] = (total, candidate.clone()); - leaderboard.sort_by_key(|&(t, _)| t); - Leaderboard::put(leaderboard); - } else { - staking::internal::slash(&self, bad_presentation_punishment); - } - } -} - -impl_dispatch! { - pub mod privileged; - fn set_desired_seats(self, count: u32) = 0; - fn remove_member(self, who: AccountId) = 1; - fn set_presentation_duration(self, count: BlockNumber) = 2; - fn set_term_duration(self, count: BlockNumber) = 3; -} - -impl privileged::Dispatch for PrivPass { - /// Set the desired member count; if lower than the current count, then seats will not be up - /// election when they expire. If more, then a new vote will be started if one is not already - /// in progress. - fn set_desired_seats(self, count: u32) { - DesiredSeats::put(count); - } - - /// Remove a particular member. A tally will happen instantly (if not already in a presentation - /// period) to fill the seat if removal means that the desired members are not met. - /// This is effective immediately. - fn remove_member(self, who: AccountId) { - let new_council: Vec<(AccountId, BlockNumber)> = active_council() - .into_iter() - .filter(|i| i.0 != who) - .collect(); - ActiveCouncil::put(new_council); - } - - /// Set the presentation duration. If there is current a vote being presented for, will - /// invoke `finalise_vote`. - fn set_presentation_duration(self, count: BlockNumber) { - PresentationDuration::put(count); - } - - /// Set the presentation duration. If there is current a vote being presented for, will - /// invoke `finalise_vote`. - fn set_term_duration(self, count: BlockNumber) { - TermDuration::put(count); - } -} - -pub mod internal { - use super::*; - - /// Check there's nothing to do this block - pub fn end_block() { - let block_number = system::block_number(); - if block_number % voting_period() == 0 { - if let Some(number) = next_tally() { - if block_number == number { - start_tally(); - } - } - } - if let Some((number, _, _)) = next_finalise() { - if block_number == number { - finalise_tally(); - } - } - } -} - -/// Remove a voter from the system. Trusts that voters()[index] != voter. -fn remove_voter(voter: &AccountId, index: usize, mut voters: Vec) { - Voters::put({ voters.swap_remove(index); voters }); - ApprovalsOf::remove(voter); - LastActiveOf::remove(voter); -} - -/// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. -fn start_tally() { - let active_council = active_council(); - let desired_seats = desired_seats() as usize; - let number = system::block_number(); - let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0).collect::>(); - if active_council.len() - expiring.len() < desired_seats { - let empty_seats = desired_seats - (active_council.len() - expiring.len()); - NextFinalise::put((number + presentation_duration(), empty_seats as u32, expiring)); - - let voters = Voters::get(); - let votes = voters.iter().map(staking::balance).collect::>(); - SnapshotedStakes::put(votes); - - // initialise leaderboard. - let leaderboard_size = empty_seats + carry_count() as usize; - Leaderboard::put(vec![(0 as Balance, AccountId::default()); leaderboard_size]); - } -} - -/// Finalise the vote, removing each of the `removals` and inserting `seats` of the most approved -/// candidates in their place. If the total council members is less than the desired membership -/// a new vote is started. -/// Clears all presented candidates, returning the bond of the elected ones. -fn finalise_tally() { - SnapshotedStakes::kill(); - let (_, coming, expiring): (BlockNumber, u32, Vec) = NextFinalise::take() - .expect("finalise can only be called after a tally is started."); - let leaderboard: Vec<(Balance, AccountId)> = Leaderboard::take().unwrap_or_default(); - let new_expiry = system::block_number() + term_duration(); - - // return bond to winners. - let candidacy_bond = candidacy_bond(); - for &(_, ref w) in leaderboard.iter() - .rev() - .take_while(|&&(b, _)| b != 0) - .take(coming as usize) - { - staking::internal::refund(w, candidacy_bond); - } - - // set the new council. - let mut new_council: Vec<_> = active_council() - .into_iter() - .skip(expiring.len()) - .chain(leaderboard.iter() - .rev() - .take_while(|&&(b, _)| b != 0) - .take(coming as usize) - .cloned() - .map(|(_, a)| (a, new_expiry))) - .collect(); - new_council.sort_by_key(|&(_, expiry)| expiry); - ActiveCouncil::put(new_council); - - // clear all except runners-up from candidate list. - let candidates = Candidates::get(); - let mut new_candidates = vec![AccountId::default(); candidates.len()]; // shrink later. - let runners_up = leaderboard.into_iter() - .rev() - .take_while(|&(b, _)| b != 0) - .skip(coming as usize) - .map(|(_, a)| (a, candidate_reg_info(&a).expect("runner up must be registered").1)); - let mut count = 0u32; - for (address, slot) in runners_up { - new_candidates[slot as usize] = address; - count += 1; - } - for (old, new) in candidates.iter().zip(new_candidates.iter()) { - if old != new { - // removed - kill it - RegisterInfoOf::remove(old); - } - } - // discard any superfluous slots. - if let Some(last_index) = new_candidates.iter().rposition(|c| *c != AccountId::default()) { - new_candidates.truncate(last_index + 1); - } - Candidates::put(new_candidates); - CandidateCount::put(count); - VoteCount::put(vote_index() + 1); -} - -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::Joiner; - use runtime::democracy; - - pub fn externalities() -> TestExternalities { - let extras: TestExternalities = map![ - twox_128(CandidacyBond::key()).to_vec() => vec![].and(&9u64), - twox_128(VotingBond::key()).to_vec() => vec![].and(&3u64), - twox_128(PresentSlashPerVoter::key()).to_vec() => vec![].and(&1u64), - twox_128(CarryCount::key()).to_vec() => vec![].and(&2u32), - twox_128(PresentationDuration::key()).to_vec() => vec![].and(&2u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&4u64), - twox_128(TermDuration::key()).to_vec() => vec![].and(&5u64), - twox_128(DesiredSeats::key()).to_vec() => vec![].and(&2u32), - twox_128(InactiveGracePeriod::key()).to_vec() => vec![].and(&1u32) - ]; - democracy::testing::externalities() - .into_iter().chain(extras.into_iter()).collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use runtime::{staking, session, democracy}; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; - - fn new_test_ext() -> TestExternalities { - testing::externalities() - } - - #[test] - fn basic_environment_works() { - let mut t = new_test_ext(); - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(next_vote_from(1), 4); - assert_eq!(next_vote_from(4), 4); - assert_eq!(next_vote_from(5), 8); - assert_eq!(vote_index(), 0); - assert_eq!(candidacy_bond(), 9); - assert_eq!(voting_bond(), 3); - assert_eq!(present_slash_per_voter(), 1); - assert_eq!(presentation_duration(), 2); - assert_eq!(voting_period(), 4); - assert_eq!(term_duration(), 5); - assert_eq!(desired_seats(), 2); - assert_eq!(carry_count(), 2); - - assert_eq!(active_council(), vec![]); - assert_eq!(next_tally(), Some(4)); - assert_eq!(presentation_active(), false); - assert_eq!(next_finalise(), None); - - assert_eq!(candidates(), Vec::::new()); - assert_eq!(is_a_candidate(&Alice), false); - assert_eq!(candidate_reg_info(*Alice), None); - - assert_eq!(voters(), Vec::::new()); - assert_eq!(voter_last_active(*Alice), None); - assert_eq!(approvals_of(*Alice), vec![]); - }); - } - - #[test] - fn simple_candidate_submission_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - assert_eq!(candidate_reg_info(*Alice), None); - assert_eq!(candidate_reg_info(*Bob), None); - assert_eq!(is_a_candidate(&Alice), false); - assert_eq!(is_a_candidate(&Bob), false); - - PublicPass::test(&Alice).submit_candidacy(0); - assert_eq!(candidates(), vec![Alice.to_raw_public()]); - assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(*Bob), None); - assert_eq!(is_a_candidate(&Alice), true); - assert_eq!(is_a_candidate(&Bob), false); - - PublicPass::test(&Bob).submit_candidacy(1); - assert_eq!(candidates(), vec![Alice.to_raw_public(), Bob.into()]); - assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(*Bob), Some((0 as VoteIndex, 1u32))); - assert_eq!(is_a_candidate(&Alice), true); - assert_eq!(is_a_candidate(&Bob), true); - }); - } - - fn new_test_ext_with_candidate_holes() -> TestExternalities { - let mut t = new_test_ext(); - t.insert(twox_128(Candidates::key()).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()])); - t.insert(twox_128(CandidateCount::key()).to_vec(), vec![].and(&1u32)); - t.insert(twox_128(&RegisterInfoOf::key_for(*Alice)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); - t - } - - #[test] - fn candidate_submission_using_free_slot_should_work() { - let mut t = new_test_ext_with_candidate_holes(); - - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()]); - - PublicPass::test(&Bob).submit_candidacy(1); - assert_eq!(candidates(), vec![AccountId::default(), Bob.into(), Alice.to_raw_public()]); - - PublicPass::test(&Charlie).submit_candidacy(0); - assert_eq!(candidates(), vec![Charlie.into(), Bob.into(), Alice.to_raw_public()]); - }); - } - - #[test] - fn candidate_submission_using_alternative_free_slot_should_work() { - let mut t = new_test_ext_with_candidate_holes(); - - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); - - PublicPass::test(&Bob).submit_candidacy(0); - assert_eq!(candidates(), vec![Bob.into(), AccountId::default(), Alice.into()]); - - PublicPass::test(&Charlie).submit_candidacy(1); - assert_eq!(candidates(), vec![Bob.to_raw_public(), Charlie.into(), Alice.into()]); - }); - } - - #[test] - #[should_panic(expected = "invalid candidate slot")] - fn candidate_submission_not_using_free_slot_should_panic() { - let mut t = new_test_ext_with_candidate_holes(); - - with_externalities(&mut t, || { - system::testing::set_block_number(1); - PublicPass::test(&Dave).submit_candidacy(3); - }); - } - - #[test] - #[should_panic(expected = "invalid candidate slot")] - fn bad_candidate_slot_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(1); - }); - } - - #[test] - #[should_panic(expected = "invalid candidate slot")] - fn non_free_candidate_slot_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Bob).submit_candidacy(0); - }); - } - - #[test] - #[should_panic(expected = "duplicate candidate submission")] - fn dupe_candidate_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Alice).submit_candidacy(1); - }); - } - - #[test] - #[should_panic(expected = "candidate has not enough funds")] - fn poor_candidate_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&One).submit_candidacy(0); - }); - } - - #[test] - fn voting_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - - PublicPass::test(&Eve).submit_candidacy(0); - - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Dave).set_approvals(vec![true], 0); - - assert_eq!(approvals_of(*Alice), vec![true]); - assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into()]); - - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); - - PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); - - assert_eq!(approvals_of(*Alice), vec![true]); - assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - - assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into(), Bob.into(), Charlie.into()]); - }); - } - - #[test] - fn resubmitting_voting_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Dave).set_approvals(vec![true], 0); - - assert_eq!(approvals_of(*Dave), vec![true]); - - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); - - assert_eq!(approvals_of(*Dave), vec![true, false, true]); - }); - } - - #[test] - fn retracting_voter_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); - - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); - - assert_eq!(voters(), vec![Alice.to_raw_public(), Bob.into(), Charlie.into(), Dave.into()]); - assert_eq!(approvals_of(*Alice), vec![true]); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); - - PublicPass::test(&Alice).retract_voter(0); - - assert_eq!(voters(), vec![Dave.to_raw_public(), Bob.into(), Charlie.into()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); - - PublicPass::test(&Bob).retract_voter(1); - - assert_eq!(voters(), vec![Dave.to_raw_public(), Charlie.into()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), Vec::::new()); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); - - PublicPass::test(&Charlie).retract_voter(1); - - assert_eq!(voters(), vec![Dave.to_raw_public()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), Vec::::new()); - assert_eq!(approvals_of(*Charlie), Vec::::new()); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); - }); - } - - #[test] - #[should_panic(expected = "retraction index mismatch")] - fn invalid_retraction_index_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - PublicPass::test(&Alice).retract_voter(1); - }); - } - - #[test] - #[should_panic(expected = "retraction index invalid")] - fn overflow_retraction_index_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Alice).retract_voter(1); - }); - } - - #[test] - #[should_panic(expected = "cannot retract non-voter")] - fn non_voter_retraction_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).retract_voter(0); - }); - } - - #[test] - fn simple_tally_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - assert!(!presentation_active()); - - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - assert!(presentation_active()); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, Bob.into()), (41, Eve.into())])); - - internal::end_block(); - - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); - - assert!(!is_a_candidate(&Bob)); - assert!(!is_a_candidate(&Eve)); - assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(*Bob), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); - }); - } - - #[test] - fn double_presentations_should_be_punished() { - with_externalities(&mut new_test_ext(), || { - assert!(staking::can_slash(&Dave, 10)); - - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - internal::end_block(); - - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); - assert_eq!(staking::balance(&Dave), 38); - }); - } - - #[test] - fn retracting_inactive_voter_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); - internal::end_block(); - - PublicPass::test(&Eve).reap_inactive_voter( - voters().iter().position(|&i| i == *Eve).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, - 2 - ); - - assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(*Bob).len(), 0); - assert_eq!(staking::balance(&Bob), 17); - assert_eq!(staking::balance(&Eve), 53); - }); - } - - #[test] - #[should_panic(expected = "candidate must not form a duplicated member if elected")] - fn presenting_for_double_election_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); - }); - } - - #[test] - fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); - internal::end_block(); - - system::testing::set_block_number(11); - PublicPass::test(&Alice).submit_candidacy(0); - - PublicPass::test(&Eve).reap_inactive_voter( - voters().iter().position(|&i| i == *Eve).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, - 2 - ); - - assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(*Bob).len(), 0); - assert_eq!(staking::balance(&Bob), 17); - assert_eq!(staking::balance(&Eve), 53); - }); - } - - #[test] - #[should_panic(expected = "bad reporter index")] - fn retracting_inactive_voter_with_bad_reporter_index_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); - internal::end_block(); - - PublicPass::test(&Bob).reap_inactive_voter( - 42, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, - 2 - ); - }); - } - - #[test] - #[should_panic(expected = "bad target index")] - fn retracting_inactive_voter_with_bad_target_index_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); - internal::end_block(); - - PublicPass::test(&Bob).reap_inactive_voter( - voters().iter().position(|&i| i == *Bob).unwrap() as u32, - Bob.into(), 42, - 2 - ); - }); - } - - #[test] - fn attempting_to_retract_active_voter_should_slash_reporter() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Charlie).submit_candidacy(1); - PublicPass::test(&Dave).submit_candidacy(2); - PublicPass::test(&Eve).submit_candidacy(3); - PublicPass::test(&Bob).set_approvals(vec![true, false, false, false], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, false, false], 0); - PublicPass::test(&Dave).set_approvals(vec![false, false, true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PrivPass::test().set_desired_seats(3); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 1); - internal::end_block(); - - PublicPass::test(&Dave).reap_inactive_voter( - voters().iter().position(|&i| i == *Dave).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, - 2 - ); - - assert_eq!(voters(), vec![Bob.to_raw_public(), Charlie.into(), Eve.into()]); - assert_eq!(approvals_of(*Dave).len(), 0); - assert_eq!(staking::balance(&Dave), 37); - }); - } - - #[test] - #[should_panic(expected = "reaper must be a voter")] - fn attempting_to_retract_inactive_voter_by_nonvoter_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); - internal::end_block(); - - PublicPass::test(&Dave).reap_inactive_voter( - 0, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, - 2 - ); - }); - } - - #[test] - #[should_panic(expected = "candidate not worthy of leaderboard")] - fn presenting_loser_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - }); - } - - #[test] - fn presenting_loser_first_should_not_matter() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - - assert_eq!(leaderboard(), Some(vec![ - (21, Charlie.into()), - (31, Dave.into()), - (41, Eve.into()), - (60, Alice.to_raw_public()) - ])); - }); - } - - #[test] - #[should_panic(expected = "cannot present outside of presentation period")] - fn present_panics_outside_of_presentation_period() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - assert!(!presentation_active()); - PublicPass::test(&Eve).present_winner(Eve.into(), 1, 0); - }); - } - - #[test] - #[should_panic(expected = "index not current")] - fn present_panics_with_invalid_vote_index() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); - }); - } - - #[test] - #[should_panic(expected = "presenter must have sufficient slashable funds")] - fn present_panics_when_presenter_is_poor() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - assert!(!presentation_active()); - - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - assert_eq!(staking::balance(&Alice), 1); - PublicPass::test(&Alice).present_winner(Alice.into(), 30, 0); - }); - } - - #[test] - fn invalid_present_tally_should_slash() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - assert!(!presentation_active()); - assert_eq!(staking::balance(&Dave), 40); - - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 80, 0); - - assert_eq!(staking::balance(&Dave), 38); - }); - } - - #[test] - fn runners_up_should_be_kept() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - assert!(!presentation_active()); - - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); - - internal::end_block(); - - system::testing::set_block_number(6); - assert!(presentation_active()); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - assert_eq!(leaderboard(), Some(vec![ - (0, AccountId::default()), - (0, AccountId::default()), - (0, AccountId::default()), - (60, Alice.to_raw_public()) - ])); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - assert_eq!(leaderboard(), Some(vec![ - (21, Charlie.into()), - (31, Dave.into()), - (41, Eve.into()), - (60, Alice.to_raw_public()) - ])); - - internal::end_block(); - - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11)]); - - assert!(!is_a_candidate(&Alice)); - assert!(!is_a_candidate(&Eve)); - assert!(!is_a_candidate(&Bob)); - assert!(is_a_candidate(&Charlie)); - assert!(is_a_candidate(&Dave)); - assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(*Bob), Some(0)); - assert_eq!(voter_last_active(*Charlie), Some(0)); - assert_eq!(voter_last_active(*Dave), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); - assert_eq!(voter_last_active(*Ferdie), Some(0)); - assert_eq!(candidate_reg_info(*Charlie), Some((0, 2))); - assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); - }); - } - - #[test] - fn second_tally_should_use_runners_up() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); - internal::end_block(); - - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - internal::end_block(); - - system::testing::set_block_number(8); - PublicPass::test(&Ferdie).set_approvals(vec![false, false, true, false], 1); - PrivPass::test().set_desired_seats(3); - internal::end_block(); - - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Charlie.into(), 81, 1); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 1); - internal::end_block(); - - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11), (Charlie.into(), 15)]); - - assert!(!is_a_candidate(&Alice)); - assert!(!is_a_candidate(&Bob)); - assert!(!is_a_candidate(&Charlie)); - assert!(!is_a_candidate(&Eve)); - assert!(is_a_candidate(&Dave)); - assert_eq!(vote_index(), 2); - assert_eq!(voter_last_active(*Bob), Some(0)); - assert_eq!(voter_last_active(*Charlie), Some(0)); - assert_eq!(voter_last_active(*Dave), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); - assert_eq!(voter_last_active(*Ferdie), Some(1)); - - assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); - }); - } -} diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index d7c3a3c794c76..8cec2bfeec4ea 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -21,7 +21,8 @@ use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; use {block, demo_primitives, transaction}; -use {runtime_primitives, consensus, timestamp, system, session, staking, democracy, executive}; +use runtime_primitives; +use {consensus, council, democracy, executive, session, staking, system, timestamp}; use runtime_primitives::{Identity, HasPublicAux}; // TODO: move into runtime support/io. @@ -92,13 +93,16 @@ impl democracy::Trait for Concrete { } pub type Democracy = democracy::Module; +impl council::Trait for Concrete {} +pub type Council = council::Module; + impl_outer_dispatch! { pub enum Call where aux: ::PublicAux { Session = 1, Staking = 2, Timestamp = 3, Democracy = 5, -// Council = 6, + Council = 6, // CouncilVote = 7, } @@ -107,7 +111,7 @@ impl_outer_dispatch! { Session = 1, Staking = 2, Democracy = 5, -// Council = 6, + Council = 6, // CouncilVote = 7, } } @@ -117,5 +121,5 @@ pub type Executive = executive::Executive< transaction::CheckedTransaction, Concrete, block::Block, - ((Democracy, Staking), Session), + ((Council, Democracy), (Staking, Session)), >; diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index e429443c23fe7..ef691b3aa2ad2 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -110,6 +110,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", + "substrate-runtime-council 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", @@ -660,6 +661,26 @@ dependencies = [ "substrate-runtime-support 0.1.0", ] +[[package]] +name = "substrate-runtime-council" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-democracy 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-democracy" version = "0.1.0" diff --git a/demo/runtime/wasm/Cargo.toml b/demo/runtime/wasm/Cargo.toml index f7713bccdf7ad..32af7412f4b2c 100644 --- a/demo/runtime/wasm/Cargo.toml +++ b/demo/runtime/wasm/Cargo.toml @@ -15,6 +15,7 @@ substrate-runtime-std = { path = "../../../substrate/runtime-std", default-featu substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } +substrate-runtime-council = { path = "../../../substrate/runtime/council", default-features = false } substrate-runtime-democracy = { path = "../../../substrate/runtime/democracy", default-features = false } substrate-runtime-executive = { path = "../../../substrate/runtime/executive", default-features = false } substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives", default-features = false } @@ -34,6 +35,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-consensus/std", + "substrate-runtime-council/std", "substrate-runtime-democracy/std", "substrate-runtime-executive/std", "substrate-runtime-primitives/std", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index d1bbedcd78311949f8d4b11c401a64b3c412ae50..51ef7340401763c489550684efbd33e93f8d7ab0 100644 GIT binary patch literal 202526 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%0A~RnDFgr20cQao zsaC9{de*Lx?J;XI!V#o8b|<72!Td48X<}tmugtI%4Wq`%^9H)vn_Oe@xlo#M9W=xn)B{2M~izN>dU^%;$BwzL>TK+J^ zksrKS;^=iYumJEnDe-I>v+HsuDu3?fj#okX){i+x~_dFRt9bOGaU!gBlvyDsP* literal 130582 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 KB(`ke2LA#QffWn@ diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index aa780a3757c47d978ed858975fd79033a758f16c..e51fc837c0590bf0f461677c4922a509cef63638 100644 GIT binary patch literal 202576 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

p8?+4^_{NPr7kN~8MVK@SRLEE% zm=F_K5X=#o{a)5FucGQP3tNslF-FD|ZmCLS1$g;hcD&NEk07@_g%@Zqh-xsN0nFN)C1WIs&0XqtT?c{Ty3 zveeHyj-%2YqZp1aNOv$%(y?g5Vf8~WZ!wMXIPRm^W%7ciQBDu6$0#oiu+en{hPtHd z@Q-CC*$Bd!N_t3^A?uIW4LU+d2caWaAlYY^f2DoCWT8T_A!$}akumPF)c_B`mEfl` z494K~8HS642yU@PG7ObWT^hX3%`Xhn=4&d2RqNXP>`qoYhMRb%3Di2 zSr^}2v;^wGhg+eQ_lc`JSp#Jy6f?t5SR!EzF(2g_Vj{*P*z^$FdPs~ymlG(XMa85@ zHi)v6DA@t*#t^IS5)?5Gsk}S{n*@@?m^AJb0+0nVr7btaYLGI7_*UhIu9HjYUF!-3 zC?|m}i6_eBF1L#{9YvN_vYy!t!q9Z@{HIA%{CvAm0MlkjjD5)e`!TgA!#s zi2nAl&WZ$tpN*K_5$_AVE&aq&yb>vAjl&2Bf!^9mBzDN<4 zu@508dR@GReyAM}h~v zA=Rl|&IkKh4Mv4{m{$Pm67VQru~GkkXE!cb)nOBLo`S&iFf3KO8RaH$N43M1#ZdDl zFAcM!{0Y4RF8XjHEAE6tmw<~ttKq=a45OxQG4hW#)`StVmNSjzJYqNKfH-Y6#028l zC#{Ao!ZBn*NKLWI?Vw^){Mey*8PG7G2)7*Q-yLW!#QIPspOwt`Ii^sSHc#is5m^$I zRH7(k1c1@{1oXyN(EEo&?}-D}`ezeR^aIG7fJ$`%dtv`{P!|udhHU%FV#F1Uabe7j zC1d{OjCmi>0xSg5Plw{a9q32aLqoEtP?O2lY>*#f>P|e?A#ywP}o@ z1Pp1}!Ai|A05zHO%t0oD9RCQ`okQ?kdM6yZ1YGnfh1qR_Z@?u`2R^IeKsCmS+H(j) zIMzgFjP+xiDK13rg*qF~-BL+@RETuO>Js@EGms9(R4N~gncUZP=-6+qMuHmoF>FP9 zx!oZBH>bL0p`NCE#=y5Xc0yl}Mop`t7B!W|OiNGC;Ts_K+yV+qI)YP6mlo+;A9k)=XzI0PkHfoLGkV zIW8apOeK)NQ*}y+OYv!BhOrqzl9BY1Psw9&XK^r%I}Oh{hcBMcv7N&L7_6VT*nqv> z(!5Ad&CKA8ly*m#QHbHi)EOM`($`=xsK3(th6A!RlcWNc7Mq<*_Jn-`CYwoygfJ{A z#?*)Vd?t){89#L~cQ_ebM zU!H)d#RJz-05cAPdo+ILV%t|Czp4eu0=Wuew1oRWrRcSrX=~}wDN}zbbuD1f^%dmt zck(PtlZ2e(&j^{VL=@Gwi*_rip$Pr5-Qp#yMYR0FHZ#>LbgfMFmI<6gH#rv@Ts$zj zYSW5Pd{aPc&kUSA93ajw?7|6xOY8eU;tXw)h;5WnP(hZ(&(O^}^;<61j8hB+2qj@b zG3bP#0_DFR&j7xLIF*-@GCy~Hs?79#jQ1Ph8L!skPSNUNT(E&~X2vgE>j{0cKwnoT zZ`NkY;#K?<2CD@#L#JahPGqj3>8I7TVLe%EftT^@<_kH}Gs4@Jj$U zWB@MLR{V+!$_1E1(r|i#KZRtrP;bR42T@F5NM{MfB1iHB9tRlzoC!a49MLrb7Z6|G zSpqIN;Pl%7X93<>0{*K5&H}u%Qn8ZilwBd)Vb)}XgGhDkPDm@p-B~$qU!Q7cezm4tmz&8P5VsvR z&0b2uR-HmxH^cpgD8raVQN*N9ep-=pu{I0W!K}c_0E_QAP8D(NWw+)jFThXCm@u76 zVE9=VOCBV^mh4uNeA%05`NI%Le(+|Aqu1HMJix1@#M33r!f$UQolmFGd5pgf%kduy`S*ta literal 130631 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 pl&~V?4u8HAfAz8{K9ym&ax=. -//! Staking manager: Handles balances and periodically determines the best set of validators. +//! Council system: Handles the voting in and maintenance of council members. #![cfg_attr(not(feature = "std"), no_std)] @@ -22,43 +22,1318 @@ extern crate integer_sqrt; extern crate substrate_codec as codec; -extern crate substrate_runtime_std as rstd; +#[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_democracy as democracy; extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use rstd::cmp; -use rstd::marker::PhantomData; -use integer_sqrt::IntegerSquareRoot; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; -use runtime_support::{StorageValue, StorageMap, Parameter}; +use primitives::{Zero, One, Executable, RefInto, As}; +use runtime_support::{StorageValue, StorageMap}; -pub mod voting; +//pub mod voting; -pub trait Trait: staking::Trait { -} +// no polynomial attacks: +// +// all unbonded public operations should be constant time. +// all other public operations must be linear time in terms of prior public operations and: +// - those "valid" ones that cost nothing be limited to a constant number per single protected operation +// - the rest costing the same order as the computational complexity +// all protected operations must complete in at most O(public operations) +// +// we assume "beneficial" transactions will have the same access as attack transactions. +// +// any storage requirements should be bonded by the same order as the volume. + +// public operations: +// - express approvals (you pay in a "voter" bond the first time you do this; O(1); one extra DB entry, one DB change) +// - remove active voter (you get your "voter" bond back; O(1); one fewer DB entry, one DB change) +// - remove inactive voter (either you or the target is removed; if the target, you get their "voter" bond back; O(1); one fewer DB entry, one DB change) +// - submit candidacy (you pay a "candidate" bond; O(1); one extra DB entry, two DB changes) +// - present winner/runner-up (you may pay a "presentation" bond of O(voters) if the presentation is invalid; O(voters) compute; ) +// protected operations: +// - remove candidacy (remove all votes for a candidate) (one fewer DB entry, two DB changes) + +// to avoid a potentially problematic case of not-enough approvals prior to voting causing a +// back-to-back votes that have no way of ending, then there's a forced grace period between votes. +// to keep the system as stateless as possible (making it a bit easier to reason about), we just +// restrict when votes can begin to blocks that lie on boundaries (`voting_period`). + +// for an approval vote of C councilers: + +// top K runners-up are maintained between votes. all others are discarded. +// - candidate removed & bond returned when elected. +// - candidate removed & bond burned when discarded. + +// at the point that the vote ends (), all voters' balances are snapshotted. + +// for B blocks following, there's a counting period whereby each of the candidates that believe +// they fall in the top K+C voted can present themselves. they get the total stake +// recorded (based on the snapshot); an ordered list is maintained (the leaderboard). Noone may +// present themselves that, if elected, would result in being included twice on the council +// (important since existing councilers will will have their approval votes as it may be that they +// don't get removed), nor if existing presenters would mean they're not in the top K+C. + +// following B blocks, the top C candidates are elected and have their bond returned. the top C +// candidates and all other candidates beyond the top C+K are cleared. + +// vote-clearing happens lazily; for an approval to count, the most recent vote at the time of the +// voter's most recent vote must be no later than the most recent vote at the time that the +// candidate in the approval position was registered there. as candidates are removed from the +// register and others join in their place, this prevent an approval meant for an earlier candidate +// being used to elect a new candidate. + +// the candidate list increases as needed, but the contents (though not really the capacity) reduce +// after each vote as all but K entries are cleared. newly registering candidates must use cleared +// entries before they increase the capacity. + +pub type VoteIndex = u32; + +pub trait Trait: democracy::Trait {} decl_module! { pub struct Module; pub enum Call where aux: T::PublicAux { + fn set_approvals(aux, votes: Vec, index: VoteIndex) = 0; + fn reap_inactive_voter(aux, signed_index: u32, who: T::AccountId, who_index: u32, assumed_vote_index: VoteIndex) = 1; + fn retract_voter(aux, index: u32) = 2; + fn submit_candidacy(aux, slot: u32) = 3; + fn present_winner(aux, candidate: T::AccountId, total: T::Balance, index: VoteIndex) = 4; } pub enum PrivCall { + fn set_desired_seats(count: u32) = 0; + fn remove_member(who: T::AccountId) = 1; + fn set_presentation_duration(count: T::BlockNumber) = 2; + fn set_term_duration(count: T::BlockNumber) = 3; } } decl_storage! { trait Store for Module; + + // parameters + // How much should be locked up in order to submit one's candidacy. + pub CandidacyBond get(candidacy_bond): b"cou:cbo" => required T::Balance; + // How much should be locked up in order to be able to submit votes. + pub VotingBond get(voting_bond): b"cou:vbo" => required T::Balance; + // The punishment, per voter, if you provide an invalid presentation. + pub PresentSlashPerVoter get(present_slash_per_voter): b"cou:pss" => required T::Balance; + // How many runners-up should have their approvals persist until the next vote. + pub CarryCount get(carry_count): b"cou:cco" => required u32; + // How long to give each top candidate to present themselves after the vote ends. + pub PresentationDuration get(presentation_duration): b"cou:pdu" => required T::BlockNumber; + // How many votes need to go by after a voter's last vote before they can be reaped if their + // approvals are moot. + pub InactiveGracePeriod get(inactivity_grace_period): b"cou:vgp" => required VoteIndex; + // How often (in blocks) to check for new votes. + pub VotingPeriod get(voting_period): b"cou:per" => required T::BlockNumber; + // How long each position is active for. + pub TermDuration get(term_duration): b"cou:trm" => required T::BlockNumber; + // Number of accounts that should be sitting on the council. + pub DesiredSeats get(desired_seats): b"cou:sts" => required u32; + + // permanent state (always relevant, changes only at the finalisation of voting) + // The current council. When there's a vote going on, this should still be used for executive + // matters. + pub ActiveCouncil get(active_council): b"cou:act" => default Vec<(T::AccountId, T::BlockNumber)>; + // The total number of votes that have happened or are in progress. + pub VoteCount get(vote_index): b"cou:vco" => default VoteIndex; + + // persistent state (always relevant, changes constantly) + // The last cleared vote index that this voter was last active at. + pub ApprovalsOf get(approvals_of): b"cou:apr" => default map [ T::AccountId => Vec ]; + // The vote index and list slot that the candidate `who` was registered or `None` if they are not + // currently registered. + pub RegisterInfoOf get(candidate_reg_info): b"cou:reg" => map [ T::AccountId => (VoteIndex, u32) ]; + // The last cleared vote index that this voter was last active at. + pub LastActiveOf get(voter_last_active): b"cou:lac" => map [ T::AccountId => VoteIndex ]; + // The present voter list. + pub Voters get(voters): b"cou:vrs" => default Vec; + // The present candidate list. + pub Candidates get(candidates): b"cou:can" => default Vec; // has holes + pub CandidateCount get(candidate_count): b"cou:cnc" => default u32; + + // temporary state (only relevant during finalisation/presentation) + // The accounts holding the seats that will become free on the next tally. + pub NextFinalise get(next_finalise): b"cou:nxt" => (T::BlockNumber, u32, Vec); + // The stakes as they were at the point that the vote ended. + pub SnapshotedStakes get(snapshoted_stakes): b"cou:sss" => required Vec; + // Get the leaderboard if we;re in the presentation phase. + pub Leaderboard get(leaderboard): b"cou:win" => Vec<(T::Balance, T::AccountId)>; // ORDERED low -> high } impl Module { + + // exposed immutables. + + /// True if we're currently in a presentation period. + pub fn presentation_active() -> bool { + >::exists() + } + + /// If `who` a candidate at the moment? + pub fn is_a_candidate(who: &T::AccountId) -> bool { + >::exists(who) + } + + /// Determine the block that a vote can happen on which is no less than `n`. + pub fn next_vote_from(n: T::BlockNumber) -> T::BlockNumber { + let voting_period = Self::voting_period(); + (n + voting_period - One::one()) / voting_period * voting_period + } + + /// The block number on which the tally for the next election will happen. `None` only if the + /// desired seats of the council is zero. + pub fn next_tally() -> Option { + let desired_seats = Self::desired_seats(); + if desired_seats == 0 { + None + } else { + let c = Self::active_council(); + let (next_possible, count, coming) = + if let Some((tally_end, comers, leavers)) = Self::next_finalise() { + // if there's a tally in progress, then next tally can begin immediately afterwards + (tally_end, c.len() - leavers.len() + comers as usize, comers) + } else { + (>::block_number(), c.len(), 0) + }; + if count < desired_seats as usize { + Some(next_possible) + } else { + // next tally begins once enough council members expire to bring members below desired. + if desired_seats <= coming { + // the entire amount of desired seats is less than those new members - we'll have + // to wait until they expire. + Some(next_possible + Self::term_duration()) + } else { + Some(c[c.len() - (desired_seats - coming) as usize].1) + } + }.map(Self::next_vote_from) + } + } + + // dispatch + + /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots + /// are registered. + fn set_approvals(aux: &T::PublicAux, votes: Vec, index: VoteIndex) { + assert!(!Self::presentation_active()); + assert_eq!(index, Self::vote_index()); + if !>::exists(aux.ref_into()) { + // not yet a voter - deduct bond. + >::reserve_balance(aux.ref_into(), Self::voting_bond()); + >::put({ + let mut v = Self::voters(); + v.push(aux.ref_into().clone()); + v + }); + } + >::insert(aux.ref_into().clone(), votes); + >::insert(aux.ref_into(), index); + } + + /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices + /// must now be either unregistered or registered to a candidate that registered the slot after + /// the voter gave their last approval set. + /// + /// May be called by anyone. Returns the voter deposit to `signed`. + fn reap_inactive_voter(aux: &T::PublicAux, signed_index: u32, who: T::AccountId, who_index: u32, assumed_vote_index: VoteIndex) { + assert!(!Self::presentation_active(), "cannot reap during presentation period"); + assert!(Self::voter_last_active(aux.ref_into()).is_some(), "reaper must be a voter"); + let last_active = Self::voter_last_active(&who).expect("target for inactivity cleanup must be active"); + assert!(assumed_vote_index == Self::vote_index(), "vote index not current"); + assert!(last_active < assumed_vote_index - Self::inactivity_grace_period(), "cannot reap during grace perid"); + let voters = Self::voters(); + let signed_index = signed_index as usize; + let who_index = who_index as usize; + assert!(signed_index < voters.len() && &voters[signed_index] == aux.ref_into(), "bad reporter index"); + assert!(who_index < voters.len() && voters[who_index] == who, "bad target index"); + + // will definitely kill one of signed or who now. + + let valid = !Self::approvals_of(&who).iter() + .zip(Self::candidates().iter()) + .any(|(&appr, addr)| + appr && + *addr != T::AccountId::default() && + Self::candidate_reg_info(addr) + .expect("all items in candidates list are registered").0 <= last_active); + + Self::remove_voter( + if valid { &who } else { aux.ref_into() }, + if valid { who_index } else { signed_index }, + voters + ); + if valid { + >::transfer_reserved_balance(&who, aux.ref_into(), Self::voting_bond()); + } else { + >::slash_reserved(aux.ref_into(), Self::voting_bond()); + } + } + + /// Remove a voter. All votes are cancelled and the voter deposit is returned. + fn retract_voter(aux: &T::PublicAux, index: u32) { + assert!(!Self::presentation_active(), "cannot retract when presenting"); + assert!(>::exists(aux.ref_into()), "cannot retract non-voter"); + let voters = Self::voters(); + let index = index as usize; + assert!(index < voters.len(), "retraction index invalid"); + assert!(&voters[index] == aux.ref_into(), "retraction index mismatch"); + Self::remove_voter(aux.ref_into(), index, voters); + >::unreserve_balance(aux.ref_into(), Self::voting_bond()); + } + + /// Submit oneself for candidacy. + /// + /// Account must have enough transferrable funds in it to pay the bond. + fn submit_candidacy(aux: &T::PublicAux, slot: u32) { + assert!(!Self::is_a_candidate(aux.ref_into()), "duplicate candidate submission"); + assert!(>::deduct_unbonded(aux.ref_into(), Self::candidacy_bond()), "candidate has not enough funds"); + + let slot = slot as usize; + let count = Self::candidate_count() as usize; + let candidates = Self::candidates(); + assert!( + (slot == count && count == candidates.len()) || + (slot < candidates.len() && candidates[slot] == T::AccountId::default()), + "invalid candidate slot" + ); + + let mut candidates = candidates; + if slot == candidates.len() { + candidates.push(aux.ref_into().clone()); + } else { + candidates[slot] = aux.ref_into().clone(); + } + >::put(candidates); + >::put(count as u32 + 1); + >::insert(aux.ref_into(), (Self::vote_index(), slot as u32)); + } + + /// Claim that `signed` is one of the top Self::carry_count() + current_vote().1 candidates. + /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` + /// `signed` should have at least + fn present_winner(aux: &T::PublicAux, candidate: T::AccountId, total: T::Balance, index: VoteIndex) { + assert_eq!(index, Self::vote_index(), "index not current"); + let (_, _, expiring) = Self::next_finalise() + .expect("cannot present outside of presentation period"); + let stakes = Self::snapshoted_stakes(); + let voters = Self::voters(); + let bad_presentation_punishment = Self::present_slash_per_voter() * T::Balance::sa(voters.len()); + assert!(>::can_slash(aux.ref_into(), bad_presentation_punishment), "presenter must have sufficient slashable funds"); + + let mut leaderboard = Self::leaderboard().expect("leaderboard must exist while present phase active"); + assert!(total > leaderboard[0].0, "candidate not worthy of leaderboard"); + + if let Some(p) = Self::active_council().iter().position(|&(ref c, _)| c == &candidate) { + assert!(p < expiring.len(), "candidate must not form a duplicated member if elected"); + } + + let (registered_since, candidate_index): (VoteIndex, u32) = + Self::candidate_reg_info(&candidate).expect("presented candidate must be current"); + let actual_total = voters.iter() + .zip(stakes.iter()) + .filter_map(|(voter, stake)| + match Self::voter_last_active(voter) { + Some(b) if b >= registered_since => + Self::approvals_of(voter).get(candidate_index as usize) + .and_then(|approved| if *approved { Some(*stake) } else { None }), + _ => None, + }) + .fold(Zero::zero(), |acc, n| acc + n); + let dupe = leaderboard.iter().find(|&&(_, ref c)| c == &candidate).is_some(); + if total == actual_total && !dupe { + // insert into leaderboard + leaderboard[0] = (total, candidate); + leaderboard.sort_by_key(|&(t, _)| t); + >::put(leaderboard); + } else { + >::slash(aux.ref_into(), bad_presentation_punishment); + } + } + + /// Set the desired member count; if lower than the current count, then seats will not be up + /// election when they expire. If more, then a new vote will be started if one is not already + /// in progress. + fn set_desired_seats(count: u32) { + >::put(count); + } + + /// Remove a particular member. A tally will happen instantly (if not already in a presentation + /// period) to fill the seat if removal means that the desired members are not met. + /// This is effective immediately. + fn remove_member(who: T::AccountId) { + let new_council: Vec<(T::AccountId, T::BlockNumber)> = Self::active_council() + .into_iter() + .filter(|i| i.0 != who) + .collect(); + >::put(new_council); + } + + /// Set the presentation duration. If there is current a vote being presented for, will + /// invoke `finalise_vote`. + fn set_presentation_duration(count: T::BlockNumber) { + >::put(count); + } + + /// Set the presentation duration. If there is current a vote being presented for, will + /// invoke `finalise_vote`. + fn set_term_duration(count: T::BlockNumber) { + >::put(count); + } + + // private + + /// Check there's nothing to do this block + fn end_block(block_number: T::BlockNumber) { + if (block_number % Self::voting_period()).is_zero() { + if let Some(number) = Self::next_tally() { + if block_number == number { + Self::start_tally(); + } + } + } + if let Some((number, _, _)) = Self::next_finalise() { + if block_number == number { + Self::finalise_tally(); + } + } + } + + /// Remove a voter from the system. Trusts that Self::voters()[index] != voter. + fn remove_voter(voter: &T::AccountId, index: usize, mut voters: Vec) { + >::put({ voters.swap_remove(index); voters }); + >::remove(voter); + >::remove(voter); + } + + /// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. + fn start_tally() { + let active_council = Self::active_council(); + let desired_seats = Self::desired_seats() as usize; + let number = >::block_number(); + let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0.clone()).collect::>(); + if active_council.len() - expiring.len() < desired_seats { + let empty_seats = desired_seats - (active_council.len() - expiring.len()); + >::put((number + Self::presentation_duration(), empty_seats as u32, expiring)); + + let voters = Self::voters(); + let votes = voters.iter().map(>::balance).collect::>(); + >::put(votes); + + // initialise leaderboard. + let leaderboard_size = empty_seats + Self::carry_count() as usize; + >::put(vec![(T::Balance::zero(), T::AccountId::default()); leaderboard_size]); + } + } + + /// Finalise the vote, removing each of the `removals` and inserting `seats` of the most approved + /// candidates in their place. If the total council members is less than the desired membership + /// a new vote is started. + /// Clears all presented candidates, returning the bond of the elected ones. + fn finalise_tally() { + >::kill(); + let (_, coming, expiring): (T::BlockNumber, u32, Vec) = >::take() + .expect("finalise can only be called after a tally is started."); + let leaderboard: Vec<(T::Balance, T::AccountId)> = >::take().unwrap_or_default(); + let new_expiry = >::block_number() + Self::term_duration(); + + // return bond to winners. + let candidacy_bond = Self::candidacy_bond(); + for &(_, ref w) in leaderboard.iter() + .rev() + .take_while(|&&(b, _)| !b.is_zero()) + .take(coming as usize) + { + >::refund(w, candidacy_bond); + } + + // set the new council. + let mut new_council: Vec<_> = Self::active_council() + .into_iter() + .skip(expiring.len()) + .chain(leaderboard.iter() + .rev() + .take_while(|&&(b, _)| !b.is_zero()) + .take(coming as usize) + .cloned() + .map(|(_, a)| (a, new_expiry))) + .collect(); + new_council.sort_by_key(|&(_, expiry)| expiry); + >::put(new_council); + + // clear all except runners-up from candidate list. + let candidates = Self::candidates(); + let mut new_candidates = vec![T::AccountId::default(); candidates.len()]; // shrink later. + let runners_up = leaderboard.into_iter() + .rev() + .take_while(|&(b, _)| !b.is_zero()) + .skip(coming as usize) + .map(|(_, a)| { let i = Self::candidate_reg_info(&a).expect("runner up must be registered").1; (a, i) }); + let mut count = 0u32; + for (address, slot) in runners_up { + new_candidates[slot as usize] = address; + count += 1; + } + for (old, new) in candidates.iter().zip(new_candidates.iter()) { + if old != new { + // removed - kill it + >::remove(old); + } + } + // discard any superfluous slots. + if let Some(last_index) = new_candidates.iter().rposition(|c| *c != T::AccountId::default()) { + new_candidates.truncate(last_index + 1); + } + >::put(new_candidates); + >::put(count); + >::put(Self::vote_index() + 1); + } } impl Executable for Module { fn execute() { + Self::end_block(>::block_number()); + } +} + +/* + +#[cfg(test)] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use codec::Joiner; + use runtime::democracy; + + pub fn externalities() -> TestExternalities { + let extras: TestExternalities = map![ + twox_128(CandidacyBond::key()).to_vec() => vec![].and(&9u64), + twox_128(VotingBond::key()).to_vec() => vec![].and(&3u64), + twox_128(PresentSlashPerVoter::key()).to_vec() => vec![].and(&1u64), + twox_128(CarryCount::key()).to_vec() => vec![].and(&2u32), + twox_128(PresentationDuration::key()).to_vec() => vec![].and(&2u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&4u64), + twox_128(TermDuration::key()).to_vec() => vec![].and(&5u64), + twox_128(DesiredSeats::key()).to_vec() => vec![].and(&2u32), + twox_128(InactiveGracePeriod::key()).to_vec() => vec![].and(&1u32) + ]; + democracy::testing::externalities() + .into_iter().chain(extras.into_iter()).collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::{KeyedVec, Joiner}; + use keyring::Keyring::*; + use demo_primitives::AccountId; + use runtime::{staking, session, democracy}; + use super::public::Dispatch; + use super::privileged::Dispatch as PrivDispatch; + + fn new_test_ext() -> TestExternalities { + testing::externalities() + } + + #[test] + fn basic_environment_works() { + let mut t = new_test_ext(); + with_externalities(&mut t, || { + system::testing::set_block_number(1); + assert_eq!(next_vote_from(1), 4); + assert_eq!(next_vote_from(4), 4); + assert_eq!(next_vote_from(5), 8); + assert_eq!(vote_index(), 0); + assert_eq!(candidacy_bond(), 9); + assert_eq!(voting_bond(), 3); + assert_eq!(present_slash_per_voter(), 1); + assert_eq!(presentation_duration(), 2); + assert_eq!(voting_period(), 4); + assert_eq!(term_duration(), 5); + assert_eq!(desired_seats(), 2); + assert_eq!(carry_count(), 2); + + assert_eq!(active_council(), vec![]); + assert_eq!(next_tally(), Some(4)); + assert_eq!(presentation_active(), false); + assert_eq!(next_finalise(), None); + + assert_eq!(candidates(), Vec::::new()); + assert_eq!(is_a_candidate(&Alice), false); + assert_eq!(candidate_reg_info(*Alice), None); + + assert_eq!(voters(), Vec::::new()); + assert_eq!(voter_last_active(*Alice), None); + assert_eq!(approvals_of(*Alice), vec![]); + }); + } + + #[test] + fn simple_candidate_submission_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(candidates(), Vec::::new()); + assert_eq!(candidate_reg_info(*Alice), None); + assert_eq!(candidate_reg_info(*Bob), None); + assert_eq!(is_a_candidate(&Alice), false); + assert_eq!(is_a_candidate(&Bob), false); + + PublicPass::test(&Alice).submit_candidacy(0); + assert_eq!(candidates(), vec![Alice.to_raw_public()]); + assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(*Bob), None); + assert_eq!(is_a_candidate(&Alice), true); + assert_eq!(is_a_candidate(&Bob), false); + + PublicPass::test(&Bob).submit_candidacy(1); + assert_eq!(candidates(), vec![Alice.to_raw_public(), Bob.into()]); + assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(*Bob), Some((0 as VoteIndex, 1u32))); + assert_eq!(is_a_candidate(&Alice), true); + assert_eq!(is_a_candidate(&Bob), true); + }); + } + + fn new_test_ext_with_candidate_holes() -> TestExternalities { + let mut t = new_test_ext(); + t.insert(twox_128(Candidates::key()).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()])); + t.insert(twox_128(CandidateCount::key()).to_vec(), vec![].and(&1u32)); + t.insert(twox_128(&RegisterInfoOf::key_for(*Alice)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); + t + } + + #[test] + fn candidate_submission_using_free_slot_should_work() { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + system::testing::set_block_number(1); + assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()]); + + PublicPass::test(&Bob).submit_candidacy(1); + assert_eq!(candidates(), vec![AccountId::default(), Bob.into(), Alice.to_raw_public()]); + + PublicPass::test(&Charlie).submit_candidacy(0); + assert_eq!(candidates(), vec![Charlie.into(), Bob.into(), Alice.to_raw_public()]); + }); + } + + #[test] + fn candidate_submission_using_alternative_free_slot_should_work() { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + system::testing::set_block_number(1); + assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); + + PublicPass::test(&Bob).submit_candidacy(0); + assert_eq!(candidates(), vec![Bob.into(), AccountId::default(), Alice.into()]); + + PublicPass::test(&Charlie).submit_candidacy(1); + assert_eq!(candidates(), vec![Bob.to_raw_public(), Charlie.into(), Alice.into()]); + }); + } + + #[test] + #[should_panic(expected = "invalid candidate slot")] + fn candidate_submission_not_using_free_slot_should_panic() { + let mut t = new_test_ext_with_candidate_holes(); + + with_externalities(&mut t, || { + system::testing::set_block_number(1); + PublicPass::test(&Dave).submit_candidacy(3); + }); + } + + #[test] + #[should_panic(expected = "invalid candidate slot")] + fn bad_candidate_slot_submission_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(candidates(), Vec::::new()); + PublicPass::test(&Alice).submit_candidacy(1); + }); + } + + #[test] + #[should_panic(expected = "invalid candidate slot")] + fn non_free_candidate_slot_submission_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(candidates(), Vec::::new()); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Bob).submit_candidacy(0); + }); + } + + #[test] + #[should_panic(expected = "duplicate candidate submission")] + fn dupe_candidate_submission_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(candidates(), Vec::::new()); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Alice).submit_candidacy(1); + }); + } + + #[test] + #[should_panic(expected = "candidate has not enough funds")] + fn poor_candidate_submission_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(candidates(), Vec::::new()); + PublicPass::test(&One).submit_candidacy(0); + }); + } + + #[test] + fn voting_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + + PublicPass::test(&Eve).submit_candidacy(0); + + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Dave).set_approvals(vec![true], 0); + + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Dave), vec![true]); + assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into()]); + + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Charlie).submit_candidacy(2); + + PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); + PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); + + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Dave), vec![true]); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + + assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into(), Bob.into(), Charlie.into()]); + }); + } + + #[test] + fn resubmitting_voting_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Dave).set_approvals(vec![true], 0); + + assert_eq!(approvals_of(*Dave), vec![true]); + + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Charlie).submit_candidacy(2); + PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); + + assert_eq!(approvals_of(*Dave), vec![true, false, true]); + }); + } + + #[test] + fn retracting_voter_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Charlie).submit_candidacy(2); + + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); + PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); + PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); + + assert_eq!(voters(), vec![Alice.to_raw_public(), Bob.into(), Charlie.into(), Dave.into()]); + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); + + PublicPass::test(&Alice).retract_voter(0); + + assert_eq!(voters(), vec![Dave.to_raw_public(), Bob.into(), Charlie.into()]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); + + PublicPass::test(&Bob).retract_voter(1); + + assert_eq!(voters(), vec![Dave.to_raw_public(), Charlie.into()]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); + + PublicPass::test(&Charlie).retract_voter(1); + + assert_eq!(voters(), vec![Dave.to_raw_public()]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(approvals_of(*Charlie), Vec::::new()); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); + }); + } + + #[test] + #[should_panic(expected = "retraction index mismatch")] + fn invalid_retraction_index_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + PublicPass::test(&Charlie).submit_candidacy(0); + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + PublicPass::test(&Alice).retract_voter(1); + }); + } + + #[test] + #[should_panic(expected = "retraction index invalid")] + fn overflow_retraction_index_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + PublicPass::test(&Charlie).submit_candidacy(0); + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Alice).retract_voter(1); + }); + } + + #[test] + #[should_panic(expected = "cannot retract non-voter")] + fn non_voter_retraction_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + PublicPass::test(&Charlie).submit_candidacy(0); + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Bob).retract_voter(0); + }); + } + + #[test] + fn simple_tally_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + assert!(!presentation_active()); + + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Eve).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + assert!(presentation_active()); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, Bob.into()), (41, Eve.into())])); + + internal::end_block(); + + assert!(!presentation_active()); + assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); + + assert!(!is_a_candidate(&Bob)); + assert!(!is_a_candidate(&Eve)); + assert_eq!(vote_index(), 1); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); + }); + } + + #[test] + fn double_presentations_should_be_punished() { + with_externalities(&mut new_test_ext(), || { + assert!(staking::can_slash(&Dave, 10)); + + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Eve).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + internal::end_block(); + + assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); + assert_eq!(staking::balance(&Dave), 38); + }); + } + + #[test] + fn retracting_inactive_voter_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + internal::end_block(); + + PublicPass::test(&Eve).reap_inactive_voter( + voters().iter().position(|&i| i == *Eve).unwrap() as u32, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2 + ); + + assert_eq!(voters(), vec![Eve.to_raw_public()]); + assert_eq!(approvals_of(*Bob).len(), 0); + assert_eq!(staking::balance(&Bob), 17); + assert_eq!(staking::balance(&Eve), 53); + }); + } + + #[test] + #[should_panic(expected = "candidate must not form a duplicated member if elected")] + fn presenting_for_double_election_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + }); + } + + #[test] + fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + internal::end_block(); + + system::testing::set_block_number(11); + PublicPass::test(&Alice).submit_candidacy(0); + + PublicPass::test(&Eve).reap_inactive_voter( + voters().iter().position(|&i| i == *Eve).unwrap() as u32, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2 + ); + + assert_eq!(voters(), vec![Eve.to_raw_public()]); + assert_eq!(approvals_of(*Bob).len(), 0); + assert_eq!(staking::balance(&Bob), 17); + assert_eq!(staking::balance(&Eve), 53); + }); + } + + #[test] + #[should_panic(expected = "bad reporter index")] + fn retracting_inactive_voter_with_bad_reporter_index_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); + internal::end_block(); + + PublicPass::test(&Bob).reap_inactive_voter( + 42, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2 + ); + }); + } + + #[test] + #[should_panic(expected = "bad target index")] + fn retracting_inactive_voter_with_bad_target_index_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); + internal::end_block(); + + PublicPass::test(&Bob).reap_inactive_voter( + voters().iter().position(|&i| i == *Bob).unwrap() as u32, + Bob.into(), 42, + 2 + ); + }); + } + + #[test] + fn attempting_to_retract_active_voter_should_slash_reporter() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Charlie).submit_candidacy(1); + PublicPass::test(&Dave).submit_candidacy(2); + PublicPass::test(&Eve).submit_candidacy(3); + PublicPass::test(&Bob).set_approvals(vec![true, false, false, false], 0); + PublicPass::test(&Charlie).set_approvals(vec![false, true, false, false], 0); + PublicPass::test(&Dave).set_approvals(vec![false, false, true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, false, false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PrivPass::test().set_desired_seats(3); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 1); + internal::end_block(); + + PublicPass::test(&Dave).reap_inactive_voter( + voters().iter().position(|&i| i == *Dave).unwrap() as u32, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2 + ); + + assert_eq!(voters(), vec![Bob.to_raw_public(), Charlie.into(), Eve.into()]); + assert_eq!(approvals_of(*Dave).len(), 0); + assert_eq!(staking::balance(&Dave), 37); + }); + } + + #[test] + #[should_panic(expected = "reaper must be a voter")] + fn attempting_to_retract_inactive_voter_by_nonvoter_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + internal::end_block(); + + PublicPass::test(&Dave).reap_inactive_voter( + 0, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2 + ); + }); + } + + #[test] + #[should_panic(expected = "candidate not worthy of leaderboard")] + fn presenting_loser_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Ferdie).set_approvals(vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![false, true], 0); + PublicPass::test(&Charlie).submit_candidacy(2); + PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); + PublicPass::test(&Dave).submit_candidacy(3); + PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); + PublicPass::test(&Eve).submit_candidacy(4); + PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + }); + } + + #[test] + fn presenting_loser_first_should_not_matter() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Ferdie).set_approvals(vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![false, true], 0); + PublicPass::test(&Charlie).submit_candidacy(2); + PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); + PublicPass::test(&Dave).submit_candidacy(3); + PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); + PublicPass::test(&Eve).submit_candidacy(4); + PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + + assert_eq!(leaderboard(), Some(vec![ + (21, Charlie.into()), + (31, Dave.into()), + (41, Eve.into()), + (60, Alice.to_raw_public()) + ])); + }); + } + + #[test] + #[should_panic(expected = "cannot present outside of presentation period")] + fn present_panics_outside_of_presentation_period() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + assert!(!presentation_active()); + PublicPass::test(&Eve).present_winner(Eve.into(), 1, 0); + }); + } + + #[test] + #[should_panic(expected = "index not current")] + fn present_panics_with_invalid_vote_index() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Eve).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + }); + } + + #[test] + #[should_panic(expected = "presenter must have sufficient slashable funds")] + fn present_panics_when_presenter_is_poor() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + assert!(!presentation_active()); + + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Eve).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + assert_eq!(staking::balance(&Alice), 1); + PublicPass::test(&Alice).present_winner(Alice.into(), 30, 0); + }); + } + + #[test] + fn invalid_present_tally_should_slash() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + assert!(!presentation_active()); + assert_eq!(staking::balance(&Dave), 40); + + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Eve).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![true, false], 0); + PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Bob.into(), 80, 0); + + assert_eq!(staking::balance(&Dave), 38); + }); + } + + #[test] + fn runners_up_should_be_kept() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + assert!(!presentation_active()); + + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Ferdie).set_approvals(vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![false, true], 0); + PublicPass::test(&Charlie).submit_candidacy(2); + PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); + PublicPass::test(&Dave).submit_candidacy(3); + PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); + PublicPass::test(&Eve).submit_candidacy(4); + PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + + internal::end_block(); + + system::testing::set_block_number(6); + assert!(presentation_active()); + PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); + assert_eq!(leaderboard(), Some(vec![ + (0, AccountId::default()), + (0, AccountId::default()), + (0, AccountId::default()), + (60, Alice.to_raw_public()) + ])); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + assert_eq!(leaderboard(), Some(vec![ + (21, Charlie.into()), + (31, Dave.into()), + (41, Eve.into()), + (60, Alice.to_raw_public()) + ])); + + internal::end_block(); + + assert!(!presentation_active()); + assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11)]); + + assert!(!is_a_candidate(&Alice)); + assert!(!is_a_candidate(&Eve)); + assert!(!is_a_candidate(&Bob)); + assert!(is_a_candidate(&Charlie)); + assert!(is_a_candidate(&Dave)); + assert_eq!(vote_index(), 1); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Charlie), Some(0)); + assert_eq!(voter_last_active(*Dave), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); + assert_eq!(voter_last_active(*Ferdie), Some(0)); + assert_eq!(candidate_reg_info(*Charlie), Some((0, 2))); + assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); + }); + } + + #[test] + fn second_tally_should_use_runners_up() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(4); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Ferdie).set_approvals(vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Bob).set_approvals(vec![false, true], 0); + PublicPass::test(&Charlie).submit_candidacy(2); + PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); + PublicPass::test(&Dave).submit_candidacy(3); + PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); + PublicPass::test(&Eve).submit_candidacy(4); + PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + internal::end_block(); + + system::testing::set_block_number(6); + PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + internal::end_block(); + + system::testing::set_block_number(8); + PublicPass::test(&Ferdie).set_approvals(vec![false, false, true, false], 1); + PrivPass::test().set_desired_seats(3); + internal::end_block(); + + system::testing::set_block_number(10); + PublicPass::test(&Dave).present_winner(Charlie.into(), 81, 1); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 1); + internal::end_block(); + + assert!(!presentation_active()); + assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11), (Charlie.into(), 15)]); + + assert!(!is_a_candidate(&Alice)); + assert!(!is_a_candidate(&Bob)); + assert!(!is_a_candidate(&Charlie)); + assert!(!is_a_candidate(&Eve)); + assert!(is_a_candidate(&Dave)); + assert_eq!(vote_index(), 2); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Charlie), Some(0)); + assert_eq!(voter_last_active(*Dave), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); + assert_eq!(voter_last_active(*Ferdie), Some(1)); + + assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); + }); } } +*/ diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index e69de29bb2d1d..72edee9adffc0 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -0,0 +1,48 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Council voting system. + +use rstd::prelude::*; +use rstd::cmp; +use rstd::marker::PhantomData; +use integer_sqrt::IntegerSquareRoot; +//use runtime_io::{twox_128, TestExternalities}; +use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; +use runtime_support::{StorageValue, StorageMap, Parameter}; + +pub trait Trait: super::Trait { +} + +decl_module! { + pub struct Module; + pub enum Call where aux: T::PublicAux { + } + pub enum PrivCall { + } +} + +decl_storage! { + trait Store for Module; +} + +impl Module { +} + +impl Executable for Module { + fn execute() { + } +} diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index d3593887b2ce3..938599c40a20c 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -44,7 +44,7 @@ pub trait Trait { type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; type Digest: Parameter + Default + Digesty; - type AccountId: Parameter + Ord; + type AccountId: Parameter + Ord + Default; type Header: Headery; } From 318f175083bf431ed6b8b127b01c1eb5bcadc6eb Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 14:01:57 +0900 Subject: [PATCH 40/76] Council voting. --- demo/runtime/src/runtime-old/council_vote.rs | 491 ------------------- demo/runtime/src/runtime.rs | 19 +- substrate/runtime/council/src/lib.rs | 2 +- substrate/runtime/council/src/voting.rs | 460 ++++++++++++++++- substrate/runtime/democracy/src/lib.rs | 8 +- 5 files changed, 477 insertions(+), 503 deletions(-) delete mode 100644 demo/runtime/src/runtime-old/council_vote.rs diff --git a/demo/runtime/src/runtime-old/council_vote.rs b/demo/runtime/src/runtime-old/council_vote.rs deleted file mode 100644 index 252caec043a3e..0000000000000 --- a/demo/runtime/src/runtime-old/council_vote.rs +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Council voting system. - -use rstd::prelude::*; -use rstd::borrow::Borrow; -use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; -use runtime_support::{PublicPass, PrivPass, Hashable, StorageValue, StorageMap}; -use demo_primitives::{AccountId, Hash, BlockNumber}; -use runtime::{system, democracy, council}; -use runtime::staking::{Balance}; -use dispatch::PrivCall as Proposal; - -type ProposalHash = [u8; 32]; - -storage_items! { - pub CooloffPeriod get(cooloff_period): b"cov:cooloff" => required BlockNumber; - pub VotingPeriod get(voting_period): b"cov:period" => required BlockNumber; - pub Proposals get(proposals): b"cov:prs" => default Vec<(BlockNumber, ProposalHash)>; // ordered by expiry. - pub ProposalOf get(proposal_of): b"cov:pro" => map [ ProposalHash => Proposal ]; - pub ProposalVoters get(proposal_voters): b"cov:voters:" => default map [ ProposalHash => Vec ]; - pub CouncilVoteOf get(vote_of): b"cov:vote:" => map [ (ProposalHash, AccountId) => bool ]; - pub VetoedProposal get(veto_of): b"cov:veto:" => map [ ProposalHash => (BlockNumber, Vec) ]; -} - -pub fn is_vetoed>(proposal: B) -> bool { - VetoedProposal::get(proposal.borrow()) - .map(|(expiry, _): (BlockNumber, Vec)| system::block_number() < expiry) - .unwrap_or(false) -} - -fn set_veto_of(proposal: &ProposalHash, expiry: BlockNumber, vetoers: Vec) { - VetoedProposal::insert(proposal, (expiry, vetoers)); -} - -fn kill_veto_of(proposal: &ProposalHash) { - VetoedProposal::remove(proposal); -} - -pub fn will_still_be_councillor_at(who: &AccountId, n: BlockNumber) -> bool { - council::active_council().iter() - .find(|&&(ref a, _)| a == who) - .map(|&(_, expires)| expires > n) - .unwrap_or(false) -} - -pub fn is_councillor(who: &AccountId) -> bool { - council::active_council().iter() - .any(|&(ref a, _)| a == who) -} - -pub fn tally(proposal_hash: &ProposalHash) -> (u32, u32, u32) { - generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| CouncilVoteOf::get((*p, *w))) -} - -fn take_tally(proposal_hash: &ProposalHash) -> (u32, u32, u32) { - generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| CouncilVoteOf::take((*p, *w))) -} - -fn generic_tally Option>(proposal_hash: &ProposalHash, vote_of: F) -> (u32, u32, u32) { - let c = council::active_council(); - let (approve, reject) = c.iter() - .filter_map(|&(ref a, _)| vote_of(a, proposal_hash)) - .map(|approve| if approve { (1, 0) } else { (0, 1) }) - .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)); - (approve, reject, c.len() as u32 - approve - reject) -} - -fn set_proposals(p: &Vec<(BlockNumber, ProposalHash)>) { - Proposals::put(p); -} - -fn take_proposal_if_expiring_at(n: BlockNumber) -> Option<(Proposal, ProposalHash)> { - let mut proposals = proposals(); - match proposals.first() { - Some(&(expiry, hash)) if expiry == n => { - // yes this is horrible, but fixing it will need substantial work in storage. - set_proposals(&proposals[1..].to_vec()); - let proposal = ProposalOf::take(hash).expect("all queued proposal hashes must have associated proposals"); - Some((proposal, hash)) - } - _ => None, - } -} - -impl_dispatch! { - pub mod public; - fn propose(self, proposal: Box) = 0; - fn vote(self, proposal: ProposalHash, approve: bool) = 1; - fn veto(self, proposal_hash: ProposalHash) = 2; -} - -impl<'a> public::Dispatch for PublicPass<'a> { - fn propose(self, proposal: Box) { - let expiry = system::block_number() + voting_period(); - assert!(will_still_be_councillor_at(&self, expiry)); - - let proposal_hash = proposal.blake2_256(); - - assert!(!is_vetoed(&proposal_hash)); - - let mut proposals = proposals(); - proposals.push((expiry, proposal_hash)); - proposals.sort_by_key(|&(expiry, _)| expiry); - set_proposals(&proposals); - - ProposalOf::insert(proposal_hash, *proposal); - ProposalVoters::insert(proposal_hash, vec![*self]); - CouncilVoteOf::insert((proposal_hash, *self), true); - } - - fn vote(self, proposal: ProposalHash, approve: bool) { - if vote_of((*self, proposal)).is_none() { - let mut voters = proposal_voters(&proposal); - voters.push(*self); - ProposalVoters::insert(proposal, voters); - } - CouncilVoteOf::insert((proposal, *self), approve); - } - - fn veto(self, proposal_hash: ProposalHash) { - assert!(is_councillor(&self), "only councillors may veto council proposals"); - assert!(ProposalVoters::exists(&proposal_hash), "proposal must exist to be vetoed"); - - let mut existing_vetoers = veto_of(&proposal_hash) - .map(|pair| pair.1) - .unwrap_or_else(Vec::new); - let insert_position = existing_vetoers.binary_search(&self) - .expect_err("a councillor may not veto a proposal twice"); - existing_vetoers.insert(insert_position, *self); - set_veto_of(&proposal_hash, system::block_number() + cooloff_period(), existing_vetoers); - - set_proposals(&proposals().into_iter().filter(|&(_, h)| h != proposal_hash).collect::>()); - ProposalVoters::remove(proposal_hash); - ProposalOf::remove(proposal_hash); - for (c, _) in council::active_council() { - CouncilVoteOf::remove((proposal_hash, c)); - } - } -} - -impl_dispatch! { - pub mod privileged; - fn set_cooloff_period(self, blocks: BlockNumber) = 0; - fn set_voting_period(self, blocks: BlockNumber) = 1; -} - -impl privileged::Dispatch for PrivPass { - fn set_cooloff_period(self, blocks: BlockNumber) { - CooloffPeriod::put(blocks); - } - - fn set_voting_period(self, blocks: BlockNumber) { - VotingPeriod::put(blocks); - } -} - -pub mod internal { - use super::*; - use runtime::democracy::privileged::Dispatch; - use runtime::democracy::VoteThreshold; - use runtime::democracy::internal::start_referendum; - - pub fn end_block(now: BlockNumber) { - while let Some((proposal, proposal_hash)) = take_proposal_if_expiring_at(now) { - let tally = take_tally(&proposal_hash); - if let &Proposal::Democracy(democracy::privileged::Call::cancel_referendum(ref_index)) = &proposal { - if let (_, 0, 0) = tally { - democracy::internal::cancel_referendum(ref_index); - } - } else { - if tally.0 > tally.1 + tally.2 { - kill_veto_of(&proposal_hash); - match tally { - (_, 0, 0) => start_referendum(proposal, VoteThreshold::SuperMajorityAgainst), - _ => start_referendum(proposal, VoteThreshold::SimpleMajority), - }; - } - } - } - } -} - -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use keyring::Keyring::{Alice, Bob, Charlie}; - use codec::Joiner; - use runtime::{council, democracy}; - - pub fn externalities() -> TestExternalities { - let expiry: BlockNumber = 10; - let extras: TestExternalities = map![ - twox_128(council::ActiveCouncil::key()).to_vec() => vec![].and(&vec![ - (Alice.to_raw_public(), expiry), - (Bob.into(), expiry), - (Charlie.into(), expiry) - ]), - twox_128(CooloffPeriod::key()).to_vec() => vec![].and(&2u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(democracy::VotingPeriod::key()).to_vec() => vec![].and(&3u64) - ]; - council::testing::externalities() - .into_iter().chain(extras.into_iter()).collect() - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::{Alice, Bob, Charlie, Dave}; - use demo_primitives::AccountId; - use runtime::democracy::VoteThreshold; - use runtime::{staking, council, democracy}; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; - - fn new_test_ext() -> TestExternalities { - testing::externalities() - } - - #[test] - fn basic_environment_works() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(staking::bonding_duration(), 0); - assert_eq!(cooloff_period(), 2); - assert_eq!(voting_period(), 1); - assert_eq!(will_still_be_councillor_at(&Alice, 1), true); - assert_eq!(will_still_be_councillor_at(&Alice, 10), false); - assert_eq!(will_still_be_councillor_at(&Dave, 10), false); - assert_eq!(is_councillor(&Alice), true); - assert_eq!(is_councillor(&Dave), false); - assert_eq!(proposals(), Vec::<(BlockNumber, ProposalHash)>::new()); - assert_eq!(proposal_voters(ProposalHash::default()), Vec::::new()); - assert_eq!(is_vetoed(&ProposalHash::default()), false); - assert_eq!(vote_of((*Alice, ProposalHash::default())), None); - assert_eq!(tally(&ProposalHash::default()), (0, 0, 3)); - }); - } - - fn sessions_per_era_proposal(value: u64) -> Proposal { - Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) - } - - fn bonding_duration_proposal(value: u64) -> Proposal { - Proposal::Staking(staking::privileged::Call::set_bonding_duration(value)) - } - - fn cancel_referendum_proposal(id: u32) -> Proposal { - Proposal::Democracy(democracy::privileged::Call::cancel_referendum(id)) - } - - #[test] - fn referendum_cancellation_should_work_when_unanimous() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - staking::public_pass_from_payment(&Charlie).vote(hash, true); - assert_eq!(proposals(), vec![(2, hash)]); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![]); - assert_eq!(staking::bonding_duration(), 0); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_not_unanimous() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - staking::public_pass_from_payment(&Charlie).vote(hash, false); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); - }); - } - - #[test] - fn referendum_cancellation_should_fail_when_abstentions() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - - let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); - }); - } - - #[test] - fn veto_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); - }); - } - - #[test] - #[should_panic] - fn double_veto_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - }); - } - - #[test] - #[should_panic] - fn retry_in_cooloff_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(2); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - }); - } - - #[test] - fn retry_after_cooloff_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(hash, false); - staking::public_pass_from_payment(&Charlie).vote(hash, true); - internal::end_block(3); - - system::testing::set_block_number(4); - internal::end_block(4); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 7, bonding_duration_proposal(42), VoteThreshold::SimpleMajority)]); - }); - } - - #[test] - fn alternative_double_veto_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Charlie).veto(hash); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn simple_propose_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - assert_eq!(proposals().len(), 1); - assert_eq!(proposal_voters(&hash), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((hash, *Alice)), Some(true)); - assert_eq!(tally(&hash), (1, 0, 2)); - }); - } - - #[test] - fn unvoted_proposal_should_expire_without_action() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - assert_eq!(tally(&proposal.blake2_256()), (1, 0, 2)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); - }); - } - - #[test] - fn unanimous_proposal_should_expire_with_biased_referendum() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); - staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), true); - assert_eq!(tally(&proposal.blake2_256()), (3, 0, 0)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SuperMajorityAgainst)]); - }); - } - - #[test] - fn majority_proposal_should_expire_with_unbiased_referendum() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); - staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), false); - assert_eq!(tally(&proposal.blake2_256()), (2, 1, 0)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SimpleMajority)]); - }); - } - - #[test] - #[should_panic] - fn propose_by_public_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Dave).propose(Box::new(proposal)); - }); - } -} diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 8cec2bfeec4ea..1affab7f8c4f4 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -49,6 +49,18 @@ impl staking::ContractAddressFor for BlakeTwo256 { } } +// TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into +// Some(its own PrivCall) or None. +impl democracy::IsCancelReferendum for PrivCall { + fn is_cancel_referendum(&self) -> Option { + if let &PrivCall::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { + Some(*ref_index) + } else { + None + } + } +} + pub struct Concrete; impl HasPublicAux for Concrete { @@ -95,6 +107,7 @@ pub type Democracy = democracy::Module; impl council::Trait for Concrete {} pub type Council = council::Module; +pub type CouncilVoting = council::voting::Module; impl_outer_dispatch! { pub enum Call where aux: ::PublicAux { @@ -103,7 +116,7 @@ impl_outer_dispatch! { Timestamp = 3, Democracy = 5, Council = 6, -// CouncilVote = 7, + CouncilVoting = 7, } pub enum PrivCall { @@ -112,7 +125,7 @@ impl_outer_dispatch! { Staking = 2, Democracy = 5, Council = 6, -// CouncilVote = 7, + CouncilVoting = 7, } } @@ -121,5 +134,5 @@ pub type Executive = executive::Executive< transaction::CheckedTransaction, Concrete, block::Block, - ((Council, Democracy), (Staking, Session)), + ((((Council, CouncilVoting), Democracy), Staking), Session), >; diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index cecc24f78f063..65788c6de4ced 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -36,7 +36,7 @@ use rstd::prelude::*; use primitives::{Zero, One, Executable, RefInto, As}; use runtime_support::{StorageValue, StorageMap}; -//pub mod voting; +pub mod voting; // no polynomial attacks: // diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 72edee9adffc0..c250d4f64ddc8 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -17,32 +17,478 @@ //! Council voting system. use rstd::prelude::*; -use rstd::cmp; -use rstd::marker::PhantomData; -use integer_sqrt::IntegerSquareRoot; +use rstd::borrow::Borrow; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable}; +use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable, RefInto, Hashing}; use runtime_support::{StorageValue, StorageMap, Parameter}; - -pub trait Trait: super::Trait { -} +use super::{Trait, system, democracy, Module as Council}; +use democracy::IsCancelReferendum; decl_module! { pub struct Module; pub enum Call where aux: T::PublicAux { + fn propose(aux, proposal: Box) = 0; + fn vote(aux, proposal: T::Hash, approve: bool) = 1; + fn veto(aux, proposal_hash: T::Hash) = 2; } pub enum PrivCall { + fn set_cooloff_period(blocks: T::BlockNumber) = 0; + fn set_voting_period(blocks: T::BlockNumber) = 1; } } decl_storage! { trait Store for Module; + + pub CooloffPeriod get(cooloff_period): b"cov:cooloff" => required T::BlockNumber; + pub VotingPeriod get(voting_period): b"cov:period" => required T::BlockNumber; + pub Proposals get(proposals): b"cov:prs" => default Vec<(T::BlockNumber, T::Hash)>; // ordered by expiry. + pub ProposalOf get(proposal_of): b"cov:pro" => map [ T::Hash => T::Proposal ]; + pub ProposalVoters get(proposal_voters): b"cov:voters:" => default map [ T::Hash => Vec ]; + pub CouncilVoteOf get(vote_of): b"cov:vote:" => map [ (T::Hash, T::AccountId) => bool ]; + pub VetoedProposal get(veto_of): b"cov:veto:" => map [ T::Hash => (T::BlockNumber, Vec) ]; } impl Module { + pub fn is_vetoed>(proposal: B) -> bool { + Self::veto_of(proposal.borrow()) + .map(|(expiry, _): (T::BlockNumber, Vec)| >::block_number() < expiry) + .unwrap_or(false) + } + + pub fn will_still_be_councillor_at(who: &T::AccountId, n: T::BlockNumber) -> bool { + >::active_council().iter() + .find(|&&(ref a, _)| a == who) + .map(|&(_, expires)| expires > n) + .unwrap_or(false) + } + + pub fn is_councillor(who: &T::AccountId) -> bool { + >::active_council().iter() + .any(|&(ref a, _)| a == who) + } + + pub fn tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { + Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| Self::vote_of((*p, w.clone()))) + } + + // Dispatch + fn propose(aux: &T::PublicAux, proposal: Box) { + let expiry = >::block_number() + Self::voting_period(); + assert!(Self::will_still_be_councillor_at(aux.ref_into(), expiry)); + + let proposal_hash = T::Hashing::hash_of(&proposal); + + assert!(!Self::is_vetoed(&proposal_hash)); + + let mut proposals = Self::proposals(); + proposals.push((expiry, proposal_hash)); + proposals.sort_by_key(|&(expiry, _)| expiry); + Self::set_proposals(&proposals); + + >::insert(proposal_hash, *proposal); + >::insert(proposal_hash, vec![aux.ref_into().clone()]); + >::insert((proposal_hash, aux.ref_into().clone()), true); + } + + fn vote(aux: &T::PublicAux, proposal: T::Hash, approve: bool) { + if Self::vote_of((proposal, aux.ref_into().clone())).is_none() { + let mut voters = Self::proposal_voters(&proposal); + voters.push(aux.ref_into().clone()); + >::insert(proposal, voters); + } + >::insert((proposal, aux.ref_into().clone()), approve); + } + + fn veto(aux: &T::PublicAux, proposal_hash: T::Hash) { + assert!(Self::is_councillor(aux.ref_into()), "only councillors may veto council proposals"); + assert!(>::exists(&proposal_hash), "proposal must exist to be vetoed"); + + let mut existing_vetoers = Self::veto_of(&proposal_hash) + .map(|pair| pair.1) + .unwrap_or_else(Vec::new); + let insert_position = existing_vetoers.binary_search(aux.ref_into()) + .expect_err("a councillor may not veto a proposal twice"); + existing_vetoers.insert(insert_position, aux.ref_into().clone()); + Self::set_veto_of(&proposal_hash, >::block_number() + Self::cooloff_period(), existing_vetoers); + + Self::set_proposals(&Self::proposals().into_iter().filter(|&(_, h)| h != proposal_hash).collect::>()); + >::remove(proposal_hash); + >::remove(proposal_hash); + for (c, _) in >::active_council() { + >::remove((proposal_hash, c)); + } + } + + fn set_cooloff_period(blocks: T::BlockNumber) { + >::put(blocks); + } + + fn set_voting_period(blocks: T::BlockNumber) { + >::put(blocks); + } + + // private + + + fn set_veto_of(proposal: &T::Hash, expiry: T::BlockNumber, vetoers: Vec) { + >::insert(proposal, (expiry, vetoers)); + } + + fn kill_veto_of(proposal: &T::Hash) { + >::remove(proposal); + } + + fn take_tally(proposal_hash: &T::Hash) -> (u32, u32, u32) { + Self::generic_tally(proposal_hash, |w: &T::AccountId, p: &T::Hash| >::take((*p, w.clone()))) + } + + fn generic_tally Option>(proposal_hash: &T::Hash, vote_of: F) -> (u32, u32, u32) { + let c = >::active_council(); + let (approve, reject) = c.iter() + .filter_map(|&(ref a, _)| vote_of(a, proposal_hash)) + .map(|approve| if approve { (1, 0) } else { (0, 1) }) + .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)); + (approve, reject, c.len() as u32 - approve - reject) + } + + fn set_proposals(p: &Vec<(T::BlockNumber, T::Hash)>) { + >::put(p); + } + + fn take_proposal_if_expiring_at(n: T::BlockNumber) -> Option<(T::Proposal, T::Hash)> { + let mut proposals = Self::proposals(); + match proposals.first() { + Some(&(expiry, hash)) if expiry == n => { + // yes this is horrible, but fixing it will need substantial work in storage. + Self::set_proposals(&proposals[1..].to_vec()); + let proposal = >::take(hash).expect("all queued proposal hashes must have associated proposals"); + Some((proposal, hash)) + } + _ => None, + } + } + + fn end_block(now: T::BlockNumber) { + while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { + let tally = Self::take_tally(&proposal_hash); + if let Some(ref_index) = proposal.is_cancel_referendum() { + if let (_, 0, 0) = tally { + >::internal_cancel_referendum(ref_index); + } + } else { + if tally.0 > tally.1 + tally.2 { + Self::kill_veto_of(&proposal_hash); + match tally { + (_, 0, 0) => >::internal_start_referendum(proposal, democracy::VoteThreshold::SuperMajorityAgainst), + _ => >::internal_start_referendum(proposal, democracy::VoteThreshold::SimpleMajority), + }; + } + } + } + } } impl Executable for Module { fn execute() { + Self::end_block(>::block_number()); + } +} + +/* + +#[cfg(test)] +pub mod testing { + use super::*; + use runtime_io::{twox_128, TestExternalities}; + use keyring::Keyring::{Alice, Bob, Charlie}; + use codec::Joiner; + use runtime::{council, democracy}; + + pub fn externalities() -> TestExternalities { + let expiry: BlockNumber = 10; + let extras: TestExternalities = map![ + twox_128(council::ActiveCouncil::key()).to_vec() => vec![].and(&vec![ + (Alice.to_raw_public(), expiry), + (Bob.into(), expiry), + (Charlie.into(), expiry) + ]), + twox_128(CooloffPeriod::key()).to_vec() => vec![].and(&2u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(democracy::VotingPeriod::key()).to_vec() => vec![].and(&3u64) + ]; + council::testing::externalities() + .into_iter().chain(extras.into_iter()).collect() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::{with_externalities, twox_128, TestExternalities}; + use codec::{KeyedVec, Joiner}; + use keyring::Keyring::{Alice, Bob, Charlie, Dave}; + use demo_primitives::AccountId; + use runtime::democracy::VoteThreshold; + use runtime::{staking, council, democracy}; + use super::public::Dispatch; + use super::privileged::Dispatch as PrivDispatch; + + fn new_test_ext() -> TestExternalities { + testing::externalities() + } + + #[test] + fn basic_environment_works() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + assert_eq!(staking::bonding_duration(), 0); + assert_eq!(cooloff_period(), 2); + assert_eq!(voting_period(), 1); + assert_eq!(will_still_be_councillor_at(&Alice, 1), true); + assert_eq!(will_still_be_councillor_at(&Alice, 10), false); + assert_eq!(will_still_be_councillor_at(&Dave, 10), false); + assert_eq!(is_councillor(&Alice), true); + assert_eq!(is_councillor(&Dave), false); + assert_eq!(proposals(), Vec::<(BlockNumber, ProposalHash)>::new()); + assert_eq!(proposal_voters(ProposalHash::default()), Vec::::new()); + assert_eq!(is_vetoed(&ProposalHash::default()), false); + assert_eq!(vote_of((*Alice, ProposalHash::default())), None); + assert_eq!(tally(&ProposalHash::default()), (0, 0, 3)); + }); + } + + fn sessions_per_era_proposal(value: u64) -> Proposal { + Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) + } + + fn bonding_duration_proposal(value: u64) -> Proposal { + Proposal::Staking(staking::privileged::Call::set_bonding_duration(value)) + } + + fn cancel_referendum_proposal(id: u32) -> Proposal { + Proposal::Democracy(democracy::privileged::Call::cancel_referendum(id)) + } + + #[test] + fn referendum_cancellation_should_work_when_unanimous() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + + let cancellation = cancel_referendum_proposal(0); + let hash = cancellation.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); + staking::public_pass_from_payment(&Charlie).vote(hash, true); + assert_eq!(proposals(), vec![(2, hash)]); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(democracy::active_referendums(), vec![]); + assert_eq!(staking::bonding_duration(), 0); + }); + } + + #[test] + fn referendum_cancellation_should_fail_when_not_unanimous() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + + let cancellation = cancel_referendum_proposal(0); + let hash = cancellation.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); + staking::public_pass_from_payment(&Charlie).vote(hash, false); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + }); + } + + #[test] + fn referendum_cancellation_should_fail_when_abstentions() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + + let cancellation = cancel_referendum_proposal(0); + let hash = cancellation.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); + staking::public_pass_from_payment(&Bob).vote(hash, true); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + }); + } + + #[test] + fn veto_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums().len(), 0); + }); + } + + #[test] + #[should_panic] + fn double_veto_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + + system::testing::set_block_number(3); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + }); + } + + #[test] + #[should_panic] + fn retry_in_cooloff_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + + system::testing::set_block_number(2); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + }); + } + + #[test] + fn retry_after_cooloff_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + + system::testing::set_block_number(3); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(hash, false); + staking::public_pass_from_payment(&Charlie).vote(hash, true); + internal::end_block(3); + + system::testing::set_block_number(4); + internal::end_block(4); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums(), vec![(0, 7, bonding_duration_proposal(42), VoteThreshold::SimpleMajority)]); + }); + } + + #[test] + fn alternative_double_veto_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).veto(hash); + + system::testing::set_block_number(3); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Charlie).veto(hash); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums().len(), 0); + }); + } + + #[test] + fn simple_propose_should_work() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + let hash = proposal.blake2_256(); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + assert_eq!(proposals().len(), 1); + assert_eq!(proposal_voters(&hash), vec![Alice.to_raw_public()]); + assert_eq!(vote_of((hash, *Alice)), Some(true)); + assert_eq!(tally(&hash), (1, 0, 2)); + }); + } + + #[test] + fn unvoted_proposal_should_expire_without_action() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + assert_eq!(tally(&proposal.blake2_256()), (1, 0, 2)); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums().len(), 0); + }); + } + + #[test] + fn unanimous_proposal_should_expire_with_biased_referendum() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); + staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), true); + assert_eq!(tally(&proposal.blake2_256()), (3, 0, 0)); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SuperMajorityAgainst)]); + }); + } + + #[test] + fn majority_proposal_should_expire_with_unbiased_referendum() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); + staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), false); + assert_eq!(tally(&proposal.blake2_256()), (2, 1, 0)); + internal::end_block(1); + + system::testing::set_block_number(2); + internal::end_block(2); + assert_eq!(proposals().len(), 0); + assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SimpleMajority)]); + }); + } + + #[test] + #[should_panic] + fn propose_by_public_should_panic() { + with_externalities(&mut new_test_ext(), || { + system::testing::set_block_number(1); + let proposal = bonding_duration_proposal(42); + staking::public_pass_from_payment(&Dave).propose(Box::new(proposal)); + }); } } +*/ diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index c0fd170ad06f9..534e869ad8779 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -43,8 +43,14 @@ pub type PropIndex = u32; /// A referendum index. pub type ReferendumIndex = u32; +/// Is a proposal the "cancel_referendum"? +// &T::Proposal::Democracy(democracy::privileged::Call::cancel_referendum(ref_index)) +pub trait IsCancelReferendum { + fn is_cancel_referendum(&self) -> Option; +} + pub trait Trait: staking::Trait { - type Proposal: Parameter + Dispatchable; + type Proposal: Parameter + Dispatchable + IsCancelReferendum; } decl_module! { From feb481101fd122b93335d784be57716667e8e73f Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 14:03:29 +0900 Subject: [PATCH 41/76] Runtime binary and tweaks. --- .../release/demo_runtime.compact.wasm | Bin 202526 -> 229971 bytes .../release/demo_runtime.wasm | Bin 202576 -> 230022 bytes substrate/runtime/council/src/voting.rs | 6 +++--- substrate/runtime/democracy/src/lib.rs | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 51ef7340401763c489550684efbd33e93f8d7ab0..581c5d1e1318d5927472efde4887e5a7495be3d0 100644 GIT binary patch literal 229971 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 literal 202526 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%0A~RnDFgr20cQao zsaC9{de*Lx?J;XI!V#o8b|<72!Td48X<}tmugtI%4Wq`%^9H)vn_Oe@xlo#M9W=xn)B{2M~izN>dU^%;$BwzL>TK+J^ zksrKS;^=iYumJEnDe-I>v+HsuDu3?fj#okX){i+x~_dFRt9bOGaU!gBlvyDsP* diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index e51fc837c0590bf0f461677c4922a509cef63638..6121113e89f70412c6728340de025571ea43bf82 100644 GIT binary patch literal 230022 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%0DEzKoxQA3`@Cg(i zJ*sfXD10ZfrBo8on!Qwb7=_JhvDhe#H|XZaB_G>*255ITYLNlOc8iD{J#W?`TMFt; zWXD00|5WXItT{nt==ZnEkP-iDWiV|Hnda6?(3G4^0KFK)PPQAHXM~b)muw)*H})-~m9qmet2&Etvk;0UQXT0gMb7%Fbe zUM+%wK_jv$kZm=QT?4XmPdb6@)}yME*szi8SFwv9NFfNr-gtkse?7MMu|72#N92M$ z%aNzRMZPlC+lnJV8*x;GZl4(<~B3X*N3~BG(wp;+( zmbIb5J`OBAi%B&ElNE%<&$_izT34oJpv`0g`$ed^NIZytW zRv`Dh!uR%vaIKxHdfFbyTy>qCzZ8EMMWquv7J3*Zc`|3R&~tn;P^MD72$|w*c`}tv zBS`SBp5nOU;24H?0uCDOA4YMdA+o?uN@w~`${q%q78^Y~?`t1GwpVKYpU`mq4g~`#+(dyBuIS=^7_bdL1h8I0b{DeYHW=B50L$fQ zFS7l9WKXs|_>!^g3xfVQJWDjj5pkJgqLClb7b$xL+3;D7CVp)!q;FDoH?q$%WltE{ zgFi;LitGkc_S;7GFtQt_8is6gogSuLDEEHqas+I3BrGrLoi(-I(v=9Y;vDW$4!puE z59LF^HFN-IYJpxH=!UTwd07$jrxK()OnR#nEaiPDnn&pqGfhLU9Cx7k2BdMgY7_-e zIaRJD0}0Y|+`j7LbuSW!G44eqose`0dje%=Yh{g+Q%Vi}L>uKSt*LvE3XDJ%5YI7& S(P0e42(piHLU_H=>Hh`f^KFg* literal 202576 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

p8?+4^_{NPr7kN~8MVK@SRLEE% zm=F_K5X=#o{a)5FucGQP3tNslF-FD|ZmCLS1$g;hcD&NEk07@_g%@Zqh-xsN0nFN)C1WIs&0XqtT?c{Ty3 zveeHyj-%2YqZp1aNOv$%(y?g5Vf8~WZ!wMXIPRm^W%7ciQBDu6$0#oiu+en{hPtHd z@Q-CC*$Bd!N_t3^A?uIW4LU+d2caWaAlYY^f2DoCWT8T_A!$}akumPF)c_B`mEfl` z494K~8HS642yU@PG7ObWT^hX3%`Xhn=4&d2RqNXP>`qoYhMRb%3Di2 zSr^}2v;^wGhg+eQ_lc`JSp#Jy6f?t5SR!EzF(2g_Vj{*P*z^$FdPs~ymlG(XMa85@ zHi)v6DA@t*#t^IS5)?5Gsk}S{n*@@?m^AJb0+0nVr7btaYLGI7_*UhIu9HjYUF!-3 zC?|m}i6_eBF1L#{9YvN_vYy!t!q9Z@{HIA%{CvAm0MlkjjD5)e`!TgA!#s zi2nAl&WZ$tpN*K_5$_AVE&aq&yb>vAjl&2Bf!^9mBzDN<4 zu@508dR@GReyAM}h~v zA=Rl|&IkKh4Mv4{m{$Pm67VQru~GkkXE!cb)nOBLo`S&iFf3KO8RaH$N43M1#ZdDl zFAcM!{0Y4RF8XjHEAE6tmw<~ttKq=a45OxQG4hW#)`StVmNSjzJYqNKfH-Y6#028l zC#{Ao!ZBn*NKLWI?Vw^){Mey*8PG7G2)7*Q-yLW!#QIPspOwt`Ii^sSHc#is5m^$I zRH7(k1c1@{1oXyN(EEo&?}-D}`ezeR^aIG7fJ$`%dtv`{P!|udhHU%FV#F1Uabe7j zC1d{OjCmi>0xSg5Plw{a9q32aLqoEtP?O2lY>*#f>P|e?A#ywP}o@ z1Pp1}!Ai|A05zHO%t0oD9RCQ`okQ?kdM6yZ1YGnfh1qR_Z@?u`2R^IeKsCmS+H(j) zIMzgFjP+xiDK13rg*qF~-BL+@RETuO>Js@EGms9(R4N~gncUZP=-6+qMuHmoF>FP9 zx!oZBH>bL0p`NCE#=y5Xc0yl}Mop`t7B!W|OiNGC;Ts_K+yV+qI)YP6mlo+;A9k)=XzI0PkHfoLGkV zIW8apOeK)NQ*}y+OYv!BhOrqzl9BY1Psw9&XK^r%I}Oh{hcBMcv7N&L7_6VT*nqv> z(!5Ad&CKA8ly*m#QHbHi)EOM`($`=xsK3(th6A!RlcWNc7Mq<*_Jn-`CYwoygfJ{A z#?*)Vd?t){89#L~cQ_ebM zU!H)d#RJz-05cAPdo+ILV%t|Czp4eu0=Wuew1oRWrRcSrX=~}wDN}zbbuD1f^%dmt zck(PtlZ2e(&j^{VL=@Gwi*_rip$Pr5-Qp#yMYR0FHZ#>LbgfMFmI<6gH#rv@Ts$zj zYSW5Pd{aPc&kUSA93ajw?7|6xOY8eU;tXw)h;5WnP(hZ(&(O^}^;<61j8hB+2qj@b zG3bP#0_DFR&j7xLIF*-@GCy~Hs?79#jQ1Ph8L!skPSNUNT(E&~X2vgE>j{0cKwnoT zZ`NkY;#K?<2CD@#L#JahPGqj3>8I7TVLe%EftT^@<_kH}Gs4@Jj$U zWB@MLR{V+!$_1E1(r|i#KZRtrP;bR42T@F5NM{MfB1iHB9tRlzoC!a49MLrb7Z6|G zSpqIN;Pl%7X93<>0{*K5&H}u%Qn8ZilwBd)Vb)}XgGhDkPDm@p-B~$qU!Q7cezm4tmz&8P5VsvR z&0b2uR-HmxH^cpgD8raVQN*N9ep-=pu{I0W!K}c_0E_QAP8D(NWw+)jFThXCm@u76 zVE9=VOCBV^mh4uNeA%05`NI%Le(+|Aqu1HMJix1@#M33r!f$UQolmFGd5pgf%kduy`S*ta diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index c250d4f64ddc8..2ab95d08de3a1 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -19,8 +19,8 @@ use rstd::prelude::*; use rstd::borrow::Borrow; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Bounded, SimpleArithmetic, Executable, RefInto, Hashing}; -use runtime_support::{StorageValue, StorageMap, Parameter}; +use primitives::{Executable, RefInto, Hashing}; +use runtime_support::{StorageValue, StorageMap}; use super::{Trait, system, democracy, Module as Council}; use democracy::IsCancelReferendum; @@ -157,7 +157,7 @@ impl Module { } fn take_proposal_if_expiring_at(n: T::BlockNumber) -> Option<(T::Proposal, T::Hash)> { - let mut proposals = Self::proposals(); + let proposals = Self::proposals(); match proposals.first() { Some(&(expiry, hash)) if expiry == n => { // yes this is horrible, but fixing it will need substantial work in storage. diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 534e869ad8779..ad74756f8937a 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -44,7 +44,6 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; /// Is a proposal the "cancel_referendum"? -// &T::Proposal::Democracy(democracy::privileged::Call::cancel_referendum(ref_index)) pub trait IsCancelReferendum { fn is_cancel_referendum(&self) -> Option; } From 81460b579fb8986bb618e55fdb78be1781d74ede Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 14:03:35 +0900 Subject: [PATCH 42/76] Binary update. --- .../release/demo_runtime.compact.wasm | Bin 229971 -> 230285 bytes .../release/demo_runtime.wasm | Bin 230022 -> 230335 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 581c5d1e1318d5927472efde4887e5a7495be3d0..04c493bc23c4e08aca3971edef76a6caccfb8156 100644 GIT binary patch delta 16710 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 Wef$$tsi0yzhfmdpzgl4~%=mwr6yZSt delta 16589 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 W^@03icGzOQ7k}%Ozg(Zw>Hh%&zTJWV diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index 6121113e89f70412c6728340de025571ea43bf82..e3e299ca6f4f7f2aaa9ca03d4d16a476fb9d8cd5 100644 GIT binary patch delta 16696 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 e*=Nbpx_bH91id%Exm~nS@5~>FO Date: Tue, 27 Mar 2018 14:10:18 +0900 Subject: [PATCH 43/76] Fix `*Type` grumble. --- .../release/demo_runtime.compact.wasm | Bin 230285 -> 229969 bytes .../release/demo_runtime.wasm | Bin 230335 -> 230021 bytes .../release/polkadot_runtime.compact.wasm | Bin 134951 -> 134951 bytes .../release/polkadot_runtime.wasm | Bin 135000 -> 135000 bytes substrate/runtime-support/src/dispatch.rs | 42 +++++++++--------- .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 04c493bc23c4e08aca3971edef76a6caccfb8156..9621fb0f6f39c6e235393d4ef712e90edebc185b 100644 GIT binary patch delta 15945 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 delta 16155 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 bTy5rCAAAE diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm index e3e299ca6f4f7f2aaa9ca03d4d16a476fb9d8cd5..af1f616e1732d154d09b053bd791f666d959b615 100644 GIT binary patch delta 15969 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 YSt39DmR8wl#c^)n%X(X`G#BOlUslUw9smFU diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 36e3b6468e8af838a8f259d75da9bcb11732ce6c..fff0408518cc070a090e46debb71f7baa60da4a3 100644 GIT binary patch delta 3665 zcmb7G3s98T75>lNWm))97lUC@NmlRytSnD4!K(bhL@S7(6b0)8ff^841O%-Q*7yi2 zM)ax|6#=7Bn@lUtA7`y4);P>KI;0_nOp32yYc0~m!CJ*u5_|6dFYs%fwqe*k_nhyX zbI;@6bN6_i@pzrF(S!IH3`9pf-Q2u9i5DR{gQpI3)Sr9>i|7L~6_RL_?g)N=tvd!u z@_PLlfDAg(kO&#_CPSt>B-1;CVquOvYVZjIGM9bE1~x}aM$;UNx701&O4frZpsX;Xn2(&$$OJGtHXqVaThVT4bu zHHO4l^jJ`ffaJW8XG)`A7yf!gKM+HvsW|lG_4e(mj|{E-0Dhq8i)R8TTk$*8m!pa= z=}1i!{bA)#xw)l0hE|lBH1(+|QrzQ`1pRb<0^P8F3TffXt)z{UX|%c`g>R`Y-ROA7LGJ95qlcSZ*f2%qCeVrRyr(X0 z^22u?fvLX(7QY}8G)hm`mA^%$%?Vt|Qf`x*Hv8%Pc#Yn+_(|tU9)6zz{@tlm@LnZD zP5IreiwKY8uiF#*46~}H8u6?i+4FavW7`PHV46$o_Vyao!%iFa{aKTI72CuO6ZZ$x zNi_u;;8e|i704Jc97aFge@&zF!GXJYHg+D2*X(rdV4Q{2b;ZFv zdZjB6x0idm7)~>~^E+j(Sneetlz(qMhrYd6WkhIo&l$9mqaHs19DC#bWd!ak;z=6! zwe?9Q=U(bv!NYY;J=+id^uykF5og^Zm}$cISD!&Yav|Ze_;e%SaNAoA!ys+%F?gRN zGXd@*bxt5Ko0p$$(ZeBfCe%5`4H~#QyJ&zwNMnC9z*&wLjsr9My*mVx)=<{v4*rN4 zjc|ZtM~#re#XUyFWP}GaaPcP|@PyN|p0JF^*23SaxhzD4W)wRy>~>;Mgmc*EgMmL3 z&Wa&ma@TZ4O>;gQpTNqB{^!VHQ*LEVxI#KcD&(kDA)R3gX;Qg1l{i$*8XLYN0j6lYHYZdUjp5P+ z<)Zg5`ZsBgR2=p54GRWd&>uB!{vTyNlFXQ>^OuvcE&~N}9-jgW08*X0ICucg@zda( zj@@4bZ;q%6i6Lf-Adwj2gINjqNXC#Lq`ko`Wif=1wh*>%F&Zba_Qg<$WX2LWsdD)` zohgYe%Y=`Re`zU{LXxv`DeUHVla0)VUvauE2dwnz5;xY94ZB=|oY8zhT#tCJGS3x; zJ(M6DJ!ibZ_jO)+1B`f)*_C+6U|rLpn&-K82F%v+&VH5vhk3_~65(Y%M=F!yoDt2Y zr^APCPM=@EQMbOMdTu!cqodB{a2OS~<-={zobK{M;7>2}wnM!}{9C)S0T*Pf46T(D>p+=DqFSz5@Dh9;|)-T&yv%+5$}|<;wronI=nYnG*u51ls`@hUrALV;tUq1 zBcqw=5sa=7q_z;zRD`fMqNj9%;HIc`hlt+!xl6O`#W`WcIVCIeOKrs^f>do4Nh}_` zJyy{zHp`x!BS^JY(O6QN8M`zyKUR>AT19j9%YrZty@Vshe<2q?=omL|LNpmgF~}%r zC@%8xqrzs^7Xb)D@<^5X0;UWs#mFFx6ob&F6guVT{IR3$FF}5u_R$RuItuWM0Se1uD`L zXcLE0D{@6hdEsV*ASk7l&fD1Ke?Yj|Hc&r%QE9HdP_17WyYETHlJjBAPb9%V?+g>o zjb_zHU%7UpKXrdcI2IF8ZAJ(C(HcaH5FL(^KHGX+d*Mfr8pBzgNM0x1;jCRGuaN2p z_D_)nE^3Sry^C{-?8T*)+!9Nv-EOhxXA4qugy_z@SXhEBZE-RA_AERfE~YFKnd=dv zS@6SZX!dNwwL#g_5y@H%WO8Uzr08CnTM%28nU9_$Me`Cg8Hp+mq!_VMNHxWdNOs$c zSVA39qPe6vE39~BAzJ2y@h^<0phziOO_b=q%w86oSyU|Gk1$s6P9|D9(1a(?`w))w o**-X;c^|@}8>3&?h~{WK4ml+}L_7{HE)Gk9T$?j-5V;2b2D7d|{r~^~ delta 3696 zcmb7G4Nz3q6@KULvMfB%#iFbNW(AE1>%y`~B2?wY_!C(bjq+!-B3c6ii-4dpku_0+ z5hL+dufMQHqgLCB^R!E?NsZ%-#<2}C#{VB|sa0znT8%oDXwQ9bfv3&1%?xkPJ?A^; zyXT&Bf7n%T+*NOE3?QK-$Y3BkLWnNV&o3y@5UA4ujU?Z|&*(ie0y3yWw;g}a>2^Yf zyhPswFqOV!aKco1nIX>~Ces_iDUc=i>$cl~%E{0dqmLv>MpKq0L~0WXEg>-^BTA1- zvrs4*3!_L35lpYk&0!-6%?wNMh16L7XUO*EurzWYj-JkXL^fFIsqB}zFyyQvbyiAq zUgqMDIZ4EAm36sW0bS*fryb;y=1gD7)z;~E2{{r=&&>P{7t8W;x@QWam2Ib!xb0#4a9w+uvW%<4DGA&Wx6X&$01B%59?SiyPL z&x@h8g@qd6Y2i8*$i;;c?bdD_vV+4?S#6 zCTSKu7Stl3I3g69ob+7DufscmWb&$tLnq$gTBUO2YU8``O{HHwlR)MC-=n|mDEmT3 znv&>~1+VdNOI0$ht~Bw)ef8N;sVvq~HC|(^tolUtw#n%Wi4K=AVetk|cXROrY>Jh( zyfcNgCeqKBq|>EKhLbydxRTuG;#FE#J&8}L4*jUry_u7J;eNC)yjjn;q52=th}#jdf{Z^_W^ z92jIu)*K!|5Ka6rsb)(Llb# zC1bx3CanMq{ji|~rpw!4Q;nY8<%k$w2=TcUYVm<#^-QjxF^o;i)5KNTG@#Q+0A=jKFdTy=#(+U!Z1j-UH?TD|gDmO*@*Vl29t7j(ZyK(xCQ*X+o z!!AT{?GGuC@TM2rT>rXto_yma@j$hw?}fC zk8Y>IczXJFG)^x+yv^`7qieoZ?iI`3bcBlTF5%FfyR}Ay7CmgjDB1Do9^kb%@LxvY zT=vJAoNMLd8m|4MeLhduck9`nMAAL&?<3CIL@?9z?=L=s?)4!FviS5pz{_o29rOg} zx}ESbN5%o%Lg^hsU?ML+TcL-oHsj7HeRu^mR3#LW+lN=SGBc)0n~0C>#hp+K0+b34J`s%#c3!Z9>^G3^V)pcu2* zm)(Fr6yECYVDi^=MO|h#3l4*L&c)ZtGQ(gD_ff9~@6Iq7jqjoN+ek1Hln-8jr_d+I zvI-OD$#-@0DN1{wgxXDkb z6wP*Nh;q<72c46&IuyQ6-94@A1^rRi&Hv-fuOu@r)ce*jtV>scyt{_OG=LnhE)DJh zJLiOa$Y81Cp#(C#d&YwiPY9DIKrZ~2?Ry36-k4XQR>y)TLLFyomY2 zeI0t~IkGnkJ~JXm;Y`@$#}15wQQ-&Tl8M*OTSoH)m^cRZsalavXUbr)V_`4qXU9SXQm4NLYx!ws*T%sweX=KONQYl(m0oP2 z6H=o2#nYbnT*aR)xVOj8VW(fmw*71#48pl?&Vy|@*9S$=3Ywi>RRa7OW+5(U(3pSc zQp&*1Huga&BzCYJErstien;lR@zBoBw~vEM6)K755<)IKFV zUj1Kz&8Y(Z0Omwe7Pueb;z6(8T(u`h-oymHv^w_ykGNbB1WrsEtc&h&0bhAfuq zhDVN$RD3u0b35t>t?Z4nFdk-j_nd`Fe4M=f&g04Q&Rq%*rg*C_Lf^qgcdY0ruW*&I zYr({BIT93S1?& zvU0vdL{ma9?kNad5xAhI+gE1$mrKP1M< zFC*H9restUbTAHz@KfRY2-hKO?|@MjccOKJ*o3?s!H6Nc0p>JQm$7 z2m>@RD{!pGPmr48v8sqhp)wRp8m(AQU`z|n!y9En^tndGD~$@TOXw=9rcsRvVifaq zBN41LkQhlz0(&cv40@x+E}AoXt6UwWT#Ni_9v(y!5Y?`1b0^w_s0qr7{nd z_C(R_!AXW{COLy+gEEQ7!A=>-u)&udqCfU2r82KbkXjw0nI{#2E*6wnDy4$zn%qfj zR1mR@^(2XAZHIZAF`wd6rN>Q4qW@f1WlCOYnSf^-TR5kjvttWS_%v71Y}A^)&R}v0 F{ta5oJY)a> diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index ee6598c099096aa71d227e9e457a716765a8537c..1076f3a3e92e7b0405c6a20322b810740af2cae0 100644 GIT binary patch delta 3667 zcmb7G3s98T75>ltmu2BcSsjoCk*ts)u(CYGNPO`7h$cP|#VDY>iHZx0prE5D#%i>Z z#^#C_BPzDETAk=Rf1FiBOH-yc4WrnS#&PP4>cSL%l?>^~`p^xXi%*n{CE#!I(?Z|qWlkc;V$@v&1IeQnNs`9s-qny&8 zFWAi4z}!28^dwQQf`M!2u$H!f|fvU&v(aSLl#HF9^stG@%X%|ZvP$s`>Kw07-8dT`Ao(&<{Jter%< z`LcnBtX=yWT~N1^J9HH>%mTx)?J%utd}ZxA6@IsO--CW?cIU zC+vtXmWoLBeOaUX(Ikt#IfJw%(%PF7xSNk|rolWa-ipBRO4KcegN(M{R!2(4ov8@z zy0eBuL%yyzAavl~F|<;O@81QSc=H|@K-ZQid$S=y5KL56584KM_;Q3iOQW1r&1 z<>DwG)nu9vG;{GCA9%>=Enis3bL-@Q3j+f_Y|de3_yI!Zn74r3>{E&)iZtuP ziMrUYH)cE2!r>#))D@e8@;Sb+=S4mH(N?I%`xgMvIHW%0JB6Tj!Mk_uo;l>eoo%Xw2IO63I z>izdDJV81VRYxAaIp@iv`je*6|D((&l?gZMJU9jq&VMbJ^ZZ!I0hr@VPJ_GPTrd$% zi7Y%1CJnBSNg*b)Ad?glfSVNX8BHNkNFPPBxAGu{bjPqmd1#!@eDk3k$;x~6sd_$nj8& zUbl?rF`W;_g8}b46DLA88$1QJ@-2Tb1=2;{wkjg=3&bLJkEqup;wGbq7CoY_gsDl)k&1`jWKdCPl_gH`C zSUp$jJiY<$WwOR~Fb#5@U#^2{e7>CX*W(>?Ixa$3Y{;W%$+$I8Q2#h3d?nY%NK;t8 zNM2+I4J2}HcZ_7LKyUzJM?^vJQk8mRqye_Yg+=ztlDNu}s^zw2*2*eD-fEFZDjvLT z7Rf8M$X;9`$W0c>P_?WewXndJD#$Gs$+UHlAPhq<@ksGsSd1TZjG@~Qor$6pWZbAl zuzBEagnKcSgeS02=0STcY?Tig5#|^!4XUavimO~+zHD(>NgM`WvbcPqnqSv&cE*RK zlC81K*OyqV$6_T@4+eZe<8g(@V^^#@b$dCc-V@7;d`U!RomDcm2MNMU8k>!{*5OBx z8?9JVM8lC8g$0dJrTft)4W$<3Dv|B2m%F-laAnkGNb%{jJzaA%<9442mzDmA_Ze3~A#bccj)oyI32W>>O0?`nZ^x5vg zwI6;2*%8mqN@Nu2jc2}oB#dlLU@?9qf;bXbx*rLg+>s!8^NyBRVS78>jLlvo$lY$H zx&WEW36e<&#wuunbmLmD2B}MAkM(3sY+It_jcrP;F0cu5N1|lPN0U%gsY8k>ss(iI zsV9*I_9N!lx+KY@Z7}aL=2KRoma8#I@?L1KPA#aY6!2#o>+&We%{^$scgyP^kM!yK n*Cq4%$0a+GpWA?rWIP5XRXjyJ2AyusZYxHv+gaO>T!Q}qAn`nu delta 3669 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 ) => { impl<$trait_instance: $trait_name> $mod_type<$trait_instance> { - pub fn aux_dispatch>(d: D, aux: &D::AuxType) { + pub fn aux_dispatch>(d: D, aux: &D::Aux) { d.dispatch(aux); } - pub fn dispatch>(d: D) { + pub fn dispatch>(d: D) { d.dispatch(); } } @@ -187,7 +187,7 @@ macro_rules! __decl_dispatch_module_without_aux { impl<$trait_instance: $trait_name> $crate::dispatch::Dispatchable for $call_type<$trait_instance> { - type TraitType = $trait_instance; + type Trait = $trait_instance; fn dispatch(self) { match self { $( @@ -201,7 +201,7 @@ macro_rules! __decl_dispatch_module_without_aux { impl<$trait_instance: $trait_name> $crate::dispatch::Callable for $mod_type<$trait_instance> { - type CallType = $call_type<$trait_instance>; + type Call = $call_type<$trait_instance>; } } } @@ -229,9 +229,9 @@ macro_rules! __decl_dispatch_module_with_aux { impl<$trait_instance: $trait_name> $crate::dispatch::AuxDispatchable for $call_type<$trait_instance> { - type TraitType = $trait_instance; - type AuxType = $aux_type; - fn dispatch(self, aux: &Self::AuxType) { + type Trait = $trait_instance; + type Aux = $aux_type; + fn dispatch(self, aux: &Self::Aux) { match self { $( $call_type::$fn_name( $( $param_name ),* ) => @@ -244,7 +244,7 @@ macro_rules! __decl_dispatch_module_with_aux { impl<$trait_instance: $trait_name> $crate::dispatch::AuxCallable for $mod_type<$trait_instance> { - type CallType = $call_type<$trait_instance>; + type Call = $call_type<$trait_instance>; } }; } @@ -394,13 +394,13 @@ macro_rules! impl_outer_dispatch { #[allow(missing_docs)] pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::AuxCallable>::CallType ) + $camelcase ( <$camelcase as $crate::dispatch::AuxCallable>::Call ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } impl $crate::dispatch::AuxDispatchable for $call_type { - type AuxType = $aux; - type TraitType = $call_type; + type Aux = $aux; + type Trait = $call_type; fn dispatch(self, aux: &$aux) { match self { $( @@ -424,12 +424,12 @@ macro_rules! impl_outer_dispatch { #[allow(missing_docs)] pub enum $call_type { $( - $camelcase ( <$camelcase as $crate::dispatch::Callable>::CallType ) + $camelcase ( <$camelcase as $crate::dispatch::Callable>::Call ) ,)* } impl_outer_dispatch_common! { $call_type, $($camelcase = $id,)* } impl $crate::dispatch::Dispatchable for $call_type { - type TraitType = $call_type; + type Trait = $call_type; fn dispatch(self) { match self { $( diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 5fb32417294bdea256953c53652460cc2235c5e2..5daa1c46c010ef7173ba9b9fff6f6813312c5094 100644 GIT binary patch delta 71 zcmZqr#n|+Val;NqW)2RP&ASP&ASxP diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index a1a3fba8577e9862907e3cb02905289f3101db9a..91c8962a835467a08d3a74d061ea6665fd5b55e1 100644 GIT binary patch delta 71 zcmccgi}BJg#tml}nK?LEHlJtoRAV%pEUB>rNM6#=VKm(QUqhFfQGc_p4u=?!GIM&% awz)iVJ^$wIUI+L#D|=31+^m+VBLV=91sJCQ delta 71 zcmccgi}BJg#tml}nOQhEHlJtoRAbbiEUB>rNM6#=VbtIJUqhFf(Qvb_4u=?!GIM&% aws}(e6voY$A`b9vR`y)azgaC)M+5+n@)-93 From 7fd63abf02473929a9152c69d30cbae817e7fafc Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 15:20:35 +0900 Subject: [PATCH 44/76] Fix up genesis_map --- demo/primitives/src/lib.rs | 3 + demo/runtime/src/block.rs | 6 +- .../src/{transaction.rs => extrinsic.rs} | 52 ++++++++--------- demo/runtime/src/genesismap.rs | 56 +++++++++---------- demo/runtime/src/lib.rs | 6 +- demo/runtime/src/runtime.rs | 8 +-- 6 files changed, 66 insertions(+), 65 deletions(-) rename demo/runtime/src/{transaction.rs => extrinsic.rs} (82%) diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 08b1e917a6e0d..bd8e546b7d6b4 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -54,6 +54,9 @@ pub use self::header::Number as BlockNumber; /// certainly continue to be the same as the substrate's `AuthorityId`. pub type AccountId = primitives::AuthorityId; +/// Balance of an account. +pub type Balance = u64; + /// The Ed25519 pub key of an session that belongs to an authority of the relay chain. This is /// exactly equivalent to what the substrate calls an "authority". pub type SessionKey = primitives::AuthorityId; diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index 77c5a3dda2230..27273b81cc9dc 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use codec::{Input, Slicable}; -use transaction::UncheckedTransaction; +use extrinsic::UncheckedExtrinsic; use runtime_primitives::Blocky; pub use demo_primitives::header::{Header, Digest, Log, Number, HeaderHash}; @@ -29,11 +29,11 @@ pub struct Block { /// The block header. pub header: Header, /// All relay-chain transactions. - pub transactions: Vec, // TODO: rename extrinsics. + pub transactions: Vec, // TODO: rename extrinsics. } impl Blocky for Block { - type Extrinsic = UncheckedTransaction; + type Extrinsic = UncheckedExtrinsic; type Header = Header; fn header(&self) -> &Self::Header { &self.header diff --git a/demo/runtime/src/transaction.rs b/demo/runtime/src/extrinsic.rs similarity index 82% rename from demo/runtime/src/transaction.rs rename to demo/runtime/src/extrinsic.rs index d417f0f3dfb1c..01647d02cd310 100644 --- a/demo/runtime/src/transaction.rs +++ b/demo/runtime/src/extrinsic.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -//! Transaction type. +//! Extrinsic type. use rstd::prelude::*; use rstd::ops; @@ -30,7 +30,7 @@ use std::fmt; /// A vetted and verified transaction from the external world. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Transaction { +pub struct Extrinsic { /// Who signed it (note this is not a signature). pub signed: AccountId, /// The number of transactions have come before from the same signer. @@ -39,9 +39,9 @@ pub struct Transaction { pub function: Call, } -impl Slicable for Transaction { +impl Slicable for Extrinsic { fn decode(input: &mut I) -> Option { - Some(Transaction { + Some(Extrinsic { signed: Slicable::decode(input)?, nonce: Slicable::decode(input)?, function: Slicable::decode(input)?, @@ -59,19 +59,19 @@ impl Slicable for Transaction { } } -impl ::codec::NonTrivialSlicable for Transaction {} +impl ::codec::NonTrivialSlicable for Extrinsic {} /// A transactions right from the external world. Unchecked. #[derive(Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] -pub struct UncheckedTransaction { +pub struct UncheckedExtrinsic { /// The actual transaction information. - pub transaction: Transaction, + pub transaction: Extrinsic, /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. pub signature: Signature, } -impl Slicable for UncheckedTransaction { +impl Slicable for UncheckedExtrinsic { fn decode(input: &mut I) -> Option { // This is a little more complicated than usual since the binary format must be compatible // with substrate's generic `Vec` type. Basically this just means accepting that there @@ -79,7 +79,7 @@ impl Slicable for UncheckedTransaction { // to use this). let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; - Some(UncheckedTransaction { + Some(UncheckedExtrinsic { transaction: Slicable::decode(input)?, signature: Slicable::decode(input)?, }) @@ -104,37 +104,37 @@ impl Slicable for UncheckedTransaction { } } -impl ::codec::NonTrivialSlicable for UncheckedTransaction {} +impl ::codec::NonTrivialSlicable for UncheckedExtrinsic {} -impl PartialEq for UncheckedTransaction { +impl PartialEq for UncheckedExtrinsic { fn eq(&self, other: &Self) -> bool { self.signature.iter().eq(other.signature.iter()) && self.transaction == other.transaction } } #[cfg(feature = "std")] -impl fmt::Debug for UncheckedTransaction { +impl fmt::Debug for UncheckedExtrinsic { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedTransaction({:?})", self.transaction) + write!(f, "UncheckedExtrinsic({:?})", self.transaction) } } /// A type-safe indicator that a transaction has been checked. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] -pub struct CheckedTransaction(UncheckedTransaction); +pub struct CheckedExtrinsic(UncheckedExtrinsic); -impl CheckedTransaction { +impl CheckedExtrinsic { /// Get a reference to the checked signature. pub fn signature(&self) -> &Signature { &self.0.signature } } -impl ops::Deref for CheckedTransaction { - type Target = Transaction; +impl ops::Deref for CheckedExtrinsic { + type Target = Extrinsic; - fn deref(&self) -> &Transaction { + fn deref(&self) -> &Extrinsic { &self.0.transaction } } @@ -142,24 +142,24 @@ impl ops::Deref for CheckedTransaction { /// Check the signature on a transaction. /// /// On failure, return the transaction back. -pub fn check(tx: UncheckedTransaction) -> Result { +pub fn check(tx: UncheckedExtrinsic) -> Result { let msg = ::codec::Slicable::encode(&tx.transaction); if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { - Ok(CheckedTransaction(tx)) + Ok(CheckedExtrinsic(tx)) } else { Err(tx) } } -impl Checkable for UncheckedTransaction { - type CheckedType = CheckedTransaction; +impl Checkable for UncheckedExtrinsic { + type CheckedType = CheckedExtrinsic; fn check(self) -> Result { check(self) } } -impl Applyable for CheckedTransaction { +impl Applyable for CheckedExtrinsic { type IndexType = TxOrder; type AccountIdType = AccountId; @@ -189,8 +189,8 @@ mod tests { #[test] fn serialize_unchecked() { - let tx = UncheckedTransaction { - transaction: Transaction { + let tx = UncheckedExtrinsic { + transaction: Extrinsic { signed: [1; 32], nonce: 999u64, function: Call::Timestamp(timestamp::Call::set(135135)), @@ -206,6 +206,6 @@ mod tests { let v = Slicable::encode(&tx); println!("{}", HexDisplay::from(&v)); - assert_eq!(UncheckedTransaction::decode(&mut &v[..]).unwrap(), tx); + assert_eq!(UncheckedExtrinsic::decode(&mut &v[..]).unwrap(), tx); } } diff --git a/demo/runtime/src/genesismap.rs b/demo/runtime/src/genesismap.rs index 50d2d7f10a61b..5d51f2f383ace 100644 --- a/demo/runtime/src/genesismap.rs +++ b/demo/runtime/src/genesismap.rs @@ -19,12 +19,12 @@ use codec::{KeyedVec, Joiner}; use std::collections::HashMap; use runtime_io::twox_128; -use runtime_support::{Hashable, StorageMap, StorageList, StorageValue}; -use primitives::Block; -use demo_primitives::{BlockNumber, AccountId}; -use runtime::staking::Balance; -use runtime::{staking, session, system, democracy, council, council_vote}; -use consensus; +use runtime_support::{Hashable, StorageMap, StorageValue}; +use substrate_primitives::Block; +use demo_primitives::{AccountId, BlockNumber, Balance}; +use runtime::Concrete; +use {consensus, council, democracy, session, staking, system}; +use council::voting as council_voting; /// Configuration of a general Substrate Demo genesis block. pub struct GenesisConfig { @@ -81,33 +81,33 @@ impl GenesisConfig { pub fn genesis_map(&self) -> HashMap, Vec> { let wasm_runtime = include_bytes!("../wasm/genesis.wasm").to_vec(); vec![ - (session::SessionLength::key(), vec![].and(&self.session_length)), - (session::Validators::key(), vec![].and(&self.validators)), + (>::key(), vec![].and(&self.session_length)), + (>::key(), vec![].and(&self.validators)), - (&staking::Intention::len_key()[..], vec![].and(&0u32)), - (&staking::SessionsPerEra::key()[..], vec![].and(&self.sessions_per_era)), - (&staking::CurrentEra::key()[..], vec![].and(&0u64)), + (&>::key()[..], vec![].and(&Vec::::new())), + (&>::key()[..], vec![].and(&self.sessions_per_era)), + (&>::key()[..], vec![].and(&0u64)), - (democracy::LaunchPeriod::key(), vec![].and(&self.launch_period)), - (democracy::VotingPeriod::key(), vec![].and(&self.voting_period)), - (democracy::MinimumDeposit::key(), vec![].and(&self.minimum_deposit)), + (>::key(), vec![].and(&self.launch_period)), + (>::key(), vec![].and(&self.voting_period)), + (>::key(), vec![].and(&self.minimum_deposit)), - (council::CandidacyBond::key(), vec![].and(&self.candidacy_bond)), - (council::VotingBond::key(), vec![].and(&self.voter_bond)), - (council::PresentSlashPerVoter::key(), vec![].and(&self.present_slash_per_voter)), - (council::CarryCount::key(), vec![].and(&self.carry_count)), - (council::PresentationDuration::key(), vec![].and(&self.presentation_duration)), - (council::VotingPeriod::key(), vec![].and(&self.council_election_voting_period)), - (council::TermDuration::key(), vec![].and(&self.council_term_duration)), - (council::DesiredSeats::key(), vec![].and(&self.desired_seats)), - (council::InactiveGracePeriod::key(), vec![].and(&self.inactive_grace_period)), + (>::key(), vec![].and(&self.candidacy_bond)), + (>::key(), vec![].and(&self.voter_bond)), + (>::key(), vec![].and(&self.present_slash_per_voter)), + (>::key(), vec![].and(&self.carry_count)), + (>::key(), vec![].and(&self.presentation_duration)), + (>::key(), vec![].and(&self.council_election_voting_period)), + (>::key(), vec![].and(&self.council_term_duration)), + (>::key(), vec![].and(&self.desired_seats)), + (>::key(), vec![].and(&self.inactive_grace_period)), - (council_vote::CooloffPeriod::key(), vec![].and(&self.cooloff_period)), - (council_vote::VotingPeriod::key(), vec![].and(&self.council_proposal_voting_period)) + (>::key(), vec![].and(&self.cooloff_period)), + (>::key(), vec![].and(&self.council_proposal_voting_period)) ].into_iter() - .map(|(k, v)| (k.into(), v)) + .map(|(k, v)| (Into::>::into(k), v)) .chain(self.balances.iter() - .map(|&(account, balance)| (staking::FreeBalanceOf::key_for(&account), vec![].and(&balance))) + .map(|&(account, balance)| (>::key_for(&account), vec![].and(&balance))) ) .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ @@ -125,6 +125,6 @@ impl GenesisConfig { pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { use codec::Slicable; map![ - system::BlockHashAt::key_for(&0) => genesis_block.header.blake2_256().encode() + >::key_for(&0) => genesis_block.header.blake2_256().encode() ] } diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index fa67bf5707276..809b29495b960 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -23,7 +23,6 @@ #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as runtime_primitives; - extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; extern crate substrate_runtime_democracy as democracy; @@ -49,7 +48,6 @@ extern crate demo_primitives; pub mod runtime; pub mod block; -pub mod transaction; +pub mod extrinsic; pub mod api; - -//#[cfg(feature = "std")] pub mod genesismap; +#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 1affab7f8c4f4..cdc4e2d1a5ba6 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use codec::Slicable; use runtime_support::Hashable; use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; -use {block, demo_primitives, transaction}; +use {block, demo_primitives, extrinsic}; use runtime_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; use runtime_primitives::{Identity, HasPublicAux}; @@ -95,7 +95,7 @@ impl session::Trait for Concrete { pub type Session = session::Module; impl staking::Trait for Concrete { - type Balance = u64; + type Balance = demo_primitives::Balance; type DetermineContractAddress = BlakeTwo256; } pub type Staking = staking::Module; @@ -130,8 +130,8 @@ impl_outer_dispatch! { } pub type Executive = executive::Executive< - transaction::UncheckedTransaction, - transaction::CheckedTransaction, + extrinsic::UncheckedExtrinsic, + extrinsic::CheckedExtrinsic, Concrete, block::Block, ((((Council, CouncilVoting), Democracy), Staking), Session), From d6db86db93af14788d35d6d5c7e9dc53fe94981a Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 15:27:13 +0900 Subject: [PATCH 45/76] Remove NonTrivialSlicable --- demo/primitives/src/header.rs | 2 +- demo/runtime/src/extrinsic.rs | 4 ++-- .../release/demo_runtime.compact.wasm | Bin 229969 -> 233173 bytes .../release/demo_runtime.wasm | Bin 230021 -> 233224 bytes polkadot/primitives/src/block.rs | 2 +- polkadot/primitives/src/parachain.rs | 4 ++-- polkadot/primitives/src/transaction.rs | 4 ++-- substrate/codec/src/lib.rs | 2 +- substrate/codec/src/slicable.rs | 17 ++++------------- substrate/primitives/src/block.rs | 12 ++++++------ substrate/runtime-support/src/dispatch.rs | 10 +++++----- substrate/test-runtime/src/transaction.rs | 2 +- .../test-runtime/src/unchecked_transaction.rs | 2 +- 13 files changed, 26 insertions(+), 35 deletions(-) diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs index c72217153c8ca..7affc4ad34403 100644 --- a/demo/primitives/src/header.rs +++ b/demo/primitives/src/header.rs @@ -46,7 +46,7 @@ impl Slicable for Log { } } -impl ::codec::NonTrivialSlicable for Log { } + /// The digest of a block, useful for light-clients. #[derive(Clone, Default, PartialEq, Eq)] diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs index 01647d02cd310..834b64efc317d 100644 --- a/demo/runtime/src/extrinsic.rs +++ b/demo/runtime/src/extrinsic.rs @@ -59,7 +59,7 @@ impl Slicable for Extrinsic { } } -impl ::codec::NonTrivialSlicable for Extrinsic {} + /// A transactions right from the external world. Unchecked. #[derive(Eq, Clone)] @@ -104,7 +104,7 @@ impl Slicable for UncheckedExtrinsic { } } -impl ::codec::NonTrivialSlicable for UncheckedExtrinsic {} + impl PartialEq for UncheckedExtrinsic { fn eq(&self, other: &Self) -> bool { diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 9621fb0f6f39c6e235393d4ef712e90edebc185b..72e9633f524098844c6d684cb3e3c4c88af96db8 100644 GIT binary patch delta 64920 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 p_GV5YB1Jp$ihwjHo=hV^7I6{(mzzN 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

eOusx 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

{ } fn candidate_digest(&self, proposal: &Block) -> HeaderHash { - proposal.header.hash() + proposal.header.blake2_256().into() } fn sign_local(&self, message: Message) -> LocalizedMessage { @@ -325,7 +327,7 @@ impl BftService /// If the local signing key is an authority, this will begin the consensus process to build a /// block on top of it. If the executor fails to run the future, an error will be returned. pub fn build_upon(&self, header: &Header) -> Result<(), P::Error> { - let hash = header.hash(); + let hash = header.blake2_256().into(); let mut _preempted_consensus = None; // defers drop of live to the end. let authorities = self.client.authorities(&BlockId::Hash(hash))?; @@ -455,7 +457,7 @@ pub fn sign_message(message: Message, key: &ed25519::Pair, parent_hash: HeaderHa match message { ::generic::Message::Propose(r, proposal) => { - let header_hash = proposal.header.hash(); + let header_hash: HeaderHash = proposal.header.blake2_256().into(); let action_header = PrimitiveAction::ProposeHeader(r as u32, header_hash.clone()); let action_propose = PrimitiveAction::Propose(r as u32, proposal.clone()); @@ -581,11 +583,11 @@ mod tests { let service = make_service(client, core.handle()); let first = Header::from_block_number(2); - let first_hash = first.hash(); + let first_hash = first.blake2_256().into(); let mut second = Header::from_block_number(3); second.parent_hash = first_hash; - let second_hash = second.hash(); + let second_hash = second.blake2_256().into(); service.build_upon(&first).unwrap(); assert!(service.live_agreements.lock().contains_key(&first_hash)); diff --git a/substrate/client/src/client.rs b/substrate/client/src/client.rs index 402a67ef2a776..8bf0b2785e2a1 100644 --- a/substrate/client/src/client.rs +++ b/substrate/client/src/client.rs @@ -226,7 +226,7 @@ impl Client where ) -> error::Result { let authorities = self.authorities_at(&BlockId::Hash(header.parent_hash))?; let just = bft::check_justification(&authorities[..], header.parent_hash, justification) - .map_err(|_| error::ErrorKind::BadJustification(BlockId::Hash(header.hash())))?; + .map_err(|_| error::ErrorKind::BadJustification(BlockId::Hash(header.blake2_256().into())))?; Ok(JustifiedHeader { header, justification: just, @@ -383,7 +383,7 @@ mod tests { // TODO: remove this in favor of custom verification pipelines for the // client fn justify(header: &block::Header) -> bft::UncheckedJustification { - let hash = header.hash(); + let hash = header.blake2_256().into(); let authorities = vec![ Keyring::Alice.into(), Keyring::Bob.into(), diff --git a/substrate/network/src/test/mod.rs b/substrate/network/src/test/mod.rs index 8aac22f16ee7d..cd4856bd699ad 100644 --- a/substrate/network/src/test/mod.rs +++ b/substrate/network/src/test/mod.rs @@ -161,7 +161,7 @@ impl Peer { } fn justify(header: &primitives::block::Header) -> bft::UncheckedJustification { - let hash = header.hash(); + let hash = header.blake2_256().into(); let authorities = vec![ Keyring::Alice.into() ]; bft::UncheckedJustification { diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index fb0f5654de8c9..ac9a4ed13378a 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -400,7 +400,6 @@ mod tests { } type System = system::Module; - type Session = session::Module; type Staking = staking::Module; type Democracy = Module; From 128893cc3e1c17a292dfa25d70a7d1ad9e0eb9c3 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 12:32:03 +0900 Subject: [PATCH 58/76] Fix last few tests. --- demo/executor/src/lib.rs | 4 +- demo/primitives/src/header.rs | 2 +- substrate/keyring/src/lib.rs | 55 ++----------------------- substrate/runtime/council/src/voting.rs | 4 -- 4 files changed, 7 insertions(+), 58 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index ab8a8b2e5fc3a..cf8ca10cc743a 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -193,7 +193,7 @@ mod tests { construct_block( 1, [69u8; 32].into(), - hex!("d952977ca0087110958d4b66f6d9f2e41d19a252b9f6f3aab9535c4982bdb9b5").into(), + hex!("b5a1cfe8075af9f2021a6fbabf13d033e579fb90341a4524743313e3b114865e").into(), vec![Extrinsic { signed: Alice.into(), nonce: 0, @@ -206,7 +206,7 @@ mod tests { construct_block( 2, block1().1, - hex!("2a3f3499414649c3449f4f7c21574233a9c4ebd1109548acc00f2568132e5a70").into(), + hex!("b646ea6f29832a39dad9feca778a1b612dc25c79ca34dc026176fcfd8943de57").into(), vec![ Extrinsic { signed: Bob.into(), diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs index db8c76fc2fa34..6a2c12345c0e2 100644 --- a/demo/primitives/src/header.rs +++ b/demo/primitives/src/header.rs @@ -168,7 +168,7 @@ mod tests { "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", "number": 67, "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", - "transactionRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", + "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", "digest": { "logs": [ "0x01" diff --git a/substrate/keyring/src/lib.rs b/substrate/keyring/src/lib.rs index 9d9fcee99e898..9749ef13449cf 100644 --- a/substrate/keyring/src/lib.rs +++ b/substrate/keyring/src/lib.rs @@ -27,7 +27,6 @@ use ed25519::{Pair, Public, Signature}; /// Set of test accounts. #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub enum Keyring { - None, Alice, Bob, Charlie, @@ -72,7 +71,6 @@ impl Keyring { pub fn pair(self) -> Pair { match self { - Keyring::None => { panic!(); }, Keyring::Alice => Pair::from_seed(b"Alice "), Keyring::Bob => Pair::from_seed(b"Bob "), Keyring::Charlie => Pair::from_seed(b"Charlie "), @@ -88,7 +86,6 @@ impl Keyring { impl From for &'static str { fn from(k: Keyring) -> Self { match k { - Keyring::None => { panic!(); }, Keyring::Alice => "Alice", Keyring::Bob => "Bob", Keyring::Charlie => "Charlie", @@ -101,38 +98,6 @@ impl From for &'static str { } } -impl From for u64 { - fn from(k: Keyring) -> Self { - match k { - Keyring::None => 0, - Keyring::Alice => 1, - Keyring::Bob => 2, - Keyring::Charlie => 3, - Keyring::Dave => 4, - Keyring::Eve => 5, - Keyring::Ferdie => 6, - Keyring::One => 7, - Keyring::Two => 8, - } - } -} - -impl From for Keyring { - fn from(k: u64) -> Keyring { - match k { - 1 => Keyring::Alice, - 2 => Keyring::Bob, - 3 => Keyring::Charlie, - 4 => Keyring::Dave, - 5 => Keyring::Eve, - 6 => Keyring::Ferdie, - 7 => Keyring::One, - 8 => Keyring::Two, - _ => Keyring::None, - } - } -} - lazy_static! { static ref PRIVATE_KEYS: HashMap = { [ @@ -148,13 +113,7 @@ lazy_static! { }; static ref PUBLIC_KEYS: HashMap = { - let mut m: HashMap<_, _> = PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect(); - m.insert(Keyring::None, Public(Default::default())); - m - }; - - static ref U64_KEYS: HashMap = { - (0u64..9).map(|n| (n.into(), n)).collect() + PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect() }; } @@ -188,12 +147,6 @@ impl AsRef<[u8; 32]> for Keyring { } } -impl AsRef for Keyring { - fn as_ref(&self) -> &u64 { - (*U64_KEYS).get(self).unwrap() - } -} - impl AsRef for Keyring { fn as_ref(&self) -> &Public { (*PUBLIC_KEYS).get(self).unwrap() @@ -201,9 +154,9 @@ impl AsRef for Keyring { } impl Deref for Keyring { - type Target = u64; - fn deref(&self) -> &u64 { - (*U64_KEYS).get(self).unwrap() + type Target = [u8; 32]; + fn deref(&self) -> &[u8; 32] { + (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() } } diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 3e81dd5093484..fe0e0548622e9 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -227,10 +227,6 @@ mod tests { }); } - fn sessions_per_era_proposal(value: u64) -> Proposal { - Proposal::Staking(staking::PrivCall::set_sessions_per_era(value)) - } - fn bonding_duration_proposal(value: u64) -> Proposal { Proposal::Staking(staking::PrivCall::set_bonding_duration(value)) } From 0c27e0cb04b57bf2bfb203c4ea8a961fc26a524e Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 07:24:13 +0200 Subject: [PATCH 59/76] Make all primitives generic. --- demo/primitives/src/lib.rs | 6 +- demo/runtime/src/block.rs | 63 --- demo/runtime/src/extrinsic.rs | 210 ---------- demo/runtime/src/lib.rs | 2 - demo/runtime/src/runtime.rs | 17 +- substrate/runtime/executive/src/lib.rs | 31 +- substrate/runtime/primitives/src/generic.rs | 407 ++++++++++++++++++++ substrate/runtime/primitives/src/lib.rs | 2 + 8 files changed, 432 insertions(+), 306 deletions(-) delete mode 100644 demo/runtime/src/block.rs delete mode 100644 demo/runtime/src/extrinsic.rs create mode 100644 substrate/runtime/primitives/src/generic.rs diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index f2541766ebd4c..857bb3b9d3cff 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -52,10 +52,10 @@ pub type Balance = u64; pub type SessionKey = primitives::AuthorityId; /// Index of a transaction in the relay chain. -pub type TxOrder = u64; +pub type Index = u64; /// A hash of some data used by the relay chain. pub type Hash = primitives::H256; -/// Alias to 520-bit hash when used in the context of a signature on the relay chain. -pub type Signature = primitives::hash::H512; +/// Alias to 512-bit hash when used in the context of a signature on the relay chain. +pub type Signature = runtime_primitives::generic::Ed25519Signature; diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs deleted file mode 100644 index 20531284e5368..0000000000000 --- a/demo/runtime/src/block.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Block and header type definitions. - -use rstd::prelude::*; -use codec::{Input, Slicable}; -use extrinsic::UncheckedExtrinsic; -use runtime_primitives::Blocky; -pub use demo_primitives::header::{Header, Digest, Log, Number, HeaderHash}; - -/// A block on the chain. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Block { - /// The block header. - pub header: Header, - /// All relay-chain extrinsics. - pub extrinsics: Vec, // TODO: rename extrinsics. -} - -impl Blocky for Block { - type Extrinsic = UncheckedExtrinsic; - type Header = Header; - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.extrinsics[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.extrinsics) - } -} - -impl Slicable for Block { - fn decode(input: &mut I) -> Option { - let (header, extrinsics) = Slicable::decode(input)?; - Some(Block { header, extrinsics }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.header.encode()); - v.extend(self.extrinsics.encode()); - - v - } -} diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs deleted file mode 100644 index a67ee5a738b97..0000000000000 --- a/demo/runtime/src/extrinsic.rs +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Extrinsic type. - -use rstd::prelude::*; -use rstd::ops; -use codec::{Input, Slicable}; -use demo_primitives::{AccountId, TxOrder, Signature}; -use runtime::Call; -use runtime_primitives::{Checkable, Applyable}; -use runtime_support::AuxDispatchable; - -#[cfg(feature = "std")] -use std::fmt; - -/// A vetted and verified extrinsic from the external world. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Debug))] -pub struct Extrinsic { - /// Who signed it (note this is not a signature). - pub signed: AccountId, - /// The number of extrinsics have come before from the same signer. - pub nonce: TxOrder, - /// The function that should be called. - pub function: Call, -} - -impl Slicable for Extrinsic { - fn decode(input: &mut I) -> Option { - Some(Extrinsic { - signed: Slicable::decode(input)?, - nonce: Slicable::decode(input)?, - function: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.signed.using_encoded(|s| v.extend(s)); - self.nonce.using_encoded(|s| v.extend(s)); - self.function.using_encoded(|s| v.extend(s)); - - v - } -} - - - -/// A extrinsics right from the external world. Unchecked. -#[derive(Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize))] -pub struct UncheckedExtrinsic { - /// The actual extrinsic information. - pub extrinsic: Extrinsic, - /// The signature; should be an Ed25519 signature applied to the serialised `extrinsic` field. - pub signature: Signature, -} - -impl Slicable for UncheckedExtrinsic { - fn decode(input: &mut I) -> Option { - // This is a little more complicated than usual since the binary format must be compatible - // with substrate's generic `Vec` type. Basically this just means accepting that there - // will be a prefix of u32, which has the total number of bytes following (we don't need - // to use this). - let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; - - Some(UncheckedExtrinsic { - extrinsic: Slicable::decode(input)?, - signature: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - // need to prefix with the total length as u32 to ensure it's binary comptible with - // Vec. we'll make room for it here, then overwrite once we know the length. - v.extend(&[0u8; 4]); - - self.extrinsic.signed.using_encoded(|s| v.extend(s)); - self.extrinsic.nonce.using_encoded(|s| v.extend(s)); - self.extrinsic.function.using_encoded(|s| v.extend(s)); - self.signature.using_encoded(|s| v.extend(s)); - - let length = (v.len() - 4) as u32; - length.using_encoded(|s| v[0..4].copy_from_slice(s)); - - v - } -} - - - -impl PartialEq for UncheckedExtrinsic { - fn eq(&self, other: &Self) -> bool { - self.signature.iter().eq(other.signature.iter()) && self.extrinsic == other.extrinsic - } -} - -#[cfg(feature = "std")] -impl fmt::Debug for UncheckedExtrinsic { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) - } -} - -/// A type-safe indicator that a extrinsic has been checked. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug))] -pub struct CheckedExtrinsic(UncheckedExtrinsic); - -impl CheckedExtrinsic { - /// Get a reference to the checked signature. - pub fn signature(&self) -> &Signature { - &self.0.signature - } -} - -impl ops::Deref for CheckedExtrinsic { - type Target = Extrinsic; - - fn deref(&self) -> &Extrinsic { - &self.0.extrinsic - } -} - -/// Check the signature on a extrinsic. -/// -/// On failure, return the extrinsic back. -pub fn check(tx: UncheckedExtrinsic) -> Result { - let msg = ::codec::Slicable::encode(&tx.extrinsic); - if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.extrinsic.signed) { - Ok(CheckedExtrinsic(tx)) - } else { - Err(tx) - } -} - -impl Checkable for UncheckedExtrinsic { - type Checked = CheckedExtrinsic; - - fn check(self) -> Result { - check(self) - } -} - -impl Applyable for CheckedExtrinsic { - type Index = TxOrder; - type AccountId = AccountId; - - fn index(&self) -> &Self::Index { - &self.0.extrinsic.nonce - } - - fn sender(&self) -> &Self::AccountId { - &self.0.extrinsic.signed - } - - fn apply(self) { - let tx = self.0.extrinsic; - tx.function.dispatch(&tx.signed); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use substrate_primitives; - use codec::Slicable; - use substrate_primitives::hexdisplay::HexDisplay; - use timestamp; - use runtime::Call; - - #[test] - fn serialize_unchecked() { - let tx = UncheckedExtrinsic { - extrinsic: Extrinsic { - signed: [1; 32], - nonce: 999u64, - function: Call::Timestamp(timestamp::Call::set(135135)), - }, - signature: substrate_primitives::hash::H512([0; 64]), - }; - // 71000000 - // 0101010101010101010101010101010101010101010101010101010101010101 - // e703000000000000 - // 00 - // df0f0200 - // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - - let v = Slicable::encode(&tx); - println!("{}", HexDisplay::from(&v)); - assert_eq!(UncheckedExtrinsic::decode(&mut &v[..]).unwrap(), tx); - } -} diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 809b29495b960..8002ef42304b3 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -47,7 +47,5 @@ extern crate demo_primitives; //#[cfg(test)] #[macro_use] extern crate hex_literal; pub mod runtime; -pub mod block; -pub mod extrinsic; pub mod api; #[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 3dc4c390b50f0..25e325305521b 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -18,9 +18,9 @@ #[cfg(any(feature = "std", test))] use runtime_io; use runtime_io::BlakeTwo256; -use {block, demo_primitives, extrinsic}; +use demo_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; -use runtime_primitives::{Identity, HasPublicAux}; +use runtime_primitives::{self as primitives, Identity, HasPublicAux}; // TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into // Some(its own PrivCall) or None. @@ -51,13 +51,13 @@ impl consensus::Trait for Concrete { pub type Consensus = consensus::Module; impl system::Trait for Concrete { - type Index = demo_primitives::TxOrder; + type Index = demo_primitives::Index; type BlockNumber = demo_primitives::BlockNumber; type Hash = demo_primitives::Hash; type Hashing = BlakeTwo256; - type Digest = demo_primitives::header::Digest; + type Digest = primitives::generic::Digest>; type AccountId = demo_primitives::AccountId; - type Header = demo_primitives::header::Header; + type Header = primitives::generic::Header>; } pub type System = system::Module; @@ -103,10 +103,11 @@ impl_outer_dispatch! { } pub type Executive = executive::Executive< - extrinsic::UncheckedExtrinsic, - extrinsic::CheckedExtrinsic, Concrete, - block::Block, + primitives::generic::Block< + demo_primitives::BlockNumber, demo_primitives::Hash, Vec, + demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature + >, Staking, (((((), Council), Democracy), Staking), Session), >; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index fb62363a4a080..60619e0dcbd6e 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -39,30 +39,21 @@ use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, E use codec::Slicable; pub struct Executive< - Unchecked, - Checked, System, Block, Payment, Finalisation, ->(PhantomData<(Unchecked, Checked, System, Block, Payment, Finalisation)>); +>(PhantomData<(System, Block, Payment, Finalisation)>); impl< - Unchecked: Checkable< - Checked = Checked - > + PartialEq + Eq + Clone + Slicable, - Checked: Applyable< - Index = System::Index, - AccountId = System::AccountId - >, System: system::Trait, - Block: Blocky< - Extrinsic = Unchecked, - Header = System::Header - >, + Block: Blocky

, Payment: MakePayment, Finalisation: Executable, -> Executive { +> Executive where + Block::Extrinsic: Checkable + Slicable, + ::Checked: Applyable +{ /// Start the execution of a particular block. pub fn initialise_block(header: &System::Header) { >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); @@ -120,7 +111,7 @@ impl< /// Apply outside of the block execution function. /// This doesn't attempt to validate anything regarding the block. - pub fn apply_extrinsic(utx: Unchecked) { + pub fn apply_extrinsic(utx: Block::Extrinsic) { // Verify the signature is good. let tx = match utx.check() { Ok(tx) => tx, @@ -128,9 +119,9 @@ impl< }; { - // check nonce - let expected_nonce = >::account_index(tx.sender()); - assert!(tx.index() == &expected_nonce, "All transactions should have the correct nonce"); + // check index + let expected_index = >::account_index(tx.sender()); + assert!(tx.index() == &expected_index, "All transactions should have the correct nonce"); // increment nonce in storage >::inc_account_index(tx.sender()); @@ -198,7 +189,7 @@ mod tests { } type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, staking::Module, (session::Module, staking::Module)>; + type Executive = super::Executive, staking::Module, (session::Module, staking::Module)>; #[test] fn staking_balance_transfer_dispatch_works() { diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs new file mode 100644 index 0000000000000..6fc916ae30219 --- /dev/null +++ b/substrate/runtime/primitives/src/generic.rs @@ -0,0 +1,407 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Generic implementations of Extrinsic/Header/Block. + +use serde::Serialize; +use codec::{Slicable, Input}; +use substrate_primitives::hash::H512; +use runtime_support::AuxDispatchable; +use super::{Checkable, Applyable, Headery, Blocky, Digesty}; +use rstd::ops; + +#[cfg(feature = "std")] +use std::fmt::{self, Debug}; + +#[cfg(feature = "std")] +pub trait MaybeSerializeDebug: Serialize + Debug {} +#[cfg(feature = "std")] +impl MaybeSerializeDebug for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeSerializeDebug {} +#[cfg(not(feature = "std"))] +impl MaybeSerializeDebug for T {} + +pub trait Member: MaybeSerializeDebug + Eq + PartialEq + Clone {} +impl Member for T {} + +/// A vetted and verified extrinsic from the external world. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] +pub struct Extrinsic where + AccountId: Member, + Index: Member, + Call: Member, +{ + /// Who signed it (note this is not a signature). + pub signed: AccountId, + /// The number of extrinsics have come before from the same signer. + pub index: Index, + /// The function that should be called. + pub function: Call, +} + +impl Slicable for Extrinsic where + AccountId: Member + Slicable, + Index: Member + Slicable, + Call: Member + Slicable +{ + fn decode(input: &mut I) -> Option { + Some(Extrinsic { + signed: Slicable::decode(input)?, + index: Slicable::decode(input)?, + function: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + self.signed.using_encoded(|s| v.extend(s)); + self.index.using_encoded(|s| v.extend(s)); + self.function.using_encoded(|s| v.extend(s)); + + v + } +} + +/// Means of signature verification. +pub trait Verify { + type Signer; + fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool; +} + +/// Ed25519 signature verify. +#[derive(Eq, PartialEq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +pub struct Ed25519Signature(H512); +impl Verify for Ed25519Signature { + type Signer = [u8; 32]; + fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { + ::runtime_io::ed25519_verify(&(self.0).0, msg, &signer[..]) + } +} +impl Slicable for Ed25519Signature { + fn decode(input: &mut I) -> Option { Some(Ed25519Signature(Slicable::decode(input)?,)) } + fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } +} + +/// A extrinsics right from the external world. Unchecked. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize))] +pub struct UncheckedExtrinsic where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member +{ + /// The actual extrinsic information. + pub extrinsic: Extrinsic, + /// The signature; should be an Ed25519 signature applied to the serialised `extrinsic` field. + pub signature: Signature, +} + +impl Slicable for UncheckedExtrinsic where + AccountId: Member + Slicable, + Index: Member + Slicable, + Call: Member + Slicable, + Signature: Member + Slicable +{ + fn decode(input: &mut I) -> Option { + // This is a little more complicated than usual since the binary format must be compatible + // with substrate's generic `Vec` type. Basically this just means accepting that there + // will be a prefix of u32, which has the total number of bytes following (we don't need + // to use this). + let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; + + Some(UncheckedExtrinsic { + extrinsic: Slicable::decode(input)?, + signature: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + // need to prefix with the total length as u32 to ensure it's binary comptible with + // Vec. we'll make room for it here, then overwrite once we know the length. + v.extend(&[0u8; 4]); + + self.extrinsic.signed.using_encoded(|s| v.extend(s)); + self.extrinsic.index.using_encoded(|s| v.extend(s)); + self.extrinsic.function.using_encoded(|s| v.extend(s)); + self.signature.using_encoded(|s| v.extend(s)); + + let length = (v.len() - 4) as u32; + length.using_encoded(|s| v[0..4].copy_from_slice(s)); + + v + } +} + +#[cfg(feature = "std")] +impl fmt::Debug for UncheckedExtrinsic where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) + } +} + +impl Checkable for UncheckedExtrinsic where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member + Verify, + Extrinsic: Slicable +{ + type Checked = CheckedExtrinsic; + + fn check(self) -> Result { + if ::codec::Slicable::using_encoded(&self.extrinsic, |msg| + self.signature.verify(msg, &self.extrinsic.signed) + ) { + Ok(CheckedExtrinsic(self)) + } else { + Err(self) + } + } +} + +/// A type-safe indicator that a extrinsic has been checked. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct CheckedExtrinsic + (UncheckedExtrinsic) +where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member; + +impl CheckedExtrinsic +where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member +{ + /// Get a reference to the checked signature. + pub fn signature(&self) -> &Signature { + &self.0.signature + } +} + +impl ops::Deref + for CheckedExtrinsic +where + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member +{ + type Target = Extrinsic; + + fn deref(&self) -> &Self::Target { + &self.0.extrinsic + } +} + +impl Applyable + for CheckedExtrinsic +where + AccountId: Member, + Index: Member, + Call: Member + AuxDispatchable, + Signature: Member +{ + type Index = Index; + type AccountId = AccountId; + + fn index(&self) -> &Self::Index { + &self.0.extrinsic.index + } + + fn sender(&self) -> &Self::AccountId { + &self.0.extrinsic.signed + } + + fn apply(self) { + let xt = self.0.extrinsic; + xt.function.dispatch(&xt.signed); + } +} + +#[derive(Default, PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +pub struct Digest { + pub logs: Vec, +} +impl Slicable for Digest where + Item: Member + Slicable +{ + fn decode(input: &mut I) -> Option { + Some(Digest { logs: Slicable::decode(input)? }) + } + fn using_encoded R>(&self, f: F) -> R { + self.logs.using_encoded(f) + } +} +impl Digesty for Digest where + Item: Member + Slicable +{ + type Item = Item; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + +#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +#[serde(rename_all = "camelCase")] +#[serde(deny_unknown_fields)] +pub struct Header where + Number: Member, + Hash: Member, + DigestItem: Member, +{ + pub parent_hash: Hash, + pub number: Number, + pub state_root: Hash, + pub extrinsics_root: Hash, + pub digest: Digest, +} +impl Slicable for Header where + Number: Member + Slicable, + Hash: Member + Slicable, + DigestItem: Member + Slicable, +{ + fn decode(input: &mut I) -> Option { + Some(Header { + parent_hash: Slicable::decode(input)?, + number: Slicable::decode(input)?, + state_root: Slicable::decode(input)?, + extrinsics_root: Slicable::decode(input)?, + digest: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.parent_hash.using_encoded(|s| v.extend(s)); + self.number.using_encoded(|s| v.extend(s)); + self.state_root.using_encoded(|s| v.extend(s)); + self.extrinsics_root.using_encoded(|s| v.extend(s)); + self.digest.using_encoded(|s| v.extend(s)); + v + } +} +impl Headery for Header where + Number: Member + Slicable, + Hash: Member + Slicable, + DigestItem: Member + Slicable, + { + type Number = Number; + type Hash = Hash; + type Digest = Digest; + + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + Header { + number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest + } + } +} + +#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +#[serde(rename_all = "camelCase")] +#[serde(deny_unknown_fields)] +pub struct Block where + Number: Member, + Hash: Member, + DigestItem: Member, + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member +{ + pub header: Header, + pub extrinsics: Vec>, +} + +impl Slicable + for Block +where + Number: Member, + Hash: Member, + DigestItem: Member, + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member, + Header: Slicable, + UncheckedExtrinsic: Slicable, +{ + fn decode(input: &mut I) -> Option { + Some(Block { + header: Slicable::decode(input)?, + extrinsics: Slicable::decode(input)?, + }) + } + fn encode(&self) -> Vec { + let mut v: Vec = Vec::new(); + v.extend(self.header.encode()); + v.extend(self.extrinsics.encode()); + v + } +} + +impl Blocky + for Block +where + Number: Member + Slicable, + Hash: Member + Slicable, + DigestItem: Member + Slicable, + AccountId: Member, + Index: Member, + Call: Member, + Signature: Member +{ + type Extrinsic = UncheckedExtrinsic; + type Header = Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.extrinsics[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.extrinsics) + } +} diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 9920030dfbbed..cb096a0c49a65 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -38,6 +38,8 @@ use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAss #[cfg(feature = "std")] pub mod testing; +pub mod generic; + #[cfg(feature = "std")] pub trait MakeTestExternalities { fn test_externalities(self) -> runtime_io::TestExternalities; From a70d24e4cae1ba77bf878ec2887f27e925498a1e Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 07:42:34 +0200 Subject: [PATCH 60/76] Fix tests. --- Cargo.lock | 1 + demo/executor/Cargo.toml | 1 + demo/executor/src/lib.rs | 52 +++++++++++---------- demo/runtime/src/runtime.rs | 24 +++++++--- substrate/runtime/primitives/src/generic.rs | 5 ++ 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d7ae173256190..66982c46097a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -228,6 +228,7 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-staking 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", diff --git a/demo/executor/Cargo.toml b/demo/executor/Cargo.toml index d42cae45cbb26..2cdc0088399a3 100644 --- a/demo/executor/Cargo.toml +++ b/demo/executor/Cargo.toml @@ -19,5 +19,6 @@ demo-runtime = { path = "../runtime" } [dev-dependencies] substrate-keyring = { path = "../../substrate/keyring" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-runtime-staking = { path = "../../substrate/runtime/staking" } substrate-runtime-system = { path = "../../substrate/runtime/system" } diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index cf8ca10cc743a..7b62c94e4e859 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -28,6 +28,7 @@ extern crate ed25519; extern crate triehash; #[cfg(test)] extern crate substrate_keyring as keyring; +#[cfg(test)] extern crate substrate_runtime_primitives as runtime_primitives; #[cfg(test)] extern crate substrate_runtime_support as runtime_support; #[cfg(test)] extern crate substrate_runtime_staking as staking; #[cfg(test)] extern crate substrate_runtime_system as system; @@ -45,11 +46,10 @@ mod tests { use runtime_support::{Hashable, StorageValue, StorageMap}; use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; - use demo_primitives::{Hash, Header, BlockNumber, Digest}; - use demo_runtime::extrinsic::{Extrinsic, UncheckedExtrinsic}; - use demo_runtime::block::Block; + use demo_primitives::{Hash, BlockNumber}; + use runtime_primitives::Headery; use {staking, system}; - use demo_runtime::runtime::{Call, Concrete, Staking}; + use demo_runtime::runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking}; use demo_runtime::runtime::{MakeTestExternalities, TestingConfig, SessionConfig, StakingConfig}; use ed25519::{Public, Pair}; @@ -63,18 +63,22 @@ mod tests { ) } - fn tx() -> UncheckedExtrinsic { + fn xt() -> UncheckedExtrinsic { let extrinsic = Extrinsic { signed: Alice.into(), - nonce: 0, + index: 0, function: Call::Staking(staking::Call::transfer::(Bob.into(), 69)), }; let signature = Keyring::from_raw_public(extrinsic.signed).unwrap() - .sign(&extrinsic.encode()); + .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } } + fn from_block_number(n: u64) -> Header { + Header::new(n, Default::default(), Default::default(), [69; 32].into(), Default::default()) + } + #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ @@ -83,9 +87,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_err()); } @@ -97,9 +101,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_err()); } @@ -111,9 +115,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { @@ -130,9 +134,9 @@ mod tests { twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; - let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { @@ -170,7 +174,7 @@ mod tests { let extrinsics = extrinsics.into_iter().map(|extrinsic| { let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed)).unwrap()) - .sign(&extrinsic.encode()); + .sign(&extrinsic.encode()).into(); UncheckedExtrinsic { extrinsic, signature } }).collect::>(); @@ -182,7 +186,7 @@ mod tests { number, state_root, extrinsics_root, - digest: Digest { logs: vec![], }, + digest: Default::default(), }; let hash = header.blake2_256(); @@ -196,7 +200,7 @@ mod tests { hex!("b5a1cfe8075af9f2021a6fbabf13d033e579fb90341a4524743313e3b114865e").into(), vec![Extrinsic { signed: Alice.into(), - nonce: 0, + index: 0, function: Call::Staking(staking::Call::transfer(Bob.into(), 69)), }] ) @@ -210,12 +214,12 @@ mod tests { vec![ Extrinsic { signed: Bob.into(), - nonce: 0, + index: 0, function: Call::Staking(staking::Call::transfer(Alice.into(), 5)), }, Extrinsic { signed: Alice.into(), - nonce: 1, + index: 1, function: Call::Staking(staking::Call::transfer(Bob.into(), 15)), } ] @@ -269,9 +273,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&tx())); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_err()); } @@ -284,9 +288,9 @@ mod tests { ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&Header::from_block_number(1u64))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&tx())); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&xt())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 25e325305521b..930e3740329d6 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -102,13 +102,25 @@ impl_outer_dispatch! { } } +pub type Header = primitives::generic::Header< + demo_primitives::BlockNumber, demo_primitives::Hash, Vec, +>; + +pub type Block = primitives::generic::Block< + demo_primitives::BlockNumber, demo_primitives::Hash, Vec, + demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature +>; + +pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic< + demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature +>; + +pub type Extrinsic = primitives::generic::Extrinsic< + demo_primitives::AccountId, demo_primitives::Index, Call +>; + pub type Executive = executive::Executive< - Concrete, - primitives::generic::Block< - demo_primitives::BlockNumber, demo_primitives::Hash, Vec, - demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature - >, - Staking, + Concrete, Block, Staking, (((((), Council), Democracy), Staking), Session), >; diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 6fc916ae30219..4cb0728c3a8bd 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -99,6 +99,11 @@ impl Slicable for Ed25519Signature { fn decode(input: &mut I) -> Option { Some(Ed25519Signature(Slicable::decode(input)?,)) } fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } } +impl From for Ed25519Signature { + fn from(h: H512) -> Ed25519Signature { + Ed25519Signature(h) + } +} /// A extrinsics right from the external world. Unchecked. #[derive(PartialEq, Eq, Clone)] From d895a17f757750bf30aaebe0070684a24bc77beb Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 08:58:58 +0200 Subject: [PATCH 61/76] Refactor runtime to remove genesismap. --- demo/cli/src/lib.rs | 71 +++++---- demo/executor/src/lib.rs | 10 +- demo/primitives/src/header.rs | 182 ------------------------ demo/primitives/src/lib.rs | 16 +-- demo/runtime/src/genesismap.rs | 130 ----------------- demo/runtime/src/lib.rs | 3 - demo/runtime/src/runtime.rs | 32 ++--- substrate/runtime/consensus/src/lib.rs | 10 +- substrate/runtime/council/src/lib.rs | 103 ++++++-------- substrate/runtime/democracy/src/lib.rs | 36 ++--- substrate/runtime/executive/src/lib.rs | 16 +-- substrate/runtime/primitives/src/lib.rs | 51 ++++++- substrate/runtime/session/src/lib.rs | 28 ++-- substrate/runtime/staking/src/lib.rs | 32 ++--- substrate/runtime/system/src/lib.rs | 15 +- 15 files changed, 235 insertions(+), 500 deletions(-) delete mode 100644 demo/primitives/src/header.rs delete mode 100644 demo/runtime/src/genesismap.rs diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 8c0a3711abcb1..88407239b10c8 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -22,6 +22,7 @@ extern crate env_logger; extern crate ed25519; extern crate triehash; extern crate substrate_codec as codec; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_state_machine as state_machine; extern crate substrate_client as client; extern crate substrate_primitives as primitives; @@ -42,7 +43,9 @@ extern crate log; pub mod error; use codec::Slicable; -use demo_runtime::genesismap::{additional_storage_with_genesis, GenesisConfig}; +use runtime_io::with_externalities; +use demo_runtime::runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, + SessionConfig, StakingConfig, BuildExternalities}; use client::genesis; /// Parse command line arguments and start the node. @@ -70,32 +73,52 @@ pub fn run(args: I) -> error::Result<()> where let god_key = hex!["3d866ec8a9190c8343c2fc593d21d8a6d0c5c4763aaab2349de3a6111d64d124"]; let genesis_config = GenesisConfig { - validators: vec![god_key.clone()], - authorities: vec![god_key.clone()], - balances: vec![(god_key.clone(), 1u64 << 63)].into_iter().collect(), - block_time: 5, // 5 second block time. - session_length: 720, // that's 1 hour per session. - sessions_per_era: 24, // 24 hours per era. - bonding_duration: 90, // 90 days per bond. - launch_period: 120 * 24 * 14, // 2 weeks per public referendum - voting_period: 120 * 24 * 28, // 4 weeks to discuss & vote on an active referendum - minimum_deposit: 1000, // 1000 as the minimum deposit for a referendum - candidacy_bond: 1000, // 1000 to become a council candidate - voter_bond: 100, // 100 down to vote for a candidate - present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. - carry_count: 24, // carry over the 24 runners-up to the next council election - presentation_duration: 120 * 24, // one day for presenting winners. - council_election_voting_period: 7 * 120 * 24, // one week period between possible council elections. - council_term_duration: 180 * 120 * 24, // 180 day term duration for the council. - desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. - inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. - cooloff_period: 90 * 120 * 24, // 90 day cooling off period if council member vetoes a proposal. - council_proposal_voting_period: 7 * 120 * 24, // 7 day voting period for council members. + consensus: Some(ConsensusConfig { + authorities: vec![god_key.clone()], + }), + system: None, +// block_time: 5, // 5 second block time. + session: Some(SessionConfig { + validators: vec![god_key.clone()], + session_length: 720, // that's 1 hour per session. + }), + staking: Some(StakingConfig { + current_era: 0, + intentions: vec![], + transaction_fee: 100, + balances: vec![(god_key.clone(), 1u64 << 63)].into_iter().collect(), + validator_count: 12, + sessions_per_era: 24, // 24 hours per era. + bonding_duration: 90, // 90 days per bond. + }), + democracy: Some(DemocracyConfig { + launch_period: 120 * 24 * 14, // 2 weeks per public referendum + voting_period: 120 * 24 * 28, // 4 weeks to discuss & vote on an active referendum + minimum_deposit: 1000, // 1000 as the minimum deposit for a referendum + }), + council: Some(CouncilConfig { + active_council: vec![], + candidacy_bond: 1000, // 1000 to become a council candidate + voter_bond: 100, // 100 down to vote for a candidate + present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. + carry_count: 24, // carry over the 24 runners-up to the next council election + presentation_duration: 120 * 24, // one day for presenting winners. + approval_voting_period: 7 * 120 * 24, // one week period between possible council elections. + term_duration: 180 * 120 * 24, // 180 day term duration for the council. + desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. + inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. + + cooloff_period: 90 * 120 * 24, // 90 day cooling off period if council member vetoes a proposal. + voting_period: 7 * 120 * 24, // 7 day voting period for council members. + }), }; let prepare_genesis = || { - storage = genesis_config.genesis_map(); + storage = genesis_config.build_externalities(); let block = genesis::construct_genesis_block(&storage); - storage.extend(additional_storage_with_genesis(&block)); + with_externalities(&mut storage, || + // TODO: use api.rs to dispatch instead + demo_runtime::runtime::System::initialise_genesis_state(&block.header) + ); (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) }; let client = client::new_in_mem(executor, prepare_genesis)?; diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 7b62c94e4e859..f09b773458453 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -50,7 +50,7 @@ mod tests { use runtime_primitives::Headery; use {staking, system}; use demo_runtime::runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking}; - use demo_runtime::runtime::{MakeTestExternalities, TestingConfig, SessionConfig, StakingConfig}; + use demo_runtime::runtime::{BuildExternalities, GenesisConfig, SessionConfig, StakingConfig}; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -148,7 +148,7 @@ mod tests { fn new_test_ext() -> TestExternalities { use keyring::Keyring::*; let three = [3u8; 32]; - TestingConfig { + GenesisConfig { consensus: Some(Default::default()), system: Some(Default::default()), session: Some(SessionConfig { @@ -166,7 +166,7 @@ mod tests { }), democracy: Some(Default::default()), council: Some(Default::default()), - }.test_externalities() + }.build_externalities() } fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, extrinsics: Vec) -> (Vec, Hash) { @@ -197,7 +197,7 @@ mod tests { construct_block( 1, [69u8; 32].into(), - hex!("b5a1cfe8075af9f2021a6fbabf13d033e579fb90341a4524743313e3b114865e").into(), + hex!("4d58afeca0dec7604a0bcfb29573e6ad202efe65c8535b013c0c79b5a8c9114d").into(), vec![Extrinsic { signed: Alice.into(), index: 0, @@ -210,7 +210,7 @@ mod tests { construct_block( 2, block1().1, - hex!("b646ea6f29832a39dad9feca778a1b612dc25c79ca34dc026176fcfd8943de57").into(), + hex!("218ce7bdf2350713aa52dbf0a12d1e8b0a3a9f1623e7c95aa4800886e96397d1").into(), vec![ Extrinsic { signed: Bob.into(), diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs deleted file mode 100644 index 6a2c12345c0e2..0000000000000 --- a/demo/primitives/src/header.rs +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Block and header type definitions. - -#[cfg(feature = "std")] -use primitives::bytes; -use primitives::H256; -use rstd::vec::Vec; -use codec::{Input, Slicable}; - -pub use primitives::block::Id; -pub use runtime_primitives::{Digesty, Headery}; - -/// Used to refer to a block number. -pub type Number = u64; - -/// Hash used to refer to a block hash. -pub type HeaderHash = H256; - -/// Execution log (event) -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - -/// The digest of a block, useful for light-clients. -#[derive(Clone, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Digest { - /// All logs that have happened in the block. - pub logs: Vec, -} - -impl Slicable for Digest { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(|logs| Digest { logs }) - } - - fn using_encoded R>(&self, f: F) -> R { - self.logs.using_encoded(f) - } -} - -impl Digesty for Digest { - type Item = Log; - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } -} - -/// Header for a block. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header { - /// Block parent's hash. - pub parent_hash: HeaderHash, - /// Block number. - pub number: Number, - /// State root after this transition. - pub state_root: H256, - /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub extrinsics_root: H256, - /// The digest of activity on the block. - pub digest: Digest, -} - -impl Header { - /// Create a new instance with default fields except `number`, which is given as an argument. - pub fn from_block_number(number: Number) -> Self { - Header { - parent_hash: Default::default(), - number, - state_root: Default::default(), - extrinsics_root: Default::default(), - digest: Default::default(), - } - } -} - -impl Headery for Header { - type Number = Number; - type Hash = HeaderHash; - type Digest = Digest; - fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - Header { - number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest - } - } -} - -impl Slicable for Header { - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: Slicable::decode(input)?, - number: Slicable::decode(input)?, - state_root: Slicable::decode(input)?, - extrinsics_root: Slicable::decode(input)?, - digest: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parent_hash.using_encoded(|s| v.extend(s)); - self.number.using_encoded(|s| v.extend(s)); - self.state_root.using_encoded(|s| v.extend(s)); - self.extrinsics_root.using_encoded(|s| v.extend(s)); - self.digest.using_encoded(|s| v.extend(s)); - - v - } -} - -#[cfg(test)] -mod tests { - use super::*; - use codec::Slicable; - use substrate_serializer as ser; - - #[test] - fn test_header_serialization() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - extrinsics_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1])] }, - }; - - assert_eq!(ser::to_string_pretty(&header), r#"{ - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", - "number": 67, - "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", - "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", - "digest": { - "logs": [ - "0x01" - ] - } -}"#); - - let v = header.encode(); - assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); - } -} diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 857bb3b9d3cff..3ac070ce7d527 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -21,24 +21,16 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] - -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; -#[cfg(feature = "std")] -extern crate serde; +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] extern crate serde; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_primitives as primitives; -#[cfg(test)] -extern crate substrate_serializer; extern crate substrate_codec as codec; -pub mod header; - -pub use self::header::{Header, Log, Digest}; -pub use self::header::Number as BlockNumber; +/// An index to a block. +pub type BlockNumber = u64; /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. diff --git a/demo/runtime/src/genesismap.rs b/demo/runtime/src/genesismap.rs deleted file mode 100644 index 5d51f2f383ace..0000000000000 --- a/demo/runtime/src/genesismap.rs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Tool for creating the genesis block. - -use codec::{KeyedVec, Joiner}; -use std::collections::HashMap; -use runtime_io::twox_128; -use runtime_support::{Hashable, StorageMap, StorageValue}; -use substrate_primitives::Block; -use demo_primitives::{AccountId, BlockNumber, Balance}; -use runtime::Concrete; -use {consensus, council, democracy, session, staking, system}; -use council::voting as council_voting; - -/// Configuration of a general Substrate Demo genesis block. -pub struct GenesisConfig { - pub validators: Vec, - pub authorities: Vec, - pub balances: Vec<(AccountId, Balance)>, - pub block_time: u64, - pub session_length: BlockNumber, - pub sessions_per_era: BlockNumber, - pub bonding_duration: BlockNumber, - pub launch_period: BlockNumber, - pub voting_period: BlockNumber, - pub minimum_deposit: Balance, - pub candidacy_bond: Balance, - pub voter_bond: Balance, - pub present_slash_per_voter: Balance, - pub carry_count: u32, - pub presentation_duration: BlockNumber, - pub council_election_voting_period: BlockNumber, - pub council_term_duration: BlockNumber, - pub desired_seats: u32, - pub inactive_grace_period: BlockNumber, - pub cooloff_period: BlockNumber, - pub council_proposal_voting_period: BlockNumber, -} - -impl GenesisConfig { - pub fn new_simple(authorities_validators: Vec, balance: Balance) -> Self { - GenesisConfig { - validators: authorities_validators.clone(), - authorities: authorities_validators.clone(), - balances: authorities_validators.iter().map(|v| (v.clone(), balance)).collect(), - block_time: 30, // 30 second block time. - session_length: 120, // that's 1 hour per session. - sessions_per_era: 24, // 24 hours per era. - bonding_duration: 90, // 90 days per bond. - launch_period: 120 * 24 * 14, // 2 weeks per public referendum - voting_period: 120 * 24 * 28, // 4 weeks to discuss & vote on an active referendum - minimum_deposit: 1000, // 1000 as the minimum deposit for a referendum - candidacy_bond: 1000, // 1000 to become a council candidate - voter_bond: 100, // 100 down to vote for a candidate - present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. - carry_count: 24, // carry over the 24 runners-up to the next council election - presentation_duration: 120 * 24, // one day for presenting winners. - council_election_voting_period: 7 * 120 * 24, // one week period between possible council elections. - council_term_duration: 180 * 120 * 24, // 180 day term duration for the council. - desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. - inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. - cooloff_period: 90 * 120 * 24, // 90 day cooling off period if council member vetoes a proposal. - council_proposal_voting_period: 7 * 120 * 24, // 7 day voting period for council members. - } - } - - pub fn genesis_map(&self) -> HashMap, Vec> { - let wasm_runtime = include_bytes!("../wasm/genesis.wasm").to_vec(); - vec![ - (>::key(), vec![].and(&self.session_length)), - (>::key(), vec![].and(&self.validators)), - - (&>::key()[..], vec![].and(&Vec::::new())), - (&>::key()[..], vec![].and(&self.sessions_per_era)), - (&>::key()[..], vec![].and(&0u64)), - - (>::key(), vec![].and(&self.launch_period)), - (>::key(), vec![].and(&self.voting_period)), - (>::key(), vec![].and(&self.minimum_deposit)), - - (>::key(), vec![].and(&self.candidacy_bond)), - (>::key(), vec![].and(&self.voter_bond)), - (>::key(), vec![].and(&self.present_slash_per_voter)), - (>::key(), vec![].and(&self.carry_count)), - (>::key(), vec![].and(&self.presentation_duration)), - (>::key(), vec![].and(&self.council_election_voting_period)), - (>::key(), vec![].and(&self.council_term_duration)), - (>::key(), vec![].and(&self.desired_seats)), - (>::key(), vec![].and(&self.inactive_grace_period)), - - (>::key(), vec![].and(&self.cooloff_period)), - (>::key(), vec![].and(&self.council_proposal_voting_period)) - ].into_iter() - .map(|(k, v)| (Into::>::into(k), v)) - .chain(self.balances.iter() - .map(|&(account, balance)| (>::key_for(&account), vec![].and(&balance))) - ) - .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) - .chain(vec![ - (consensus::CODE.to_vec(), wasm_runtime), - (consensus::AUTHORITY_COUNT[..].into(), vec![].and(&(self.authorities.len() as u32))), - ].into_iter()) - .chain(self.authorities.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(consensus::AUTHORITY_AT), vec![].and(account))) - ) - .collect() - } -} - -pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { - use codec::Slicable; - map![ - >::key_for(&0) => genesis_block.header.blake2_256().encode() - ] -} diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 8002ef42304b3..ab8061eecdcbe 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -44,8 +44,5 @@ extern crate substrate_codec as codec; #[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] extern crate substrate_primitives; extern crate demo_primitives; -//#[cfg(test)] #[macro_use] extern crate hex_literal; - pub mod runtime; pub mod api; -#[cfg(feature = "std")] pub mod genesismap; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 930e3740329d6..4242213c7e79f 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -124,15 +124,15 @@ pub type Executive = executive::Executive< (((((), Council), Democracy), Staking), Session), >; -#[cfg(any(feature = "std", test))] pub type ConsensusConfig = consensus::TestingConfig; -#[cfg(any(feature = "std", test))] pub type SystemConfig = system::TestingConfig; -#[cfg(any(feature = "std", test))] pub type SessionConfig = session::TestingConfig; -#[cfg(any(feature = "std", test))] pub type StakingConfig = staking::TestingConfig; -#[cfg(any(feature = "std", test))] pub type DemocracyConfig = democracy::TestingConfig; -#[cfg(any(feature = "std", test))] pub type CouncilConfig = council::TestingConfig; +#[cfg(any(feature = "std", test))] pub type ConsensusConfig = consensus::GenesisConfig; +#[cfg(any(feature = "std", test))] pub type SystemConfig = system::GenesisConfig; +#[cfg(any(feature = "std", test))] pub type SessionConfig = session::GenesisConfig; +#[cfg(any(feature = "std", test))] pub type StakingConfig = staking::GenesisConfig; +#[cfg(any(feature = "std", test))] pub type DemocracyConfig = democracy::GenesisConfig; +#[cfg(any(feature = "std", test))] pub type CouncilConfig = council::GenesisConfig; #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { pub consensus: Option, pub system: Option, pub session: Option, @@ -142,29 +142,29 @@ pub struct TestingConfig { } #[cfg(any(feature = "std", test))] -pub use runtime_primitives::MakeTestExternalities; +pub use runtime_primitives::BuildExternalities; #[cfg(any(feature = "std", test))] -impl MakeTestExternalities for TestingConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { +impl BuildExternalities for GenesisConfig { + fn build_externalities(self) -> runtime_io::TestExternalities { let mut s = runtime_io::TestExternalities::default(); if let Some(extra) = self.consensus { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } if let Some(extra) = self.system { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } if let Some(extra) = self.session { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } if let Some(extra) = self.staking { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } if let Some(extra) = self.democracy { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } if let Some(extra) = self.council { - s.extend(extra.test_externalities()); + s.extend(extra.build_externalities()); } s } diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 78e49996fb990..0f6706d0810a6 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -78,23 +78,23 @@ impl Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { pub authorities: Vec, } #[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { - TestingConfig { + GenesisConfig { authorities: vec![], } } } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig +impl primitives::BuildExternalities for GenesisConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities { use codec::{Slicable, KeyedVec}; let auth_count = self.authorities.len() as u32; let mut r: runtime_io::TestExternalities = self.authorities.into_iter().enumerate().map(|(i, v)| diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index bb4426ddbe45a..f22cbde534e99 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -499,13 +499,19 @@ impl Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { // for the voting onto the council + pub candidacy_bond: T::Balance, + pub voter_bond: T::Balance, + pub present_slash_per_voter: T::Balance, + pub carry_count: u32, pub active_council: Vec<(T::AccountId, T::BlockNumber)>, pub approval_voting_period: T::BlockNumber, - pub presentation_period: T::BlockNumber, + pub presentation_duration: T::BlockNumber, pub desired_seats: u32, pub term_duration: T::BlockNumber, + pub inactive_grace_period: T::BlockNumber, + // for the council's votes. pub cooloff_period: T::BlockNumber, @@ -513,70 +519,42 @@ pub struct TestingConfig { } #[cfg(any(feature = "std", test))] -impl TestingConfig { - pub fn new() -> Self { - TestingConfig { - active_council: vec![], - approval_voting_period: T::BlockNumber::sa(4), - presentation_period: T::BlockNumber::sa(2), - desired_seats: 2, - term_duration: T::BlockNumber::sa(5), - cooloff_period: T::BlockNumber::sa(2), - voting_period: T::BlockNumber::sa(1), - } - } - - pub fn with_council() -> Self where T::AccountId: From { - use keyring::Keyring::*; - let expiry = T::BlockNumber::sa(10); - TestingConfig { - active_council: vec![ - (T::AccountId::from(Alice), expiry), - (T::AccountId::from(Bob), expiry), - (T::AccountId::from(Charlie), expiry) - ], - approval_voting_period: T::BlockNumber::sa(4), - presentation_period: T::BlockNumber::sa(2), - desired_seats: 2, - term_duration: T::BlockNumber::sa(5), - cooloff_period: T::BlockNumber::sa(2), - voting_period: T::BlockNumber::sa(1), - } - } -} - -#[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { - TestingConfig { + GenesisConfig { + candidacy_bond: T::Balance::sa(9), + voter_bond: T::Balance::sa(0), + present_slash_per_voter: T::Balance::sa(1), + carry_count: 2, + inactive_grace_period: T::BlockNumber::sa(1), active_council: vec![], approval_voting_period: T::BlockNumber::sa(1000), - presentation_period: T::BlockNumber::sa(1000), + presentation_duration: T::BlockNumber::sa(1000), desired_seats: 0, term_duration: T::BlockNumber::sa(5), cooloff_period: T::BlockNumber::sa(1000), - voting_period: T::BlockNumber::sa(1000), + voting_period: T::BlockNumber::sa(3), } } } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig +impl primitives::BuildExternalities for GenesisConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities { use codec::Slicable; use runtime_io::twox_128; map![ - twox_128(>::key()).to_vec() => T::Balance::sa(9).encode(), - twox_128(>::key()).to_vec() => T::Balance::sa(3).encode(), - twox_128(>::key()).to_vec() => T::Balance::sa(1).encode(), - twox_128(>::key()).to_vec() => 2u32.encode(), - twox_128(>::key()).to_vec() => self.presentation_period.encode(), + twox_128(>::key()).to_vec() => self.candidacy_bond.encode(), + twox_128(>::key()).to_vec() => self.voter_bond.encode(), + twox_128(>::key()).to_vec() => self.present_slash_per_voter.encode(), + twox_128(>::key()).to_vec() => self.carry_count.encode(), + twox_128(>::key()).to_vec() => self.presentation_duration.encode(), twox_128(>::key()).to_vec() => self.approval_voting_period.encode(), twox_128(>::key()).to_vec() => self.term_duration.encode(), twox_128(>::key()).to_vec() => self.desired_seats.encode(), - twox_128(>::key()).to_vec() => T::BlockNumber::sa(1).encode(), + twox_128(>::key()).to_vec() => self.inactive_grace_period.encode(), twox_128(>::key()).to_vec() => self.active_council.encode(), twox_128(>::key()).to_vec() => self.cooloff_period.encode(), @@ -590,7 +568,7 @@ mod tests { pub use super::*; pub use runtime_io::with_externalities; pub use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::{HasPublicAux, Identity, BuildExternalities}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { @@ -639,15 +617,15 @@ mod tests { impl Trait for Test {} pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(consensus::TestingConfig::{ + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::{ authorities: vec![], - }.test_externalities()); - t.extend(session::TestingConfig::{ + }.build_externalities()); + t.extend(session::GenesisConfig::{ session_length: 1, //??? or 2? validators: vec![10, 20], - }.test_externalities()); - t.extend(staking::TestingConfig::{ + }.build_externalities()); + t.extend(staking::GenesisConfig::{ sessions_per_era: 1, current_era: 0, balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], @@ -655,25 +633,30 @@ mod tests { validator_count: 2, bonding_duration: 0, transaction_fee: 0, - }.test_externalities()); - t.extend(democracy::TestingConfig::{ + }.build_externalities()); + t.extend(democracy::GenesisConfig::{ launch_period: 1, voting_period: 3, minimum_deposit: 1, - }.test_externalities()); - t.extend(TestingConfig::{ + }.build_externalities()); + t.extend(GenesisConfig::{ + candidacy_bond: 9, + voter_bond: 0, + present_slash_per_voter: 1, + carry_count: 2, + inactive_grace_period: 1, active_council: if with_council { vec![ (1, 10), (2, 10), (3, 10) ] } else { vec![] }, approval_voting_period: 4, - presentation_period: 2, + presentation_duration: 2, desired_seats: 2, term_duration: 5, cooloff_period: 2, voting_period: 1, - }.test_externalities()); + }.build_externalities()); t } diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index ac9a4ed13378a..d88c27aa29756 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -270,16 +270,16 @@ impl Executable for Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { pub launch_period: T::BlockNumber, pub voting_period: T::BlockNumber, pub minimum_deposit: T::Balance, } #[cfg(any(feature = "std", test))] -impl TestingConfig { +impl GenesisConfig { pub fn new() -> Self { - TestingConfig { + GenesisConfig { launch_period: T::BlockNumber::sa(1), voting_period: T::BlockNumber::sa(1), minimum_deposit: T::Balance::sa(1), @@ -287,7 +287,7 @@ impl TestingConfig { } pub fn extended() -> Self { - TestingConfig { + GenesisConfig { launch_period: T::BlockNumber::sa(1), voting_period: T::BlockNumber::sa(3), minimum_deposit: T::Balance::sa(1), @@ -296,9 +296,9 @@ impl TestingConfig { } #[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { - TestingConfig { + GenesisConfig { launch_period: T::BlockNumber::sa(1000), voting_period: T::BlockNumber::sa(1000), minimum_deposit: T::Balance::sa(0), @@ -307,9 +307,9 @@ impl Default for TestingConfig { } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig +impl primitives::BuildExternalities for GenesisConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities { use codec::Slicable; use runtime_io::twox_128; @@ -326,7 +326,7 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::{HasPublicAux, Identity, BuildExternalities}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { @@ -374,15 +374,15 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(consensus::TestingConfig::{ + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::{ authorities: vec![], - }.test_externalities()); - t.extend(session::TestingConfig::{ + }.build_externalities()); + t.extend(session::GenesisConfig::{ session_length: 1, //??? or 2? validators: vec![10, 20], - }.test_externalities()); - t.extend(staking::TestingConfig::{ + }.build_externalities()); + t.extend(staking::GenesisConfig::{ sessions_per_era: 1, current_era: 0, balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], @@ -390,12 +390,12 @@ mod tests { validator_count: 2, bonding_duration: 3, transaction_fee: 0, - }.test_externalities()); - t.extend(TestingConfig::{ + }.build_externalities()); + t.extend(GenesisConfig::{ launch_period: 1, voting_period: 1, minimum_deposit: 1, - }.test_externalities()); + }.build_externalities()); t } diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 60619e0dcbd6e..0a9e2cec8170b 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -160,7 +160,7 @@ mod tests { use staking::Call; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, Headery, MakeTestExternalities}; + use primitives::{HasPublicAux, Identity, Headery, BuildExternalities}; use primitives::testing::{Digest, Header, Block}; pub struct Test; @@ -193,8 +193,8 @@ mod tests { #[test] fn staking_balance_transfer_dispatch_works() { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(staking::TestingConfig:: { + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(staking::GenesisConfig:: { sessions_per_era: 0, current_era: 0, balances: vec![(1, 111)], @@ -202,7 +202,7 @@ mod tests { validator_count: 0, bonding_duration: 0, transaction_fee: 10, - }.test_externalities()); + }.build_externalities()); let xt = primitives::testing::TestXt((1, 0, Call::transfer(2, 69))); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); @@ -213,10 +213,10 @@ mod tests { } fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(consensus::TestingConfig::::default().test_externalities()); - t.extend(session::TestingConfig::::default().test_externalities()); - t.extend(staking::TestingConfig::::default().test_externalities()); + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::::default().build_externalities()); + t.extend(session::GenesisConfig::::default().build_externalities()); + t.extend(staking::GenesisConfig::::default().build_externalities()); t } diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index cb096a0c49a65..f5984051d377f 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -41,8 +41,8 @@ pub mod testing; pub mod generic; #[cfg(feature = "std")] -pub trait MakeTestExternalities { - fn test_externalities(self) -> runtime_io::TestExternalities; +pub trait BuildExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities; } pub trait MakePayment { @@ -148,6 +148,13 @@ pub trait Digesty { fn push(&mut self, item: Self::Item); } +impl Digesty for substrate_primitives::Digest { + type Item = substrate_primitives::block::Log; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. @@ -171,6 +178,32 @@ pub trait Headery: Sized + Slicable { ) -> Self; } +impl Headery for substrate_primitives::Header { + type Number = substrate_primitives::block::Number; + type Hash = substrate_primitives::block::HeaderHash; + type Digest = substrate_primitives::block::Digest; + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.transaction_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + substrate_primitives::Header { + number: number, + transaction_root: extrinsics_root, + state_root: state_root, + parent_hash: parent_hash, + digest: digest, + } + } +} + /// Something which fulfills the abstract idea of a Substrate block. It has types for an /// `Extrinsic` piece of information as well as a `Header`. /// @@ -183,6 +216,20 @@ pub trait Blocky { fn deconstruct(self) -> (Self::Header, Vec); } +impl Blocky for substrate_primitives::Block { + type Extrinsic = substrate_primitives::block::Transaction; + type Header = substrate_primitives::Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.transactions[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.transactions) + } +} + /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. pub trait Checkable: Sized { diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 62b2216017313..b40c325a629e2 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -149,18 +149,18 @@ impl Executable for Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { pub session_length: T::BlockNumber, pub validators: Vec, } #[cfg(any(feature = "std", test))] -impl TestingConfig where T::AccountId: From { +impl GenesisConfig where T::AccountId: From { pub fn simple() -> Self where T::AccountId: From<[u8; 32]> { use primitives::As; use keyring::Keyring::*; let three = [3u8; 32]; - TestingConfig { + GenesisConfig { session_length: T::BlockNumber::sa(2), validators: vec![T::AccountId::from(One), T::AccountId::from(Two), T::AccountId::from(three)], } @@ -169,7 +169,7 @@ impl TestingConfig where T::AccountId: From { pub fn extended() -> Self { use primitives::As; use keyring::Keyring::*; - TestingConfig { + GenesisConfig { session_length: T::BlockNumber::sa(1), validators: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], } @@ -177,10 +177,10 @@ impl TestingConfig where T::AccountId: From { } #[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { use primitives::As; - TestingConfig { + GenesisConfig { session_length: T::BlockNumber::sa(1000), validators: vec![], } @@ -188,9 +188,9 @@ impl Default for TestingConfig { } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig +impl primitives::BuildExternalities for GenesisConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; use primitives::As; @@ -207,7 +207,7 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::{HasPublicAux, Identity, BuildExternalities}; use primitives::testing::{Digest, Header}; pub struct Test; @@ -236,14 +236,14 @@ mod tests { type Session = Module; fn new_test_ext() -> runtime_io::TestExternalities { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(consensus::TestingConfig::{ + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::{ authorities: vec![1, 2, 3], - }.test_externalities()); - t.extend(TestingConfig::{ + }.build_externalities()); + t.extend(GenesisConfig::{ session_length: 2, validators: vec![1, 2, 3], - }.test_externalities()); + }.build_externalities()); t } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 8e648523ed5be..115c54ee68520 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -579,7 +579,7 @@ impl ContractAddressFor for DummyContractAddressFor { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig { +pub struct GenesisConfig { pub sessions_per_era: T::BlockNumber, pub current_era: T::BlockNumber, pub balances: Vec<(T::AccountId, T::Balance)>, @@ -590,10 +590,10 @@ pub struct TestingConfig { } #[cfg(any(feature = "std", test))] -impl TestingConfig where T::AccountId: From { +impl GenesisConfig where T::AccountId: From { pub fn simple() -> Self { use primitives::As; - TestingConfig { + GenesisConfig { sessions_per_era: T::BlockNumber::sa(2), current_era: T::BlockNumber::sa(0), balances: vec![(T::AccountId::from(1), T::Balance::sa(111))], @@ -606,7 +606,7 @@ impl TestingConfig where T::AccountId: From { pub fn extended() -> Self { use primitives::As; - TestingConfig { + GenesisConfig { sessions_per_era: T::BlockNumber::sa(3), current_era: T::BlockNumber::sa(1), balances: vec![ @@ -627,10 +627,10 @@ impl TestingConfig where T::AccountId: From { } #[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { use primitives::As; - TestingConfig { + GenesisConfig { sessions_per_era: T::BlockNumber::sa(1000), current_era: T::BlockNumber::sa(0), balances: vec![], @@ -643,8 +643,8 @@ impl Default for TestingConfig { } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { +impl primitives::BuildExternalities for GenesisConfig { + fn build_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; @@ -672,7 +672,7 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::{HasPublicAux, Identity, BuildExternalities}; use primitives::testing::{Digest, Header}; pub struct Test; @@ -701,15 +701,15 @@ mod tests { } fn new_test_ext(session_length: u64, sessions_per_era: u64, current_era: u64, monied: bool) -> runtime_io::TestExternalities { - let mut t = system::TestingConfig::::default().test_externalities(); - t.extend(consensus::TestingConfig::{ + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::{ authorities: vec![], - }.test_externalities()); - t.extend(session::TestingConfig::{ + }.build_externalities()); + t.extend(session::GenesisConfig::{ session_length, validators: vec![10, 20], - }.test_externalities()); - t.extend(TestingConfig::{ + }.build_externalities()); + t.extend(GenesisConfig::{ sessions_per_era, current_era, balances: if monied { vec![(1, 10), (2, 20), (3, 30), (4, 40)] } else { vec![] }, @@ -717,7 +717,7 @@ mod tests { validator_count: 2, bonding_duration: 3, transaction_fee: 0, - }.test_externalities()); + }.build_externalities()); t } diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 207a6c74a9f54..61e0b0170ae8b 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -104,6 +104,11 @@ impl Module { >::insert(header.number(), &T::Hashing::hash_of(header)); } + /// Initializes the state following the determination of the genesis block. + pub fn initialise_genesis_state>(header: &H) { + Self::record_block_hash(header); + } + /// Calculate the current block's random seed. fn calculate_random() -> T::Hash { (0..81) @@ -140,19 +145,19 @@ impl Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig(PhantomData); +pub struct GenesisConfig(PhantomData); #[cfg(any(feature = "std", test))] -impl Default for TestingConfig { +impl Default for GenesisConfig { fn default() -> Self { - TestingConfig(PhantomData) + GenesisConfig(PhantomData) } } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig +impl primitives::BuildExternalities for GenesisConfig { - fn test_externalities(self) -> runtime_io::TestExternalities { + fn build_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; From a396025d9ffaa7511e996cec20b9b242107ee134 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:29:11 +0200 Subject: [PATCH 62/76] Streamline runtime more with macrofied config. --- demo/runtime/src/lib.rs | 2 +- demo/runtime/src/runtime.rs | 53 +++++-------------------- substrate/runtime/council/src/lib.rs | 2 +- substrate/runtime/primitives/src/lib.rs | 36 +++++++++++++++++ 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index ab8061eecdcbe..85cf7465dfbbc 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -22,7 +22,7 @@ #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; -extern crate substrate_runtime_primitives as runtime_primitives; +#[cfg_attr(feature = "std", macro_use)]extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; extern crate substrate_runtime_democracy as democracy; diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 4242213c7e79f..4cfb76f5a6c51 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -16,11 +16,11 @@ //! Dispatch system. Just dispatches calls. -#[cfg(any(feature = "std", test))] use runtime_io; use runtime_io::BlakeTwo256; use demo_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; use runtime_primitives::{self as primitives, Identity, HasPublicAux}; +pub use runtime_primitives::BuildExternalities; // TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into // Some(its own PrivCall) or None. @@ -124,48 +124,13 @@ pub type Executive = executive::Executive< (((((), Council), Democracy), Staking), Session), >; -#[cfg(any(feature = "std", test))] pub type ConsensusConfig = consensus::GenesisConfig; -#[cfg(any(feature = "std", test))] pub type SystemConfig = system::GenesisConfig; -#[cfg(any(feature = "std", test))] pub type SessionConfig = session::GenesisConfig; -#[cfg(any(feature = "std", test))] pub type StakingConfig = staking::GenesisConfig; -#[cfg(any(feature = "std", test))] pub type DemocracyConfig = democracy::GenesisConfig; -#[cfg(any(feature = "std", test))] pub type CouncilConfig = council::GenesisConfig; - -#[cfg(any(feature = "std", test))] -pub struct GenesisConfig { - pub consensus: Option, - pub system: Option, - pub session: Option, - pub staking: Option, - pub democracy: Option, - pub council: Option, -} - -#[cfg(any(feature = "std", test))] -pub use runtime_primitives::BuildExternalities; - -#[cfg(any(feature = "std", test))] -impl BuildExternalities for GenesisConfig { - fn build_externalities(self) -> runtime_io::TestExternalities { - let mut s = runtime_io::TestExternalities::default(); - if let Some(extra) = self.consensus { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.system { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.session { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.staking { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.democracy { - s.extend(extra.build_externalities()); - } - if let Some(extra) = self.council { - s.extend(extra.build_externalities()); - } - s +impl_outer_config! { + pub struct GenesisConfig for Concrete { + ConsensusConfig => consensus, + SystemConfig => system, + SessionConfig => session, + StakingConfig => staking, + DemocracyConfig => democracy, + CouncilConfig => council, } } diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index f22cbde534e99..b556f141e7c49 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -641,7 +641,7 @@ mod tests { }.build_externalities()); t.extend(GenesisConfig::{ candidacy_bond: 9, - voter_bond: 0, + voter_bond: 3, present_slash_per_voter: 1, carry_count: 2, inactive_grace_period: 1, diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index f5984051d377f..a1aaf727dd5c3 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -30,6 +30,7 @@ extern crate substrate_codec as codec; extern crate substrate_primitives; use rstd::prelude::*; +#[cfg(feature = "std")] pub use std::collections::HashMap; use codec::Slicable; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; @@ -45,6 +46,41 @@ pub trait BuildExternalities { fn build_externalities(self) -> runtime_io::TestExternalities; } +#[macro_export] +macro_rules! __impl_outer_config_types { + ($concrete:ident $config:ident $snake:ident $($rest:ident)*) => { + #[cfg(any(feature = "std", test))] + pub type $config = $snake::GenesisConfig<$concrete>; + __impl_outer_config_types! {$concrete $($rest)*} + }; + ($concrete:ident) => () +} + +#[macro_export] +macro_rules! impl_outer_config { + ( pub struct $main:ident for $concrete:ident { $( $config:ident => $snake:ident, )* } ) => { + __impl_outer_config_types! { $concrete $( $config $snake )* } + #[cfg(any(feature = "std", test))] + pub struct $main { + $( + pub $snake: Option<$config>, + )* + } + #[cfg(any(feature = "std", test))] + impl $crate::BuildExternalities for $main { + fn build_externalities(self) -> $crate::HashMap::, Vec> { + let mut s = $crate::HashMap::, Vec>::new(); + $( + if let Some(extra) = self.$snake { + s.extend(extra.build_externalities()); + } + )* + s + } + } + } +} + pub trait MakePayment { fn make_payment(who: &AccountId); } From bf438e57ab0f6168c549fc0eeea6f319ad00542a Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:34:39 +0200 Subject: [PATCH 63/76] Clean paths --- demo/runtime/src/runtime.rs | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 4cfb76f5a6c51..6e7cfa4833053 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -17,7 +17,7 @@ //! Dispatch system. Just dispatches calls. use runtime_io::BlakeTwo256; -use demo_primitives; +use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use {consensus, council, democracy, executive, session, staking, system, timestamp}; use runtime_primitives::{self as primitives, Identity, HasPublicAux}; pub use runtime_primitives::BuildExternalities; @@ -37,7 +37,7 @@ impl democracy::IsCancelReferendum for PrivCall { pub struct Concrete; impl HasPublicAux for Concrete { - type PublicAux = demo_primitives::AccountId; + type PublicAux = AccountId; } impl timestamp::Trait for Concrete { @@ -46,18 +46,18 @@ impl timestamp::Trait for Concrete { pub type Timestamp = timestamp::Module; impl consensus::Trait for Concrete { - type SessionKey = demo_primitives::AccountId; + type SessionKey = AccountId; } pub type Consensus = consensus::Module; impl system::Trait for Concrete { - type Index = demo_primitives::Index; - type BlockNumber = demo_primitives::BlockNumber; - type Hash = demo_primitives::Hash; + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; type Hashing = BlakeTwo256; type Digest = primitives::generic::Digest>; - type AccountId = demo_primitives::AccountId; - type Header = primitives::generic::Header>; + type AccountId = AccountId; + type Header = primitives::generic::Header>; } pub type System = system::Module; @@ -68,7 +68,7 @@ impl session::Trait for Concrete { pub type Session = session::Module; impl staking::Trait for Concrete { - type Balance = demo_primitives::Balance; + type Balance = Balance; type DetermineContractAddress = BlakeTwo256; } pub type Staking = staking::Module; @@ -103,20 +103,20 @@ impl_outer_dispatch! { } pub type Header = primitives::generic::Header< - demo_primitives::BlockNumber, demo_primitives::Hash, Vec, + BlockNumber, Hash, Vec, >; pub type Block = primitives::generic::Block< - demo_primitives::BlockNumber, demo_primitives::Hash, Vec, - demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature + BlockNumber, Hash, Vec, + AccountId, Index, Call, Signature >; pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic< - demo_primitives::AccountId, demo_primitives::Index, Call, demo_primitives::Signature + AccountId, Index, Call, Signature >; pub type Extrinsic = primitives::generic::Extrinsic< - demo_primitives::AccountId, demo_primitives::Index, Call + AccountId, Index, Call >; pub type Executive = executive::Executive< From 98387bb08000374925cd4b27a4c1fbd25b12e7cf Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:37:29 +0200 Subject: [PATCH 64/76] Fix warning. --- demo/runtime/src/runtime.rs | 5 ++--- substrate/runtime/primitives/src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 6e7cfa4833053..686cc3abbebbc 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -46,7 +46,7 @@ impl timestamp::Trait for Concrete { pub type Timestamp = timestamp::Module; impl consensus::Trait for Concrete { - type SessionKey = AccountId; + type SessionKey = SessionKey; } pub type Consensus = consensus::Module; @@ -107,8 +107,7 @@ pub type Header = primitives::generic::Header< >; pub type Block = primitives::generic::Block< - BlockNumber, Hash, Vec, - AccountId, Index, Call, Signature + BlockNumber, Hash, Vec, AccountId, Index, Call, Signature >; pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic< diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index a1aaf727dd5c3..3cfacd3260bae 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -68,7 +68,7 @@ macro_rules! impl_outer_config { } #[cfg(any(feature = "std", test))] impl $crate::BuildExternalities for $main { - fn build_externalities(self) -> $crate::HashMap::, Vec> { + fn build_externalities(self) -> $crate::HashMap, Vec> { let mut s = $crate::HashMap::, Vec>::new(); $( if let Some(extra) = self.$snake { From 69587a0d5c5e81554a3c457ec2745a380ee8775a Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:46:05 +0200 Subject: [PATCH 65/76] Consolidate demo runtime crate. --- demo/cli/src/lib.rs | 4 +- demo/executor/src/lib.rs | 4 +- demo/runtime/src/api.rs | 27 -------- demo/runtime/src/lib.rs | 125 +++++++++++++++++++++++++++++---- demo/runtime/src/runtime.rs | 135 ------------------------------------ 5 files changed, 116 insertions(+), 179 deletions(-) delete mode 100644 demo/runtime/src/api.rs delete mode 100644 demo/runtime/src/runtime.rs diff --git a/demo/cli/src/lib.rs b/demo/cli/src/lib.rs index 88407239b10c8..4fdfc535c3473 100644 --- a/demo/cli/src/lib.rs +++ b/demo/cli/src/lib.rs @@ -44,7 +44,7 @@ pub mod error; use codec::Slicable; use runtime_io::with_externalities; -use demo_runtime::runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, +use demo_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, SessionConfig, StakingConfig, BuildExternalities}; use client::genesis; @@ -117,7 +117,7 @@ pub fn run(args: I) -> error::Result<()> where let block = genesis::construct_genesis_block(&storage); with_externalities(&mut storage, || // TODO: use api.rs to dispatch instead - demo_runtime::runtime::System::initialise_genesis_state(&block.header) + demo_runtime::System::initialise_genesis_state(&block.header) ); (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) }; diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index f09b773458453..ae135301e8265 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -49,8 +49,8 @@ mod tests { use demo_primitives::{Hash, BlockNumber}; use runtime_primitives::Headery; use {staking, system}; - use demo_runtime::runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking}; - use demo_runtime::runtime::{BuildExternalities, GenesisConfig, SessionConfig, StakingConfig}; + use demo_runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking, + BuildExternalities, GenesisConfig, SessionConfig, StakingConfig}; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); diff --git a/demo/runtime/src/api.rs b/demo/runtime/src/api.rs deleted file mode 100644 index f9ed4f1af9492..0000000000000 --- a/demo/runtime/src/api.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -use runtime; - -impl_stubs!( - authorities => |()| runtime::Consensus::authorities(), - initialise_block => |header| runtime::Executive::initialise_block(&header), - apply_extrinsic => |extrinsic| runtime::Executive::apply_extrinsic(extrinsic), - execute_block => |block| runtime::Executive::execute_block(block), - finalise_block => |()| runtime::Executive::finalise_block(), - validator_count => |()| runtime::Session::validator_count(), - validators => |()| runtime::Session::validators() -); diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 85cf7465dfbbc..a3a5bc164a871 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -18,11 +18,9 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; - -#[cfg_attr(feature = "std", macro_use)]extern crate substrate_runtime_primitives as runtime_primitives; +#[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; extern crate substrate_runtime_democracy as democracy; @@ -31,18 +29,119 @@ extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; +extern crate demo_primitives; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; -extern crate safe_mix; +use runtime_io::BlakeTwo256; +use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; +use runtime_primitives::{generic, Identity, HasPublicAux}; +pub use runtime_primitives::BuildExternalities; -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; -#[cfg(feature = "std")] extern crate serde; +// TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into +// Some(its own PrivCall) or None. +impl democracy::IsCancelReferendum for PrivCall { + fn is_cancel_referendum(&self) -> Option { + if let &PrivCall::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { + Some(*ref_index) + } else { + None + } + } +} -#[cfg(feature = "std")] extern crate rustc_hex; +pub struct Concrete; -extern crate substrate_codec as codec; -#[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] extern crate substrate_primitives; -extern crate demo_primitives; +impl HasPublicAux for Concrete { + type PublicAux = AccountId; +} + +impl timestamp::Trait for Concrete { + type Value = u64; +} +pub type Timestamp = timestamp::Module; + +impl consensus::Trait for Concrete { + type SessionKey = SessionKey; +} +pub type Consensus = consensus::Module; + +impl system::Trait for Concrete { + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Digest = generic::Digest>; + type AccountId = AccountId; + type Header = generic::Header>; +} +pub type System = system::Module; + +impl session::Trait for Concrete { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; +} +pub type Session = session::Module; + +impl staking::Trait for Concrete { + type Balance = Balance; + type DetermineContractAddress = BlakeTwo256; +} +pub type Staking = staking::Module; + +impl democracy::Trait for Concrete { + type Proposal = PrivCall; +} +pub type Democracy = democracy::Module; + +impl council::Trait for Concrete {} +pub type Council = council::Module; +pub type CouncilVoting = council::voting::Module; + +impl_outer_dispatch! { + pub enum Call where aux: ::PublicAux { + Session = 1, + Staking = 2, + Timestamp = 3, + Democracy = 5, + Council = 6, + CouncilVoting = 7, + } + + pub enum PrivCall { + Consensus = 0, + Session = 1, + Staking = 2, + Democracy = 5, + Council = 6, + CouncilVoting = 7, + } +} + +pub type Header = generic::Header>; +pub type Block = generic::Block, AccountId, Index, Call, Signature>; +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +pub type Extrinsic = generic::Extrinsic; +pub type Executive = executive::Executive; + +impl_outer_config! { + pub struct GenesisConfig for Concrete { + ConsensusConfig => consensus, + SystemConfig => system, + SessionConfig => session, + StakingConfig => staking, + DemocracyConfig => democracy, + CouncilConfig => council, + } +} -pub mod runtime; -pub mod api; +pub mod api { + impl_stubs!( + authorities => |()| super::Consensus::authorities(), + initialise_block => |header| super::Executive::initialise_block(&header), + apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), + execute_block => |block| super::Executive::execute_block(block), + finalise_block => |()| super::Executive::finalise_block(), + validator_count => |()| super::Session::validator_count(), + validators => |()| super::Session::validators() + ); +} diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs deleted file mode 100644 index 686cc3abbebbc..0000000000000 --- a/demo/runtime/src/runtime.rs +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Substrate Demo. - -// Substrate Demo 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. - -// Substrate Demo 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 Substrate Demo. If not, see . - -//! Dispatch system. Just dispatches calls. - -use runtime_io::BlakeTwo256; -use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; -use {consensus, council, democracy, executive, session, staking, system, timestamp}; -use runtime_primitives::{self as primitives, Identity, HasPublicAux}; -pub use runtime_primitives::BuildExternalities; - -// TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into -// Some(its own PrivCall) or None. -impl democracy::IsCancelReferendum for PrivCall { - fn is_cancel_referendum(&self) -> Option { - if let &PrivCall::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { - Some(*ref_index) - } else { - None - } - } -} - -pub struct Concrete; - -impl HasPublicAux for Concrete { - type PublicAux = AccountId; -} - -impl timestamp::Trait for Concrete { - type Value = u64; -} -pub type Timestamp = timestamp::Module; - -impl consensus::Trait for Concrete { - type SessionKey = SessionKey; -} -pub type Consensus = consensus::Module; - -impl system::Trait for Concrete { - type Index = Index; - type BlockNumber = BlockNumber; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Digest = primitives::generic::Digest>; - type AccountId = AccountId; - type Header = primitives::generic::Header>; -} -pub type System = system::Module; - -impl session::Trait for Concrete { - type PublicAux = ::PublicAux; - type ConvertAccountIdToSessionKey = Identity; -} -pub type Session = session::Module; - -impl staking::Trait for Concrete { - type Balance = Balance; - type DetermineContractAddress = BlakeTwo256; -} -pub type Staking = staking::Module; - -impl democracy::Trait for Concrete { - type Proposal = PrivCall; -} -pub type Democracy = democracy::Module; - -impl council::Trait for Concrete {} -pub type Council = council::Module; -pub type CouncilVoting = council::voting::Module; - -impl_outer_dispatch! { - pub enum Call where aux: ::PublicAux { - Session = 1, - Staking = 2, - Timestamp = 3, - Democracy = 5, - Council = 6, - CouncilVoting = 7, - } - - pub enum PrivCall { - Consensus = 0, - Session = 1, - Staking = 2, - Democracy = 5, - Council = 6, - CouncilVoting = 7, - } -} - -pub type Header = primitives::generic::Header< - BlockNumber, Hash, Vec, ->; - -pub type Block = primitives::generic::Block< - BlockNumber, Hash, Vec, AccountId, Index, Call, Signature ->; - -pub type UncheckedExtrinsic = primitives::generic::UncheckedExtrinsic< - AccountId, Index, Call, Signature ->; - -pub type Extrinsic = primitives::generic::Extrinsic< - AccountId, Index, Call ->; - -pub type Executive = executive::Executive< - Concrete, Block, Staking, - (((((), Council), Democracy), Staking), Session), ->; - -impl_outer_config! { - pub struct GenesisConfig for Concrete { - ConsensusConfig => consensus, - SystemConfig => system, - SessionConfig => session, - StakingConfig => staking, - DemocracyConfig => democracy, - CouncilConfig => council, - } -} From 87147f8b17550aaa28055334437092b31bf71372 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 12:44:56 +0200 Subject: [PATCH 66/76] Remove stale code. --- substrate/runtime-support/src/dispatch.rs | 210 ---------------------- 1 file changed, 210 deletions(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 399727031b528..3b759a78581da 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -479,213 +479,3 @@ macro_rules! impl_outer_dispatch_common { } } - - -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////// - - -/// Implement a dispatch module to create a pairing of a dispatch trait and enum. -#[macro_export] -macro_rules! impl_dispatch { - ( - pub mod $mod_name:ident; - $( - fn $fn_name:ident(self - $( - , $param_name:ident : $param:ty - )* - ) - = $id:expr ; - )* - ) => { - pub mod $mod_name { - use super::*; - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[repr(u32)] - #[allow(non_camel_case_types)] - enum Id { - $( - #[allow(non_camel_case_types)] - $fn_name = $id, - )* - } - - impl Id { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - match value { - $( - $id => Some(Id::$fn_name), - )* - _ => None, - } - } - } - - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[allow(missing_docs)] - pub enum Call { - $( - #[allow(non_camel_case_types)] - $fn_name ( $( $param ),* ) - ,)* - } - - pub trait Dispatch: Sized { - $( - fn $fn_name (self, $( $param_name: $param ),* ); - )* - } - - impl Call { - pub fn dispatch(self, d: D) { - match self { - $( - Call::$fn_name( $( $param_name ),* ) => - d.$fn_name( $( $param_name ),* ), - )* - } - } - } - - impl $crate::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - let id = input.read_byte().and_then(Id::from_u8)?; - Some(match id { - $( - Id::$fn_name => { - $( - let $param_name = $crate::dispatch::Slicable::decode(input)?; - )* - Call :: $fn_name( $( $param_name ),* ) - } - )* - }) - } - - fn encode(&self) -> $crate::dispatch::Vec { - let mut v = $crate::dispatch::Vec::new(); - match *self { - $( - Call::$fn_name( - $( - ref $param_name - ),* - ) => { - (Id::$fn_name as u8).using_encoded(|s| v.extend(s)); - $( - $param_name.using_encoded(|s| v.extend(s)); - )* - } - )* - } - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } - } - - } - } -} - -/// Implement a meta-dispatch module to dispatch to other dispatchers. -#[macro_export] -macro_rules! impl_meta_dispatch { - ( - pub mod $super_name:ident; - path $path:ident; - trait $trait:ty; - $( - $camelcase:ident(mod $sub_name_head:ident $( :: $sub_name_tail:ident )* ) = $id:expr ; - )* - ) => { - pub mod $super_name { - use super::*; - - #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[repr(u32)] - #[allow(non_camel_case_types)] - enum Id { - $( - #[allow(non_camel_case_types)] - $camelcase = $id, - )* - } - - impl Id { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - match value { - $( - $id => Some(Id::$camelcase), - )* - _ => None, - } - } - } - - #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] - #[allow(missing_docs)] - pub enum Call { - $( - #[allow(non_camel_case_types)] - $camelcase ( $sub_name_head $( :: $sub_name_tail )* ::$path::Call ) - ,)* - } - - impl Call { - pub fn dispatch(self, d: $trait) { - match self { - $( - Call::$camelcase(x) => x.dispatch(d), - )* - } - } - } - - impl $crate::dispatch::Slicable for Call { - fn decode(input: &mut I) -> Option { - let id = input.read_byte().and_then(Id::from_u8)?; - Some(match id { - $( - Id::$camelcase => - Call::$camelcase( $crate::dispatch::Slicable::decode(input)? ), - )* - }) - } - - fn encode(&self) -> $crate::dispatch::Vec { - let mut v = $crate::dispatch::Vec::new(); - match *self { - $( - Call::$camelcase( ref sub ) => { - (Id::$camelcase as u8).using_encoded(|s| v.extend(s)); - sub.using_encoded(|s| v.extend(s)); - } - )* - } - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } - } - - } - } -} From e5383686a9ee8c98f3d4c543684ba9a360b6db03 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 13:39:58 +0200 Subject: [PATCH 67/76] Refactor away dodgy trait. --- demo/primitives/src/lib.rs | 1 - demo/runtime/src/lib.rs | 12 ----------- substrate/runtime-support/src/dispatch.rs | 15 +++++++++++++ substrate/runtime-support/src/lib.rs | 2 +- substrate/runtime/council/src/lib.rs | 9 -------- substrate/runtime/council/src/voting.rs | 5 ++--- substrate/runtime/democracy/src/lib.rs | 26 ++++++----------------- 7 files changed, 25 insertions(+), 45 deletions(-) diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 3ac070ce7d527..1095278478f36 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -21,7 +21,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; extern crate substrate_runtime_std as rstd; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index a3a5bc164a871..d1973cf2378d0 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -36,18 +36,6 @@ use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, use runtime_primitives::{generic, Identity, HasPublicAux}; pub use runtime_primitives::BuildExternalities; -// TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into -// Some(its own PrivCall) or None. -impl democracy::IsCancelReferendum for PrivCall { - fn is_cancel_referendum(&self) -> Option { - if let &PrivCall::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { - Some(*ref_index) - } else { - None - } - } -} - pub struct Concrete; impl HasPublicAux for Concrete { diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 3b759a78581da..88bb5f1e242dd 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -377,6 +377,10 @@ macro_rules! __decl_dispatch_module_common { } } +pub trait IsSubType { + fn is_sub_type(&self) -> Option<&::Call>; +} + /// Implement a meta-dispatch module to dispatch to other dispatchers. #[macro_export] macro_rules! impl_outer_dispatch { @@ -438,6 +442,17 @@ macro_rules! impl_outer_dispatch { } } } + $( + impl $crate::dispatch::IsSubType<$camelcase> for $call_type { + fn is_sub_type(&self) -> Option<&<$camelcase as $crate::dispatch::Callable>::Call> { + if let $call_type::$camelcase ( ref r ) = *self { + Some(r) + } else { + None + } + } + } + )* impl_outer_dispatch!{ $($rest)* } } } diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index ad1e8a0f6300a..6c4a20f7d8f55 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -38,4 +38,4 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable}; +pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsSubType}; diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index b556f141e7c49..a2cc7cea0d9a3 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -577,15 +577,6 @@ mod tests { Democracy = 1, } } - impl democracy::IsCancelReferendum for Proposal { - fn is_cancel_referendum(&self) -> Option { - if let &Proposal::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { - Some(*ref_index) - } else { - None - } - } - } pub struct Test; impl HasPublicAux for Test { diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index fe0e0548622e9..96b89699de916 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -20,10 +20,9 @@ use rstd::prelude::*; use rstd::borrow::Borrow; use primitives::{Executable, RefInto}; use runtime_io::Hashing; -use runtime_support::{StorageValue, StorageMap}; +use runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; use super::{Trait, Module as Council}; -use democracy::IsCancelReferendum; decl_module! { pub struct Module; @@ -173,7 +172,7 @@ impl Module { fn end_block(now: T::BlockNumber) { while let Some((proposal, proposal_hash)) = Self::take_proposal_if_expiring_at(now) { let tally = Self::take_tally(&proposal_hash); - if let Some(ref_index) = proposal.is_cancel_referendum() { + if let Some(&democracy::PrivCall::cancel_referendum(ref_index)) = IsSubType::>::is_sub_type(&proposal) { if let (_, 0, 0) = tally { >::internal_cancel_referendum(ref_index); } diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index d88c27aa29756..596109a8adafe 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -33,7 +33,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use primitives::{Zero, Executable, RefInto, As}; -use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable}; +use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; mod vote_threshold; pub use vote_threshold::{Approved, VoteThreshold}; @@ -43,13 +43,8 @@ pub type PropIndex = u32; /// A referendum index. pub type ReferendumIndex = u32; -/// Is a proposal the "cancel_referendum"? -pub trait IsCancelReferendum { - fn is_cancel_referendum(&self) -> Option; -} - -pub trait Trait: staking::Trait { - type Proposal: Parameter + Dispatchable + IsCancelReferendum; +pub trait Trait: staking::Trait + Sized { + type Proposal: Parameter + Dispatchable + IsSubType>; } decl_module! { @@ -331,17 +326,9 @@ mod tests { impl_outer_dispatch! { pub enum Proposal { - Staking = 0, - Democracy = 1, - } - } - impl IsCancelReferendum for Proposal { - fn is_cancel_referendum(&self) -> Option { - if let &Proposal::Democracy(PrivCall::cancel_referendum(ref ref_index)) = self { - Some(*ref_index) - } else { - None - } + Session = 0, + Staking = 1, + Democracy = 2, } } @@ -400,6 +387,7 @@ mod tests { } type System = system::Module; + type Session = session::Module; type Staking = staking::Module; type Democracy = Module; From adb9a135c5fbbf85c3b5f600e52b0be21753ac55 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 14:28:20 +0200 Subject: [PATCH 68/76] Add corresponding Aux type. --- substrate/runtime-support/src/dispatch.rs | 14 ++++++++++++++ substrate/runtime-support/src/lib.rs | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index 88bb5f1e242dd..d5d9c97f3b9c1 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -380,6 +380,9 @@ macro_rules! __decl_dispatch_module_common { pub trait IsSubType { fn is_sub_type(&self) -> Option<&::Call>; } +pub trait IsAuxSubType { + fn is_aux_sub_type(&self) -> Option<&::Call>; +} /// Implement a meta-dispatch module to dispatch to other dispatchers. #[macro_export] @@ -413,6 +416,17 @@ macro_rules! impl_outer_dispatch { } } } + $( + impl $crate::dispatch::IsAuxSubType<$camelcase> for $call_type { + fn is_aux_sub_type(&self) -> Option<&<$camelcase as $crate::dispatch::AuxCallable>::Call> { + if let $call_type::$camelcase ( ref r ) = *self { + Some(r) + } else { + None + } + } + } + )* impl_outer_dispatch!{ $($rest)* } }; ( diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 6c4a20f7d8f55..1f6ac20f81a67 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -38,4 +38,4 @@ mod hashable; pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; pub use self::hashable::Hashable; -pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsSubType}; +pub use self::dispatch::{Parameter, Dispatchable, Callable, AuxDispatchable, AuxCallable, IsSubType, IsAuxSubType}; From 98c24b2086d939b91b87065393d1901d4b77e3f9 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 22:08:07 +0200 Subject: [PATCH 69/76] Fixes --- Cargo.lock | 3 --- polkadot/consensus/src/service.rs | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20e9f68258c47..9c88eeb867418 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1212,11 +1212,8 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-network 0.1.0", "substrate-primitives 0.1.0", -<<<<<<< HEAD "substrate-runtime-support 0.1.0", -======= "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ->>>>>>> master "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/polkadot/consensus/src/service.rs b/polkadot/consensus/src/service.rs index 288f7a7d839a5..d3c44fecc4747 100644 --- a/polkadot/consensus/src/service.rs +++ b/polkadot/consensus/src/service.rs @@ -26,6 +26,7 @@ use parking_lot::Mutex; use substrate_network as net; use tokio_core::reactor; use client::BlockchainEvents; +use runtime_support::Hashable; use substrate_keyring::Keyring; use primitives::{Hash, AuthorityId}; use primitives::block::{Id as BlockId, HeaderHash, Header}; @@ -151,7 +152,7 @@ impl Service { }; let bft_service = BftService::new(client.clone(), key, factory); let build_bft = |header: &Header| -> Result<_, Error> { - let hash = header.hash(); + let hash = header.blake2_256().into(); let authorities = client.authorities(&BlockId::Hash(hash))?; let input = network.bft_messages() .filter_map(move |message| { From f69f56f9d29e2fe38eabfd426e8cced573d36aeb Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 31 Mar 2018 11:58:20 +0200 Subject: [PATCH 70/76] Rename Digesty -> Digest --- demo/executor/src/lib.rs | 2 +- demo/primitives/src/lib.rs | 2 +- demo/runtime/src/lib.rs | 3 +- publish-wasm.sh | 2 +- substrate/runtime/council/src/lib.rs | 5 +- substrate/runtime/council/src/voting.rs | 2 +- substrate/runtime/democracy/src/lib.rs | 5 +- .../runtime/democracy/src/vote_threshold.rs | 2 +- substrate/runtime/executive/src/lib.rs | 7 +- substrate/runtime/primitives/src/generic.rs | 41 +-- substrate/runtime/primitives/src/lib.rs | 248 +-------------- substrate/runtime/primitives/src/testing.rs | 8 +- substrate/runtime/primitives/src/traits.rs | 292 ++++++++++++++++++ substrate/runtime/session/src/lib.rs | 13 +- substrate/runtime/staking/src/lib.rs | 11 +- substrate/runtime/system/src/lib.rs | 16 +- substrate/runtime/timestamp/src/lib.rs | 2 +- 17 files changed, 351 insertions(+), 310 deletions(-) create mode 100644 substrate/runtime/primitives/src/traits.rs diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index ae135301e8265..63680ef7b23c7 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -47,7 +47,7 @@ mod tests { use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; use demo_primitives::{Hash, BlockNumber}; - use runtime_primitives::Headery; + use runtime_primitives::traits::Headery; use {staking, system}; use demo_runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking, BuildExternalities, GenesisConfig, SessionConfig, StakingConfig}; diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index 1095278478f36..ecfb5f7e7d214 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -49,4 +49,4 @@ pub type Index = u64; pub type Hash = primitives::H256; /// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = runtime_primitives::generic::Ed25519Signature; +pub type Signature = runtime_primitives::traits::Ed25519Signature; diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index d1973cf2378d0..9161974303b92 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -33,7 +33,8 @@ extern crate demo_primitives; use runtime_io::BlakeTwo256; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; -use runtime_primitives::{generic, Identity, HasPublicAux}; +use runtime_primitives::generic; +use runtime_primitives::traits::{Identity, HasPublicAux}; pub use runtime_primitives::BuildExternalities; pub struct Concrete; diff --git a/publish-wasm.sh b/publish-wasm.sh index 8424817c66d72..7ac79a99bf548 100755 --- a/publish-wasm.sh +++ b/publish-wasm.sh @@ -4,7 +4,7 @@ set -e REPO="github.com/paritytech/polkadot-wasm-bin.git" REPO_AUTH="${GH_TOKEN}:@${REPO}" -SRCS=( "polkadot/runtime/wasm" "substrate/executor/wasm" "substrate/test-runtime/wasm" ) +SRCS=( "polkadot/runtime/wasm" "substrate/executor/wasm" "demo/runtime/wasm" "substrate/test-runtime/wasm" ) DST=".wasm-binaries" TARGET="wasm32-unknown-unknown" UTCDATE=`date -u "+%Y%m%d.%H%M%S.0"` diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index a2cc7cea0d9a3..9f7f4b21bbd1f 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -35,7 +35,7 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use primitives::{Zero, One, RefInto, As}; +use primitives::traits::{Zero, One, RefInto, As}; use runtime_support::{StorageValue, StorageMap}; pub mod voting; @@ -568,7 +568,8 @@ mod tests { pub use super::*; pub use runtime_io::with_externalities; pub use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, BuildExternalities}; + use primitives::BuildExternalities; + use primitives::traits::{HasPublicAux, Identity}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 96b89699de916..13cce3f9158ca 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::{Executable, RefInto}; +use primitives::traits::{Executable, RefInto}; use runtime_io::Hashing; use runtime_support::{StorageValue, StorageMap, IsSubType}; use {system, democracy}; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 596109a8adafe..591f8a29956d4 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -32,7 +32,7 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -use primitives::{Zero, Executable, RefInto, As}; +use primitives::traits::{Zero, Executable, RefInto, As}; use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; mod vote_threshold; @@ -321,7 +321,8 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, BuildExternalities}; + use primitives::BuildExternalities; + use primitives::traits::{HasPublicAux, Identity}; use primitives::testing::{Digest, Header}; impl_outer_dispatch! { diff --git a/substrate/runtime/democracy/src/vote_threshold.rs b/substrate/runtime/democracy/src/vote_threshold.rs index abfecb652d33f..c40f611e34373 100644 --- a/substrate/runtime/democracy/src/vote_threshold.rs +++ b/substrate/runtime/democracy/src/vote_threshold.rs @@ -16,7 +16,7 @@ //! Voting thresholds. -use primitives::IntegerSquareRoot; +use primitives::traits::IntegerSquareRoot; use codec::{Input, Slicable}; use rstd::ops::{Add, Mul, Div}; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 0a9e2cec8170b..0ea20dfa9d280 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -35,7 +35,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; use runtime_io::Hashing; -use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Executable, MakePayment}; +use primitives::traits::{self, Headery, Zero, One, Checkable, Applyable, CheckEqual, Executable, MakePayment}; use codec::Slicable; pub struct Executive< @@ -47,7 +47,7 @@ pub struct Executive< impl< System: system::Trait, - Block: Blocky
, + Block: traits::Blocky
, Payment: MakePayment, Finalisation: Executable, > Executive where @@ -160,7 +160,8 @@ mod tests { use staking::Call; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, Headery, BuildExternalities}; + use primitives::BuildExternalities; + use primitives::traits::{self, HasPublicAux, Identity}; use primitives::testing::{Digest, Header, Block}; pub struct Test; diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 4cb0728c3a8bd..ac2e900b6d6c3 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -18,9 +18,8 @@ use serde::Serialize; use codec::{Slicable, Input}; -use substrate_primitives::hash::H512; use runtime_support::AuxDispatchable; -use super::{Checkable, Applyable, Headery, Blocky, Digesty}; +use traits; use rstd::ops; #[cfg(feature = "std")] @@ -79,32 +78,6 @@ impl Slicable for Extrinsic wher } } -/// Means of signature verification. -pub trait Verify { - type Signer; - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool; -} - -/// Ed25519 signature verify. -#[derive(Eq, PartialEq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize))] -pub struct Ed25519Signature(H512); -impl Verify for Ed25519Signature { - type Signer = [u8; 32]; - fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { - ::runtime_io::ed25519_verify(&(self.0).0, msg, &signer[..]) - } -} -impl Slicable for Ed25519Signature { - fn decode(input: &mut I) -> Option { Some(Ed25519Signature(Slicable::decode(input)?,)) } - fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } -} -impl From for Ed25519Signature { - fn from(h: H512) -> Ed25519Signature { - Ed25519Signature(h) - } -} - /// A extrinsics right from the external world. Unchecked. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] @@ -170,11 +143,11 @@ impl fmt::Debug for UncheckedExtrinsic Checkable for UncheckedExtrinsic where +impl traits::Checkable for UncheckedExtrinsic where AccountId: Member, Index: Member, Call: Member, - Signature: Member + Verify, + Signature: Member + traits::Verify, Extrinsic: Slicable { type Checked = CheckedExtrinsic; @@ -229,7 +202,7 @@ where } } -impl Applyable +impl traits::Applyable for CheckedExtrinsic where AccountId: Member, @@ -269,7 +242,7 @@ impl Slicable for Digest where self.logs.using_encoded(f) } } -impl Digesty for Digest where +impl traits::Digest for Digest where Item: Member + Slicable { type Item = Item; @@ -317,7 +290,7 @@ impl Slicable for Header whe v } } -impl Headery for Header where +impl traits::Headery for Header where Number: Member + Slicable, Hash: Member + Slicable, DigestItem: Member + Slicable, @@ -387,7 +360,7 @@ where } } -impl Blocky +impl traits::Blocky for Block where Number: Member + Slicable, diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 3cfacd3260bae..97c60586ddb4a 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -29,21 +29,20 @@ extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_primitives; -use rstd::prelude::*; -#[cfg(feature = "std")] pub use std::collections::HashMap; -use codec::Slicable; -pub use integer_sqrt::IntegerSquareRoot; -pub use num_traits::{Zero, One, Bounded}; -use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +#[cfg(feature = "std")] use std::collections::HashMap; #[cfg(feature = "std")] pub mod testing; +pub mod traits; pub mod generic; +#[cfg(feature = "std")] +pub type BuiltExternalities = HashMap, Vec>; + #[cfg(feature = "std")] pub trait BuildExternalities { - fn build_externalities(self) -> runtime_io::TestExternalities; + fn build_externalities(self) -> BuiltExternalities; } #[macro_export] @@ -57,6 +56,7 @@ macro_rules! __impl_outer_config_types { } #[macro_export] +/// Implement the output "meta" module configuration struct. macro_rules! impl_outer_config { ( pub struct $main:ident for $concrete:ident { $( $config:ident => $snake:ident, )* } ) => { __impl_outer_config_types! { $concrete $( $config $snake )* } @@ -68,8 +68,8 @@ macro_rules! impl_outer_config { } #[cfg(any(feature = "std", test))] impl $crate::BuildExternalities for $main { - fn build_externalities(self) -> $crate::HashMap, Vec> { - let mut s = $crate::HashMap::, Vec>::new(); + fn build_externalities(self) -> $crate::BuiltExternalities { + let mut s = $crate::BuiltExternalities::new(); $( if let Some(extra) = self.$snake { s.extend(extra.build_externalities()); @@ -80,233 +80,3 @@ macro_rules! impl_outer_config { } } } - -pub trait MakePayment { - fn make_payment(who: &AccountId); -} - -impl MakePayment for () { - fn make_payment(_: &T) {} -} - -pub trait Convert { - fn convert(a: A) -> B; -} - -pub trait As { - fn as_(self) -> T; - fn sa(T) -> Self; -} - -macro_rules! impl_numerics { - ( $( $t:ty ),* ) => { - $( - impl_numerics!($t: u8, u16, u32, u64, usize, i8, i16, i32, i64, isize,); - )* - }; - ( $f:ty : $t:ty, $( $rest:ty, )* ) => { - impl As<$t> for $f { - fn as_(self) -> $t { self as $t } - fn sa(t: $t) -> Self { t as Self } - } - impl_numerics!($f: $( $rest, )*); - }; - ( $f:ty : ) => {} -} - -impl_numerics!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); - -pub struct Identity; -impl Convert for Identity { - fn convert(a: T) -> T { a } -} - -pub trait HasPublicAux { - type PublicAux; -} - -pub trait RefInto { - fn ref_into(&self) -> &T; -} -impl RefInto for T { - fn ref_into(&self) -> &T { &self } -} - -pub trait SimpleArithmetic: - Zero + One + IntegerSquareRoot + As + - Add + AddAssign + - Sub + SubAssign + - Mul + MulAssign + - Div + DivAssign + - Rem + RemAssign + - PartialOrd + Ord -{} -impl + - Add + AddAssign + - Sub + SubAssign + - Mul + MulAssign + - Div + DivAssign + - Rem + RemAssign + - PartialOrd + Ord -> SimpleArithmetic for T {} - -pub trait SimpleBitOps: - Sized + - rstd::ops::BitOr + - rstd::ops::BitAnd -{} -impl + - rstd::ops::BitAnd -> SimpleBitOps for T {} - -/// Something that can be executed. -pub trait Executable { - fn execute(); -} - -impl Executable for () { - fn execute() {} -} -impl Executable for (A, B) { - fn execute() { - A::execute(); - B::execute(); - } -} - -/// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are -/// each `Slicable`. -pub trait Digesty { - type Item: Sized; - fn push(&mut self, item: Self::Item); -} - -impl Digesty for substrate_primitives::Digest { - type Item = substrate_primitives::block::Log; - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } -} - -/// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, -/// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and -/// `parent_hash`, as well as a `digest` and a block `number`. -/// -/// You can also create a `new` one from those fields. -pub trait Headery: Sized + Slicable { - type Number: Sized; - type Hash: Sized; - type Digest: Sized; - fn number(&self) -> &Self::Number; - fn extrinsics_root(&self) -> &Self::Hash; - fn state_root(&self) -> &Self::Hash; - fn parent_hash(&self) -> &Self::Hash; - fn digest(&self) -> &Self::Digest; - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self; -} - -impl Headery for substrate_primitives::Header { - type Number = substrate_primitives::block::Number; - type Hash = substrate_primitives::block::HeaderHash; - type Digest = substrate_primitives::block::Digest; - fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.transaction_root } - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - substrate_primitives::Header { - number: number, - transaction_root: extrinsics_root, - state_root: state_root, - parent_hash: parent_hash, - digest: digest, - } - } -} - -/// Something which fulfills the abstract idea of a Substrate block. It has types for an -/// `Extrinsic` piece of information as well as a `Header`. -/// -/// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Blocky { - type Extrinsic: Sized; - type Header: Headery; - fn header(&self) -> &Self::Header; - fn extrinsics(&self) -> &[Self::Extrinsic]; - fn deconstruct(self) -> (Self::Header, Vec); -} - -impl Blocky for substrate_primitives::Block { - type Extrinsic = substrate_primitives::block::Transaction; - type Header = substrate_primitives::Header; - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.transactions[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.transactions) - } -} - -/// A "checkable" piece of information, used by the standard Substrate Executive in order to -/// check the validity of a piece of extrinsic information, usually by verifying the signature. -pub trait Checkable: Sized { - type Checked: Sized; - fn check(self) -> Result; -} - -/// An "executable" piece of information, used by the standard Substrate Executive in order to -/// enact a piece of extrinsic information by marshalling and dispatching to a named functioon -/// call. -/// -/// Also provides information on to whom this information is attributable and an index that allows -/// each piece of attributable information to be disambiguated. -pub trait Applyable { - type AccountId; - type Index; - fn index(&self) -> &Self::Index; - fn sender(&self) -> &Self::AccountId; - fn apply(self); -} - -/// Something that can be checked for equality and printed out to a debug channel if bad. -pub trait CheckEqual { - fn check_equal(&self, other: &Self); -} - -impl CheckEqual for substrate_primitives::H256 { - #[cfg(feature = "std")] - fn check_equal(&self, other: &Self) { - use substrate_primitives::hexdisplay::HexDisplay; - if &self.0 != &other.0 { - println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); - } - } - - #[cfg(not(feature = "std"))] - fn check_equal(&self, other: &Self) { - if self != other { - runtime_io::print("Hash not equal"); - runtime_io::print(&self.0[..]); - runtime_io::print(&other.0[..]); - } - } -} diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index be2c3e2e8d296..96ae0f3965a8f 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -20,7 +20,7 @@ use serde; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; -use super::{Checkable, Applyable, Headery, Blocky, Digesty}; +use traits::{self, Checkable, Applyable, Headery as HeaderT, Blocky as BlockT, Digest as DigestT}; #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] pub struct Digest { @@ -34,7 +34,7 @@ impl Slicable for Digest { self.logs.using_encoded(f) } } -impl Digesty for Digest { +impl traits::Digest for Digest { type Item = u64; fn push(&mut self, item: Self::Item) { self.logs.push(item); @@ -72,7 +72,7 @@ impl Slicable for Header { v } } -impl Headery for Header { +impl traits::Header for Header { type Number = u64; type Hash = H256; type Digest = Digest; @@ -113,7 +113,7 @@ impl Slicable for Block { v } } -impl Blocky for Block { +impl traits::Blocky for Block { type Extrinsic = Xt; type Header = Header; fn header(&self) -> &Self::Header { diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs new file mode 100644 index 0000000000000..f7793e660a14e --- /dev/null +++ b/substrate/runtime/primitives/src/traits.rs @@ -0,0 +1,292 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Primitives for the runtime modules. + +use rstd::prelude::*; +use rstd; +use substrate_primitives; +use codec::{Input, Slicable}; +use substrate_primitives::hash::H512; +pub use integer_sqrt::IntegerSquareRoot; +pub use num_traits::{Zero, One, Bounded}; +use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; + +/// Means of signature verification. +pub trait Verify { + /// Type of the signer. + type Signer; + /// Verify a signature. + fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool; +} + +/// Ed25519 signature verify. +#[derive(Eq, PartialEq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +pub struct Ed25519Signature(H512); +impl Verify for Ed25519Signature { + type Signer = [u8; 32]; + fn verify(&self, msg: &[u8], signer: &Self::Signer) -> bool { + ::runtime_io::ed25519_verify(&(self.0).0, msg, &signer[..]) + } +} +impl Slicable for Ed25519Signature { + fn decode(input: &mut I) -> Option { Some(Ed25519Signature(Slicable::decode(input)?,)) } + fn using_encoded R>(&self, f: F) -> R { self.0.using_encoded(f) } +} +impl From for Ed25519Signature { + fn from(h: H512) -> Ed25519Signature { + Ed25519Signature(h) + } +} + +/// Simple payment making trait, operating on a single generic `AccountId` type. +pub trait MakePayment { + /// Make some sort of payment concerning `who`. + fn make_payment(who: &AccountId); +} + +impl MakePayment for () { + fn make_payment(_: &T) {} +} + +/// Extensible conversion trait. Generic over both source and destination types. +pub trait Convert { + /// Make conversion. + fn convert(a: A) -> B; +} + +/// Simple trait similar to `Into`, except that it can be used to convert numerics between each +/// other. +pub trait As { + /// Convert forward (ala `Into::into`). + fn as_(self) -> T; + /// Convert backward (ala `From::from`). + fn sa(T) -> Self; +} + +macro_rules! impl_numerics { + ( $( $t:ty ),* ) => { + $( + impl_numerics!($t: u8, u16, u32, u64, usize, i8, i16, i32, i64, isize,); + )* + }; + ( $f:ty : $t:ty, $( $rest:ty, )* ) => { + impl As<$t> for $f { + fn as_(self) -> $t { self as $t } + fn sa(t: $t) -> Self { t as Self } + } + impl_numerics!($f: $( $rest, )*); + }; + ( $f:ty : ) => {} +} + +impl_numerics!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); + +pub struct Identity; +impl Convert for Identity { + fn convert(a: T) -> T { a } +} + +pub trait HasPublicAux { + type PublicAux; +} + +pub trait RefInto { + fn ref_into(&self) -> &T; +} +impl RefInto for T { + fn ref_into(&self) -> &T { &self } +} + +pub trait SimpleArithmetic: + Zero + One + IntegerSquareRoot + As + + Add + AddAssign + + Sub + SubAssign + + Mul + MulAssign + + Div + DivAssign + + Rem + RemAssign + + PartialOrd + Ord +{} +impl + + Add + AddAssign + + Sub + SubAssign + + Mul + MulAssign + + Div + DivAssign + + Rem + RemAssign + + PartialOrd + Ord +> SimpleArithmetic for T {} + +pub trait SimpleBitOps: + Sized + + rstd::ops::BitOr + + rstd::ops::BitAnd +{} +impl + + rstd::ops::BitAnd +> SimpleBitOps for T {} + +/// Something that can be executed. +pub trait Executable { + fn execute(); +} + +impl Executable for () { + fn execute() {} +} +impl Executable for (A, B) { + fn execute() { + A::execute(); + B::execute(); + } +} + +/// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are +/// each `Slicable`. +pub trait Digest { + type Item: Sized; + fn push(&mut self, item: Self::Item); +} + +impl Digest for substrate_primitives::Digest { + type Item = substrate_primitives::block::Log; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + +/// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, +/// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and +/// `parent_hash`, as well as a `digest` and a block `number`. +/// +/// You can also create a `new` one from those fields. +pub trait Headery: Sized + Slicable { + type Number: Sized; + type Hash: Sized; + type Digest: Sized; + fn number(&self) -> &Self::Number; + fn extrinsics_root(&self) -> &Self::Hash; + fn state_root(&self) -> &Self::Hash; + fn parent_hash(&self) -> &Self::Hash; + fn digest(&self) -> &Self::Digest; + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self; +} + +impl Headery for substrate_primitives::Header { + type Number = substrate_primitives::block::Number; + type Hash = substrate_primitives::block::HeaderHash; + type Digest = substrate_primitives::block::Digest; + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.transaction_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + substrate_primitives::Header { + number: number, + transaction_root: extrinsics_root, + state_root: state_root, + parent_hash: parent_hash, + digest: digest, + } + } +} + +/// Something which fulfills the abstract idea of a Substrate block. It has types for an +/// `Extrinsic` piece of information as well as a `Header`. +/// +/// You can get an iterator over each of the `extrinsics` and retrieve the `header`. +pub trait Blocky { + type Extrinsic: Sized; + type Header: Headery; + fn header(&self) -> &Self::Header; + fn extrinsics(&self) -> &[Self::Extrinsic]; + fn deconstruct(self) -> (Self::Header, Vec); +} + +impl Blocky for substrate_primitives::Block { + type Extrinsic = substrate_primitives::block::Transaction; + type Header = substrate_primitives::Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.transactions[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.transactions) + } +} + +/// A "checkable" piece of information, used by the standard Substrate Executive in order to +/// check the validity of a piece of extrinsic information, usually by verifying the signature. +pub trait Checkable: Sized { + type Checked: Sized; + fn check(self) -> Result; +} + +/// An "executable" piece of information, used by the standard Substrate Executive in order to +/// enact a piece of extrinsic information by marshalling and dispatching to a named functioon +/// call. +/// +/// Also provides information on to whom this information is attributable and an index that allows +/// each piece of attributable information to be disambiguated. +pub trait Applyable { + type AccountId; + type Index; + fn index(&self) -> &Self::Index; + fn sender(&self) -> &Self::AccountId; + fn apply(self); +} + +/// Something that can be checked for equality and printed out to a debug channel if bad. +pub trait CheckEqual { + fn check_equal(&self, other: &Self); +} + +impl CheckEqual for substrate_primitives::H256 { + #[cfg(feature = "std")] + fn check_equal(&self, other: &Self) { + use substrate_primitives::hexdisplay::HexDisplay; + if &self.0 != &other.0 { + println!("Hash: given={}, expected={}", HexDisplay::from(&self.0), HexDisplay::from(&other.0)); + } + } + + #[cfg(not(feature = "std"))] + fn check_equal(&self, other: &Self) { + if self != other { + runtime_io::print("Hash not equal"); + runtime_io::print(&self.0[..]); + runtime_io::print(&other.0[..]); + } + } +} diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index b40c325a629e2..692708a5bef70 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -33,7 +33,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; //use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, RefInto, Executable, Convert}; +use primitives::traits::{Zero, One, RefInto, Executable, Convert}; use runtime_support::{StorageValue, StorageMap}; pub trait Trait: consensus::Trait + system::Trait { @@ -157,7 +157,7 @@ pub struct GenesisConfig { #[cfg(any(feature = "std", test))] impl GenesisConfig where T::AccountId: From { pub fn simple() -> Self where T::AccountId: From<[u8; 32]> { - use primitives::As; + use primitives::traits::As; use keyring::Keyring::*; let three = [3u8; 32]; GenesisConfig { @@ -167,7 +167,7 @@ impl GenesisConfig where T::AccountId: From { } pub fn extended() -> Self { - use primitives::As; + use primitives::traits::As; use keyring::Keyring::*; GenesisConfig { session_length: T::BlockNumber::sa(1), @@ -179,7 +179,7 @@ impl GenesisConfig where T::AccountId: From { #[cfg(any(feature = "std", test))] impl Default for GenesisConfig { fn default() -> Self { - use primitives::As; + use primitives::traits::As; GenesisConfig { session_length: T::BlockNumber::sa(1000), validators: vec![], @@ -193,7 +193,7 @@ impl primitives::BuildExternalities for GenesisConfig fn build_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; - use primitives::As; + use primitives::traits::As; map![ twox_128(>::key()).to_vec() => self.session_length.encode(), twox_128(>::key()).to_vec() => T::BlockNumber::sa(0).encode(), @@ -207,7 +207,8 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, BuildExternalities}; + use primitives::BuildExternalities; + use primitives::traits::{HasPublicAux, Identity}; use primitives::testing::{Digest, Header}; pub struct Test; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 115c54ee68520..938d21680c6ff 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -38,7 +38,7 @@ use rstd::marker::PhantomData; use rstd::collections::btree_map::{BTreeMap, Entry}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; -use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment}; +use primitives::traits::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment}; #[cfg(test)] #[derive(Debug, PartialEq, Clone)] @@ -592,7 +592,7 @@ pub struct GenesisConfig { #[cfg(any(feature = "std", test))] impl GenesisConfig where T::AccountId: From { pub fn simple() -> Self { - use primitives::As; + use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(2), current_era: T::BlockNumber::sa(0), @@ -605,7 +605,7 @@ impl GenesisConfig where T::AccountId: From { } pub fn extended() -> Self { - use primitives::As; + use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(3), current_era: T::BlockNumber::sa(1), @@ -629,7 +629,7 @@ impl GenesisConfig where T::AccountId: From { #[cfg(any(feature = "std", test))] impl Default for GenesisConfig { fn default() -> Self { - use primitives::As; + use primitives::traits::As; GenesisConfig { sessions_per_era: T::BlockNumber::sa(1000), current_era: T::BlockNumber::sa(0), @@ -672,7 +672,8 @@ mod tests { use super::*; use runtime_io::with_externalities; use substrate_primitives::H256; - use primitives::{HasPublicAux, Identity, BuildExternalities}; + use primitives::BuildExternalities; + use primitives::traits::{HasPublicAux, Identity}; use primitives::testing::{Digest, Header}; pub struct Test; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 61e0b0170ae8b..4c8126063d2ef 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -33,7 +33,7 @@ use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; #[cfg(any(feature = "std", test))] use codec::Slicable; use runtime_io::Hashing; -use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Headery}; +use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -45,9 +45,9 @@ pub trait Trait { type BlockNumber: Parameter + SimpleArithmetic + Default + Bounded + Copy; type Hash: Parameter + SimpleBitOps + Default + Copy + CheckEqual; type Hashing: Hashing; - type Digest: Parameter + Default + Digesty; + type Digest: Parameter + Default + traits::Digest; type AccountId: Parameter + Ord + Default; - type Header: Headery; + type Header: traits::Headery; } decl_module! { @@ -87,25 +87,25 @@ impl Module { let digest = >::take(); let extrinsics_root = >::take(); let storage_root = T::Hashing::storage_root(); - T::Header::new(number, extrinsics_root, storage_root, parent_hash, digest) + ::new(number, extrinsics_root, storage_root, parent_hash, digest) } /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(item: ::Item) { + pub fn deposit_log(item: ::Item) { let mut l = >::get(); - l.push(item); + traits::Digest::push(&mut l, item); >::put(l); } /// Records a particular block number and hash combination. - pub fn record_block_hash>(header: &H) { + pub fn record_block_hash>(header: &H) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. >::insert(header.number(), &T::Hashing::hash_of(header)); } /// Initializes the state following the determination of the genesis block. - pub fn initialise_genesis_state>(header: &H) { + pub fn initialise_genesis_state>(header: &H) { Self::record_block_hash(header); } diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index bbd3fbeaed81f..e3afc076a868d 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -25,7 +25,7 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_codec as codec; use runtime_support::{StorageValue, Parameter}; -use runtime_primitives::HasPublicAux; +use runtime_primitives::traits::HasPublicAux; pub trait Trait: HasPublicAux { type Value: Parameter + Default; From fb147b921eb54ea71cca8b5df9113b52e2677fe2 Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 31 Mar 2018 12:03:00 +0200 Subject: [PATCH 71/76] Rename Headery -> Header --- demo/executor/src/lib.rs | 2 +- substrate/runtime/executive/src/lib.rs | 4 ++-- substrate/runtime/primitives/src/generic.rs | 2 +- substrate/runtime/primitives/src/testing.rs | 2 +- substrate/runtime/primitives/src/traits.rs | 6 +++--- substrate/runtime/system/src/lib.rs | 8 ++++---- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 63680ef7b23c7..c64855a3d35fc 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -47,7 +47,7 @@ mod tests { use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; use demo_primitives::{Hash, BlockNumber}; - use runtime_primitives::traits::Headery; + use runtime_primitives::traits::Header as HeaderT; use {staking, system}; use demo_runtime::{Header, Block, UncheckedExtrinsic, Extrinsic, Call, Concrete, Staking, BuildExternalities, GenesisConfig, SessionConfig, StakingConfig}; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 0ea20dfa9d280..cfca9686b1c57 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -35,7 +35,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; use runtime_io::Hashing; -use primitives::traits::{self, Headery, Zero, One, Checkable, Applyable, CheckEqual, Executable, MakePayment}; +use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, Executable, MakePayment}; use codec::Slicable; pub struct Executive< @@ -161,7 +161,7 @@ mod tests { use runtime_io::with_externalities; use substrate_primitives::H256; use primitives::BuildExternalities; - use primitives::traits::{self, HasPublicAux, Identity}; + use primitives::traits::{HasPublicAux, Identity, Header as HeaderT}; use primitives::testing::{Digest, Header, Block}; pub struct Test; diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index ac2e900b6d6c3..d49fe4d158bad 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -290,7 +290,7 @@ impl Slicable for Header whe v } } -impl traits::Headery for Header where +impl traits::Header for Header where Number: Member + Slicable, Hash: Member + Slicable, DigestItem: Member + Slicable, diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index 96ae0f3965a8f..c901ab53116c3 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -20,7 +20,7 @@ use serde; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; -use traits::{self, Checkable, Applyable, Headery as HeaderT, Blocky as BlockT, Digest as DigestT}; +use traits::{self, Checkable, Applyable, Header as HeaderT, Blocky as BlockT, Digest as DigestT}; #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] pub struct Digest { diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index f7793e660a14e..8cccc8a4168fc 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -176,7 +176,7 @@ impl Digest for substrate_primitives::Digest { /// `parent_hash`, as well as a `digest` and a block `number`. /// /// You can also create a `new` one from those fields. -pub trait Headery: Sized + Slicable { +pub trait Header: Sized + Slicable { type Number: Sized; type Hash: Sized; type Digest: Sized; @@ -194,7 +194,7 @@ pub trait Headery: Sized + Slicable { ) -> Self; } -impl Headery for substrate_primitives::Header { +impl Header for substrate_primitives::Header { type Number = substrate_primitives::block::Number; type Hash = substrate_primitives::block::HeaderHash; type Digest = substrate_primitives::block::Digest; @@ -226,7 +226,7 @@ impl Headery for substrate_primitives::Header { /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. pub trait Blocky { type Extrinsic: Sized; - type Header: Headery; + type Header: Header; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; fn deconstruct(self) -> (Self::Header, Vec); diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 4c8126063d2ef..0b7eb5036b31d 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -47,7 +47,7 @@ pub trait Trait { type Hashing: Hashing; type Digest: Parameter + Default + traits::Digest; type AccountId: Parameter + Ord + Default; - type Header: traits::Headery; + type Header: traits::Header; } decl_module! { @@ -87,7 +87,7 @@ impl Module { let digest = >::take(); let extrinsics_root = >::take(); let storage_root = T::Hashing::storage_root(); - ::new(number, extrinsics_root, storage_root, parent_hash, digest) + ::new(number, extrinsics_root, storage_root, parent_hash, digest) } /// Deposits a log and ensures it matches the blocks log data. @@ -98,14 +98,14 @@ impl Module { } /// Records a particular block number and hash combination. - pub fn record_block_hash>(header: &H) { + pub fn record_block_hash>(header: &H) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. >::insert(header.number(), &T::Hashing::hash_of(header)); } /// Initializes the state following the determination of the genesis block. - pub fn initialise_genesis_state>(header: &H) { + pub fn initialise_genesis_state>(header: &H) { Self::record_block_hash(header); } From b1d954441fd636e56e4bc17e7eda84744440509d Mon Sep 17 00:00:00 2001 From: Gav Date: Sat, 31 Mar 2018 12:05:37 +0200 Subject: [PATCH 72/76] Blocky -> Block --- substrate/runtime/executive/src/lib.rs | 2 +- substrate/runtime/primitives/src/generic.rs | 2 +- substrate/runtime/primitives/src/testing.rs | 4 ++-- substrate/runtime/primitives/src/traits.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index cfca9686b1c57..a4bf7ae804f16 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -47,7 +47,7 @@ pub struct Executive< impl< System: system::Trait, - Block: traits::Blocky
, + Block: traits::Block
, Payment: MakePayment, Finalisation: Executable, > Executive where diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index d49fe4d158bad..671f7e8c138c8 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -360,7 +360,7 @@ where } } -impl traits::Blocky +impl traits::Block for Block where Number: Member + Slicable, diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index c901ab53116c3..d7d28a51aabf8 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -20,7 +20,7 @@ use serde; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; -use traits::{self, Checkable, Applyable, Header as HeaderT, Blocky as BlockT, Digest as DigestT}; +use traits::{self, Checkable, Applyable, Header as HeaderT, Block as BlockT, Digest as DigestT}; #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] pub struct Digest { @@ -113,7 +113,7 @@ impl Slicable for Block { v } } -impl traits::Blocky for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; fn header(&self) -> &Self::Header { diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index 8cccc8a4168fc..bb516508f5f86 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -224,7 +224,7 @@ impl Header for substrate_primitives::Header { /// `Extrinsic` piece of information as well as a `Header`. /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. -pub trait Blocky { +pub trait Block { type Extrinsic: Sized; type Header: Header; fn header(&self) -> &Self::Header; @@ -232,7 +232,7 @@ pub trait Blocky { fn deconstruct(self) -> (Self::Header, Vec); } -impl Blocky for substrate_primitives::Block { +impl Block for substrate_primitives::Block { type Extrinsic = substrate_primitives::block::Transaction; type Header = substrate_primitives::Header; fn header(&self) -> &Self::Header { From df50bd054f04c70666537260f39a266436a946b3 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 3 Apr 2018 15:29:08 +0200 Subject: [PATCH 73/76] Fix wasm build. --- demo/runtime/src/lib.rs | 3 +++ demo/runtime/wasm/Cargo.lock | 7 ++++++- .../release/demo_runtime.compact.wasm | Bin 233511 -> 236029 bytes .../release/demo_runtime.wasm | Bin 233604 -> 236080 bytes .../release/polkadot_runtime.compact.wasm | Bin 134951 -> 134951 bytes .../release/polkadot_runtime.wasm | Bin 135000 -> 135000 bytes substrate/runtime/primitives/src/generic.rs | 17 ++++++++++------- substrate/runtime/primitives/src/lib.rs | 2 +- substrate/runtime/primitives/src/traits.rs | 1 + substrate/runtime/staking/src/lib.rs | 1 + .../substrate_test_runtime.compact.wasm | Bin 32002 -> 33039 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 33119 bytes 12 files changed, 22 insertions(+), 9 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index 9161974303b92..d6d062156d32d 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -18,6 +18,7 @@ #![cfg_attr(not(feature = "std"), no_std)] +extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; #[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; @@ -31,10 +32,12 @@ extern crate substrate_runtime_system as system; extern crate substrate_runtime_timestamp as timestamp; extern crate demo_primitives; +use rstd::prelude::*; use runtime_io::BlakeTwo256; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; use runtime_primitives::traits::{Identity, HasPublicAux}; +#[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; pub struct Concrete; diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index 456429471d0f2..bc627b63e09c6 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -683,6 +683,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", @@ -702,6 +703,7 @@ dependencies = [ "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-session 0.1.0", @@ -718,7 +720,6 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", - "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", @@ -746,10 +747,13 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", ] [[package]] @@ -780,6 +784,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-session 0.1.0", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 71699820aa6ad2c55f0f0abf1639e65dcbb75a00..e380c8c8f16566cb541db8f57b732f27f7cc33f6 100644 GIT binary patch delta 80409 zcmd443xHf@dH;XjGnbv+o!OnuhV15kW>~@ohzXDjCW<*hKok|cV*Ob`q16R%7;mjQ zv7|Ot)aYObTg25;p%#!DG!ap^Ep4f#7Avi3rR}!T8e3YUjha>}|Ihb%-*aXr2?ezM zw`lgvdEWc;KKJ)>Zk!$Y&pji%&rb$g{y*2cIBvZ?;!n%H{o=ygTdn9~$Isus;%8m0 z?cVPSg>u3EYyYcT)*3DpswGz`S8BCdng7*lN>h&VP@z!LFaAH`A(rIgI4<*Ffq!wW zqMzA+q!i*pH6AUOOU_ZILWy{2s5&}Y7_AN!OYXI9XsA?h(b&L8-EjF;m$hE?nk(ND zM`KsM;q}{J`m)P@_LZ-G=^I}CrdPiD(r9`4RhL|G#cN(3HH$xUsZM`paJWGO}GBZ5_SjwXeP6Eib+7&D*bh<*Q%+%9lrJ z?Xovt_VPDu&vKkK@-we|b#IZgN4LC@_e(F?{+cUa`tsMj;nmxtbB1!r>!WiA$6b_0 z!$Ti+t4=xLIXS zhLcKKoY@#pC&THwnY1#~j6;TvF{uI+l8XJd(oKG^qZE})HOm|0_59{hR7K>9x5itO z;@Pz*iKgSI5hca6dPQSU*;|#yP+@Blsmh8H%T%9Olf^W$7Ph%f1^OpwlosnNl44RM zXR~BojFOUdVTK0jdF<0@T>Y&3iqsbkN&{8*@~)OPwydwEjqyU?<+|@8byC>sO4O}p z+1f4p+6U;XY8+6F^=5H~K9uV#m*{n&Mvx38mAc0){Y(m~VTkI0lB=NPndT5x#I3DK zS%@jti^E`{IsAWI8xP7qhzneMlo@T6Uv0oWJpbU+%_x85c3u# zmBf*xjt$XdhW-+*q(aPGM6TlS!D8nFi{rm@D>~bk#6QR5+e_lat?bm7#;5Ywwluzi z$0wJ@&#d3@#QN#c@I@|e*=$Cg@3h>e(KS&qb?4H5^`<_)_qogBWkvV4y{}E;C9byn ziRoBxg-+$hSpXwT&CC&Im-nKR4=bq(z_KUGAw;&KOQcUZYHwQ$110tcSkTo4w zAQ<|osi0bNLBazdJS`@r_IEzAuyg6cxZX-iY2lfSXJ9(6QlNEyjpVayE-BT^%`z2~ z>Wx|)F)uU)qM4)AHOj+=0Fq;7w+z;c^-@!F)H-J=&k|iIJ#%Ryo{E?Z-qnb&0@5i~ z9Tg@b$0AQ7SFr?;81&H{sF4AUdQ?WkUvY5>$w+hVa=KN0Rils=8w{|)kQ+r!kxf%M z9iB-i&ZDiuE!zt3Y*w}XRDAD8pUC{=#u!H8Xas5 zB&9~V06+xD;NUtNEUzN8a#FAdy@m1zQa3{h2VNO=3}p;!U`0)a#zz4LvoWqPlKYIJ zj5eZSF#5-%aj~;xI{st}9x0{!V}_sJ7SE*9VwzHVw-W$x1~@GG7B~Zt835o6a8w<$ zN7mtU0M3d~$56MK&U04BKl6X7Kj}&F`KLc7{CN7w(9@YaDL(D76)YLy zbPiHGMFc&N?tokkoB`$x05}62fWj%#1)!4#QlQGv89g;VofghIHGTq*D^HEr^7z=P zamwR?Q{&C!J*}vYxrjoio)%Ayk|3F~qY!|Xo)%v=IPL|_T%rB5fB6xrXpO|pY8)i^ z?Q#9|_J+Uuh4_KEJ@(g&^!UnOJx7lV?>|S6SABibt!}^b>o569bL{z>zux1VYk%Nx zPvh@9=8tRt)!)9BU(cA|;M|^f%x`xm+*d^GRO_cA8t*JhEu}XXlPWSyknCrB$=_e> zPHg}D-#--JyR7||Z|v0L;cvW`$Da2+uqM{?3;$SiZcY21Z=USd>^c0+4Mq2a_7fib z)djmp)79z0QAjMEU6B4kT;JIKs|S}ZIJhuvq;tomzv9yQMd<;+dj|gHPUlYAbJxF~ z8JFfu>A_Na;5+v&iY4d<)4Q3dg)?b*E42URI}^uU_xp&=Gm=4)rxEE-<4K{#-#w$e zt6V=V8gBo|cP1-&i8p=sw8`*ttr;$ZDYA4uh4z)(zw_NE6z?9WpSI`UzWWNd2zXDM zCTa)MLi=@xPFv$^pwJ{OzJlk2bSzYR5NW&)5Cv52wUze0hn_He&!GB}?jK;*2fw$n zVj3w<%k6dFJ7?&c>c)67iPM|r+B?2C364MXy{9gvx>JD7FS9g$RcLFP=WW&Y;qNUk z?yJ^MYcKx(nh8@Eg_Oq>x{}9qQczVd`Tk^lu-bmp_fK)BwQuGTzt(M&r1D<#q8yw{T@$xwO_CLc0dF*!PvUW=eGuotW`FM#yYKKbFzRQfXy zzoPwzl_Z{9+WuB$>nU?f)6->Uefh+Av{iU}W(3_9U)~&*;vG$+&CzbhbGPgK&I9f^ zy8E>U-11tyHHl?>V#bm3qX*oRR|_;!iCnyFS)o{BkiCUxm@q7dbDJ@OOiF1Q3MXQZ?4fLpnF zaVYK5!ZT`%>9-pxMnl6@^?6&gsSpMXy3>kWhIHT=O}DgJpzAvh;674*HJKXq)HOz` zm?=WfOcK?9DlIfXmJ*u_ZcHC`uS*N()Fw$6KO=!HBR^Kh(I$A#!%fk5DS`QG@Tcl&#Z} z=-TMwE$$G=Q*W+u8{_-K@7?^~@4$5YsAO^aqApn!Jy`&G3^V$(Wb-p>R8$&HOEfno z1cC@AmMNT$FK$L>*MMnqE^XE~(M?`FhND{5y7w3w6T(AduCYLE97!C7M<9*>_r)QO zWWl!Nos9)aU8XsnUH!(!2#A6_8U^e9F?%z31T~NSk9MaNx--f^A4_-E3%#DXVwel( zCJ-^KHNtN(8qzx>MQzWYb@@g@Lg#n>*)43{ z=w?<&zB|hN5hRAV^=4n|ND}1?EPkeNl(;^S@n{c!DjTr@XTb_t1zr;1w~eAP#jb*> zi#Op@w{E77LOS4!$#H{kx0sA%jVR~MRyzSEG&KChKrR zC}3R7zjO=p+SLw)dRIO43e!A#u$hCn?(OwpqV)B+Mt+|@s%V~+?@HJ>)Gr_>f95D0%Z-h%Rs#CKJ4c;XGTtax3s7NDMPEicRL1j7-FBrEP|J^ zJU1I(!nIw_4D!VpZ??SAAQ-$^&3Q0Lmm;laY$*_IsSstKXgNZ%?6MZS@+^}pyChd+ zv>+9_lC32O^IYtmV1&vcG-FLvpSl`<;)Y5K)m{XrzLgwN`IxdM`cgonW=c)<$Q>J^ z;om1!a-nG^RhUQ>>X$*gkU>`m8FUC4BylQ9Wz^Lb<6h@5f8D_fL|+IUXE;n-g4w(( z+U@0^K(tOsE&~aNSJSLSt!U}uU@C^$t>j|Xz?aK=0#W6iXa(z8NEE8E zXuBvBR{N;MYmOfD2_Wh@5>aNIdh}(+DL6At^=+(@QJi~kF}I{N{sqv0xCdSpe({qw zM&EKoea&I$Av@p2Y;@kvRv&uoY>+O6==+}aOU&hAIZj74?ZtHg+(Ud)ebd;~Ig=go z2(+2s-`RM`9S_xb)ecca@7Hg9W^dwJ-`eVdr>tbbrh>+(H@e18;od;EIY}E+=k|`l zBy%E97lW85al7khjk=dw`QVh%26*!k85toBWch-MzgS(j{sgRD3Y9Pl>F+hNp452- z(3tw->de3vfSDdKfM!j44nZ*|dUI)g`<0Z($TsVG0oFC9XX%_;EXEJgL6Y6qn~|TT z829;Oz1x|M}uO_tu1psz<@eoTq_KaRn7%b;O&eTC-zEj65~LdIZl5h2z*`nsIA+X zLz_WW+ta*J8t}zBN0yi&Dz@e~wY-+M)GmgS2!Na|W+$UQ)zBRCAY#b$rwUFihhK86 zB|g=oh$KT1PjLnjEWhx8Nb$1K(_~9)4WfYsXU3NjY0!J7%Cj8|w}O|4T5HzQYG8Zn@9^A&iPicG;&{IyIV%f_r1?+QV_$H07m z^;4Sgj?qFaPN*Z~Z7V6G!%=(f;0sz$)-sgoAQtw9|FYzU@+Gi)Sr{5p=Am?!zC`tB z@M|Z(?7chQp_CD(%QE;W89#gYr1;*KnC?%3{b`J<)2aRhCXz)*OG)}u5Ck5+tRD{1 zl|#y8o-!TJitmR)Lft3qaI%x)tqi+-Zmngg5l(%*CP6Xq{F@0*0wP1x@eKqXfHE4^ zrUK;-iR3CtDSxFKgGo7iO@>y-JIoauO7CU94HE-Og%CVQ!mgB5`d~Je!3?BIC~yG< zps~k`zq4ZPsi&w#t7RXg-$LYpb2E1)uG_)^QcNx=PNWW z81f*o1i=Kc3Y_AQ&&nr&tx4Fcy@=o`?s9^UhW}zD-o~P57T=t6t;?HdiNw!RCG`)u zg3!!=8j4%hbO*OUEpql6B70&hgvK zd-3lO-c;{9lYT;Y*JCST)>3j-Cs`jaZk=WP3F$PG<3&vL%Y&%o_++XNL_Jf<2^lCk zi)ij9h?oN6Q|c%s%`DYG)KTuKR=KESpj&Nn4wZ-vW>t&i9<`j1GmQsP%c`7lJcwFO zOpII9U&ivI_3^5Lew?@=Ue)49Pqk`xCA^4%(rAXxu7DZ!etdXej)kiCsqnrG6{`0W z!uwLxhu&9(_a&%Xy`LD~7h`YeeL5+vi7ty8s{?#urip10HBJiei)Na2y`LQ3kDFHU=OzHp|wK<{h9`}jbjrDWMSCifx=?Ah5|m z0xM1rodQ+VLID;?Cu)b4}mTROipXW4U`)d*+ViFSBkQET~ua(&Q{l z2I{zV6L1b7(ZD$XC*X)Oz82tl9w7B??Qh+&+7ww$#gL z_+3MBxfSQKe0Pa$EE45q1!vLjzME{g*%(u6S>pO`p6T5TAxabNcq&iF0!@>FEm%#q zqD;pJaL*!&qr=MS&e)6w15644nx`>PeHOG>Ieo~xC6)z@l+(jK0Q78GuBVir<$zYp z>A@ZV4p}*UFbA+bEKTT%@AK-yO|DTP1AV4Twjr!c`+29aL@S%9xU5vnabGMwz+4#` z0M?&vqhe1^sK*9;u+WSQ1Bnfq@fWbutT-EVgq9{vvgXKC$6Ez?kTo_UJ&=7%ulK|a z$T0K>j6Qo0kLH z_hqQnL_VlDo@`1`&I%M8y8gtsNfo=e3>6l3v4fEw zL>`%2A|Y4rU$*C#=+DBl1y7T(Ir@w6{F-*W1?sHVNy|{SIs#=C*(({!{0s9+D@rkx z@f44MR2AM;0=e}Ox@l%uLEVh%*STgTo!hT@ZM~s6@VuI^TS*4qwy8iJfj;Zk3mqac z&pa800jXbromWnGmt;(i4zt%R-M`%SjU4okyZ1+W{n~04(7Qrue)RHYof4RRRUwY; zaQ8lKStH^dm!qD*ak#89fGbHoovqFA7nVIQsbhZDn4S9S!fZ`}=yV6N#Ij&jd7ov$A zPoEBU8L2tVRHZQ@WDleC26*D_@6aAcuq%$)HNedHx`kx$-xwt|inkWFlEdSjNqLqc zNH~q>NS??@5lUNr&Q#7*OD{Guh{v+##2_LB4SnZ;w!PBAz)bz;{FBBtLzcW_z`7j} zt{KVd>*9O%1*VIMgOPYehVv{R6;mN;ioHqlux}Sz$~Fb76T+tzv;n&UXeL}s=Hd1& zpFh5({mU9LyDHebjoD7u6q*?Ju0LB&34rxva+Xpbmp45Om4>o3N=5Z?f@Rhkees(* z4F&SxM(RXu3CI_QlM$Qa)!?Sl8UrU`sPJ}1NPa$qOb@A^4KHV8sd>mUcCnN}(AWJ$ zc|WS7&S>&73hmTWz(86?jp;pTDccGK|M0UWJk}HTFCphV!|_Zpx%jJ%i)zeB>rUi| zg`bS#_NkL|{@RWcuLoj&k~xlcdme`K0@EWD2q860rIM5@s@4Xw>K5Ty0Nw(S#Tp+;FEE1UT&h% z7s4@KVOs@_p`_4&*Bhn6))tjR-B1vf!zT<|Hq>k_zzG{kVL(;Th1eNCNV$+d_|OzI zlgH1@DC6kOi;2^hm*Uu4F1aKk{xjr6Sm@NR+Y`*$_EG{nD*`fk+yWy&zo&tf3`+GH_{mO z7)rvVdZuoUcnl!ZgfHAPBPH?}wqTAC2#(p{{VuTqabW2#kH8we?86|P?n7Y{%4JU> z1V~22=%_ZKSD2lV^hq;9s5R3QF%gZfj&G21K|yL+2n`hF(8&O&V?Wg?yawg@?44kf{4q~mT zgDgYUv~S%&JP~Bch{Px=H&Y#Ka<^)Q`smq`d#IKs0_i-sYm}k8?OKLSYR_KUtf_ab zg-SH>AkLrE>Vy};Q|)E?^US5NI1xj{)-Y&^tEd;%*BF&VByV%*>>ArdY7Lfnh7hPw zf}a#dH6n%@Nr*j0)v``!)J(C~be<(jstwnE`)5~kh(Lm{>IvW;gq_K6L=X;}aUkz^ zNz-G+-XM;YCnpmCPtI#vPdFH%0!qV&8YDTr10@WCu0hclJU2h2=a%RJp2UDRM*kQ9 z{}i4N+H-UCui^Ra@H`lv-wDs}hUdS9=b`ZYUU+^#Jbw_Lhr{#V!}C9ek`_JL9Q`l= z9tzL@49_2h=fgwzfq6%pav9Q5^YC^heXR>h!J4o=j!NS56tEP*Z~hy@;pC< z-j?hjD#}B>a5(_vjg}#NwE`esMlyidX|~3q(IDh+_5=hX@mkST4*02*8u$GREo7z5 zi-1RA;RnmovtXS8E z$RKwYRJF_p4`JQR6e>*3o{5HwxB5d%!A`sz0mUv}6E(hHvZK7g(6u`UHKMaW^%PMj+ko$mod-fX@jH zo3i2Q4{{M1d|e%`t?0jN6l8?@+>0MoBQ^g#IefiItMHpXG!6zjBQGI}wUfL4-9_SZ+x(Y>^cEGSQu?(n;~qUfMCO)D96Q~VBSGa!w?B5B6D$mb`bA| z9sQ51^@G5_e+@Q7I0Xqf2OtAkhbiGlw+e?t8N{VI$EE35AiOCH#&c+RI$q{O&G^Qp z^bE1Hf5$>ArR%%zIL0Mbl=F1#wNmQ$VMGc};})wkY0}NoLZTbYulZXxj1mL+Efjz_ zcTO3FebwvLg$g>_kF)4~tnueU$-rOyy(1!S=o*~NF?;E3> z{S07(l(U}!Y?N~LGk^_K&VB~4G0NG`05-xo0a}L2{sBHxU$d_Mzn-oV>d9-h={VE_ zu&y5L0a#braFiFRwuI{gJrL{b13dui>wFIIUG+1exwQPyR(&ifZD4+MT7lWw01-88 zcW2%9F4%+`N&9sVyElQgwDt%8Y*UeHs_j4dvn6L-6muv)UrOWbJ6rxZIa7a=E*_{@ zMf|XZ6P_3;!vp~0`Wfx1uQr+&#JXZbT3-j}lgqVwQ6%+E*!>JVt}kl8>Z@y84;15} zo_zO4mp6&X;zG+Zz~a+hzKYgZY*U~9D2>TNKbk!L+&!qKJ<^SaXsMMLEF3T4|xVWRO4zs=45MRiR?7 zA^;gu;R22w43W6{VzrdWXd6-pg4lrH;XyBzgW1tkBkiesbs=E`PKyK$2G)Q>NY!d3 z>7Yokfu0*C)+vdm)W&+<6Y*4j^T;lkAdL=!ADKJD+&G}?G^kPC)`J0YaY1hf*eTdr zC(cy6aAxS&x@L6~V;Y3bu}hi-s`0B*g#`Vi&WVw&6r&VTXuFQ0i&!v`_0KSq*xH~f zp$kKeqD7LmCPs4-{%W@UTYt8wrA{k^jAtwpIP2}8GSS@XxVVXF;1DV;$(x8o8<8}| zu;P5o5&Gf?rSPRG_PBJ3ceZeObBQK%i56?6=1bemW9PjE0L@y?0lW+M;av{|ofR}9 zY!0T05u%Wga&D($r~j5ftZ+vlbSM0=*MyE5ftkC%#QaejN5%z}4JfqF+EW+iyTDRZ z21=G-9>iEG>dCwx!ce}4-Gdke9GI1`T#TdYcakwlOH|1mmCUP>Szk#lY1w8nr5lV| zf|-zmsHJPESS|C^GHXb|s%AiSZ(~@A9e}80EVqzAo!Q<^PKac^Q&(oGWJe)s(R;KZ zwT#Pt3DY7FwbYZbJ`i0QOBQ4x!%Bex3H9RvO2jAps&or0=REt3z+Wv#+lXOnv50!~ zXe`afo%FTtxX#lraYLgvYIPXg5&P^cJ~Lj*GM8%AD1?eR8$|ES+7NoD6#&e1^rYe{ z5K%SqfLClD8oIj!5pxt6HWseR$r9UU!f%Z>l12w#1EC{6P-IY0RtZoaBob6TXSZ?G zdB>gZxDZ%my>&GQ#z-!xg(0n|hF5AHrr+6XAS?fx(<69M4kH4QD1|t9&AYEVKUTu5+KW=T;ZS(_jL0<%pks62!SJE?4;iO89wGHPfnrS%}iVk$L!>m6hb_P&Gcq42JU z5h?jFF%pnemguT3Z4T5|LddL@Cj+K?)odvlpeGXS#NJql7rHqAE<6}@&{8e2-Kh3T zLn9vPdbJ_P%Gg60`J9_rGRmlBWRSK*Ek+t687w0Wwi>AMQIB5gG%9CFKlH_{$}vAh zN)1zFjfZ)b)XB&)OtS<{56Jw&g$Rp`E{zW)n{v^_3PnZ*CaoC3qFmzmTnu0$S(xR@ zCLYn0i~Y&uxGdQ;0hJt=ELx4(=_hf{qhV1pk!7>tc(IjB?1^MDOU?v#Z^g5|606wP zt4ij)z%J!gm-AW%l2+a=WerkJwmtI=4fO6_KAIQ0qL0C3+xNXRG$a|B7>!Cm8j>>p zH2JwBW^@0XPLx7OdeGG&>Vo&LwJ3uqF^f1542rB7e_+!a~$z*Y87Ck2JrA!}u2@ui2n5N4 zYAyw8o)MVb5nou-Y-2EaQ1R0Vu%*L>%o#sfh6ulU1wux2G7Ae}hY0sg-bvz1LMCdY%2^(m?T|)SLA&;9Ckhz%WAnY=|iX z3==fsG+CI!$cywy9$lqM0O7~2@z@m>%M_pY+EtF^oc+X!mH5=873Shi1*SLmci5vzvaSr2Efn}L z=AJs8W~0P3#Gq77nBE?U~J5|qC?v{UoSenpi6e84E zneyH~&H6rtu9%m9^&d;5F-z=Ex@%BL%fuu&u z>Ap#JHxe_p&dZc!?Lt0&-dpb%v$ZR3EDMM;zLR~O3)5h=$&$(!z;h%sbdZqc74Jy( z0d3i2QJc9?red>PmI5>5M44*ssWnWn`BA2HvoflAYw#d6^;B$A?P)*L1xlgfK`L%} zPR+_^(%e+1v22#2ns<03kJ}Tq>oZE0`p7-=P=((J9V(Cc5s^*_`O)Vmvm)ZUMr)!p zZiKQ71XH`m@gk1XS@go^AY8R1z1rgN9zZZzF+Bf5_%xSLk@iL90zYEkP%iT$qRr}; z3+; zdc6FWQ}oz<%lUfD-?peduy?#&zV(TE-FoW_^|-qbJ+s_Nt!Jia?v-9dSj(@)WLf_?y_VYe{VRZ-g8&OX3+|Bl?+n2Y$c`naBy`q);Pr+K_=YoE7wRCT^+?~Cccr}v(J%6!vSR_;5&9&=~fEU*#L-)}@i^P<#HmvnR*1)ReoqbemO)ySc^| zjJKcs;ioJn(e5G9Ek|*cyOToYN&ABzPREyKMbAdJS;b4+zkL0ZM}gbDK=hK3%aHP} zaNO`z3i*fC)KZ!nrl|$v3%N;;Vs2@B`$wL}RdQsfr6c>?9{K2*F9z)U!vMJIS=UCD zsv2Or&-rLEE$?$$sMVG-4g=rmnj>~`R84!pcPlEy6xPDYX5`q2qymY1PW`QmxN~Sp zKE}ngcuxE0XLr@vHy6gei1n-bne7KZ`m_-i5)G^DseX2?+TQlD^+nDMFQm|yhr5Ux zYoGbyGxzNK*d1;d!Vb06+HbpI&K25c{>Bm)?|IR0OgJ~#e%;5nx=MTVjZbZV|Kn%5 z0e+o#Iyd03loPQJgImqmvVsf2yItdJ+X8*qS3gZ{$EhT3oX#EO^0Nj1qhLu7iQ%o;9|(#9YrP8u?lB~jt0SI$s^j4@U3fYVV%K zi#d))qhQgNcwahrA6747YSEPh`lFCBttk4#>V+aeTD^$%o>qESFL)o&+6DI!aQ&K= z&k*}9$8l?High}r?EE+@(x*1!ih|=sd8wA$pMACFJTw4!Q4cs7OS>%NtE0>bmaQ}Z z58qcmOuC`W4jBZ~umjC;+a2;b61EkfkGq7$i(xSK4YBBFN{qTgE&ebrYnF-KW)-DR zQOZ9?+SH?MGEw?u0a))^>#xS3#_8zdjnNZ**uTtLL#6#s?>r;9vVOkirYO@Bj1OP? z67E9ZTT{97eUQ1iaw2D`vV68goQ%x^Du>{Su%yN$u(lA%(ou%{*QK2F|Hf^#*& z-0>h)^bc|4A29o2fn)j7D7sqa?t90HPyXC9)l{V?H;+QyWpSn%`+&G)x#OT*z zI$w<4$`i0Hr>TZ~nl_Pow*=G7eUrMhu~2ZU)XK>Pt~+GyN-quopC!?UukZM`36 zW|Jw$zu3tX;X9P$t^Ou@rh6YEZhNDW>i%xsBg8)z@{-Dx>BA2fUMHQVW;FX<>eO3( zrj-$^Ui-+?a0!%65{h+~6w4_ZfrgF|vgLe?x>YB5t6w;91EC#HyU?t)YNRF#-M|Ek z5~m>>x;VDB1s$QW8N(s`CS~|`v7s0S^wyYA#%~lw(rY11k+gEo7wy0MV<#;CP7E5NyJt~K!lEE0k^G#J&z z&&;vzp(URNS!JPjp73$_Kf={zC|@5B!&_jo*<=tDNWs4fw`hvP4K zcz!2^hZC9b@Nn%%mY+Q$9-iM#F~*{V$<2_EFWvi!V8pTM_)c4yfr!?+`QjFLJ<34f zeSqf+aD4$hRzMqd^b4P32^Cvz2|`5?15`O11VuCmrze!%qH_)xGli8N?EXBE|CI2^ z<-`DTqJoL<EfoM(I}&S)CF)-s|l1){D5qUPv~5p^7hx*Uia$w0IsNfuQL@l}ElfG`%w>(O$2}z$ zBxgnvKO;J#GJxW7=OD}nQUWsxRafNGJeJ8`dgN?tvR8)5KBeLoPjyulJ6kl71n~&o z=M#y}u5?~mam!x@pGY+JQkYiFP+Ju*tw`ZGb2#uxgb&#og&gHfJl??bw zbSE>Mz0BxwMd;$_pj!fiQbPJySFVbS=_2~q;*46$1Xi>UW=Jd1CFHgmM=ev0*u)?C zS*E?L{@hQ!Hla{sCZ~P%Xvs`ynf%U}xP`*(OTfXt(hv2d{}B*<6vn6jzNM?XUMN`=zXMPk!AVgymdXnb|<-P*#C>wmNgVi_9+lgOZuLD5f>=qnLdfr6XaG&YE3< zoi>(!tyMBJ-5DCvKef719$?l4VquGWNZR*K3zH^%M1Z>@Gn8T2-N_|d$--oETm79o zjW-u01KiOGG4X+rWfauVgWC6XWHneyai)c<;;Z*#m-Jsto8B-%I>WLi4mCQc(Yza( zYm^d5b_AF3g>Ko*%D(a$f}z3r_bh|Qs*cx*?vqi1xR?TLlkaBmwuBeKD38#luP|tn zygkgNTwyR-C=9ywBZBs0={+De>(zf4I(V%Pin$qOVK?DfkpwXJITKZ{w?O;0=ZIS>5r>RdPESbeKjN#_OP*aP+fL{lK`14 zZq1-qFvl`Be;ftVV=Rpk-=%)9VJ5sv$gCzb%uk|Vf}x5Z_Em|vUdcM@g`!Snwg^aY zEHQ{y4hm$VbqQoW?$u2)nM?!~^j|3|Q}SLE6NS?JKm)RvS(UMo8Nnj>#&zf1SSr~O zFO$ohlX7fL?bz|q!=qR2Ocr;ZHR2X|EnDB>?hwVIa_-a zEZtA*15%lx_4~971;5l9|4YgdkWt%z1si#;wzrl5YnUXHGX0yUc|eGPdO|D^YiuB7D8`^7)c{6UjHR{2Iw9`KW<) zNBRC+Cc$Oqo0}>k%@%HZgg4qrc7Agrc*S1wjN-yrFRio^jq`aT%f55MU=XXv1peu zBBe2em^w+-mM$q;pfI6F{gLjb3`XmrjW@jYS&?ztYelkE$Xk)DZ(#LY?zad@x3gWy zNCzthzb0dR*5ggRA+6u% zWM9>hPAC3MpVP?|$-O=&I;qQVrXX^9%Kgf~i`tqP?2%@d6p$HRpYs$+NS_Jr%Fb5i zbO$w!DC}#qFxokFnVZC>G7q!li9QaF=CndaDAp{bWT7N*Vj(E{VUFjhFhdB6CbJNf zIh;78=BUCe%x!leq$CPh?1NiXEqYf&I(=R)&uIJTsP zM-f?2t1%HO0@eN9g0ALejl|Vx zpSWV9r`N3#S0#0@M_6)^8wb(6#NyB-#@j;QClR9=fZPKFIx_lKW#gW3tAc>zz{$g2O~!~=MpGD zyOcaFKo^;886qpk{`y5^bxk=*IewwrwXaLDM@UB_5lLA;oc&gk)XCKPfhIOd6=CQtx|cy z9yh`^LkVOUx*=`+yxbKdT9LbAIAZwJixsfI0XQ}*Xd&OUFO+YlNg(-0B&{$V9+i(N z>_Kq;za#E()LcCv6ZBDn9h#xjdu@4K%7WJ5u%3Dl*zYK!PC8pA*fxi`iV%}W$h8eW zuBuYN19l3V+-!1605DIF^0hHfdn2Rl29Xma!Eo%*=>M#iYPSA&wbabX{}Wouw9-dy z0mQVFX>b-w9)p(ZBbgqa%e0hhiLY6|KIY`2u4sFMh>3{xqt)eWIZENxk5qV6r7FEu zf3mn-djvxDil6XXBBF=Fy8+ErD~O6()a;S-ENijm>Up59ugUzlY#@s*Z0_z|AJ7%V zk7TjQOP?o^qHuT*YX&qW;KBJIX=#! z{nRo>xD|k~#awBoQ6n@H^N)4I!dA_XU*eS#LTPbdQi$HN&xq))KLVmdPVz}KM|K>f ztX+u~qsN0LkUJ2wAKdF|ZG$k0RDZL5P(>kpo49(5!`v)fDt4&7B(cu$S#VonWWK?n zt$jtE<1?MFPw3UztHHKU$i}v3X!np}6uvrY)4o28$~*mfO)sUHC8nd9W{KGcuLoLG zRKOH74UHF>6CJu*5fsKiOS-Gfx4_7tGy;R;H>x3Z29LvkoH@`ONO?4uV<>kySWNFV zz!UUj27^C*Qe3ySeOSR;IN-(@IsG_1&@`YsCbTh4C$20gAwm0Em+7|x^nFN9!o31>^2zW;gO za`Yiwm6U(IzzapQ@&)f%-3;iJ&#aW5^-ZPN`ljGLK3Tv%x+#pXuX!8Wyta_`J7?Du z)}OTyKWhwZ$6>9wY;vcdn~H=k78y_&>w+t;RSY@iPe#~`rCPpVTZw*3+k#cxAl}5B z764%7&zLj#|InY0iHSq4h+?4K*n-5k1>KFF4p4hWqYR2S+h%WR@T=c4Z*P*azCL$l zx=B&3vGlsKU~&QsP|$KwYrr;INgMehLfY4KYnw*xBk4YY(pg1}thXYYGXNTJXiAM> zX^4&J=xH3-hJWTkXFbFYm5SMs{$bV zaGLd7QDQ`7K8EYGG}k4&3?H107e4ag>kdo-^7@Ut=+Fhes_RgN=TlR@j%pQQq-Y-Z zm2eOuHapjCGnHC1?LG>~t9O03jjk5br`V?~O~2QW zLaqa^)7IPbh-}ynT&GFV9lf?LpiO5i#3=4j!GOwE!l{X7^Dg+Y=3P)~E?nmP)wda) z^&*YVkhK?SVSqgy?H?=G|5!-(F_Iil9vWaC@dAF_A{PId&wlOi! znd!1_Vj(2?n{Pp(w_qAJ5;0aZ9wBhRa zpR45i-v4eTQ`0oy1k#%A=;$esn)Hmx5UK6IA4^A>yT`TU2@ z)3?|Me(mY4a7JRsvfkqmX*eQ|ghtwD4vY05Ne zm0yYdD)Gw#%&1j0?u|#(JDosbK*m#S*$#HMhv9II0bK`l(iSclYxd^bnJ(=P|4P`Yx9q%tU$L#}7a^WX%-dXBN_}owR@-%ss?i(87 z=xTHhW;M<8XcJ_(z8sX-a}OWc6i!v=tc(`wO!ZwCsI%N# ziFSIk5?!+o+M{NUBj4wd?^EgDhi}B=MOihwsAiw4#LB-TR6Wn$brwvg*t_n&pl5NT z`&~Ut8{Hr1S>5Qq#54U1tI~I%xA}vGP43Ieu%Efds21sPzJ{MU>9mvtS%~D7l%MwV zg#uM6rJt(yu{5?{RUfwc@~aa(0KU+N5w*nU0YXd$5K-=@_+d^~)LZ4|gjT6wF1}p@ z5hWAcz${88RLTmICu{zN+Q~8W$~sL%u7!h9J|tk4eZtB`T&q9@JCqiJpBQ z4^)LtJ|9wT^6jUI#J>Ma7boP0OS?_`8`~$Ch!y}W`V4^kDwUYOgGedM{M}?Bj%t>l z0fC$DJC=f-!SU%+>^p?DLNEDzNfj@`Frn`49!jEm%XfL#kcdODCU?fdizaPh-^hyZ z9zqzgGUTsNRmQ7_8Xf`BO(K5XglW%>(XHYAQ{j2LJvT?63D3PTQBzIGO`O!_s4jHp zcfn0@A7$K}_C#~7hxs=shGvwsk4h4r*Qzq*sq+*GCUtHdKD%~eGJ%RZ5iPDSZzhFX zc5dTyHn3e%x+SR!wv+Fd^z@utRv%B-(>s@>16kky8@hg=B}%Q2R9A63RW5If60||= zo?DwFgHhmO8hrd*^1zoq{ne|!eE;5KbBS&>WI7Stc2j@GCQyTaS0d7#mmWSL0%3f@ z)A)qcUGR&k>SFy2m4VdIf_xmROL7yKX#&9()xaschFYvCD51%==rY&0qvR*po6KG& zwGY*eiR#Ka^+r*sPBM%wo<;yn-E~G)8>8#(xh48ocyd6Te4C?>hv$vD+e-5e(Qt2X zHcsUK>S#8nI>{Ok(xtj`%n!+jEJ$iS=Cnvm%u^SxyCe) zkGO47GX1s-YfC9~zbU1u^qbkaF46yf^vhKG4K6N(ZB1732@U#TLiuld!1|oVRQmNU zgtxDSH|e$XtM+0{{-^$@teijgKV_9*e4rrMYBZI8$-2S4@HhVT*ZRf0l?l`3b9#CWYPgSn5pE=E@;nXcvOrTc zJX?G>%>+Jb+H?(nk>>SH%6ebf6Y;%eLn$+Ew5lXAOdw*u4EA_v_)x)U_&TN-`j!4q zuh(yn(~o(upf_}Xeq2Az{K#ql#td{!vi8E!_IhU$_1LuCGR}QG#C>jUHJy`3UaY@_ zUow!)wvZyrbi6?^E6S$6`k>G?Y6bE(sM$aM24PuIe8j2XmFEo@ob~Foj5*^tZ@qL4 zUo&9+n2s=fmEsNGf-!6`25fP{t7_;rP|MXV$kexx2aKUbQ8GfwGvm%YOCBMfN_POv zwrcuHQQbx|RtS^LTL@}gUV@~kPl4COTj_3UnC4bnO*OfY6m5sq%(_)$qI$B%EsG_{ z3-9G*HmG4l%xC6)Pp^)`M?MIpU>x`odDwai`M1`|6gCk@FJBQD1vAtHKI1S+;2Ha$ zB^)TRYiLXKEe#^zmNA84D4ZTJeYlHep)j}q(udUb)gS~_FZt(3|8fRj)!_M8_6U#| zG>@m2k32|50u-6kMOAn!n-D`(^>Cl5Ufme|v!FjTxrvw+IwZR2V)RX={D2E4^Fss3 zIm?Kc%`td{0W z@>ie{-$i{Zy4lb9l4Vnx|B(+#4hnd7Ukw zij^#G_jh3P(ozCXxd%jVOaQR?-s%x7Sg+cUpTmO1n!&Jt?WcSnku`rs_B-u!1%9mh zfVLl%LDSta7~z)GQ4jUy(p`qXj0*Lpk1%a@;zjXXM{>{E)*F&F!K)!^{~=P#bMgfz2FmeW%Pl38y`j(?KfBh%)>6#K zk4#kBg8rePffa9hpSuo7v|!m&3x)`!uVN6kev#pl7w>m5qq_jpx9? zvqDU8pZ%8}0_{b99Wm^UnqL1J0Pw%566gIz~=RQ;k*CHZ2<@c}hD#CLQ64t*f z5zn6&^Za=dkbwZek{6?V7vT)=hWU@bo3=6uuA1bhNgWpDr?HtQEk2Wzq!1KtDf( zcNhcMEP-RVjM7!TE~Bb2yRXM<%-lo~Rx9|4@(6>Uh(j2>%Eoej67-()UgHYL%M2v% zI?5lJNLFY;XDV54-v*vY`2GTh2C^p-=ixt!vN>#@#bGCi()+#qR(gtKNb(v=NGI3$Stdk&92w%LsbwxAj$=L}Ob8>Ei-_UT z3k98HKruUxF-?91O$#LnCw#L7b%jW-ChU$wj4iqmk^++S1}{k|{$J9Tl*rM24$kgTeKy5*UyGeVTgzAbdn&SEdsD0mzOq|dVIa$afg-JfGB(wMP9*-v z?X@g|p%qorO8s8NZ(7p@!VMy-&}b9iKXl@|D&?|bNl~#`;gd=L*7}luldHTV9J@Br0EB*i|!c1mGOCF_|*S z`J7clwv(trmSbk@Uk6-^XV>!7;vzw%#-fmK;Y>qIwJL&%C~b0UJkv;ceu`&<=V#)X zR-?&}y#S6!DtcW4>oXHpke>@O#bO*_qS>eMbG$DN#M`#|t{ytT*HZ9u7J|ISP;#6e zgIryVr?QF$_QM^LKNIZGL8@o^%Ws0+FFRAyP8XKJw;?sthzO$q(v8(wQK8SPzPjnW zT!XRR2$4`D;=lxHvdk9>{)a?gZ!5}1&-nI5Z`~427Vy~Zlb5q?vZrZL;cn4P5Z;r% zk0NUW(Z*umE+7nTmDMq5qaiI7TMsqsaLn@Fns-BBa|*#sYdK3LP|jxM(iF8b#~9|r zCJF4*FjLxK4GPW1m?Ma%GD92V`?cn3(UVFtDpI!ibGE3&yG2Ze_7IC7wPWanQvBs8 zRHH~HYp(}>@vD0t{IyTns**pe?l~BtnoB#lj2E*TJY&ODCbxLnDnP{gYgl0=prdm_ zzHpj^jG?&EVpw2hXOeiEH}s*JvOclq%BfcSdDv}?fNHVTHr00ddL7FRO z(DXGecD1U>ilpX8663W>j4$i1c7aW_uCYq}a?(u$DvCsqlrJUAY#C(1)4qnHZPR|6 z69cpfw`=7*oiJyCP80$1LPyiwnzEH%>#S$%0PqE5S_VK~rv5@Y!f+0#GbS|lnVJLp znwc>Bt7(_bvD`}xjI$jQpx9tb_0YK)iy$ns+n(X`jGw$=pxU|olNU%B?%;r>Ya%i4 z*Bj6KB!5Z0SIjo=%Pvcn_cnen95WBcWH>XoQ+zez`v>J{!5aMYkxhjLH3me@^8C{e z9t6*>$S;3~YqJm;l3HdB-DE7wLdy%_S_~k}>|g-#3zId#jLqlimmd@-jgc3~e}Vz@ zD_d{CNL@`1ykX;1^!gCA?6IoVGm8!}b{h6Q42%lJ(+li6&!{+Y!eL<4_x`nC{>{-Y z@-PQn@)wE=lXeWWV`3QEd2%a_pc;? z`aHNk1nvzI`l)%X_ROn5%xg{a>Q7Nj96hm25_ric)|N7DV(lQhO>DlAN>iqZ)trbh zm_Bix&1+^Y+PpI3VP4^#LCq`iH%&!0u~6e9Ol&nwtXV~mG_l^e@R1eGYcMv96l4Z6 zsEnOp0L?2GwS;_EgGNaLjq_;uH=l^*Vrk8u#ZQ>^c>jv8B&;5}S%0B$a-ga}8%-lD>o1@RK8JVqmDGY@=CdP4 z#X;6$8P+edvpUV`Z819B${o;G4Ijb!I}DX#{b`J{{xm{adkWOBjL}$D5Ci05J&R7r za6xP7YrBDVz0CugD>j*1;n=UHz_k9ZMIM_yTh1{-t zh?P%`7Q9D7-~(P(hkUDf08!j#K`J=vkhmYC8l1D?c%ml1l(;4Gw@xhb?Al`FmvA%P zQd1_raC&@GN7Q4UMm9hVo7hVgcO7gdQC2ZtR93M@hrKTbBlJ)7m}Uz!X3eQJZ$nsX zT$ENzrtKn-%xq&2`M4C(r$t%XiVrk&dmE!rOizt#IBdCG?6+KkQs%S%4iutjrdplU zWDC)6^-ofbn0$g*hP>>*hVtb44 zJlP&QPqD{?A@se|pvrxnPq^JbcK&$?jsJPe|F}H>ZpaJFpN!$Nj*|D?ha5#$oyza* zi@EekN(8-vM|Z^fR? z5V3j1LCeTvAVic0h`Nzgs>q`;=7BF$1ChM#zJLtv8!vLJ2XSx-8L@qjJz{MA*kdx= zS_ENao%&^bHtHJ-swrp$>&xxi6RG4tvX7eqeKoF zKQ7xdO5dt{f(a4UU8@wJG+{*L#9!3Yo3uPCn;_n*e)vGAHa%K{MYR@b2R`*sKks(F zg^GI)!0(JEHcc9w;&1#p%{yJ@6(bS#~!XA8ETxZl&kc+xtC`0DP|Q8wt{2=2+r zOVec1E2E|!V(QkbTt-ZJy*-bJ;FL z*|=H2L;JtY;=l@el+EV03-P@l{_L^0(IO;3?vJsH7Wz|w@F(3yiZ3>&nt|4T_2D3HSZ!%rH*i}oS7s-7yOtd45Th;x1VmV2VGM^!yWSc7FF8^1X zN~7+k(pH#Hbv6|8_K4<_-SFP-?2#(D9jYz!A(&3qtB2%YStOsQZ7L=85jK^YJ&B!z zG1pSn-c|MlG|}Bvit#AU9|JEKT;@_?6+rLw0YPE@3VyEfHM>edR2p`b>gQwIRB8uj zZ9(7GzVltBEQV1B&Qb4X>BqdQ)Mi1BR~}B(O1#+Bu}|N7>vSC1)H30e6tWXC?kAUc z2tZkUj`cLKq~lc*o?M!tsD^uFdt?uBK)zoYZ6AGs^z!^d}i^dtAS_@F({qVG%UZ`%8%huzOlG&6{UWxV&opK^b~=OsET zU*gU$**zqCey#C9f#ZNXxJ_^62UcCd&sVM5>5@I)UG-e|bcni?oS05u!6z>`B$w#U zlM^rJz0UXDrqkU>f$8)xM~uYw`Oir_;MfRqt(s**?lRRIK#&QmAOPeT8IEic4{b`0Tge*QiCW#{QU>1_+S#-Ej2AfH z>m#Tu>vW(nj?TjQvy7vheu3}TFXto$-$i(8K*I>eoyZt@?J`R zj$1fcTUD;*sogBhX>;w)MMNP}+CO^YZ-K>6Y!;17Y`KuXuiWx`lRdbEHUk>!_08?4 zKIu1l6Fn}}eI>dlzlicLezNB7-Y4J2-*=q((PPYDd;L@1)>_H&S2>XtL#+K_#gUr{ z46P)JKS5LDL_Z&PxsqogUqo!F_I-hjYpskh=I2vWpf4)feq^4uA30`)v%PNX@HmxI zoO$WaO8Z$`{{W^tE`5qS!LV?|+~`0zQX^C^E_lnf^Y;wC;E&?=;MptO3)|CYKgYdr z&(EK|e^5+Y)$Tg}?t(TP(-Y)+oce#6d=WD;@HoKL37wmGMawmijkVzToJTV;`HC>ylfqm2U z(>ve#W%Bm+^hCG4bNF5EZvcMn-Ku===+*8yE`ROtdVJ^e?{Ob@FWGzPd)>1NZc}H^ z`_*vgU*GTk^un(c<8sf(#Adm;k~>3-Qs!pXa{^wd!VJ7Yck^-_VV0-J>?S?wYPO!q zeXL6AaM{28EmT^G^J<2-8(fpc)d%#( z^HLrpUQCnJ#%=RwD9;1Bb)V+5W_xaqZVgYqBgDmOe)Je|)+HMtJ1SkXA`@QA z?uq}U&)_gLUTkOr3cE2EYe0fh?~(1HF4k=Rvpb)UP$nA}HyB0KqMOl< zpu^8~9{go@Vdp~~7|aN9Y3EyCag&hKDc8Ca-OS$ST}w*S-#}oWoKIG1Fmvkn7)!hTx{==_gT0JS;Y7oBem|bTOz5wYjU;7p3xQP>#$>y7j zE^iW@C}NB5==|;9yQS+HMb1UeY=L!|p%am7R01cYiwRjl1-~>FH4Y4R7T{-(rOp>Q{E2@DbN>)1A2w zyM>FU%~`|x=Kh1=mMu=FJOA`yx8zyVKpP5Ra0Th&uD55Ozb3TrLAZL8{_^D3Y3$)Mm=noJ{S}?7KIZ=4DRWkMG9@lX;V)TX&cpJy*4@2c>qe8Is=L;A zR{Vy$tb|iqe@^F@e#3E(g{oWL`Qu-Aqi*}&um8H6aF4sfSGfMl{`xoEt?ts!)gO27 zyL2R7`Nm{Y8*W&&90W@eA?z@4T_@SYAa2)nkv$B~a||S#iNx8jdB^t=7U{BO%hed^ zv~G0kF8J@Lm>|%iyw-@8VTe;KY6Jb5}n ze?Apt(b7q_UT_C29lczJ5BBQf^fnYLp&(EZ25&SXC}hKghT-Q>C}$j~M}VL$|55V7 zZ85d&_qFLW=YD^U2T_&2)ZPm+3d{nnqChHOg`F=xXeMlDkP!(}V0GCGxF1n1dQp-6 z>_A@1UY~?Z+u^q;?1pbFOK;wg4&!3&{!KUSMmoRyo9>OzSOgmw?QRfVdtzJ@&211} zXT*4?rSYNpbddU3Rvpo%5>`nUiSZYk8A8uH^B;9viqj(49{L{zUBUqzJQHtCCOfNs z%dK{=>s;_#?y0gwQH0YHN ze8ydbUis(GIGL}j_PRm0GMSW}=$nb_PZv)fa3Uu&&L%p4w9kEx?>QLJ*OhU9=l!2` z<1L9JWDi`qx^OMx#gc%*!iZEpLhE7rxywr*KX3GWoP8%q8smD=FV!sc!Y2n&%cvJl z0tI=5U6l*fmvi1p>oB?Sq>}MuVIPP}7W%IxC>NE)7j2R(o%AvgAX~74gfiwUd0_Ev)sbkde;F7u@<*Pzqk0QES!DfniiMMwM(+ z&07(O`WEEdKeK6JenDim;dCKiZTHG(G|9HfTFxV>fJmmz4rM5^Yr-`m>=>QKGVUtorifKl6vGk)bhdh&I5OEhm4%@2)~B>mfOGsM{(o1z3qj0 z=xt9R(b3WEUBt9AA=olDE6@5}o0WI{F0+#LLMJrxj_6oMJ`gaxx^PkFZ@|Ek2W&ae zWKjL>wreyKK>uHJ-yUC8as9hzCLxcVghL=94@mYo1W0(lAps;CQ9w~1f{!a;0z`-e z5|aq1;5k;r7icWVP^EaTrPcnfwz1G2Tdf`y0TCrtY;9}X)7IY0r&oVHwt7o{wZHrO zu9?~UoCK}C|6TorIeX2THEY(aS+nLXYhGoOP)o6uud-2?M3DC!W9txncnsFMQdYdi zRw3B_8oL6)sn;+LMU8&+8iqBF?01|6D|L%i#*9`4Fs+15ar8?yz|C^radrce9zM?I zeVOs^cS0He_7kd@+KoQJ2C&OwzdFHYv#INCr$kfM^@}XXw;+S(SDv<-CWh>u+v_gXH&H2rmA{Pb=z5{4)OgHjE+lvLD2(#J zl&7cnI*@bb43__RolOciff4OSV-%y9RGAV8nUXp6%rt?JADL4FqUxjdCwS++1)*){ zh7;u@fe5KhItWB^p`!{k3r1PH_{xHKBdcQHvJVCa#>SKNPGAcmbpiD1dVhK56r09w zl)>ZZj5w|7<`-d$j2jK1@fNF{Dc$&qBO2!G{h*VJ3ZgA5_*tNTVs~0eU@H9h608eP zK~#h(S07X`i1Vlv_*6hUL*W-VgH$+((qT&sR#)Ks6Jn@nF^$EG(h)$otJWQ$_Ri2? zSe|@?{h?B8htUnPI0V3|p|%(U<&NX5RQ};Kt8$x2U;Uc$^vbIW6$4q5hnyneS0zMV zEGwR8rPMZ>-ekKd{OC=#0MeWG7Q1GUQC!SmmD0HojLPk|<$r&REw6Y^`RsU}TKN;& zpU*V@#0yj9z%v-9E|aZi)b!go&aj7QT5U=XqnWouJ*k#`0#fA7%7U%y2_WakYHpyDp|F4@;c7xQdW=%w@&>iapu&QS)yv zz>MqZ6Y?JmH1e{AjAxd9KC)$hLvFf~EvC}HcqO}X@8b)zW!_?zja+2$Vs`oLQa1w{ znz68)=7UOIT%DLrJL$W4h&?m+J?oB8IgacL4x6s_6L)NErXWSQFyV^)T21D6x9 z8`q=bk~4Ul;6cS8evV$cQN%Ue14I-G!jngwfa z-mS=V*g`ea3A)uh!XQrU`4LVjW>EpyiA96?^wZtVhz%@^$(xt6ftP0FXVQ(hKv6tl z^G2ovwrlv9>1fIp%}m26Q$er-ujWe8y0NaT5@6L?&8KF_L(9=p2Fjl;XBQ!nO^eQ7 zq`m(kpShYnK+5{jb!;>Y;QDJ=owxMx^}&%Xk|%lUkg2JFn^b@HPe zzOWZ`Q!b##v-qXGpuoMW7vKVFpPvp;tYWK7b3J2dTk-e@_3e`5dduGF*VY z_PzV#XA1Z?5i>5pgM<8-v#_a964hY?VZJ=mpVQ*h7h|mr@O?ly4>ES2)E@bfpGRK# z4+R#-qB=RKv=vUatztJ+d{|2pY8iOdlsdOR*V2TV?j^^wBs6UmThD6ciq)!xb**NP zkVzhS1A9vp_Nh$EzE@_gWvlrowQ~JhDBNeY^5%84#royRKqi9o3{THTh^A)g*0ZA@AovUF`XX`BbvbAAglUAg^D_ z@ruI?`SDf!+OTJDer@yIG`A$eHimM^Ey<-;zro3+YnmGHm4FF1#{zS!IUv=1LkRDm zVZ%+eHHett`p#9HW3aGhM&B4LSninAH%Mq$7 zu2&}IESfT5q0Q$>6$)EzeSj(zcH8;@42vwz=v?`lmY`V6wI{dIk_@y{+kZ2*TG61tkS`19o*nx#SuSI6_|6(bvK}}P$%dxMw8dl%%RqE40_N2 zYOEzG5VR(fKnoOze$`K>R^U2{LO<&NlyjsYAb>yro+EfnNyy42+xlP zKQuBE+G;l{LqEamvEfZ^38J)EJw=_715l4I7={I=AaogoZfS_9<_nZXps|+j zVR%{(gX7QCfXOf=YiT)=v?mKL0@0$1Kyg)@1rc&-l_06H(jEiC2K{=9YS6#u(Q9Pu z@EbuD5hM3qw-!3?9jK)QMh_d{M=l_O>iKJm*buS|;|?m8UWBF10C3^R;pNz*W8qLA z^7UjwPZdzQs$hmp+|4G2u~~!ofB7PANb5NE51%U$4 zRXZv0I)K`6=)&h#{vt;Fr~31vut;6dk1ZHQWRi)&Z}L$B7_e z;S8S>E^?3Ir@F+w$UU9<2^JM1I6JO5m`N9>gVQ?eEfbz$YSm9uBaW1o5+COnM2XM> z4Ee`Z{#0TDMmVph|5XWan5OT2R7Dt;2trl`q=KTrZnpAg>BklDQ;TYV5yYA}u5!?Y zfw^a1F^5o$I~{X_QnrrZ|LZ4?O>8bsR*QL7&?9P{X?tE_Xec7pjf zYO_1*AaW|ErEt)L?Fhf?Ur+IxUrj_OSeW#*=sb5{~ zFykZ`TK(|KLm;qHfOUp+5Llu4Xj~@Zi3Jp>TL$x*2w5H|jb1ZT;-mEqrmldr)1daBT2cnmy_J#Tte9T{f(9Ok6>LP5ZRswwo)COy_m z%r6|>O{0mNRdvvqL05!@K`X`wx(d_>UF$5H)OIW3B>x6!1jQ&4E7AUlQw*0gH@kHlR1ij z*JtrwCx~+_1mR#e)|+NhW_sy~elqp*vzbsO{qw^V^z=+*rE%3yAHl;tJPV6ZY=t6$ zbOwxUi)|Mqu~g_q0gZlQC9A($tHO>7wZ?^1gACU0S!#;wvzcl-apK+gr)=sGxAF*S)u+yA{2L73E?a-kmhuny-T}WVrr;;PSVqCp_b;Vj(=SVg z)dVdxx=cOG=vX#JbPRJ5utfMLBQVO|&*gXb^5VU}nmar2$wWO)*5i-!6OW9#IGY)$ zUey`T&QIJsci#5Eu}L&I!Nyd$7h|pCllHzfZzek$yZ?H=j`4GI&`H*z&m1FEy+)CPVn<=fT37gAQgY~bI+H1I=>{4(BiT=uNt z3k6&=IdTnulJI`AhOZpB4-$cQ>mFQfXk{JL2OurW5pq2da6qz`w7(ciV@p@Xci;}6iz{%8o#Fl!xTIAFP11si*gw(-%dJ(g(0 zk|C3_p&h;GBl5THd@kD`tLosFXF$YlTk$v+PLXZpo7h2Fwv7)NaftDHRg;+R)jAg% zrs{U&4pcKL`Py<+uw1!~*OuMsX`)_fsmQy8MC;%ph}d_x@lHk^N2OCiEf$k@D1C(% zB>Uy)ZWceGkF#7cX%<0usTWcsI* zgOC>89cN&#MfVx*WR>bD-Z-S0_ntWv(80xHsB(h5|B98Pek2hk-;VH+{HeJ7dxV$s zuDC3@lTVnGj9auF+=yThj04R|1l`Y$;m0=oz_Q171o(=OV0XSIZ@ZH(8MN~?K;i_! z+7L!dLHFQm^4E9rDdBsMD~fIuDl%3v=+CYDllgjK!hQNx&F3)_zHh>PrbN+~b^LQC z>_HPBqey;cAO}rJ6UdZG961rT+=&Xsb4}c%XjS-MiS_6Sjh8rKxx*CNS(DdJ9MvHT zezJe^;}gT@!Jq3iA0DHtigd+Yk9uaQdS-q-qxJ`?dSuv~PW6fHbX1=R2`MyGZG;%w zJF?FT@y5IO%BFN%hi2i>8i;8WX(o>h9vwGT215S}Q~fU+#n_mgJcs2gV}R6TD4XTn zyZL6aV#$@fNS?TxE%qfBXR$Y_V96RaO}oCFfbJddZjtkE6qVS_T2|H z1Al*rKj9&JOAQ*?TWSEZS!#%3sbQdp?5!|qWN(ED$on7F>k_9Q{2~KeMQIuyf`Re14cBTCD z}Fq?Yc0#qb@!b?PZp}7`|R#xZa3~7Xh-L|i%Exxdg?Bp{szB+ z#Qxjo`4YM6Fn{szlySb_*s5emgkO?e~<6&2PdNjec{pX@xNig z@jFNO9H9UE5gsMirt2u*p7{ZlB{tyu{I*PV7rTGN>lYpcsFwvgZ2&M}PK|Sq_Eh`W zQ0N4yMcVSIWv9zyg?#3Djy-`&C_RwJkr()C#l^F{Sl0ZQKS(9`(U188!pV4%{{lFP z7x{Jq-|!ND9DVuzIKPx)7sPoTI`N%xzJYr9e~{I&9FbxhrI znX}vg=}T4|=aXsAdv82!hfpB+h9)LZF1H@%mw@t*kMqqY#d8>ZA>n&)nGNL{1pr(T zUvh$1vhvu?CwL(aoy(o4h(PSrDZWyW=Wq{mcA<3S?eAhlh+I+f9Nf2X8y*r=^zh4& zpt*;yU~nB?`U&4o;92kRb_CyjhtsK|bMNrY2(CHHan4pgdzLST>%iXS4MSRC(eG5t z+RJHb9vR>Yd(S1?@h<0F7BI-DA3g&xra z9TSCV7_D+4Dvi-Fcqb?#h?;ND{21#|J4QEf8-=K;-mZeAK&0rau*X5NyC50#6bXK*KjdR1dM6g z&D>};{PJ65{SfivA|6=j)&%codHZnf0Z~TRcynxJKXC)q^9xy`8HX%JWQ*4weLMoP z)cXZ^dEVPmhh2lQp=tFS# z^xnCLPa>v{!3`)DH)HGGUBzN9_&8oH{t8;Lmj;Vx8CxxHE){n>dV``*L+?=ZX<&;Jh}BfQw=2XC=;-jnc-K?ToG)_ZkxDU^nEhR)7|qxa**_>~pWr1y zQBCKjb@fpIvw)>3YUtM+sQQ!-2gORH`%@6W%Ci*1l^j~3r4*!OciJ_6>Ifz`1G$B4@^GnVFk%q5#At|Mtgri#mAcTN)f8IQgr z!&Aj#xnYV}hN^mgig<MxnSJk* zftB)4(?pUzEfdqlY8>01GefMT8$FQwmAUk4=$ojqa}(sJGa&Knm6lX4bw%g@$C8kc#30!|SB(FcOMY^$SlqkS z`1LW$xtwPH(#t>RV$sH0W%tEmK3gQuUo6&m3NODkPaLZ2r6frx$rRIdo9d?;^FXEw zC_8}U9hZozFHWDP7=C)K1f&;~{{2hD2v`Aeso08*irX)R+pk-eeDzYOaq?~Q&Vpo> z=8~xj&ljr-&cChNvU`4*GG~9BFQyKBl(`2OS-yvbXYmY$VZL3PEPwqh&r#DK=N5Y zW2TQ@T`omVcWYIr?RESLX{0-;cTeuQoOQ~BFeCbX6V;aq&W%uCk$2$OhCw+}rM(Sr z=EBP$U|-nne1@QS>x^=?59%f(NO#{r&YN?9x=BI%#Tvh$3~K* z7pds8BZ)BOlpJYhDs+n2^5x?DcKG)b_>eI7_bYUZjUnu%&Tz_I^J>Uk27lMWHx^6} zFbeUSunO^-u=#$%gojm#*Mv>@Bov6=9wBOK>AIY*6VW>r%4@7B3x$W!N?f^%?N0zZ z`pZGw0o-dooiA|83D#yX0tjK2@h_MmAb9E2Ut9FoZ93RaL7jDn4#IBKaDi;FfUdZq z?8Vk38w9jbz=pbRH&`p6#(wJ9llNeyU=LaJd{H%uFL4WoTnG|VN* z*eFiIR38P{gbiL)*8eI8wke4B3LY-ZhtD#QF3yL|DxomSf+Rys;T;f8`COc|!>beJ zZWoNDg#-Da96XB`4q!+?X+)4y*acUJ*Xyg-7)l1Ck9lA0+HxCiax=HkDwzb8Vm+J-fD zk}owPRY__^TNy|Kfrg?Bi$L{enwlX?AQEpB$5&N*J;0#;pRQrm(ccZvF2m^41;J+%( zQB1WGNHg?mTdRuqZ@J}Uw{dn8t(v5X*AdV?wK*tpjliWUM(7|)+Mwn>z>lg2e88}x zM$r0I1YNU>{1wcDAQb>46oaDiePX#ObXr%zxkW6x1PhgY2<6~vS}ZT)^bEIQMDX4y zuDYNJ4ln?tgB_S)ubS@@L4hefnk3|O`Hkc7^&7DWO`VL}4L4#-NS#T=m2OlV%3G-` zLsnG#s*nU#3c(QB3yR91$#(zHU^(_j&@p3DebPsz6yDk4u!ezBq1HA}g49FcG>%7^ z#M_qE%YjH4+Ki!Z{$1 z2IYcNeEuhL$hm+?T#n{b&G*w5q>>SRD@^qQR6{FO311-lG~0y&kv=Iq1%~pq?0pcJ zQm5Qa|Dt8DZI`hxWLnKuC~ZwZC3OS4Z(ve8l|1964UFj}vr7>sEKupw8Bn)@&JIui7!C^kuB|l173D`A8dj9T)a29_ zjtsPrYIt2?T%x%tL|YNCIF$oZIaid!O2CgQbP647VRi1OGq$qim>zh(tL6ujQPre z;4d^^xnb2K_$`T$QED5|H2cMk{mS7# zerSFT@b7d|HMI^(`*}Y61ad9GH)IyDf4FQGSIuGDg)TTHaK9OQTtK>8$*<% z1?*cLFoc^gs0=2M_F;5^85%*aqXKiMFp)dK^h&=?pZq11OkzCrU`T* z)8rIKa2gYO6Qq_y<3HRX!|4Dm+;Pkw;;l_=`sB(kVY8((km?k*1-oRET?#n(Tv#5s zTa8;1oHjaZo2fb}PZ+)#O=r`X(KI&0RI&)<13Oyi%eT~*X==|c)ts`UWIS-48-`Cf zqM`(8LB-MyNDd0_8xS15hP~GYgbGM;%D^fQ?&^Usyco8XkQ-G(=Q1D(o4hCgG>aCH z+CgUwt{(+2DjT@Kw$iLLHmJ$vm+=tB7RUqh1LS$B*#g?^p)Hc-SW1FKd>i&pTR6ah zxN6{Wy1WfVRAWRn4X@2O_}0kEjZ;1%K-#HODd}jMnl%7gXQ&W&=F>chQ#g$;(mX6s zr***rOp&@x9*B#SlUL0bXg?7QPrz6eUQ#viU|hf`hN-5uC+I``r4%w;FO0R<6rjg=1q5uAbXjF{Ilqf~WqO{B;v z_TCKeox60xga#^Ugo%o=sX0FFTy#U)RAReqdVX=#vQm|}wy6Vs=Eh)HAIsPAbPBn%A z`W8dHkLr`YLG|f|39a<7-(_UK)vJx_1BOj0I(?Afpy>En>fj;@26v*=w=oXJcPYz4 zSJI>m3h<0Yk#lhDUr+UD>i{p2j6i}lw-Z;f^+TOCbHR!`E{|%WxSU58hjB}Z1Hle zGXnwSs$%xle8NAad2SJ35xeI)UT>1TTqMAr{n`yb;dtW0&Pa?2Sa_dB-Wn01DHH7e zEzN5hTUuJzj^EO>c3gW0y|`qT0L7}n-vs>i$KU(hvT_j8$!pmY5y2@DW|uSoFcg0t zRt9p?SW#vdENJZ5;B0Q~bee9yrLo1rWiRqiVNrC^F{JE9ssZ@3m}Lz_kO%su^zFX? zIkBhw+#_68G>O45-$bjplG`N?ND!$dhExi<#~^>eW#*0I%|%aV*nu{XDg^eN48wr? zLWW(^1?Xr%;|Ph?V$do=Xt`(8(o9C0Y6VSZ$cpu%n0IB$8@7t^Jf11Lwu++WM5dj2 z{kU=CR#|Q`(=M?xA$cT7A}mJOfDn{H_TGMWAOUj3$}`!X)DB=!9S2SUpgjnIU?mVz zZKTpZ*U#>fzuq7oz7g|xSt&Ztf)0>D{k<%^qzyl*NKu5nizha$PQz2?@= zCZ~Dxx~6T8<#y%DpEiq8!{WI%-sqsH4nTWy?S3^*>y1tW6f4(e2$H!Z(h1Bai55?_ z?SeH;>zg+_vt~O@o7XwjNMzd?^ob<49jI}(ZfM%d_gTqElcOlPEk!IyxKMJ3E}l zPVf`yZ|5sMAx8u1>Mz%~h^u+Bf9$0eY#HIv!r1@WBraz>IY?gIDlX;mBKbh8c#J2C zW7Tb96LU_M+9ioRty=-G(p$F@rMf|Ml_|-MJzQp&ECJRq;vL}}gd_*8TQ8K^S)I+B z>b8)1=qZzJw~3KFQZAppMU0i54QOETa{2xmG2Mv_K|@EgsQz3!(IGO}A;wk?v9o)C z1nHuB-osZnzRJ~CVu)QOf3rbUjk4UGL+wBmF}aBO3jVZ0M2FhB9qnt!L!FfhcMp}f ztrL}tdWPEls+`S@o0>p#s9h3)JsgEp^$4jrTkr>B$T5l70HEXW;l*ypZ)(P90TuQ* zIdP3BkrMy#c!e(J@J19fQYpu;5#z#7SK1|UwDuus6fVYZ)GsI;Lu?mftI}ex@MGUc zY&~KZq{Tkq$9{s?0Afji9&da7*e=JezN)iTHZ-CF;*R{c2C;~D1?B&0#2ZENpnS4X zIOE4O)m}lYe1(d zXgp+B%B8!-;899}RUITkkT=p3*WCzbBOHT2tv-=qRPAGU_b?f~8ya)^4l$@PIn2)L zXzHkIX<3W4Veg}9GxWd8E}4L)TMGhh2$de9?#JRAOCwb}9a^8|M$O0O7NmR1d?+pL zu99w8%;w1|nb;vlIQxd9GXpVF@C!NY9BvZp+IGttDA-6jZi|>U?bt{=kc4?5 z)LN8}SVKoP(k_VtN_|2PLP#^Mn@f(Ak8TkY=SQmz!KQW;+SVXtJIzjga~0kHwZUYQoV$B#X02(`6AF%qNgs+;C#5g(QHXOc*j#nz<92*Zii^7n~1WL5Z zkYUj(lNhg6ziWcFBHKGe@#vlj==On16@Fooa}(^$y0xwAV8)UYD39vOi6}Gh$?@tz zNTvHO=<5d2JyE{ALk#6T6LmFxGSTi=*LX|khB^z6PoP~>GW86MM|M#4^OeP6fJU;pEe(B+S<`3j!v<2C~8YF~c!N*)1H|?q)=A5@*^iCL-0fm~=xMk^M00IxYfI~maQ~j0YVvIAY(*A5 zQ|0yBMHNp@m3IQ4Mdh>GY4&HD{Nr}9n0HUtJ#1pST(<)@EILDeyOZK)$lrBBGjTkV z9CYV!E&3UBK~#@%gyf*7yy|$Za>2uAKL;!2#(!7~b9!q>U26+T+thx>l&pEPI#?Y!k)u zrLCf$-O<{vn@n<+jI6~&TwSx3v&g$=lRX{56SL*TonoC6zX*zru2!`mgw$I$;m@?7 zi;T&bL%pRN?wJGDMw&)*0rt5$r0BQQDchd}YCTZN{&X4C-{ZG#6Zc}ksBpJX*U&}7 z$2eRRvLZ=@@D;5INUXVd3egMbr(C;BTpCW|GvJZ@z$b~rzlP)*ki=OW^F^($%lm3< zgU%fAzFHb#)^WlRqb_7N0;D{$=Y6s`cnG74I2dac9Uu|?&5!SSS05kQd_znkV9Yfu}rDoPf2n14u?~4Tk46Q0c3t7NWII zA4GHujTc(Vp?}BIlysiYR`j^6xL-`Vya&-r|2sOMo;XUazuM>v2U#How1V`ebD2*9 zHyCT=t>oQAPRPgZ7t_Y$R4W=X5)A{Vo)%x>C&H!0I#J_V_+^O``yUY1!JQ|O#zC5C zX=!LmBtsQ9dQvWYK+NQclX4f(dDrW*`vEbT$6uF!ctA{=o_yW1^BTtFI_=HtH+0rH z4dCXKWs8P72Q3c22Ix^KP3Nq=rMuu_~Ugi(YJ zlX*=U()ejv3Ey#2lA_l%u5&Q3UEkEH=NG{2o0eTj;P$3An9HViFCzM;JPoou{-*qR zk0|GfH)X+t2qSOF(GQBzx!rGBYT6CgVQ=A+?I7lsEn$pSLYD zR(e}LezzDWTkb@!hux{@emfiMTAFCEdPzWVbfAz$?K43!iUcyM+e%Nv#k^+fkcHM2?78aNB1s{&S05i$S?-oQq~VXvnuT{TF?! BJHh|} delta 78190 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 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 1d6a049791694caa67b627c63f256223bce9314b..daf9b0468286b4a56660257bb2e1936d1ab9ddf4 100644 GIT binary patch delta 3246 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 Oobyrgy4Q3g&F~+8y5?j6 diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 671f7e8c138c8..5464d62d46413 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -16,7 +16,8 @@ //! Generic implementations of Extrinsic/Header/Block. -use serde::Serialize; +#[cfg(feature = "std")] use serde::Serialize; +use rstd::prelude::*; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use traits; @@ -251,9 +252,10 @@ impl traits::Digest for Digest where } } -#[derive(PartialEq, Eq, Clone, Serialize, Debug)] -#[serde(rename_all = "camelCase")] -#[serde(deny_unknown_fields)] +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] +#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] +#[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Header where Number: Member, Hash: Member, @@ -317,9 +319,10 @@ impl traits::Header for Header where Number: Member, Hash: Member, diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 97c60586ddb4a..f9246539a006e 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -25,7 +25,7 @@ extern crate num_traits; extern crate integer_sqrt; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[cfg(feature = "std")] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; extern crate substrate_primitives; diff --git a/substrate/runtime/primitives/src/traits.rs b/substrate/runtime/primitives/src/traits.rs index bb516508f5f86..1e2008c976819 100644 --- a/substrate/runtime/primitives/src/traits.rs +++ b/substrate/runtime/primitives/src/traits.rs @@ -18,6 +18,7 @@ use rstd::prelude::*; use rstd; +#[cfg(not(feature = "std"))] use runtime_io; use substrate_primitives; use codec::{Input, Slicable}; use substrate_primitives::hash::H512; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 938d21680c6ff..3d5f405a4a99a 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -572,6 +572,7 @@ impl MakePayment for Module { #[cfg(any(feature = "std", test))] pub struct DummyContractAddressFor; +#[cfg(any(feature = "std", test))] impl ContractAddressFor for DummyContractAddressFor { fn contract_address_for(_code: &[u8], origin: &u64) -> u64 { origin + 1 diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 783d13e44494d9e3e66935a1c619edcdc4104def..1e934f702c35daf2bf0aafe6fee1a556848f281c 100644 GIT binary patch delta 7176 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 N|I1tX)5QZr{{z@S%;x|A delta 6194 zcmb_gO^h5z74GVuneN%?p6UIu_s?i+TCu%rZ)~pKwIy8ztjA53sppdFNgHKDFx}e);Z;`2ErD<7{8@>F!_QH<_Mg`#Rm}_t=Th;*49< zwnaaMaH8^;C+)%5z9FC;0?~CZMMLv;!CvGnfUM3$d#Y|#_z-6h`;SkCT|`3Qhdt=n%cbGb_pg1G3f&rzy}oyTJJUM0Y)u* z(OFa~0eY6eY}yU>QUG5F)~plgw+l@kh_{)-q)gl3GLyQ3(6qJpD#fTF4!x1pixZ@`JVP-HW+W3@YKxrwkk^cAaxsNF8qhztxh;5Dl3~8@Xu^QuVMA04$o2{^2!9RStR`n0b0@1IvL1!QX$n*# zib{J5|2_K%2P|Ls+<7Y%*AteIvGPkfO-~nJE2Q6eBp{dd|8n0n|ctTaoCoQTjww4=NRE4N)HL2Ro*z0cR$43u4&%znVSq&F#XKxmsPaoql)z;Am|BN` z{&aP0j#eA<)JrKCz`SlLZ6={ixZjslZ|inGT|LbjZG|E$EF=I5Qxj8TvUJdGz}y%Ismpy_@jiekkc!AK*R34rA%d0> z#S8*3MS!x6a#1#XSx4HPb(hlVG1~xLi)e z>~Ji{2sIp7Fn%i@I16~(;f`=uB7ZV+W&Vo- z+2n9sNo3z*96rP`iTaRF$KlZ#D5#H7;;4}OdD6ink0fENS?Gd*WnL!k*^`k&dlw)8 z#XZ`Jc!)X)9$MU93dq>D%2PY@g%n}O$KYMu)x@*4dn6a3{*hB`6M9G z14%$4F!3S9H+~g~rESO}{y?B#eFPJ?;*#Z0;>xiRhc{}+`fP#HCo#oaX}QQ#2BpM# zXwz~)7ms^HmvWw}A*7(Hy!0`mE%-;ADbvl=y0%uFb0 zQ3z1cs4oX5yh;QmS+0)8avHEa&@CS9VUXJNr z9^WoaL;aTy>?#M^rdJGb?XHUHZE_|#3HG_htSoEQxxgF?$Oe?BLF2_C(?Eu`&*F4@ zOqG0Us~TR)B`S$vE^cim7$kzZS%c1!fC{yaJ<4~wB)jn{8(=Mv;hdu5pPf%?8d?sS ztg#YVE(|S+D;ES3pwIQ4M<@g>>M^*f_0p{1MNvR=DF|mJTGfp%r0#EeT#<+)NrWB; zwoGGj6nxb1Z$#q_e)D}C$j9H0ToE4&aM@o9ur@44mEeAbdrIQSOo zl?v<$=IuKG!7C{k4BxeJUJler@~+*id-zgT#Ghj?%I{?oIeaBa1I*ME%Y zNK^DNXJkqSAJ$L9+X^i%RM-!QEs5C2k=zYO0_K-1g4KOGy!*7A^zrg)G%y*Js29@) zCF7m~FQxhiNE3WyL^y5`;T8eWQ~k3=eP*r|!Cx zF!q~9HgP{05`r> z)MHm%gSx;X&(rP%vK%_Tt=G}6((yAGt&e9VgYsoe-(yYHa3M9x7I06sC=@=jc%(^lh)NKO19+2Fa|d1VC`y)?#bw^SOv?!| zEE&mWJkjK?nZaqsJv$rSf$t<{^fta~>qECCKEa#rv6gtQY0k)&cv|A>rnv55qOLra sxbqBNb@{QxU-72z#+LXq-e6IiR{HqHrHD%RQ*@Q2vR3chxw3cgKfz};L;wH) diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 5c34fed29cd1a7b787ecc752aca7b1ea19e3fe35..b8bcd03d8394115663e14df58070cf9290bc3b7d 100644 GIT binary patch delta 7176 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 TOYY3d_a6MfTiJVY|G@tM;X=>@ delta 6194 zcmb_gUu+b|8QPVYc|(l82i)=CrA(o7ME)`mSTu5Lu7H z;WPv)5k;jn4)PcAfcMWSi`*Ie3cW95fHF>8!vm!p9+9at_9YS`{j`SFboai;A__c= zMxl^;>ulE17?EFva60|zzG1TF>b|Y0tRL^Y4kLfKe`=?!K>bvKXaiVOo3JeyHO*`C zG42-}yIQ=T3Pmfux&Lyt<;GaCM3_)J(hKtwPG;o}|S*?5j}amzpSn%W~qXOkw2^bVr@g7M1kKLib_e)XFaw zo?~;$IK-o-;bt|#xT9-O9A;(0c&L7eSoYGPod=uB%~Fvxh6J!qsxbmsCu>d4x+e9> z0dc)+9Rm87Lz{NdYGa;yDFuC)*DiINNhs6y!;HxC3d)|=G$X;m_dWjiP zalnY6*tgT@$Omk9`nMzBXFFG(fA$T=rdDnreUGu-D{mkBm9uhv>fKuU)N_AIUtjzd zXnAw-9GhO*_q~7E$@>r48xzMIlbX)ic$m&Z!=i(xi1J)eokzW+suuI_R8qU|^smFz zI?jlgzToswK>c^c_(JTB#br8#Fz)j5+1R0N`WW|lxe?nlcDi(YH1WvrVbMaLm90TH z4kg0&eZ1JsE+qnjimCI%e0UNdP_b<&X)7hJ=?qE)C1n#rC4v%Pc7}wStklx7(O*bQ zQ)vlI|4|}nshTdOM3S+-Mn_QEP|_qN9i=2odL@FAe$)L(l*odOvqD}=6IwdbAQh28 zu3I_KLj)~DrrszKplqOAlnq~bh3sM6WS4(?5-q zV4rKaTuy(seK3(@gc=Sk7{3*byGneGmt^MfH9?02))jIwhXlqI*M^(}hGJ@Bp+V@x z@w2sL8<(I$1FGME8dwJuIUUtLbGI%*lqJBi*2R$56KmFy@j}#b7Vx;k9pNs-{#fkF z{1*kX$>F$?$iBrme28Nb^&y{*!^4wM5N)EwQ6cy9q=QH9OTt96&;J#ai&Z+Ps5p#VQUg+h=@>d9L*yt7;LNN(2?S2ld3irOL436Do~P582veRP}Ak^s!1-0AyxD zNs~f=ibj1oFyU1qD9LhlIFZwU<(_VFZyy^nZ9_FJXxU)$Sc#xyV{bF;s6JLQ-ODlE z%i|lRX{i6wfoeAv_F2;1 z9#bWsTB?SZa*0YJn2TGR2?mK^Zq}f)B%ngAV~_IPU6S2+l?|{K$Z$^4@z2gDH4QC? zOx9S5EEk5R#FYyI3DDa);6+hDb14XCAwHxVT}a*E^td7sN0JCV z4s4mg;y8Gx?q7&U>ip7G9LPtm#;!=d7T~f!A7E`*j4SD%UmQ&=+6$i-EBLG>pK$Ok zM3oBc31;kD0KqF=Fc`jVYrU&&ls)5;=S&NdwH(6w8EM183Bs zZAiQ56VAw#3_h%%fVUM|T&S=g5L*(lk0ZGo4hPIHR|JcEI=uU|ob>VXp}21>E>SP0 z4NAs61zzgv?;}m{k&R;m?w=?)$vg2VAFcDBT;wC%AB#qyvPcka+4PN0k}&)-_i*Zt zq#UOQIH!WB_>1)YWn>m-ZI}C0wou|Q51LgKb9nGHusWFU(>+!1v-*Ip$B2g;C|JFiS` z^fSt|M4#z>%%EbQ(@2L7P>OCYsxKI3(FnA{G2I5CN2s*TN!IjKamx9e;#>(&6hHL( zd<9oT(Icd}smhN}%^@m5C?3U|teTtYibqkh#CBZf&C7(G zkie3mY{tV4?wT2#X56u}(arcyVn#p0S8aXhw!{s*=^kr|CmQCAY>8=!tKG$Q2NQMW uvBa&%@T$v?CH{yveK)qmO}xRP7OnL0jY|=g?x*M~>GO-x%JkB<{{H|}gFnLn From e927229da736e4c3acd13a5be877c3c754c86a67 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 3 Apr 2018 18:10:28 +0200 Subject: [PATCH 74/76] kill warnings --- Cargo.lock | 6 +++--- polkadot/cli/Cargo.toml | 2 +- substrate/runtime/consensus/src/lib.rs | 4 ++-- substrate/runtime/democracy/src/lib.rs | 14 +++++++------- substrate/runtime/primitives/src/generic.rs | 10 ++++++++++ substrate/runtime/primitives/src/testing.rs | 2 +- substrate/runtime/staking/src/lib.rs | 4 +--- 7 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c88eeb867418..334f59d7e1377 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "app_dirs" -version = "1.1.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ole32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1162,7 +1162,7 @@ dependencies = [ name = "polkadot-cli" version = "0.1.0" dependencies = [ - "app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.29.4 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2436,7 +2436,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" -"checksum app_dirs 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b7d1c0d48a81bbb13043847f957971f4d87c81542d80ece5e84ba3cba4058fd4" +"checksum app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e73a24bad9bd6a94d6395382a6c69fe071708ae4409f763c5475e14ee896313d" "checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e772942dccdf11b368c31e044e4fca9189f80a773d2f0808379de65894cbf57" diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 232c105f6f7bd..c7c10f9e5d970 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -12,7 +12,7 @@ log = "0.3" hex-literal = "0.1" triehash = "0.1" ed25519 = { path = "../../substrate/ed25519" } -app_dirs = "1.1" +app_dirs = "1.2.1" substrate-client = { path = "../../substrate/client" } substrate-codec = { path = "../../substrate/codec" } substrate-runtime-io = { path = "../../substrate/runtime-io" } diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 0f6706d0810a6..ca1174bb3bb08 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -34,10 +34,10 @@ pub const AUTHORITY_COUNT: &'static[u8] = b":auth:len"; struct AuthorityStorageVec(rstd::marker::PhantomData); impl StorageVec for AuthorityStorageVec { type Item = S; - const PREFIX: &'static[u8] = AUTHORITY_AT; + const PREFIX: &'static [u8] = AUTHORITY_AT; } -pub const CODE: &'static[u8] = b":code"; +pub const CODE: &'static [u8] = b":code"; pub trait Trait { type SessionKey: Parameter + Default; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 591f8a29956d4..0f9cdd51353b9 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -536,7 +536,7 @@ mod tests { }); } - fn sessions_per_era_propsal(value: u64) -> Proposal { + fn sessions_per_era_proposal(value: u64) -> Proposal { Proposal::Staking(staking::PrivCall::set_sessions_per_era(value)) } @@ -544,7 +544,7 @@ mod tests { fn simple_passing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&1, r, true); assert_eq!(Democracy::voters_for(r), vec![1]); @@ -562,7 +562,7 @@ mod tests { fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&1, r, true); Democracy::cancel_referendum(r); @@ -577,7 +577,7 @@ mod tests { fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&1, r, false); assert_eq!(Democracy::voters_for(r), vec![1]); @@ -595,7 +595,7 @@ mod tests { fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&1, r, true); Democracy::vote(&2, r, false); Democracy::vote(&3, r, false); @@ -616,7 +616,7 @@ mod tests { fn controversial_low_turnout_voting_should_work() { with_externalities(&mut new_test_ext(), || { System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&5, r, false); Democracy::vote(&6, r, true); @@ -636,7 +636,7 @@ mod tests { assert_eq!(Staking::total_stake(), 210); System::set_block_number(1); - let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + let r = Democracy::inject_referendum(1, sessions_per_era_proposal(2), VoteThreshold::SuperMajorityApprove); Democracy::vote(&4, r, true); Democracy::vote(&5, r, false); Democracy::vote(&6, r, true); diff --git a/substrate/runtime/primitives/src/generic.rs b/substrate/runtime/primitives/src/generic.rs index 5464d62d46413..81c7ca44c69a4 100644 --- a/substrate/runtime/primitives/src/generic.rs +++ b/substrate/runtime/primitives/src/generic.rs @@ -252,6 +252,7 @@ impl traits::Digest for Digest where } } +/// Abstraction over a block header for a substrate chain. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] @@ -261,12 +262,18 @@ pub struct Header where Hash: Member, DigestItem: Member, { + /// The parent hash. pub parent_hash: Hash, + /// The block number. pub number: Number, + /// The state trie merkle root pub state_root: Hash, + /// The merkle root of the extrinsics. pub extrinsics_root: Hash, + /// A chain-specific digest of data useful for light clients or referencing auxiliary data. pub digest: Digest, } + impl Slicable for Header where Number: Member + Slicable, Hash: Member + Slicable, @@ -319,6 +326,7 @@ impl traits::Header for Header wh Call: Member, Signature: Member { + /// The block header. pub header: Header, + /// The accompanying extrinsics. pub extrinsics: Vec>, } diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs index d7d28a51aabf8..7300d8d1765b5 100644 --- a/substrate/runtime/primitives/src/testing.rs +++ b/substrate/runtime/primitives/src/testing.rs @@ -20,7 +20,7 @@ use serde; use codec::{Slicable, Input}; use runtime_support::AuxDispatchable; use substrate_primitives::H256; -use traits::{self, Checkable, Applyable, Header as HeaderT, Block as BlockT, Digest as DigestT}; +use traits::{self, Checkable, Applyable}; #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] pub struct Digest { diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 3d5f405a4a99a..49c125f4dda9e 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -371,9 +371,7 @@ impl ChangeEntry { } } -// Compiler bug: https://github.com/rust-lang/rust/issues/40640. Will cause a warning and there's -// not much we can do about it. -type State = BTreeMap>; +type State = BTreeMap<::AccountId, ChangeEntry>; trait Externalities { fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option>; From 8cb2648fe4d5f9a82312dd782848f2caa3c074f7 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 4 Apr 2018 10:42:26 +0200 Subject: [PATCH 75/76] more docs --- demo/runtime/src/lib.rs | 21 +++++++++++++++++++++ substrate/runtime-io/src/lib.rs | 13 +++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index d6d062156d32d..bbf55850bdb99 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -40,6 +40,7 @@ use runtime_primitives::traits::{Identity, HasPublicAux}; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; +/// Concrete runtime type used to parameterize the various modules. pub struct Concrete; impl HasPublicAux for Concrete { @@ -49,11 +50,15 @@ impl HasPublicAux for Concrete { impl timestamp::Trait for Concrete { type Value = u64; } + +/// Timestamp module for this concrete runtime. pub type Timestamp = timestamp::Module; impl consensus::Trait for Concrete { type SessionKey = SessionKey; } + +/// Consensus module for this concrete runtime. pub type Consensus = consensus::Module; impl system::Trait for Concrete { @@ -65,27 +70,38 @@ impl system::Trait for Concrete { type AccountId = AccountId; type Header = generic::Header>; } + +/// System module for this concrete runtime. pub type System = system::Module; impl session::Trait for Concrete { type PublicAux = ::PublicAux; type ConvertAccountIdToSessionKey = Identity; } + +/// Session module for this concrete runtime. pub type Session = session::Module; impl staking::Trait for Concrete { type Balance = Balance; type DetermineContractAddress = BlakeTwo256; } + +/// Staking module for this concrete runtime. pub type Staking = staking::Module; impl democracy::Trait for Concrete { type Proposal = PrivCall; } + +/// Democracy module for this concrete runtime. pub type Democracy = democracy::Module; impl council::Trait for Concrete {} + +/// Council module for this concrete runtime. pub type Council = council::Module; +/// Council voting module for this concrete runtime. pub type CouncilVoting = council::voting::Module; impl_outer_dispatch! { @@ -108,10 +124,15 @@ impl_outer_dispatch! { } } +/// Block header type as expected by this runtime. pub type Header = generic::Header>; +/// Block type as expected by this runtime. pub type Block = generic::Block, AccountId, Index, Call, Signature>; +/// Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type as expected by this runtime. pub type Extrinsic = generic::Extrinsic; +/// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive; diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index 836ab42c3466a..a2eb13dafd552 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -30,16 +30,25 @@ include!("../with_std.rs"); #[cfg(not(feature = "std"))] include!("../without_std.rs"); +/// Abstraction around hashing pub trait Hashing { + /// The hash type produced. type Output; + + /// Produce the hash of some byte-slice. fn hash(s: &[u8]) -> Self::Output; + /// Produce the hash of some codec-encodable value. fn hash_of(s: &S) -> Self::Output { codec::Slicable::using_encoded(s, Self::hash) } - fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output; + /// Produce the patricia-trie root of a mapping from indices to byte slices. + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output; + + /// Acquire the global storage root. fn storage_root() -> Self::Output; } +/// Blake2-256 Hashing implementation. pub struct BlakeTwo256; impl Hashing for BlakeTwo256 { @@ -47,7 +56,7 @@ impl Hashing for BlakeTwo256 { fn hash(s: &[u8]) -> Self::Output { blake2_256(s).into() } - fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output { + fn enumerated_trie_root(items: &[&[u8]]) -> Self::Output { enumerated_trie_root(items).into() } fn storage_root() -> Self::Output { From 504c1168c4d65bc05332a47110ce84ff19bd20c6 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 4 Apr 2018 10:54:14 +0200 Subject: [PATCH 76/76] minor cleanups --- demo/runtime/src/lib.rs | 13 ++++++++++--- substrate/runtime-io/with_std.rs | 7 +++++-- substrate/runtime-support/src/lib.rs | 8 ++++++-- substrate/runtime/consensus/src/lib.rs | 9 +++++++-- substrate/runtime/democracy/src/lib.rs | 15 +++++++++++---- substrate/runtime/executive/src/lib.rs | 21 ++++++++++++++++----- substrate/runtime/primitives/src/lib.rs | 9 +++++++-- substrate/runtime/session/src/lib.rs | 22 +++++++++++++++------- substrate/runtime/staking/src/lib.rs | 11 ++++++++--- substrate/runtime/system/src/lib.rs | 21 ++++++++++++++------- substrate/runtime/timestamp/src/lib.rs | 12 +++++++++--- 11 files changed, 108 insertions(+), 40 deletions(-) diff --git a/demo/runtime/src/lib.rs b/demo/runtime/src/lib.rs index bbf55850bdb99..e6ac39823bdf4 100644 --- a/demo/runtime/src/lib.rs +++ b/demo/runtime/src/lib.rs @@ -18,10 +18,16 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[macro_use] +extern crate substrate_runtime_io as runtime_io; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[macro_use] +extern crate substrate_runtime_primitives as runtime_primitives; + extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; -#[macro_use] extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_council as council; extern crate substrate_runtime_democracy as democracy; @@ -37,6 +43,7 @@ use runtime_io::BlakeTwo256; use demo_primitives::{AccountId, Balance, BlockNumber, Hash, Index, SessionKey, Signature}; use runtime_primitives::generic; use runtime_primitives::traits::{Identity, HasPublicAux}; + #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildExternalities; diff --git a/substrate/runtime-io/with_std.rs b/substrate/runtime-io/with_std.rs index 764cb3b188e70..5fda5181b06ac 100644 --- a/substrate/runtime-io/with_std.rs +++ b/substrate/runtime-io/with_std.rs @@ -14,10 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -#[macro_use] extern crate environmental; +#[macro_use] +extern crate environmental; + +#[cfg_attr(test, macro_use)] +extern crate substrate_primitives as primitives; extern crate substrate_state_machine; -#[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives; extern crate triehash; extern crate ed25519; diff --git a/substrate/runtime-support/src/lib.rs b/substrate/runtime-support/src/lib.rs index 1f6ac20f81a67..12894aa8088bc 100644 --- a/substrate/runtime-support/src/lib.rs +++ b/substrate/runtime-support/src/lib.rs @@ -18,11 +18,15 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + #[cfg(feature = "std")] #[allow(unused_imports)] #[macro_use] // can be removed when fixed: https://github.com/rust-lang/rust/issues/43497 extern crate serde_derive; -#[cfg(feature = "std")] pub use serde_derive::*; + +#[cfg(feature = "std")] +pub use serde_derive::*; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index ca1174bb3bb08..7826c689e70c1 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -18,9 +18,14 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; +#[allow(unused_imports)] +#[macro_use] +extern crate substrate_runtime_std as rstd; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; extern crate substrate_codec as codec; diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 0f9cdd51353b9..2ffe1441a383b 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -18,13 +18,20 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[cfg(feature = "std")] +extern crate substrate_primitives; + +#[macro_use] +extern crate substrate_runtime_std as rstd; extern crate substrate_codec as codec; -#[cfg(feature = "std")] extern crate substrate_primitives; -#[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_session as session; diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index a4bf7ae804f16..a99bd28c987f1 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -24,11 +24,22 @@ extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; -#[cfg(test)] #[macro_use] extern crate hex_literal; -#[cfg(test)] extern crate substrate_primitives; -#[cfg(test)] extern crate substrate_runtime_consensus as consensus; -#[cfg(test)] extern crate substrate_runtime_session as session; -#[cfg(test)] extern crate substrate_runtime_staking as staking; + +#[cfg(test)] +#[macro_use] +extern crate hex_literal; + +#[cfg(test)] +extern crate substrate_primitives; + +#[cfg(test)] +extern crate substrate_runtime_consensus as consensus; + +#[cfg(test)] +extern crate substrate_runtime_session as session; + +#[cfg(test)] +extern crate substrate_runtime_staking as staking; #[cfg(feature = "std")] extern crate serde; diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index f9246539a006e..69a3039de6aee 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -19,8 +19,13 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; + extern crate num_traits; extern crate integer_sqrt; extern crate substrate_runtime_std as rstd; diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 692708a5bef70..cdaa9302eb1bc 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -19,20 +19,28 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + +#[cfg(any(feature = "std", test))] +extern crate substrate_keyring as keyring; + +#[cfg(any(feature = "std", test))] +extern crate substrate_primitives; + +#[cfg_attr(feature = "std", macro_use)] +extern crate substrate_runtime_std as rstd; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; -extern crate substrate_codec as codec; -#[cfg(any(feature = "std", test))] extern crate substrate_primitives; -#[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_system as system; use rstd::prelude::*; -//use runtime_io::{twox_128, TestExternalities}; use primitives::traits::{Zero, One, RefInto, Executable, Convert}; use runtime_support::{StorageValue, StorageMap}; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 49c125f4dda9e..947b08b240066 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -18,13 +18,18 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] +extern crate serde; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[cfg_attr(feature = "std", macro_use)] +extern crate substrate_runtime_std as rstd; extern crate substrate_codec as codec; extern crate substrate_primitives; -#[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; -#[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_session as session; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 0b7eb5036b31d..84f89678a6a34 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -19,24 +19,31 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg_attr(any(feature = "std", test), macro_use)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_support as runtime_support; +#[cfg_attr(any(feature = "std", test), macro_use)] +extern crate substrate_runtime_std as rstd; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[cfg(feature = "std")] +extern crate serde; + extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; - -#[cfg(feature = "std")] extern crate serde; - extern crate safe_mix; use rstd::prelude::*; -#[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; -#[cfg(any(feature = "std", test))] use codec::Slicable; use runtime_io::Hashing; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; +#[cfg(any(feature = "std", test))] +use rstd::marker::PhantomData; +#[cfg(any(feature = "std", test))] +use codec::Slicable; + #[cfg(any(feature = "std", test))] use runtime_io::{twox_128, TestExternalities}; diff --git a/substrate/runtime/timestamp/src/lib.rs b/substrate/runtime/timestamp/src/lib.rs index e3afc076a868d..c651fd8753f43 100644 --- a/substrate/runtime/timestamp/src/lib.rs +++ b/substrate/runtime/timestamp/src/lib.rs @@ -18,9 +18,15 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; -#[macro_use] extern crate substrate_runtime_support as runtime_support; -#[cfg(test)] extern crate substrate_runtime_io as runtime_io; +#[cfg_attr(test, macro_use)] +extern crate substrate_runtime_std as rstd; + +#[macro_use] +extern crate substrate_runtime_support as runtime_support; + +#[cfg(test)] +extern crate substrate_runtime_io as runtime_io; + extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_codec as codec;

!-<6il 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 XT2AHIh?VI#Q~iAx-#g8JX~+Kyg*>)d delta 61532 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 diff --git a/polkadot/primitives/src/block.rs b/polkadot/primitives/src/block.rs index b2d90a19c09d2..e74dd19f4c59b 100644 --- a/polkadot/primitives/src/block.rs +++ b/polkadot/primitives/src/block.rs @@ -49,7 +49,7 @@ impl Slicable for Log { } } -impl ::codec::NonTrivialSlicable for Log { } + /// The digest of a block, useful for light-clients. #[derive(Clone, Default, PartialEq, Eq)] diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index 32f3f6e86e7e6..e94ba03d28590 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -19,7 +19,7 @@ #[cfg(feature = "std")] use primitives::bytes; use primitives; -use codec::{Input, Slicable, NonTrivialSlicable}; +use codec::{Input, Slicable}; use rstd::cmp::{PartialOrd, Ord, Ordering}; use rstd::vec::Vec; use ::Hash; @@ -86,7 +86,7 @@ impl Slicable for Chain { } } -impl NonTrivialSlicable for Chain { } + /// The duty roster specifying what jobs each validator must do. #[derive(Clone, PartialEq)] diff --git a/polkadot/primitives/src/transaction.rs b/polkadot/primitives/src/transaction.rs index 08fadf313c4b7..f3637034b403d 100644 --- a/polkadot/primitives/src/transaction.rs +++ b/polkadot/primitives/src/transaction.rs @@ -365,7 +365,7 @@ impl Slicable for Transaction { } } -impl ::codec::NonTrivialSlicable for Transaction {} + /// A transactions right from the external world. Unchecked. #[derive(Eq, Clone)] @@ -441,7 +441,7 @@ impl Slicable for UncheckedTransaction { } } -impl ::codec::NonTrivialSlicable for UncheckedTransaction {} + impl PartialEq for UncheckedTransaction { fn eq(&self, other: &Self) -> bool { diff --git a/substrate/codec/src/lib.rs b/substrate/codec/src/lib.rs index 15ff92b4f6694..7a9f17baeb510 100644 --- a/substrate/codec/src/lib.rs +++ b/substrate/codec/src/lib.rs @@ -27,6 +27,6 @@ mod slicable; mod joiner; mod keyedvec; -pub use self::slicable::{Input, Slicable, NonTrivialSlicable}; +pub use self::slicable::{Input, Slicable}; pub use self::joiner::Joiner; pub use self::keyedvec::KeyedVec; diff --git a/substrate/codec/src/slicable.rs b/substrate/codec/src/slicable.rs index 4b515e896b03a..592a348c194fd 100644 --- a/substrate/codec/src/slicable.rs +++ b/substrate/codec/src/slicable.rs @@ -61,10 +61,6 @@ pub trait Slicable: Sized { } } -/// Trait to mark that a type is not trivially (essentially "in place") serialisable. -// TODO: under specialization, remove this and simply specialize in place serializable types. -pub trait NonTrivialSlicable: Slicable {} - impl Slicable for Option { fn decode(input: &mut I) -> Option { match input.read_byte()? { @@ -83,7 +79,7 @@ impl Slicable for Option { }]) } } -impl NonTrivialSlicable for Option {} + impl Slicable for Box { fn decode(input: &mut I) -> Option { @@ -147,7 +143,7 @@ impl Slicable for Vec { } } -impl NonTrivialSlicable for Vec where Vec: Slicable {} + impl Slicable for () { fn decode(_: &mut I) -> Option<()> { @@ -178,7 +174,7 @@ macro_rules! tuple_impl { } } - impl<$one: NonTrivialSlicable> NonTrivialSlicable for ($one,) { } + }; ($first:ident, $($rest:ident,)+) => { impl<$first: Slicable, $($rest: Slicable),+> @@ -214,11 +210,6 @@ macro_rules! tuple_impl { } } - impl<$first: Slicable, $($rest: Slicable),+> - NonTrivialSlicable - for ($first, $($rest),+) - { } - tuple_impl!($($rest,)+); } } @@ -227,7 +218,7 @@ macro_rules! tuple_impl { mod inner_tuple_impl { use rstd::vec::Vec; - use super::{Input, Slicable, NonTrivialSlicable}; + use super::{Input, Slicable}; tuple_impl!(A, B, C, D, E, F, G, H, I, J, K,); } diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs index 0fd55bca403fc..76e4061c10449 100644 --- a/substrate/primitives/src/block.rs +++ b/substrate/primitives/src/block.rs @@ -21,7 +21,7 @@ use rstd::vec::Vec; #[cfg(feature = "std")] use bytes; use Hash; -use codec::{Input, Slicable, NonTrivialSlicable}; +use codec::{Input, Slicable}; /// Used to refer to a block number. pub type Number = u64; @@ -47,7 +47,7 @@ impl Slicable for Transaction { } } -impl NonTrivialSlicable for Transaction { } + @@ -66,7 +66,7 @@ impl Slicable for Log { } } -impl NonTrivialSlicable for Log { } + @@ -88,11 +88,11 @@ impl Slicable for Digest { } } -impl NonTrivialSlicable for Digest { } + /// Generic types to be specialised later. pub mod generic { - use super::{Header, Slicable, Input, NonTrivialSlicable, Vec}; + use super::{Header, Slicable, Input, Vec}; /// A Block - this is generic for later specialisation in particular runtimes. #[derive(PartialEq, Eq, Clone)] @@ -120,7 +120,7 @@ pub mod generic { } } - impl NonTrivialSlicable for Block where Vec: Slicable { } + } /// The body of a block is just a bunch of transactions. diff --git a/substrate/runtime-support/src/dispatch.rs b/substrate/runtime-support/src/dispatch.rs index e64fbcf4027f1..399727031b528 100644 --- a/substrate/runtime-support/src/dispatch.rs +++ b/substrate/runtime-support/src/dispatch.rs @@ -22,7 +22,7 @@ pub use std::fmt; pub use rstd::marker::PhantomData; #[cfg(feature = "std")] use serde; -pub use codec::{Slicable, Input, NonTrivialSlicable}; +pub use codec::{Slicable, Input}; pub trait Dispatchable { type Trait; @@ -373,7 +373,7 @@ macro_rules! __decl_dispatch_module_common { f(self.encode().as_slice()) } } - impl<$trait_instance: $trait_name> $crate::dispatch::NonTrivialSlicable for $call_type<$trait_instance> {} + } } @@ -476,7 +476,7 @@ macro_rules! impl_outer_dispatch_common { f(self.encode().as_slice()) } } - impl $crate::dispatch::NonTrivialSlicable for $call_type {} + } } @@ -595,7 +595,7 @@ macro_rules! impl_dispatch { f(self.encode().as_slice()) } } - impl $crate::dispatch::NonTrivialSlicable for Call {} + } } } @@ -685,7 +685,7 @@ macro_rules! impl_meta_dispatch { f(self.encode().as_slice()) } } - impl $crate::dispatch::NonTrivialSlicable for Call {} + } } } diff --git a/substrate/test-runtime/src/transaction.rs b/substrate/test-runtime/src/transaction.rs index 81fd37f779a5b..19ddba99e4ef3 100644 --- a/substrate/test-runtime/src/transaction.rs +++ b/substrate/test-runtime/src/transaction.rs @@ -53,7 +53,7 @@ impl Slicable for Transaction { } } -impl ::codec::NonTrivialSlicable for Transaction {} + #[cfg(test)] mod tests { diff --git a/substrate/test-runtime/src/unchecked_transaction.rs b/substrate/test-runtime/src/unchecked_transaction.rs index 72b60098c11a8..0aff8d472738e 100644 --- a/substrate/test-runtime/src/unchecked_transaction.rs +++ b/substrate/test-runtime/src/unchecked_transaction.rs @@ -60,7 +60,7 @@ impl Slicable for UncheckedTransaction { } } -impl ::codec::NonTrivialSlicable for UncheckedTransaction {} + #[cfg(test)] mod tests { From fd6263c789260291970f2cc28b40f0ee7b6c12ce Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 16:49:01 +0900 Subject: [PATCH 46/76] Staking "test externalities" stuff along with refactor. --- Cargo.lock | 3 + demo/executor/Cargo.toml | 2 + demo/executor/src/lib.rs | 134 +++++++++++++----------- demo/primitives/src/header.rs | 14 +-- demo/runtime/src/block.rs | 14 +-- demo/runtime/src/extrinsic.rs | 44 ++++---- demo/runtime/src/runtime.rs | 23 +++- substrate/runtime/primitives/src/lib.rs | 7 +- substrate/runtime/staking/Cargo.toml | 2 + substrate/runtime/staking/src/lib.rs | 56 +++++----- 10 files changed, 171 insertions(+), 128 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index efe1cbe720848..a51d854dfedad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -228,7 +228,9 @@ dependencies = [ "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-staking 0.1.0", "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", "substrate-state-machine 0.1.0", "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1884,6 +1886,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", diff --git a/demo/executor/Cargo.toml b/demo/executor/Cargo.toml index ad2d53f9921b3..d42cae45cbb26 100644 --- a/demo/executor/Cargo.toml +++ b/demo/executor/Cargo.toml @@ -19,3 +19,5 @@ demo-runtime = { path = "../runtime" } [dev-dependencies] substrate-keyring = { path = "../../substrate/keyring" } +substrate-runtime-staking = { path = "../../substrate/runtime/staking" } +substrate-runtime-system = { path = "../../substrate/runtime/system" } diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 8d94b475acbdd..679438ffae760 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -29,6 +29,8 @@ extern crate triehash; #[cfg(test)] extern crate substrate_keyring as keyring; #[cfg(test)] extern crate substrate_runtime_support as runtime_support; +#[cfg(test)] extern crate substrate_runtime_staking as staking; +#[cfg(test)] extern crate substrate_runtime_system as system; #[cfg(test)] #[macro_use] extern crate hex_literal; native_executor_instance!(pub Executor, demo_runtime::api::dispatch, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm")); @@ -44,11 +46,11 @@ mod tests { use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; use demo_primitives::{Hash, Header, BlockNumber, Digest}; - use demo_runtime::transaction::{Transaction, UncheckedTransaction}; + use demo_runtime::extrinsic::{Extrinsic, UncheckedExtrinsic}; use demo_runtime::block::Block; - use demo_runtime::runtime::staking::{FreeBalanceOf, balance}; - use demo_runtime::runtime::{staking, system}; - use demo_runtime::dispatch; + use {staking, system}; + use demo_runtime::runtime::{Call, Concrete, Staking}; + use demo_runtime::runtime::{MakeTestExternalities, TestingConfig, StakingConfig}; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -61,110 +63,116 @@ mod tests { ) } - fn tx() -> UncheckedTransaction { - let transaction = Transaction { + fn tx() -> UncheckedExtrinsic { + let extrinsic = Extrinsic { signed: Alice.into(), nonce: 0, - function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer::(Bob.into(), 69)), }; - let signature = Keyring::from_raw_public(transaction.signed).unwrap() - .sign(&transaction.encode()); + let signature = Keyring::from_raw_public(extrinsic.signed).unwrap() + .sign(&extrinsic.encode()); - UncheckedTransaction { transaction, signature } + UncheckedExtrinsic { extrinsic, signature } } #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_err()); } #[test] fn panic_execution_with_native_equivalent_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_err()); } #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, COMPACT_CODE, "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 42); - assert_eq!(balance(&Bob), 69); + assert_eq!(Staking::balance(&Alice), 42); + assert_eq!(Staking::balance(&Bob), 69); }); } #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&tx())); + let r = Executor::new().call(&mut t, BLOATY_CODE, "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 42); - assert_eq!(balance(&Bob), 69); + assert_eq!(Staking::balance(&Alice), 42); + assert_eq!(Staking::balance(&Bob), 69); }); } fn new_test_ext() -> TestExternalities { - staking::testing::externalities(2, 2, 0) + //staking::testing::externalities(2, 2, 0) + TestingConfig { + staking: Some(StakingConfig { + sessions_per_era: 2, + current_era: 2, + }), + }.test_externalities() } - fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec) -> (Vec, Hash) { + fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, extrinsics: Vec) -> (Vec, Hash) { use triehash::ordered_trie_root; - let transactions = txs.into_iter().map(|transaction| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(transaction.signed)).unwrap()) - .sign(&transaction.encode()); + let extrinsics = extrinsics.into_iter().map(|extrinsic| { + let signature = Pair::from(Keyring::from_public(Public::from_raw(extrinsic.signed)).unwrap()) + .sign(&extrinsic.encode()); - UncheckedTransaction { transaction, signature } + UncheckedExtrinsic { extrinsic, signature } }).collect::>(); - let transaction_root = ordered_trie_root(transactions.iter().map(Slicable::encode)).0.into(); + let extrinsics_root = ordered_trie_root(extrinsics.iter().map(Slicable::encode)).0.into(); let header = Header { parent_hash, number, state_root, - transaction_root, + extrinsics_root, digest: Digest { logs: vec![], }, }; let hash = header.blake2_256(); - (Block { header, transactions }.encode(), hash.into()) + (Block { header, extrinsics }.encode(), hash.into()) } fn block1() -> (Vec, Hash) { @@ -172,10 +180,10 @@ mod tests { 1, [69u8; 32].into(), hex!("7a388ce5b4eeadbb9268ae96e8822b223f4fd1841327d99f4e1c21fad81f97f2").into(), - vec![Transaction { + vec![Extrinsic { signed: Alice.into(), nonce: 0, - function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 69)), + function: Call::Staking(staking::Call::transfer(Bob.into(), 69)), }] ) } @@ -186,15 +194,15 @@ mod tests { block1().1, hex!("e4eb71be8b816f2061f32f284e9b429562cdc1b82f11725e5f965ff23439f5e9").into(), vec![ - Transaction { + Extrinsic { signed: Bob.into(), nonce: 0, - function: dispatch::PubCall::Staking(staking::public::Call::transfer(Alice.into(), 5)), + function: Call::Staking(staking::Call::transfer(Alice.into(), 5)), }, - Transaction { + Extrinsic { signed: Alice.into(), nonce: 1, - function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 15)), + function: Call::Staking(staking::Call::transfer(Bob.into(), 15)), } ] ) @@ -207,15 +215,15 @@ mod tests { Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 41); - assert_eq!(balance(&Bob), 69); + assert_eq!(Staking::balance(&Alice), 41); + assert_eq!(Staking::balance(&Bob), 69); }); Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 30); - assert_eq!(balance(&Bob), 78); + assert_eq!(Staking::balance(&Alice), 30); + assert_eq!(Staking::balance(&Bob), 78); }); } @@ -226,50 +234,50 @@ mod tests { WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 41); - assert_eq!(balance(&Bob), 69); + assert_eq!(Staking::balance(&Alice), 41); + assert_eq!(Staking::balance(&Bob), 69); }); WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 30); - assert_eq!(balance(&Bob), 78); + assert_eq!(Staking::balance(&Alice), 30); + assert_eq!(Staking::balance(&Bob), 78); }); } #[test] fn panic_execution_gives_error() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &vec![].and(&tx())); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_err()); } #[test] fn successful_execution_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8], - twox_128(&system::BlockHashAt::key_for(0)).to_vec() => vec![0u8; 32] + twox_128(&>::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(>::key()).to_vec() => vec![0u8; 8], + twox_128(&>::key_for(0)).to_vec() => vec![0u8; 32] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); let r = WasmExecutor.call(&mut t, &foreign_code[..], "initialise_block", &vec![].and(&Header::from_block_number(1u64))); assert!(r.is_ok()); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &vec![].and(&tx())); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "apply_extrinsic", &vec![].and(&tx())); assert!(r.is_ok()); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 42); - assert_eq!(balance(&Bob), 69); + assert_eq!(Staking::balance(&Alice), 42); + assert_eq!(Staking::balance(&Bob), 69); }); } } diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs index 7affc4ad34403..f70e91bbc766e 100644 --- a/demo/primitives/src/header.rs +++ b/demo/primitives/src/header.rs @@ -86,7 +86,7 @@ pub struct Header { /// State root after this transition. pub state_root: H256, /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub transaction_root: H256, + pub extrinsics_root: H256, /// The digest of activity on the block. pub digest: Digest, } @@ -98,7 +98,7 @@ impl Header { parent_hash: Default::default(), number, state_root: Default::default(), - transaction_root: Default::default(), + extrinsics_root: Default::default(), digest: Default::default(), } } @@ -109,7 +109,7 @@ impl Headery for Header { type Hash = HeaderHash; type Digest = Digest; fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.transaction_root } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } fn state_root(&self) -> &Self::Hash { &self.state_root } fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } fn digest(&self) -> &Self::Digest { &self.digest } @@ -121,7 +121,7 @@ impl Headery for Header { digest: Self::Digest ) -> Self { Header { - number, transaction_root: extrinsics_root, state_root, parent_hash, digest + number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest } } } @@ -132,7 +132,7 @@ impl Slicable for Header { parent_hash: try_opt!(Slicable::decode(input)), number: try_opt!(Slicable::decode(input)), state_root: try_opt!(Slicable::decode(input)), - transaction_root: try_opt!(Slicable::decode(input)), + extrinsics_root: try_opt!(Slicable::decode(input)), digest: try_opt!(Slicable::decode(input)), }) } @@ -143,7 +143,7 @@ impl Slicable for Header { self.parent_hash.using_encoded(|s| v.extend(s)); self.number.using_encoded(|s| v.extend(s)); self.state_root.using_encoded(|s| v.extend(s)); - self.transaction_root.using_encoded(|s| v.extend(s)); + self.extrinsics_root.using_encoded(|s| v.extend(s)); self.digest.using_encoded(|s| v.extend(s)); v @@ -162,7 +162,7 @@ mod tests { parent_hash: 5.into(), number: 67, state_root: 3.into(), - transaction_root: 6.into(), + extrinsics_root: 6.into(), digest: Digest { logs: vec![Log(vec![1])] }, }; diff --git a/demo/runtime/src/block.rs b/demo/runtime/src/block.rs index 27273b81cc9dc..20531284e5368 100644 --- a/demo/runtime/src/block.rs +++ b/demo/runtime/src/block.rs @@ -28,8 +28,8 @@ pub use demo_primitives::header::{Header, Digest, Log, Number, HeaderHash}; pub struct Block { /// The block header. pub header: Header, - /// All relay-chain transactions. - pub transactions: Vec, // TODO: rename extrinsics. + /// All relay-chain extrinsics. + pub extrinsics: Vec, // TODO: rename extrinsics. } impl Blocky for Block { @@ -39,24 +39,24 @@ impl Blocky for Block { &self.header } fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.transactions[..] + &self.extrinsics[..] } fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.transactions) + (self.header, self.extrinsics) } } impl Slicable for Block { fn decode(input: &mut I) -> Option { - let (header, transactions) = Slicable::decode(input)?; - Some(Block { header, transactions }) + let (header, extrinsics) = Slicable::decode(input)?; + Some(Block { header, extrinsics }) } fn encode(&self) -> Vec { let mut v = Vec::new(); v.extend(self.header.encode()); - v.extend(self.transactions.encode()); + v.extend(self.extrinsics.encode()); v } diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs index 834b64efc317d..34278e97b51d7 100644 --- a/demo/runtime/src/extrinsic.rs +++ b/demo/runtime/src/extrinsic.rs @@ -27,13 +27,13 @@ use runtime_support::AuxDispatchable; #[cfg(feature = "std")] use std::fmt; -/// A vetted and verified transaction from the external world. +/// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Extrinsic { /// Who signed it (note this is not a signature). pub signed: AccountId, - /// The number of transactions have come before from the same signer. + /// The number of extrinsics have come before from the same signer. pub nonce: TxOrder, /// The function that should be called. pub function: Call, @@ -61,13 +61,13 @@ impl Slicable for Extrinsic { -/// A transactions right from the external world. Unchecked. +/// A extrinsics right from the external world. Unchecked. #[derive(Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize))] pub struct UncheckedExtrinsic { - /// The actual transaction information. - pub transaction: Extrinsic, - /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. + /// The actual extrinsic information. + pub extrinsic: Extrinsic, + /// The signature; should be an Ed25519 signature applied to the serialised `extrinsic` field. pub signature: Signature, } @@ -80,7 +80,7 @@ impl Slicable for UncheckedExtrinsic { let _length_do_not_remove_me_see_above: u32 = Slicable::decode(input)?; Some(UncheckedExtrinsic { - transaction: Slicable::decode(input)?, + extrinsic: Slicable::decode(input)?, signature: Slicable::decode(input)?, }) } @@ -92,9 +92,9 @@ impl Slicable for UncheckedExtrinsic { // Vec. we'll make room for it here, then overwrite once we know the length. v.extend(&[0u8; 4]); - self.transaction.signed.using_encoded(|s| v.extend(s)); - self.transaction.nonce.using_encoded(|s| v.extend(s)); - self.transaction.function.using_encoded(|s| v.extend(s)); + self.extrinsic.signed.using_encoded(|s| v.extend(s)); + self.extrinsic.nonce.using_encoded(|s| v.extend(s)); + self.extrinsic.function.using_encoded(|s| v.extend(s)); self.signature.using_encoded(|s| v.extend(s)); let length = (v.len() - 4) as u32; @@ -108,18 +108,18 @@ impl Slicable for UncheckedExtrinsic { impl PartialEq for UncheckedExtrinsic { fn eq(&self, other: &Self) -> bool { - self.signature.iter().eq(other.signature.iter()) && self.transaction == other.transaction + self.signature.iter().eq(other.signature.iter()) && self.extrinsic == other.extrinsic } } #[cfg(feature = "std")] impl fmt::Debug for UncheckedExtrinsic { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedExtrinsic({:?})", self.transaction) + write!(f, "UncheckedExtrinsic({:?})", self.extrinsic) } } -/// A type-safe indicator that a transaction has been checked. +/// A type-safe indicator that a extrinsic has been checked. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Debug))] pub struct CheckedExtrinsic(UncheckedExtrinsic); @@ -135,16 +135,16 @@ impl ops::Deref for CheckedExtrinsic { type Target = Extrinsic; fn deref(&self) -> &Extrinsic { - &self.0.transaction + &self.0.extrinsic } } -/// Check the signature on a transaction. +/// Check the signature on a extrinsic. /// -/// On failure, return the transaction back. +/// On failure, return the extrinsic back. pub fn check(tx: UncheckedExtrinsic) -> Result { - let msg = ::codec::Slicable::encode(&tx.transaction); - if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { + let msg = ::codec::Slicable::encode(&tx.extrinsic); + if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.extrinsic.signed) { Ok(CheckedExtrinsic(tx)) } else { Err(tx) @@ -164,15 +164,15 @@ impl Applyable for CheckedExtrinsic { type AccountIdType = AccountId; fn index(&self) -> &Self::IndexType { - &self.0.transaction.nonce + &self.0.extrinsic.nonce } fn sender(&self) -> &Self::AccountIdType { - &self.0.transaction.signed + &self.0.extrinsic.signed } fn apply(self) { - let tx = self.0.transaction; + let tx = self.0.extrinsic; //TODO: take payment e.g. public_pass_from_payment tx.function.dispatch(&tx.signed); } @@ -190,7 +190,7 @@ mod tests { #[test] fn serialize_unchecked() { let tx = UncheckedExtrinsic { - transaction: Extrinsic { + extrinsic: Extrinsic { signed: [1; 32], nonce: 999u64, function: Call::Timestamp(timestamp::Call::set(135135)), diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index cdc4e2d1a5ba6..50ce1d70e7ff4 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -19,7 +19,7 @@ use rstd::prelude::*; use codec::Slicable; use runtime_support::Hashable; -use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; +use runtime_io::{self, enumerated_trie_root, storage_root, blake2_256}; use {block, demo_primitives, extrinsic}; use runtime_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; @@ -136,3 +136,24 @@ pub type Executive = executive::Executive< block::Block, ((((Council, CouncilVoting), Democracy), Staking), Session), >; + +pub type StakingConfig = staking::TestingConfig; + +#[cfg(any(feature = "std", test))] +pub struct TestingConfig { + pub staking: Option, +} + +#[cfg(any(feature = "std", test))] +pub use runtime_primitives::MakeTestExternalities; + +#[cfg(any(feature = "std", test))] +impl MakeTestExternalities for TestingConfig { + fn test_externalities(self) -> runtime_io::TestExternalities { + let mut s = runtime_io::TestExternalities::default(); + if let Some(extra) = self.staking { + s.extend(extra.test_externalities()); + } + s + } +} diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 654792f43e975..8c9247b612ad3 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -22,7 +22,7 @@ extern crate num_traits; extern crate integer_sqrt; extern crate substrate_runtime_std as rstd; -#[cfg(not(feature = "std"))] extern crate substrate_runtime_io as runtime_io; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_primitives; @@ -32,6 +32,11 @@ pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +#[cfg(feature = "std")] +pub trait MakeTestExternalities { + fn test_externalities(self) -> runtime_io::TestExternalities; +} + pub trait Convert { fn convert(a: A) -> B; } diff --git a/substrate/runtime/staking/Cargo.toml b/substrate/runtime/staking/Cargo.toml index c464875625043..b046b97dd07f1 100644 --- a/substrate/runtime/staking/Cargo.toml +++ b/substrate/runtime/staking/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } @@ -21,6 +22,7 @@ default = ["std"] std = [ "serde/std", "safe-mix/std", + "substrate-keyring", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index f15704968ea80..ccbd28151d269 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -20,8 +20,10 @@ #[cfg(feature = "std")] extern crate serde; +extern crate substrate_keyring as keyring; + extern crate substrate_codec as codec; -extern crate substrate_runtime_std as rstd; +#[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; @@ -34,7 +36,6 @@ use rstd::cmp; use rstd::cell::RefCell; use rstd::marker::PhantomData; use rstd::collections::btree_map::{BTreeMap, Entry}; -//use runtime_io::{twox_128, TestExternalities}; use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; use runtime_support::{StorageValue, StorageMap, Parameter}; @@ -556,34 +557,35 @@ impl Module { } } } -/* + #[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::{Joiner, KeyedVec}; - use keyring::Keyring::*; - use runtime::session; - use super::public::{Call, Dispatch}; - use super::privileged::{Dispatch as PrivDispatch, Call as PrivCall}; - - pub fn externalities(session_length: u64, sessions_per_era: u64, current_era: u64) -> TestExternalities { - let extras: TestExternalities = map![ - twox_128(&Intention::len_key()).to_vec() => vec![].and(&3u32), - twox_128(&Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&sessions_per_era), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&3u64), - twox_128(BondingDuration::key()).to_vec() => vec![].and(&0u64), - twox_128(TransactionFee::key()).to_vec() => vec![].and(&1u64), - twox_128(CurrentEra::key()).to_vec() => vec![].and(¤t_era), - twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - session::testing::externalities(session_length).into_iter().chain(extras.into_iter()).collect() - } +pub struct TestingConfig { + pub sessions_per_era: T::BlockNumber, + pub current_era: T::BlockNumber, } +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig where + T::AccountId: From +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use runtime_io::twox_128; + use codec::Slicable; + use keyring::Keyring::*; + use primitives::As; + + map![ + twox_128(>::key()).to_vec() => vec![Alice.to_raw_public_vec(), Bob.to_raw_public_vec(), Charlie.to_raw_public_vec()].encode(), + twox_128(>::key()).to_vec() => self.sessions_per_era.encode(), + twox_128(>::key()).to_vec() => 3u64.encode(), + twox_128(>::key()).to_vec() => 0u64.encode(), + twox_128(>::key()).to_vec() => 1u64.encode(), + twox_128(>::key()).to_vec() => self.current_era.encode(), + twox_128(&>::key_for(T::AccountId::from(Alice))).to_vec() => T::Balance::sa(111).encode() + ] + } +} +/* #[cfg(test)] mod tests { use super::*; From 15baf8bbff70d8a35f803a8ba38b5088e24786b9 Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 27 Mar 2018 16:57:08 +0900 Subject: [PATCH 47/76] Add session test externalities constructor --- Cargo.lock | 1 + demo/executor/src/lib.rs | 8 +++--- demo/runtime/src/runtime.rs | 5 ++++ substrate/runtime/session/Cargo.toml | 2 ++ substrate/runtime/session/src/lib.rs | 38 +++++++++++++++------------- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a51d854dfedad..f645e10f77b0a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,6 +1869,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index 679438ffae760..b280a0b87cd94 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -50,7 +50,7 @@ mod tests { use demo_runtime::block::Block; use {staking, system}; use demo_runtime::runtime::{Call, Concrete, Staking}; - use demo_runtime::runtime::{MakeTestExternalities, TestingConfig, StakingConfig}; + use demo_runtime::runtime::{MakeTestExternalities, TestingConfig, SessionConfig, StakingConfig}; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -142,11 +142,13 @@ mod tests { } fn new_test_ext() -> TestExternalities { - //staking::testing::externalities(2, 2, 0) TestingConfig { + session: Some(SessionConfig { + session_length: 2, + }), staking: Some(StakingConfig { sessions_per_era: 2, - current_era: 2, + current_era: 0, }), }.test_externalities() } diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 50ce1d70e7ff4..ae19122615639 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -137,10 +137,12 @@ pub type Executive = executive::Executive< ((((Council, CouncilVoting), Democracy), Staking), Session), >; +pub type SessionConfig = session::TestingConfig; pub type StakingConfig = staking::TestingConfig; #[cfg(any(feature = "std", test))] pub struct TestingConfig { + pub session: Option, pub staking: Option, } @@ -151,6 +153,9 @@ pub use runtime_primitives::MakeTestExternalities; impl MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { let mut s = runtime_io::TestExternalities::default(); + if let Some(extra) = self.session { + s.extend(extra.test_externalities()); + } if let Some(extra) = self.staking { s.extend(extra.test_externalities()); } diff --git a/substrate/runtime/session/Cargo.toml b/substrate/runtime/session/Cargo.toml index c5d69ea34fb05..17bdeb7264096 100644 --- a/substrate/runtime/session/Cargo.toml +++ b/substrate/runtime/session/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } @@ -21,6 +22,7 @@ default = ["std"] std = [ "serde/std", "safe-mix/std", + "substrate-keyring", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 5fa4199b76e35..ffd45c2414665 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -21,8 +21,9 @@ #[cfg(feature = "std")] extern crate serde; +extern crate substrate_keyring as keyring; extern crate substrate_codec as codec; -extern crate substrate_runtime_std as rstd; +#[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; @@ -145,27 +146,30 @@ impl Executable for Module { Self::check_rotate_session(); } } -/* + #[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::{Joiner, KeyedVec}; - use keyring::Keyring::*; - use runtime::system; +pub struct TestingConfig { + pub session_length: T::BlockNumber, +} - pub fn externalities(session_length: u64) -> TestExternalities { - let three = [3u8; 32]; +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig where + T::AccountId: From +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use runtime_io::twox_128; + use codec::Slicable; + use keyring::Keyring::*; - let extras: TestExternalities = map![ - twox_128(SessionLength::key()).to_vec() => vec![].and(&session_length), - twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), - twox_128(Validators::key()).to_vec() => vec![].and(&vec![One.into(), Two.into(), three]) - ]; - system::testing::externalities().into_iter().chain(extras.into_iter()).collect() + let three = [3u8; 32]; + map![ + twox_128(>::key()).to_vec() => self.session_length.encode(), + twox_128(>::key()).to_vec() => 0u64.encode(), + twox_128(>::key()).to_vec() => vec![One.into(), Two.into(), three].encode() + ] } } - +/* #[cfg(test)] mod tests { use super::*; From 643611195659ca10efb30224ec317ba37189860b Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 28 Mar 2018 13:56:38 +0900 Subject: [PATCH 48/76] Fixed executor tests. --- Cargo.lock | 3 + demo/executor/src/lib.rs | 16 ++- demo/runtime/src/extrinsic.rs | 4 +- demo/runtime/src/runtime.rs | 29 +++++- demo/runtime/wasm/Cargo.lock | 14 +++ .../release/demo_runtime.compact.wasm | Bin 233173 -> 233511 bytes .../release/demo_runtime.wasm | Bin 233224 -> 233604 bytes .../release/polkadot_runtime.compact.wasm | Bin 134951 -> 134951 bytes .../release/polkadot_runtime.wasm | Bin 135000 -> 135000 bytes substrate/runtime/consensus/Cargo.toml | 9 +- substrate/runtime/consensus/src/lib.rs | 27 +++++ substrate/runtime/council/Cargo.toml | 2 + substrate/runtime/council/src/lib.rs | 94 ++++++++++++++++-- substrate/runtime/council/src/voting.rs | 10 +- substrate/runtime/democracy/src/lib.rs | 83 +++++++++------- substrate/runtime/session/src/lib.rs | 34 +++++-- substrate/runtime/staking/src/lib.rs | 73 +++++++++++--- substrate/runtime/system/src/lib.rs | 27 +++++ .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 20 files changed, 348 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f645e10f77b0a..f898b69a75fae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1778,6 +1778,8 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] @@ -1791,6 +1793,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-io 0.1.0", diff --git a/demo/executor/src/lib.rs b/demo/executor/src/lib.rs index b280a0b87cd94..ab8a8b2e5fc3a 100644 --- a/demo/executor/src/lib.rs +++ b/demo/executor/src/lib.rs @@ -142,14 +142,26 @@ mod tests { } fn new_test_ext() -> TestExternalities { + use keyring::Keyring::*; + let three = [3u8; 32]; TestingConfig { + consensus: Some(Default::default()), + system: Some(Default::default()), session: Some(SessionConfig { session_length: 2, + validators: vec![One.into(), Two.into(), three], }), staking: Some(StakingConfig { sessions_per_era: 2, current_era: 0, + balances: vec![(Alice.into(), 111)], + intentions: vec![Alice.into(), Bob.into(), Charlie.into()], + validator_count: 3, + bonding_duration: 0, + transaction_fee: 1, }), + democracy: Some(Default::default()), + council: Some(Default::default()), }.test_externalities() } @@ -181,7 +193,7 @@ mod tests { construct_block( 1, [69u8; 32].into(), - hex!("7a388ce5b4eeadbb9268ae96e8822b223f4fd1841327d99f4e1c21fad81f97f2").into(), + hex!("d952977ca0087110958d4b66f6d9f2e41d19a252b9f6f3aab9535c4982bdb9b5").into(), vec![Extrinsic { signed: Alice.into(), nonce: 0, @@ -194,7 +206,7 @@ mod tests { construct_block( 2, block1().1, - hex!("e4eb71be8b816f2061f32f284e9b429562cdc1b82f11725e5f965ff23439f5e9").into(), + hex!("2a3f3499414649c3449f4f7c21574233a9c4ebd1109548acc00f2568132e5a70").into(), vec![ Extrinsic { signed: Bob.into(), diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs index 34278e97b51d7..1099dbf57cd0e 100644 --- a/demo/runtime/src/extrinsic.rs +++ b/demo/runtime/src/extrinsic.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; -use runtime::Call; +use runtime::{Call, Staking}; use runtime_primitives::{Checkable, Applyable}; use runtime_support::AuxDispatchable; @@ -173,7 +173,7 @@ impl Applyable for CheckedExtrinsic { fn apply(self) { let tx = self.0.extrinsic; - //TODO: take payment e.g. public_pass_from_payment + Staking::make_payment(&tx.signed); tx.function.dispatch(&tx.signed); } } diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index ae19122615639..ea09aaea44427 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -19,7 +19,8 @@ use rstd::prelude::*; use codec::Slicable; use runtime_support::Hashable; -use runtime_io::{self, enumerated_trie_root, storage_root, blake2_256}; +#[cfg(any(feature = "std", test))] use runtime_io; +use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; use {block, demo_primitives, extrinsic}; use runtime_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; @@ -134,16 +135,24 @@ pub type Executive = executive::Executive< extrinsic::CheckedExtrinsic, Concrete, block::Block, - ((((Council, CouncilVoting), Democracy), Staking), Session), + (((((), Council), Democracy), Staking), Session), >; -pub type SessionConfig = session::TestingConfig; -pub type StakingConfig = staking::TestingConfig; +#[cfg(any(feature = "std", test))] pub type ConsensusConfig = consensus::TestingConfig; +#[cfg(any(feature = "std", test))] pub type SystemConfig = system::TestingConfig; +#[cfg(any(feature = "std", test))] pub type SessionConfig = session::TestingConfig; +#[cfg(any(feature = "std", test))] pub type StakingConfig = staking::TestingConfig; +#[cfg(any(feature = "std", test))] pub type DemocracyConfig = democracy::TestingConfig; +#[cfg(any(feature = "std", test))] pub type CouncilConfig = council::TestingConfig; #[cfg(any(feature = "std", test))] pub struct TestingConfig { + pub consensus: Option, + pub system: Option, pub session: Option, pub staking: Option, + pub democracy: Option, + pub council: Option, } #[cfg(any(feature = "std", test))] @@ -153,12 +162,24 @@ pub use runtime_primitives::MakeTestExternalities; impl MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { let mut s = runtime_io::TestExternalities::default(); + if let Some(extra) = self.consensus { + s.extend(extra.test_externalities()); + } + if let Some(extra) = self.system { + s.extend(extra.test_externalities()); + } if let Some(extra) = self.session { s.extend(extra.test_externalities()); } if let Some(extra) = self.staking { s.extend(extra.test_externalities()); } + if let Some(extra) = self.democracy { + s.extend(extra.test_externalities()); + } + if let Some(extra) = self.council { + s.extend(extra.test_externalities()); + } s } } diff --git a/demo/runtime/wasm/Cargo.lock b/demo/runtime/wasm/Cargo.lock index ef691b3aa2ad2..456429471d0f2 100644 --- a/demo/runtime/wasm/Cargo.lock +++ b/demo/runtime/wasm/Cargo.lock @@ -633,6 +633,15 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-keyring" +version = "0.1.0" +dependencies = [ + "ed25519 0.1.0", + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-primitives" version = "0.1.0" @@ -657,6 +666,8 @@ dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", ] @@ -670,6 +681,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-io 0.1.0", @@ -748,6 +760,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", @@ -765,6 +778,7 @@ dependencies = [ "safe-mix 0.1.0", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", diff --git a/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 72e9633f524098844c6d684cb3e3c4c88af96db8..71699820aa6ad2c55f0f0abf1639e65dcbb75a00 100644 GIT binary patch delta 58437 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 delta 58212 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�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%0A_oAIIP<-tQ<}t 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 Y7FO`Nu#cw$n%lJoHJ`^hgml4w04_8BSO5S3 delta 3361 zcmb7G4Nz3q6@KULvMfB%rGoqjW>t*xx3DbI1S;~PO^hfA8dR(fL>R;GA|PmuvgU{Q zgOzyIy9x?6Mx8oM$-Jg(2^!2W&Df!hn(d^DL2OcsHnF6R7%Qng_q}C(nog%-*gf~0 z@BG|z?mg%3@x#XBhmDg3Sj7q9!dQzT_GOX#jOyHF@c7T+e2FPqlZfT*?E^-?Y5Q7FC0O_bd( zp;tx`f1fKCwYNXGEc?9i?`c%sy+&|_7Cxc)fXO#U%&2s z)R%2F=XBtt->zT4t<4Row6Wf#sgAQ=N!8r2NF%Iocw5!B$XOeR4l~H!B!d(vJO~YjSU9uW`eL z2V!Wtvr+@R>pY+W1rH5F=-C7P8lATf-oT5oyLGN6Qh#fvhKp{SgBrzcR*md%+hXlC z_TK03wP1y_A$Y<6^b;cmDV_4`7*ndIa|A&&@lI03<{y~!ysPA0hmIRysXXiGlpuIP zUiO|#54m)F*W3uM+cu56Kui4h7)n^Rj;>(p=$gzAqNA%Q02ayQqiw#NZT@2u@kdJ~ z5_*rkFrakv=qK0E`+z%FKTg}trd&GvQlzG`y_cJL^@lH2;t*PWIh}OaXzOM3f76&t z_w_%=@qzxS534NuT_M0-1b+5ojn&G}HmgDlH4fxK4qZ8L6>{YCtJnCvTx!|JtDc&d3?Pkxjaj>B5_Hxtlj{X2LRh@#ZuPFWzpeS^gbGe=+(7;%r!i zFq-x4+6WC2(h(gS0go7MAYJ^-azH5YOD4yg89bA0c5AJi? z!|(fIu;7g;;ZBODhiDF*0@HVfCm6eT_aPVU&r_LW(I`dzHUs16Wj-V5;o$XV&i7O zY913)D-4E(?BjIE#1mmbKZ5m*-gm)aQ98t#q>#Z#g&d7j$WWp}x>e4t5{IhkwBSUa zYD&STIH9`eOp<0PP3K*BgY+gVj=X%w%7;(c_iFwBN12a@Fih0-)7e;;hXryS&w!P@ zaJo#m4X*fkpwmM$OPY_`qcLp3e269PSXMtDwX)gQ&qIYyZ^~xU^YAN`uR>C|08Sza z$bve^c5TgqJ-pLc&mst6v5R1@hdJw^aqOLJNQ>tEe#QD&4IV22yCXp{x-NJIFp%rq zGhoENWEbZ`0SnB57M@Xi4&>MJY)B7xL5RMq69gYcZ8(-S8c9fFOPom3%!0HxPV`AzV=pcd zq_#NGSX)<=_F_>*njjsG6T@023c?IDOG1kOLMeXG6GrPsbTNujkr_iPyr>(|VGM26 zpp{;9I8L;(34X*jxiemzSX;9uv1WZ$U1?=WB1SJSty*iTsTHL2@vPX7q(KX7_apI^ zQwd_&AO?Iw<8p)7<@p59*6mfe^}z&o&yP%7>ad7mJ)wdyU1QUPYdwAh$!QTyEr?D< z=4q_qG(~y>Z8A|Bhg>yMUcDR;1f||mkA+qHlSDFXVMqK)h`uFJoXR@Jkw|vt9!|NQ zL^kM8Vtz7|D28>0sm5c~*@KSMz>XxWETY;}TD_uQj_UyY2vTPfD-p@l zWH^a+h-5NW=L3;Muj;glK{X}S_L@3#X|1`=Za3R2iUq0HD*Eyht*XW2?ej1d_BD7p zJWPENGFPl(m=KOt(1dj3+MtAVu*?9GkpszH9CEX+_mF0{(0fZMAjw8g@01Sj~erjEtG`Y9}FmwAzjo iwc4F2O0}bUQ}C2aYWWuMl>0m!W{RBKwJ?zM!+!vNPUiFg diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 1076f3a3e92e7b0405c6a20322b810740af2cae0..1d6a049791694caa67b627c63f256223bce9314b 100644 GIT binary patch delta 3460 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 T0-kbjfWu6Y^ZObeA_MSmI)?5c diff --git a/substrate/runtime/consensus/Cargo.toml b/substrate/runtime/consensus/Cargo.toml index f5c42ef8fd628..c2de219535770 100644 --- a/substrate/runtime/consensus/Cargo.toml +++ b/substrate/runtime/consensus/Cargo.toml @@ -6,14 +6,19 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default_features = false } +substrate-codec = { path = "../../codec", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } -substrate-codec = { path = "../../codec", default_features = false } +substrate-runtime-primitives = { path = "../primitives", default_features = false } [features] default = ["std"] std = [ + "serde/std", + "substrate-codec/std", "substrate-runtime-std/std", + "substrate-runtime-io/std", "substrate-runtime-support/std", - "serde/std", + "substrate-runtime-primitives/std", ] diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 588ab45238e09..6d98fcd4f34cc 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -19,10 +19,13 @@ #![cfg_attr(not(feature = "std"), no_std)] #[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; +extern crate substrate_runtime_primitives as primitives; extern crate substrate_codec as codec; use rstd::prelude::*; +#[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; use runtime_support::{storage, Parameter}; use runtime_support::storage::unhashed::StorageVec; @@ -74,3 +77,27 @@ impl Module { AuthorityStorageVec::::set_item(index, key); } } + +#[cfg(any(feature = "std", test))] +pub struct TestingConfig(PhantomData); + +#[cfg(any(feature = "std", test))] +impl Default for TestingConfig { + fn default() -> Self { + TestingConfig(PhantomData) + } +} + +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use codec::{Slicable, KeyedVec}; + + map![ + b":auth:len".to_vec() => 2u32.encode(), + 0u32.to_keyed_vec(b":auth:") => vec![11; 32], + 1u32.to_keyed_vec(b":auth:") => vec![21; 32] + ] + } +} diff --git a/substrate/runtime/council/Cargo.toml b/substrate/runtime/council/Cargo.toml index 8ac120083d783..449e6bc34e0c8 100644 --- a/substrate/runtime/council/Cargo.toml +++ b/substrate/runtime/council/Cargo.toml @@ -8,6 +8,7 @@ hex-literal = "0.1.0" integer-sqrt = "0.1.0" serde = { version = "1.0", default_features = false } safe-mix = { path = "../../../safe-mix", default_features = false} +substrate-keyring = { path = "../../keyring", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } substrate-runtime-std = { path = "../../runtime-std", default_features = false } @@ -24,6 +25,7 @@ default = ["std"] std = [ "serde/std", "safe-mix/std", + "substrate-keyring", "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 65788c6de4ced..a275d5bb09565 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -22,7 +22,8 @@ extern crate integer_sqrt; extern crate substrate_codec as codec; -#[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; +#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +#[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; @@ -32,8 +33,7 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -//use runtime_io::{twox_128, TestExternalities}; -use primitives::{Zero, One, Executable, RefInto, As}; +use primitives::{Zero, One, RefInto, As}; use runtime_support::{StorageValue, StorageMap}; pub mod voting; @@ -496,14 +496,94 @@ impl Module { } } -impl Executable for Module { - fn execute() { - Self::end_block(>::block_number()); +#[cfg(any(feature = "std", test))] +pub struct TestingConfig { + // for the voting onto the council + pub active_council: Vec<(T::AccountId, T::BlockNumber)>, + pub approval_voting_period: T::BlockNumber, + pub presentation_period: T::BlockNumber, + pub desired_seats: u32, + pub term_duration: T::BlockNumber, + + // for the council's votes. + pub cooloff_period: T::BlockNumber, + pub voting_period: T::BlockNumber, +} + +#[cfg(any(feature = "std", test))] +impl TestingConfig { + pub fn new() -> Self { + TestingConfig { + active_council: vec![], + approval_voting_period: T::BlockNumber::sa(4), + presentation_period: T::BlockNumber::sa(2), + desired_seats: 2, + term_duration: T::BlockNumber::sa(5), + cooloff_period: T::BlockNumber::sa(2), + voting_period: T::BlockNumber::sa(1), + } + } + + pub fn with_council() -> Self where T::AccountId: From { + use keyring::Keyring::*; + let expiry = T::BlockNumber::sa(10); + TestingConfig { + active_council: vec![ + (T::AccountId::from(Alice), expiry), + (T::AccountId::from(Bob), expiry), + (T::AccountId::from(Charlie), expiry) + ], + approval_voting_period: T::BlockNumber::sa(4), + presentation_period: T::BlockNumber::sa(2), + desired_seats: 2, + term_duration: T::BlockNumber::sa(5), + cooloff_period: T::BlockNumber::sa(2), + voting_period: T::BlockNumber::sa(1), + } } } -/* +#[cfg(any(feature = "std", test))] +impl Default for TestingConfig { + fn default() -> Self { + TestingConfig { + active_council: vec![], + approval_voting_period: T::BlockNumber::sa(1000), + presentation_period: T::BlockNumber::sa(1000), + desired_seats: 0, + term_duration: T::BlockNumber::sa(5), + cooloff_period: T::BlockNumber::sa(1000), + voting_period: T::BlockNumber::sa(1000), + } + } +} +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use codec::Slicable; + use runtime_io::twox_128; + + map![ + twox_128(>::key()).to_vec() => T::Balance::sa(9).encode(), + twox_128(>::key()).to_vec() => T::Balance::sa(3).encode(), + twox_128(>::key()).to_vec() => T::Balance::sa(1).encode(), + twox_128(>::key()).to_vec() => 2u32.encode(), + twox_128(>::key()).to_vec() => self.presentation_period.encode(), + twox_128(>::key()).to_vec() => self.approval_voting_period.encode(), + twox_128(>::key()).to_vec() => self.term_duration.encode(), + twox_128(>::key()).to_vec() => self.desired_seats.encode(), + twox_128(>::key()).to_vec() => T::BlockNumber::sa(1).encode(), + twox_128(>::key()).to_vec() => self.active_council.encode(), + + twox_128(>::key()).to_vec() => self.cooloff_period.encode(), + twox_128(>::key()).to_vec() => self.voting_period.encode() + ] + } +} + +/* #[cfg(test)] pub mod testing { use super::*; diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index 2ab95d08de3a1..da23aaffa3273 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,10 +18,10 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -//use runtime_io::{twox_128, TestExternalities}; use primitives::{Executable, RefInto, Hashing}; +use {system, democracy}; use runtime_support::{StorageValue, StorageMap}; -use super::{Trait, system, democracy, Module as Council}; +use super::{Trait, Module as Council}; use democracy::IsCancelReferendum; decl_module! { @@ -189,9 +189,11 @@ impl Module { } } -impl Executable for Module { +impl Executable for Council { fn execute() { - Self::end_block(>::block_number()); + let n = >::block_number(); + Self::end_block(n); + >::end_block(n); } } diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index ad74756f8937a..7b90f71f2c12a 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -21,7 +21,7 @@ #[cfg(feature = "std")] extern crate serde; extern crate substrate_codec as codec; -#[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; +#[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; @@ -30,8 +30,6 @@ extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; use rstd::prelude::*; -//use rstd::cmp; -//use runtime_io::{twox_128, TestExternalities}; use primitives::{Zero, Executable, RefInto, As}; use runtime_support::{StorageValue, StorageMap, Parameter, Dispatchable}; @@ -269,47 +267,58 @@ impl Executable for Module { } } -/* +#[cfg(any(feature = "std", test))] +pub struct TestingConfig { + pub launch_period: T::BlockNumber, + pub voting_period: T::BlockNumber, + pub minimum_deposit: T::Balance, +} +#[cfg(any(feature = "std", test))] +impl TestingConfig { + pub fn new() -> Self { + TestingConfig { + launch_period: T::BlockNumber::sa(1), + voting_period: T::BlockNumber::sa(1), + minimum_deposit: T::Balance::sa(1), + } + } -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use runtime_support::{StorageList, StorageValue, StorageMap}; - use codec::Joiner; - use keyring::Keyring::*; - use runtime::{session, staking}; + pub fn extended() -> Self { + TestingConfig { + launch_period: T::BlockNumber::sa(1), + voting_period: T::BlockNumber::sa(3), + minimum_deposit: T::Balance::sa(1), + } + } +} + +#[cfg(any(feature = "std", test))] +impl Default for TestingConfig { + fn default() -> Self { + TestingConfig { + launch_period: T::BlockNumber::sa(1000), + voting_period: T::BlockNumber::sa(1000), + minimum_deposit: T::Balance::sa(0), + } + } +} + +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use codec::Slicable; + use runtime_io::twox_128; - pub fn externalities() -> TestExternalities { map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![Alice.to_raw_public(), Bob.into(), Charlie.into()]), - twox_128(&staking::Intention::len_key()).to_vec() => vec![].and(&3u32), - twox_128(&staking::Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&staking::Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&staking::Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(&staking::FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), - twox_128(&staking::FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), - twox_128(&staking::FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), - twox_128(&staking::FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64), - twox_128(&staking::FreeBalanceOf::key_for(*Eve)).to_vec() => vec![].and(&50u64), - twox_128(&staking::FreeBalanceOf::key_for(*Ferdie)).to_vec() => vec![].and(&60u64), - twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![].and(&1u64), - twox_128(staking::TotalStake::key()).to_vec() => vec![].and(&210u64), - twox_128(staking::SessionsPerEra::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::ValidatorCount::key()).to_vec() => vec![].and(&3u64), - twox_128(staking::CurrentEra::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::TransactionFee::key()).to_vec() => vec![].and(&1u64), - twox_128(staking::BondingDuration::key()).to_vec() => vec![].and(&0u64), - - twox_128(LaunchPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(MinimumDeposit::key()).to_vec() => vec![].and(&1u64) + twox_128(>::key()).to_vec() => self.launch_period.encode(), + twox_128(>::key()).to_vec() => self.voting_period.encode(), + twox_128(>::key()).to_vec() => self.minimum_deposit.encode() ] } } - +/* #[cfg(test)] mod tests { use super::*; diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index ffd45c2414665..6f8ca8dd26f30 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -21,7 +21,7 @@ #[cfg(feature = "std")] extern crate serde; -extern crate substrate_keyring as keyring; +#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate substrate_codec as codec; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; @@ -150,6 +150,29 @@ impl Executable for Module { #[cfg(any(feature = "std", test))] pub struct TestingConfig { pub session_length: T::BlockNumber, + pub validators: Vec, +} + +#[cfg(any(feature = "std", test))] +impl TestingConfig where T::AccountId: From { + pub fn simple() -> Self where T::AccountId: From<[u8; 32]> { + use primitives::As; + use keyring::Keyring::*; + let three = [3u8; 32]; + TestingConfig { + session_length: T::BlockNumber::sa(2), + validators: vec![T::AccountId::from(One), T::AccountId::from(Two), T::AccountId::from(three)], + } + } + + pub fn extended() -> Self { + use primitives::As; + use keyring::Keyring::*; + TestingConfig { + session_length: T::BlockNumber::sa(1), + validators: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], + } + } } #[cfg(any(feature = "std", test))] @@ -159,16 +182,15 @@ impl primitives::MakeTestExternalities for TestingConfig where fn test_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; - use keyring::Keyring::*; - - let three = [3u8; 32]; + use primitives::As; map![ twox_128(>::key()).to_vec() => self.session_length.encode(), - twox_128(>::key()).to_vec() => 0u64.encode(), - twox_128(>::key()).to_vec() => vec![One.into(), Two.into(), three].encode() + twox_128(>::key()).to_vec() => T::BlockNumber::sa(0).encode(), + twox_128(>::key()).to_vec() => self.validators.encode() ] } } + /* #[cfg(test)] mod tests { diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index ccbd28151d269..e0b0fdbc5ab07 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -20,7 +20,7 @@ #[cfg(feature = "std")] extern crate serde; -extern crate substrate_keyring as keyring; +#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate substrate_codec as codec; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; @@ -562,27 +562,74 @@ impl Module { pub struct TestingConfig { pub sessions_per_era: T::BlockNumber, pub current_era: T::BlockNumber, + pub balances: Vec<(T::AccountId, T::Balance)>, + pub intentions: Vec, + pub validator_count: u64, + pub bonding_duration: T::BlockNumber, + pub transaction_fee: T::Balance, } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig where - T::AccountId: From -{ +impl TestingConfig where T::AccountId: From { + pub fn simple() -> Self { + use primitives::As; + use keyring::Keyring::*; + TestingConfig { + sessions_per_era: T::BlockNumber::sa(2), + current_era: T::BlockNumber::sa(0), + balances: vec![(T::AccountId::from(Alice), T::Balance::sa(111))], + intentions: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], + validator_count: 3u64, + bonding_duration: T::BlockNumber::sa(0), + transaction_fee: T::Balance::sa(0), + } + } + + pub fn extended() -> Self { + use primitives::As; + use keyring::Keyring::*; + TestingConfig { + sessions_per_era: T::BlockNumber::sa(3), + current_era: T::BlockNumber::sa(1), + balances: vec![ + (T::AccountId::from(Alice), T::Balance::sa(10)), + (T::AccountId::from(Bob), T::Balance::sa(20)), + (T::AccountId::from(Charlie), T::Balance::sa(30)), + (T::AccountId::from(Dave), T::Balance::sa(40)), + (T::AccountId::from(Eve), T::Balance::sa(50)), + (T::AccountId::from(Ferdie), T::Balance::sa(60)), + (T::AccountId::from(One), T::Balance::sa(1)) + ], + intentions: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], + validator_count: 3u64, + bonding_duration: T::BlockNumber::sa(0), + transaction_fee: T::Balance::sa(1), + } + } +} + +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; use codec::Slicable; - use keyring::Keyring::*; - use primitives::As; - map![ - twox_128(>::key()).to_vec() => vec![Alice.to_raw_public_vec(), Bob.to_raw_public_vec(), Charlie.to_raw_public_vec()].encode(), + let total_stake: T::Balance = self.balances.iter().fold(Zero::zero(), |acc, &(_, n)| acc + n); + + let mut r: runtime_io::TestExternalities = map![ + twox_128(>::key()).to_vec() => self.intentions.encode(), twox_128(>::key()).to_vec() => self.sessions_per_era.encode(), - twox_128(>::key()).to_vec() => 3u64.encode(), - twox_128(>::key()).to_vec() => 0u64.encode(), - twox_128(>::key()).to_vec() => 1u64.encode(), + twox_128(>::key()).to_vec() => self.validator_count.encode(), + twox_128(>::key()).to_vec() => self.bonding_duration.encode(), + twox_128(>::key()).to_vec() => self.transaction_fee.encode(), twox_128(>::key()).to_vec() => self.current_era.encode(), - twox_128(&>::key_for(T::AccountId::from(Alice))).to_vec() => T::Balance::sa(111).encode() - ] + twox_128(>::key()).to_vec() => total_stake.encode() + ]; + + for (who, value) in self.balances.into_iter() { + r.insert(twox_128(&>::key_for(who)).to_vec(), value.encode()); + } + r } } /* diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 938599c40a20c..05b402cf4b917 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -30,6 +30,7 @@ extern crate substrate_runtime_primitives as primitives; extern crate safe_mix; use rstd::prelude::*; +#[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; #[cfg(any(feature = "std", test))] use codec::Slicable; use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Hashing, Headery}; use runtime_support::{StorageValue, StorageMap, Parameter}; @@ -137,6 +138,32 @@ impl Module { } } +#[cfg(any(feature = "std", test))] +pub struct TestingConfig(PhantomData); + +#[cfg(any(feature = "std", test))] +impl Default for TestingConfig { + fn default() -> Self { + TestingConfig(PhantomData) + } +} + +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig +{ + fn test_externalities(self) -> runtime_io::TestExternalities { + use runtime_io::twox_128; + use codec::Slicable; + + map![ + twox_128(&>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(), + twox_128(>::key()).to_vec() => 1u64.encode(), + twox_128(>::key()).to_vec() => [69u8; 32].encode(), + twox_128(>::key()).to_vec() => [0u8; 32].encode() + ] + } +} + #[cfg(test)] mod tests { /* diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 5daa1c46c010ef7173ba9b9fff6f6813312c5094..783d13e44494d9e3e66935a1c619edcdc4104def 100644 GIT binary patch delta 185 zcmZqr#n|+Val=kVHXasMRwjE-LOB^>a11VM4SmDj$v2VB;4L7r7US^sc9~ll*x;-)v XNUBAho!k_0ck|~c6{gMCv$X{Qhon8H diff --git a/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 91c8962a835467a08d3a74d061ea6665fd5b55e1..5c34fed29cd1a7b787ecc752aca7b1ea19e3fe35 100644 GIT binary patch delta 185 zcmccgi}BJg#tml~*?3r3S(!LCUuN8@%xE&XQ}qRqEK+*|B;(aHf#gZ`ct(TCni@NR zxzhMOkeq1(GOWoo zA4q;OH35?9W|oX5n-k5FxEW11A938k45Uh3V}&QHW!{}UDLovhb%7 From 70284cb1494f19624735f60d06bef9a646013ee6 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 28 Mar 2018 15:58:18 +0900 Subject: [PATCH 49/76] Make one test in executive module work. --- Cargo.lock | 4 + demo/primitives/src/header.rs | 12 +- demo/primitives/src/lib.rs | 10 - demo/runtime/src/extrinsic.rs | 12 +- demo/runtime/src/runtime.rs | 30 +-- substrate/primitives/src/block.rs | 32 +--- substrate/primitives/src/lib.rs | 2 +- substrate/runtime-io/src/lib.rs | 25 +++ substrate/runtime/council/src/voting.rs | 5 +- substrate/runtime/executive/Cargo.toml | 7 +- substrate/runtime/executive/src/lib.rs | 233 ++++++++++++++++++++---- substrate/runtime/primitives/src/lib.rs | 19 +- substrate/runtime/staking/src/lib.rs | 15 +- substrate/runtime/system/src/lib.rs | 106 +---------- 14 files changed, 274 insertions(+), 238 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f898b69a75fae..c04066694d37a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1829,10 +1829,14 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", "substrate-runtime-system 0.1.0", diff --git a/demo/primitives/src/header.rs b/demo/primitives/src/header.rs index f70e91bbc766e..db8c76fc2fa34 100644 --- a/demo/primitives/src/header.rs +++ b/demo/primitives/src/header.rs @@ -46,8 +46,6 @@ impl Slicable for Log { } } - - /// The digest of a block, useful for light-clients. #[derive(Clone, Default, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -129,11 +127,11 @@ impl Headery for Header { impl Slicable for Header { fn decode(input: &mut I) -> Option { Some(Header { - parent_hash: try_opt!(Slicable::decode(input)), - number: try_opt!(Slicable::decode(input)), - state_root: try_opt!(Slicable::decode(input)), - extrinsics_root: try_opt!(Slicable::decode(input)), - digest: try_opt!(Slicable::decode(input)), + parent_hash: Slicable::decode(input)?, + number: Slicable::decode(input)?, + state_root: Slicable::decode(input)?, + extrinsics_root: Slicable::decode(input)?, + digest: Slicable::decode(input)?, }) } diff --git a/demo/primitives/src/lib.rs b/demo/primitives/src/lib.rs index bd8e546b7d6b4..f2541766ebd4c 100644 --- a/demo/primitives/src/lib.rs +++ b/demo/primitives/src/lib.rs @@ -33,18 +33,8 @@ extern crate substrate_runtime_primitives as runtime_primitives; extern crate substrate_primitives as primitives; #[cfg(test)] extern crate substrate_serializer; - extern crate substrate_codec as codec; -macro_rules! try_opt { - ($e: expr) => { - match $e { - Some(x) => x, - None => return None, - } - } -} - pub mod header; pub use self::header::{Header, Log, Digest}; diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs index 1099dbf57cd0e..4e7c082b28082 100644 --- a/demo/runtime/src/extrinsic.rs +++ b/demo/runtime/src/extrinsic.rs @@ -152,22 +152,22 @@ pub fn check(tx: UncheckedExtrinsic) -> Result Result { + fn check(self) -> Result { check(self) } } impl Applyable for CheckedExtrinsic { - type IndexType = TxOrder; - type AccountIdType = AccountId; + type Index = TxOrder; + type AccountId = AccountId; - fn index(&self) -> &Self::IndexType { + fn index(&self) -> &Self::Index { &self.0.extrinsic.nonce } - fn sender(&self) -> &Self::AccountIdType { + fn sender(&self) -> &Self::AccountId { &self.0.extrinsic.signed } diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index ea09aaea44427..1dfa4b10f9908 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -16,40 +16,12 @@ //! Dispatch system. Just dispatches calls. -use rstd::prelude::*; -use codec::Slicable; -use runtime_support::Hashable; #[cfg(any(feature = "std", test))] use runtime_io; -use runtime_io::{enumerated_trie_root, storage_root, blake2_256}; +use runtime_io::BlakeTwo256; use {block, demo_primitives, extrinsic}; -use runtime_primitives; use {consensus, council, democracy, executive, session, staking, system, timestamp}; use runtime_primitives::{Identity, HasPublicAux}; -// TODO: move into runtime support/io. -pub struct BlakeTwo256; - -impl runtime_primitives::Hashing for BlakeTwo256 { - type Output = demo_primitives::Hash; - fn hash_of(s: &S) -> Self::Output { - Self::Output::from(s.blake2_256()) - } - fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output { - enumerated_trie_root(items).into() - } - fn storage_root() -> Self::Output { - storage_root().into() - } -} - -impl staking::ContractAddressFor for BlakeTwo256 { - fn contract_address_for(code: &[u8], origin: &demo_primitives::AccountId) -> demo_primitives::AccountId { - let mut dest_pre = blake2_256(code).to_vec(); - dest_pre.extend(&origin[..]); - blake2_256(&dest_pre) - } -} - // TODO: refactor so that each module gets to be able to attempt to extract a PrivCall into // Some(its own PrivCall) or None. impl democracy::IsCancelReferendum for PrivCall { diff --git a/substrate/primitives/src/block.rs b/substrate/primitives/src/block.rs index 76e4061c10449..6f1ec91ab76a4 100644 --- a/substrate/primitives/src/block.rs +++ b/substrate/primitives/src/block.rs @@ -47,10 +47,6 @@ impl Slicable for Transaction { } } - - - - /// Execution log (event) #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -66,10 +62,6 @@ impl Slicable for Log { } } - - - - /// The digest of a block, useful for light-clients. #[derive(Clone, Default, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -88,8 +80,6 @@ impl Slicable for Digest { } } - - /// Generic types to be specialised later. pub mod generic { use super::{Header, Slicable, Input, Vec}; @@ -107,8 +97,8 @@ pub mod generic { impl Slicable for Block where Vec: Slicable { fn decode(input: &mut I) -> Option { Some(Block { - header: try_opt!(Slicable::decode(input)), - transactions: try_opt!(Slicable::decode(input)), + header: Slicable::decode(input)?, + transactions: Slicable::decode(input)?, }) } @@ -119,8 +109,6 @@ pub mod generic { v } } - - } /// The body of a block is just a bunch of transactions. @@ -162,22 +150,16 @@ impl Header { digest: Default::default(), } } - - /// Get the blake2-256 hash of this header. - #[cfg(feature = "std")] - pub fn hash(&self) -> HeaderHash { - ::hashing::blake2_256(Slicable::encode(self).as_slice()).into() - } } impl Slicable for Header { fn decode(input: &mut I) -> Option { Some(Header { - parent_hash: try_opt!(Slicable::decode(input)), - number: try_opt!(Slicable::decode(input)), - state_root: try_opt!(Slicable::decode(input)), - transaction_root: try_opt!(Slicable::decode(input)), - digest: try_opt!(Slicable::decode(input)), + parent_hash: Slicable::decode(input)?, + number: Slicable::decode(input)?, + state_root: Slicable::decode(input)?, + transaction_root: Slicable::decode(input)?, + digest: Slicable::decode(input)?, }) } diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index ecf187cf910f3..626efbf78727b 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -91,7 +91,7 @@ mod tests; pub use self::hash::{H160, H256}; pub use self::uint::{U256, U512}; -pub use block::{Block, Header}; +pub use block::{Block, Header, Digest}; /// General hash type. pub type Hash = H256; diff --git a/substrate/runtime-io/src/lib.rs b/substrate/runtime-io/src/lib.rs index 5a165c62e5848..836ab42c3466a 100644 --- a/substrate/runtime-io/src/lib.rs +++ b/substrate/runtime-io/src/lib.rs @@ -29,3 +29,28 @@ include!("../with_std.rs"); #[cfg(not(feature = "std"))] include!("../without_std.rs"); + +pub trait Hashing { + type Output; + fn hash(s: &[u8]) -> Self::Output; + fn hash_of(s: &S) -> Self::Output { + codec::Slicable::using_encoded(s, Self::hash) + } + fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output; + fn storage_root() -> Self::Output; +} + +pub struct BlakeTwo256; + +impl Hashing for BlakeTwo256 { + type Output = primitives::H256; + fn hash(s: &[u8]) -> Self::Output { + blake2_256(s).into() + } + fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output { + enumerated_trie_root(items).into() + } + fn storage_root() -> Self::Output { + storage_root().into() + } +} diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index da23aaffa3273..c964eefbca3b0 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -18,9 +18,10 @@ use rstd::prelude::*; use rstd::borrow::Borrow; -use primitives::{Executable, RefInto, Hashing}; -use {system, democracy}; +use primitives::{Executable, RefInto}; +use runtime_io::Hashing; use runtime_support::{StorageValue, StorageMap}; +use {system, democracy}; use super::{Trait, Module as Council}; use democracy::IsCancelReferendum; diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index a5521424f775d..acb128ad2ea98 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -11,10 +11,14 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-primitives = { path = "../primitives", default_features = false } -substrate-runtime-consensus = { path = "../consensus", default_features = false } substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] +serde_derive = { version = "1.0" } +substrate-primitives = { path = "../../primitives" } +substrate-runtime-session = { path = "../session" } +substrate-runtime-staking = { path = "../staking" } +substrate-runtime-consensus = { path = "../consensus" } [features] default = ["std"] @@ -25,6 +29,5 @@ std = [ "substrate-codec/std", "substrate-runtime-primitives/std", "substrate-runtime-io/std", - "substrate-runtime-consensus/std", "substrate-runtime-system/std", ] diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index f08ce75a1b675..17bd6aca1345f 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -18,18 +18,24 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg_attr(test, macro_use)] extern crate substrate_runtime_std as rstd; +extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; +#[cfg(test)] #[macro_use] extern crate serde_derive; +#[cfg(test)] extern crate substrate_primitives; +#[cfg(test)] extern crate substrate_runtime_consensus as consensus; +#[cfg(test)] extern crate substrate_runtime_session as session; +#[cfg(test)] extern crate substrate_runtime_staking as staking; #[cfg(feature = "std")] extern crate serde; use rstd::prelude::*; use rstd::marker::PhantomData; -use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Hashing, Executable}; +use runtime_io::Hashing; +use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Executable}; use codec::Slicable; pub struct Executive< @@ -42,11 +48,11 @@ pub struct Executive< impl< Unchecked: Checkable< - CheckedType = Checked + Checked = Checked > + PartialEq + Eq + Clone + Slicable, Checked: Applyable< - IndexType = System::Index, - AccountIdType = System::AccountId + Index = System::Index, + AccountId = System::AccountId >, System: system::Trait, Block: Blocky< @@ -151,48 +157,199 @@ impl< >::record_block_hash(header) } } -/* + #[cfg(test)] mod tests { use super::*; - use super::internal::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use runtime_support::StorageValue; - use codec::{Joiner, KeyedVec, Slicable}; - use keyring::Keyring::*; - use primitives::hexdisplay::HexDisplay; - use demo_primitives::{Header, Digest}; - use transaction::{UncheckedTransaction, Transaction}; - use runtime::staking; - use dispatch::public::Call as PubCall; - use runtime::staking::public::Call as StakingCall; + use staking::Call; + use codec::{Slicable, Input}; + use runtime_io::with_externalities; + use runtime_support::AuxDispatchable; + use substrate_primitives::H256; + use primitives::{Checkable, Applyable, HasPublicAux, Identity, Headery, Blocky, Digesty, MakeTestExternalities}; + + #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] + pub struct Digest { + pub logs: Vec, + } + impl Slicable for Digest { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(|logs| Digest { logs }) + } + fn using_encoded R>(&self, f: F) -> R { + self.logs.using_encoded(f) + } + } + impl Digesty for Digest { + type Item = u64; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } + } + + #[derive(PartialEq, Eq, Clone, Serialize, Debug)] + #[serde(rename_all = "camelCase")] + #[serde(deny_unknown_fields)] + pub struct Header { + pub parent_hash: H256, + pub number: u64, + pub state_root: H256, + pub extrinsics_root: H256, + pub digest: Digest, + } + impl Slicable for Header { + fn decode(input: &mut I) -> Option { + Some(Header { + parent_hash: Slicable::decode(input)?, + number: Slicable::decode(input)?, + state_root: Slicable::decode(input)?, + extrinsics_root: Slicable::decode(input)?, + digest: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.parent_hash.using_encoded(|s| v.extend(s)); + self.number.using_encoded(|s| v.extend(s)); + self.state_root.using_encoded(|s| v.extend(s)); + self.extrinsics_root.using_encoded(|s| v.extend(s)); + self.digest.using_encoded(|s| v.extend(s)); + v + } + } + impl Headery for Header { + type Number = u64; + type Hash = H256; + type Digest = Digest; + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + Header { + number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest + } + } + } + + #[derive(PartialEq, Eq, Clone, Serialize, Debug)] + pub struct Block { + pub header: Header, + pub extrinsics: Vec, + } + impl Slicable for Block { + fn decode(input: &mut I) -> Option { + Some(Block { + header: Slicable::decode(input)?, + extrinsics: Slicable::decode(input)?, + }) + } + fn encode(&self) -> Vec { + let mut v: Vec = Vec::new(); + v.extend(self.header.encode()); + v.extend(self.extrinsics.encode()); + v + } + } + impl Blocky for Block { + type Extrinsic = TestXt; + type Header = Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.extrinsics[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.extrinsics) + } + } + + pub struct Test; + + #[derive(PartialEq, Eq, Clone, Serialize, Debug)] + pub struct TestXt((u64, u64, Call)); + impl Slicable for TestXt { + fn decode(input: &mut I) -> Option { + Some(TestXt(Slicable::decode(input)?)) + } + fn encode(&self) -> Vec { + self.0.encode() + } + } + impl Checkable for TestXt { + type Checked = Self; + fn check(self) -> Result { Ok(self) } + } + impl Applyable for TestXt { + type AccountId = u64; + type Index = u64; + fn sender(&self) -> &u64 { &(self.0).0 } + fn index(&self) -> &u64 { &(self.0).1 } + fn apply(self) { >::make_payment(&(self.0).0); (self.0).2.dispatch(&(self.0).0) } + } + + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = substrate_primitives::H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl session::Trait for Test { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; + } + pub struct DummyContractAddressFor; + impl staking::ContractAddressFor for DummyContractAddressFor { + fn contract_address_for(_code: &[u8], origin: &u64) -> u64 { + origin + 1 + } + } + impl staking::Trait for Test { + type Balance = u64; + type DetermineContractAddress = DummyContractAddressFor; + } + type Executive = super::Executive; #[test] fn staking_balance_transfer_dispatch_works() { - let mut t: TestExternalities = map![ - twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() - ]; - - let tx = UncheckedTransaction { - transaction: Transaction { - signed: One.into(), - nonce: 0, - function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), - }, - signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), - }; - + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(staking::TestingConfig:: { + sessions_per_era: 0, + current_era: 0, + balances: vec![(1, 111)], + intentions: vec![], + validator_count: 0, + bonding_duration: 0, + transaction_fee: 10, + }.test_externalities()); + let xt = TestXt((1, 0, Call::transfer(2, 69))); with_externalities(&mut t, || { - internal::initialise_block(&Header::from_block_number(1)); - internal::execute_transaction(tx); - assert_eq!(staking::balance(&One), 32); - assert_eq!(staking::balance(&Two), 69); + Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); + Executive::apply_extrinsic(xt); + assert_eq!(>::balance(&1), 32); + assert_eq!(>::balance(&2), 69); }); } +/* fn new_test_ext() -> TestExternalities { staking::testing::externalities(2, 2, 0) } @@ -264,5 +421,5 @@ mod tests { execute_block(b); }); } -} */ +} diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 8c9247b612ad3..4990b3f99b421 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -73,13 +73,6 @@ pub trait HasPublicAux { type PublicAux; } -pub trait Hashing { - type Output; - fn hash_of(s: &S) -> Self::Output; - fn enumerated_trie_root(items: &Vec<&[u8]>) -> Self::Output; - fn storage_root() -> Self::Output; -} - pub trait RefInto { fn ref_into(&self) -> &T; } @@ -177,8 +170,8 @@ pub trait Blocky { /// A "checkable" piece of information, used by the standard Substrate Executive in order to /// check the validity of a piece of extrinsic information, usually by verifying the signature. pub trait Checkable: Sized { - type CheckedType: Sized; - fn check(self) -> Result; + type Checked: Sized; + fn check(self) -> Result; } /// An "executable" piece of information, used by the standard Substrate Executive in order to @@ -188,10 +181,10 @@ pub trait Checkable: Sized { /// Also provides information on to whom this information is attributable and an index that allows /// each piece of attributable information to be disambiguated. pub trait Applyable { - type AccountIdType; - type IndexType; - fn index(&self) -> &Self::IndexType; - fn sender(&self) -> &Self::AccountIdType; + type AccountId; + type Index; + fn index(&self) -> &Self::Index; + fn sender(&self) -> &Self::AccountId; fn apply(self); } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index e0b0fdbc5ab07..fe3656c3c1e1a 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -36,8 +36,9 @@ use rstd::cmp; use rstd::cell::RefCell; use rstd::marker::PhantomData; use rstd::collections::btree_map::{BTreeMap, Entry}; -use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; +use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; +use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; #[cfg(test)] #[derive(Debug, PartialEq, Clone)] @@ -59,6 +60,18 @@ pub trait ContractAddressFor { fn contract_address_for(code: &[u8], origin: &AccountId) -> AccountId; } +impl ContractAddressFor for Hashing where + Hashing: runtime_io::Hashing, + AccountId: Sized + Slicable + From, + Hashing::Output: Slicable +{ + fn contract_address_for(code: &[u8], origin: &AccountId) -> AccountId { + let mut dest_pre = Hashing::hash(code).encode(); + origin.using_encoded(|s| dest_pre.extend(s)); + AccountId::from(Hashing::hash(&dest_pre)) + } +} + pub trait Trait: system::Trait + session::Trait { /// The balance of an account. type Balance: Parameter + SimpleArithmetic + Default + Copy; diff --git a/substrate/runtime/system/src/lib.rs b/substrate/runtime/system/src/lib.rs index 05b402cf4b917..207a6c74a9f54 100644 --- a/substrate/runtime/system/src/lib.rs +++ b/substrate/runtime/system/src/lib.rs @@ -32,7 +32,8 @@ extern crate safe_mix; use rstd::prelude::*; #[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; #[cfg(any(feature = "std", test))] use codec::Slicable; -use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Hashing, Headery}; +use runtime_io::Hashing; +use primitives::{Digesty, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Headery}; use runtime_support::{StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -163,106 +164,3 @@ impl primitives::MakeTestExternalities for TestingConfig ] } } - -#[cfg(test)] -mod tests { -/* - use super::*; - #[test] - fn staking_balance_transfer_dispatch_works() { - let mut t: TestExternalities = map![ - twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(&BlockHash::key_for(&0)).to_vec() => [69u8; 32].encode() - ]; - - let tx = UncheckedTransaction { - transaction: Transaction { - signed: One.into(), - nonce: 0, - function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), - }, - signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), - }; - - with_externalities(&mut t, || { - internal::initialise_block(&Header::from_block_number(1)); - internal::execute_transaction(tx); - assert_eq!(staking::balance(&One), 32); - assert_eq!(staking::balance(&Two), 69); - }); - } - - fn new_test_ext() -> TestExternalities { - staking::testing::externalities(2, 2, 0) - } - - #[test] - fn block_import_works() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), - extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_state_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_extrinsics_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), - extrinsics_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - */ -} From 17cd39a7439016a76b939b96f20c97fec94d3534 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 28 Mar 2018 16:50:17 +0900 Subject: [PATCH 50/76] Remove test framework stuff into common module. --- Cargo.lock | 4 +- demo/runtime/src/runtime.rs | 1 + substrate/runtime/executive/Cargo.toml | 1 - substrate/runtime/executive/src/lib.rs | 159 ++------------------ substrate/runtime/primitives/Cargo.toml | 10 +- substrate/runtime/primitives/src/lib.rs | 10 ++ substrate/runtime/primitives/src/testing.rs | 150 ++++++++++++++++++ substrate/runtime/staking/src/lib.rs | 27 ++-- 8 files changed, 205 insertions(+), 157 deletions(-) create mode 100644 substrate/runtime/primitives/src/testing.rs diff --git a/Cargo.lock b/Cargo.lock index c04066694d37a..d10984579ee91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1829,7 +1829,6 @@ version = "0.1.0" dependencies = [ "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-consensus 0.1.0", @@ -1862,10 +1861,13 @@ version = "0.1.0" dependencies = [ "integer-sqrt 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", ] [[package]] diff --git a/demo/runtime/src/runtime.rs b/demo/runtime/src/runtime.rs index 1dfa4b10f9908..3dc4c390b50f0 100644 --- a/demo/runtime/src/runtime.rs +++ b/demo/runtime/src/runtime.rs @@ -107,6 +107,7 @@ pub type Executive = executive::Executive< extrinsic::CheckedExtrinsic, Concrete, block::Block, + Staking, (((((), Council), Democracy), Staking), Session), >; diff --git a/substrate/runtime/executive/Cargo.toml b/substrate/runtime/executive/Cargo.toml index acb128ad2ea98..5b1280c2490fa 100644 --- a/substrate/runtime/executive/Cargo.toml +++ b/substrate/runtime/executive/Cargo.toml @@ -14,7 +14,6 @@ substrate-runtime-primitives = { path = "../primitives", default_features = fals substrate-runtime-system = { path = "../system", default_features = false } [dev-dependencies] -serde_derive = { version = "1.0" } substrate-primitives = { path = "../../primitives" } substrate-runtime-session = { path = "../session" } substrate-runtime-staking = { path = "../staking" } diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 17bd6aca1345f..2b22a107f8b72 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -24,7 +24,6 @@ extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; -#[cfg(test)] #[macro_use] extern crate serde_derive; #[cfg(test)] extern crate substrate_primitives; #[cfg(test)] extern crate substrate_runtime_consensus as consensus; #[cfg(test)] extern crate substrate_runtime_session as session; @@ -35,7 +34,7 @@ extern crate substrate_runtime_system as system; use rstd::prelude::*; use rstd::marker::PhantomData; use runtime_io::Hashing; -use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Executable}; +use primitives::{Zero, One, Headery, Blocky, Checkable, Applyable, CheckEqual, Executable, MakePayment}; use codec::Slicable; pub struct Executive< @@ -43,8 +42,9 @@ pub struct Executive< Checked, System, Block, + Payment, Finalisation, ->(PhantomData<(Unchecked, Checked, System, Block, Finalisation)>); +>(PhantomData<(Unchecked, Checked, System, Block, Payment, Finalisation)>); impl< Unchecked: Checkable< @@ -59,8 +59,9 @@ impl< Extrinsic = Unchecked, Header = System::Header >, + Payment: MakePayment, Finalisation: Executable, -> Executive { +> Executive { /// Start the execution of a particular block. pub fn initialise_block(header: &System::Header) { >::initialise(header.number(), header.parent_hash(), header.extrinsics_root()); @@ -134,6 +135,9 @@ impl< >::inc_account_index(tx.sender()); } + // pay any fees. + Payment::make_payment(tx.sender()); + // decode parameters and dispatch tx.apply(); } @@ -162,141 +166,12 @@ impl< mod tests { use super::*; use staking::Call; - use codec::{Slicable, Input}; use runtime_io::with_externalities; - use runtime_support::AuxDispatchable; use substrate_primitives::H256; - use primitives::{Checkable, Applyable, HasPublicAux, Identity, Headery, Blocky, Digesty, MakeTestExternalities}; - - #[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] - pub struct Digest { - pub logs: Vec, - } - impl Slicable for Digest { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(|logs| Digest { logs }) - } - fn using_encoded R>(&self, f: F) -> R { - self.logs.using_encoded(f) - } - } - impl Digesty for Digest { - type Item = u64; - fn push(&mut self, item: Self::Item) { - self.logs.push(item); - } - } - - #[derive(PartialEq, Eq, Clone, Serialize, Debug)] - #[serde(rename_all = "camelCase")] - #[serde(deny_unknown_fields)] - pub struct Header { - pub parent_hash: H256, - pub number: u64, - pub state_root: H256, - pub extrinsics_root: H256, - pub digest: Digest, - } - impl Slicable for Header { - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: Slicable::decode(input)?, - number: Slicable::decode(input)?, - state_root: Slicable::decode(input)?, - extrinsics_root: Slicable::decode(input)?, - digest: Slicable::decode(input)?, - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - self.parent_hash.using_encoded(|s| v.extend(s)); - self.number.using_encoded(|s| v.extend(s)); - self.state_root.using_encoded(|s| v.extend(s)); - self.extrinsics_root.using_encoded(|s| v.extend(s)); - self.digest.using_encoded(|s| v.extend(s)); - v - } - } - impl Headery for Header { - type Number = u64; - type Hash = H256; - type Digest = Digest; - fn number(&self) -> &Self::Number { &self.number } - fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } - fn state_root(&self) -> &Self::Hash { &self.state_root } - fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } - fn digest(&self) -> &Self::Digest { &self.digest } - fn new( - number: Self::Number, - extrinsics_root: Self::Hash, - state_root: Self::Hash, - parent_hash: Self::Hash, - digest: Self::Digest - ) -> Self { - Header { - number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest - } - } - } - - #[derive(PartialEq, Eq, Clone, Serialize, Debug)] - pub struct Block { - pub header: Header, - pub extrinsics: Vec, - } - impl Slicable for Block { - fn decode(input: &mut I) -> Option { - Some(Block { - header: Slicable::decode(input)?, - extrinsics: Slicable::decode(input)?, - }) - } - fn encode(&self) -> Vec { - let mut v: Vec = Vec::new(); - v.extend(self.header.encode()); - v.extend(self.extrinsics.encode()); - v - } - } - impl Blocky for Block { - type Extrinsic = TestXt; - type Header = Header; - fn header(&self) -> &Self::Header { - &self.header - } - fn extrinsics(&self) -> &[Self::Extrinsic] { - &self.extrinsics[..] - } - fn deconstruct(self) -> (Self::Header, Vec) { - (self.header, self.extrinsics) - } - } + use primitives::{HasPublicAux, Identity, Headery, MakeTestExternalities}; + use primitives::testing::{Digest, Header, Block}; pub struct Test; - - #[derive(PartialEq, Eq, Clone, Serialize, Debug)] - pub struct TestXt((u64, u64, Call)); - impl Slicable for TestXt { - fn decode(input: &mut I) -> Option { - Some(TestXt(Slicable::decode(input)?)) - } - fn encode(&self) -> Vec { - self.0.encode() - } - } - impl Checkable for TestXt { - type Checked = Self; - fn check(self) -> Result { Ok(self) } - } - impl Applyable for TestXt { - type AccountId = u64; - type Index = u64; - fn sender(&self) -> &u64 { &(self.0).0 } - fn index(&self) -> &u64 { &(self.0).1 } - fn apply(self) { >::make_payment(&(self.0).0); (self.0).2.dispatch(&(self.0).0) } - } - impl HasPublicAux for Test { type PublicAux = u64; } @@ -316,17 +191,13 @@ mod tests { type PublicAux = ::PublicAux; type ConvertAccountIdToSessionKey = Identity; } - pub struct DummyContractAddressFor; - impl staking::ContractAddressFor for DummyContractAddressFor { - fn contract_address_for(_code: &[u8], origin: &u64) -> u64 { - origin + 1 - } - } impl staking::Trait for Test { type Balance = u64; - type DetermineContractAddress = DummyContractAddressFor; + type DetermineContractAddress = staking::DummyContractAddressFor; } - type Executive = super::Executive; + + type TestXt = primitives::testing::TestXt>; + type Executive = super::Executive, staking::Module, ()>; #[test] fn staking_balance_transfer_dispatch_works() { @@ -340,7 +211,7 @@ mod tests { bonding_duration: 0, transaction_fee: 10, }.test_externalities()); - let xt = TestXt((1, 0, Call::transfer(2, 69))); + let xt = primitives::testing::TestXt((1, 0, Call::transfer(2, 69))); with_externalities(&mut t, || { Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default())); Executive::apply_extrinsic(xt); diff --git a/substrate/runtime/primitives/Cargo.toml b/substrate/runtime/primitives/Cargo.toml index 899bd0dcd6e1b..cc3f035715430 100644 --- a/substrate/runtime/primitives/Cargo.toml +++ b/substrate/runtime/primitives/Cargo.toml @@ -6,17 +6,23 @@ authors = ["Parity Technologies "] [dependencies] num-traits = { version = "0.2", default_features = false } integer-sqrt = "0.1.0" -substrate-runtime-std = { path = "../../runtime-std", default_features = false } -substrate-runtime-io = { path = "../../runtime-io", default_features = false } +serde = { version = "1.0", optional = true } +serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../codec", default_features = false } substrate-primitives = { path = "../../primitives", default_features = false } +substrate-runtime-std = { path = "../../runtime-std", default_features = false } +substrate-runtime-io = { path = "../../runtime-io", default_features = false } +substrate-runtime-support = { path = "../../runtime-support", default_features = false } [features] default = ["std"] std = [ "num-traits/std", + "serde", + "serde_derive", "substrate-runtime-std/std", "substrate-runtime-io/std", + "substrate-runtime-support/std", "substrate-codec/std", "substrate-primitives/std", ] diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 4990b3f99b421..25b3aadfe807d 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -19,10 +19,13 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "std")] extern crate serde; +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; extern crate num_traits; extern crate integer_sqrt; extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; +#[cfg(feature = "std")] extern crate substrate_runtime_support as runtime_support; extern crate substrate_codec as codec; extern crate substrate_primitives; @@ -32,11 +35,18 @@ pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; +#[cfg(feature = "std")] +pub mod testing; + #[cfg(feature = "std")] pub trait MakeTestExternalities { fn test_externalities(self) -> runtime_io::TestExternalities; } +pub trait MakePayment { + fn make_payment(who: &AccountId); +} + pub trait Convert { fn convert(a: A) -> B; } diff --git a/substrate/runtime/primitives/src/testing.rs b/substrate/runtime/primitives/src/testing.rs new file mode 100644 index 0000000000000..be2c3e2e8d296 --- /dev/null +++ b/substrate/runtime/primitives/src/testing.rs @@ -0,0 +1,150 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Substrate Demo. + +// Substrate Demo 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. + +// Substrate Demo 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 Substrate Demo. If not, see . + +//! Testing utilities. + +use serde; +use codec::{Slicable, Input}; +use runtime_support::AuxDispatchable; +use substrate_primitives::H256; +use super::{Checkable, Applyable, Headery, Blocky, Digesty}; + +#[derive(Default, PartialEq, Eq, Clone, Serialize, Debug)] +pub struct Digest { + pub logs: Vec, +} +impl Slicable for Digest { + fn decode(input: &mut I) -> Option { + Vec::::decode(input).map(|logs| Digest { logs }) + } + fn using_encoded R>(&self, f: F) -> R { + self.logs.using_encoded(f) + } +} +impl Digesty for Digest { + type Item = u64; + fn push(&mut self, item: Self::Item) { + self.logs.push(item); + } +} + +#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +#[serde(rename_all = "camelCase")] +#[serde(deny_unknown_fields)] +pub struct Header { + pub parent_hash: H256, + pub number: u64, + pub state_root: H256, + pub extrinsics_root: H256, + pub digest: Digest, +} +impl Slicable for Header { + fn decode(input: &mut I) -> Option { + Some(Header { + parent_hash: Slicable::decode(input)?, + number: Slicable::decode(input)?, + state_root: Slicable::decode(input)?, + extrinsics_root: Slicable::decode(input)?, + digest: Slicable::decode(input)?, + }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + self.parent_hash.using_encoded(|s| v.extend(s)); + self.number.using_encoded(|s| v.extend(s)); + self.state_root.using_encoded(|s| v.extend(s)); + self.extrinsics_root.using_encoded(|s| v.extend(s)); + self.digest.using_encoded(|s| v.extend(s)); + v + } +} +impl Headery for Header { + type Number = u64; + type Hash = H256; + type Digest = Digest; + fn number(&self) -> &Self::Number { &self.number } + fn extrinsics_root(&self) -> &Self::Hash { &self.extrinsics_root } + fn state_root(&self) -> &Self::Hash { &self.state_root } + fn parent_hash(&self) -> &Self::Hash { &self.parent_hash } + fn digest(&self) -> &Self::Digest { &self.digest } + fn new( + number: Self::Number, + extrinsics_root: Self::Hash, + state_root: Self::Hash, + parent_hash: Self::Hash, + digest: Self::Digest + ) -> Self { + Header { + number, extrinsics_root: extrinsics_root, state_root, parent_hash, digest + } + } +} + +#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +pub struct Block { + pub header: Header, + pub extrinsics: Vec, +} +impl Slicable for Block { + fn decode(input: &mut I) -> Option { + Some(Block { + header: Slicable::decode(input)?, + extrinsics: Slicable::decode(input)?, + }) + } + fn encode(&self) -> Vec { + let mut v: Vec = Vec::new(); + v.extend(self.header.encode()); + v.extend(self.extrinsics.encode()); + v + } +} +impl Blocky for Block { + type Extrinsic = Xt; + type Header = Header; + fn header(&self) -> &Self::Header { + &self.header + } + fn extrinsics(&self) -> &[Self::Extrinsic] { + &self.extrinsics[..] + } + fn deconstruct(self) -> (Self::Header, Vec) { + (self.header, self.extrinsics) + } +} + +#[derive(PartialEq, Eq, Clone, Serialize, Debug)] +pub struct TestXt(pub (u64, u64, Call)); +impl Slicable for TestXt { + fn decode(input: &mut I) -> Option { + Some(TestXt(Slicable::decode(input)?)) + } + fn encode(&self) -> Vec { + self.0.encode() + } +} +impl Checkable for TestXt { + type Checked = Self; + fn check(self) -> Result { Ok(self) } +} +impl + Slicable + Sized + serde::Serialize> Applyable for TestXt { + type AccountId = u64; + type Index = u64; + fn sender(&self) -> &u64 { &(self.0).0 } + fn index(&self) -> &u64 { &(self.0).1 } + fn apply(self) { (self.0).2.dispatch(&(self.0).0); } +} diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index fe3656c3c1e1a..9e074673c1302 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -38,7 +38,7 @@ use rstd::marker::PhantomData; use rstd::collections::btree_map::{BTreeMap, Entry}; use codec::Slicable; use runtime_support::{StorageValue, StorageMap, Parameter}; -use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable}; +use primitives::{Zero, One, Bounded, RefInto, SimpleArithmetic, Executable, MakePayment}; #[cfg(test)] #[derive(Debug, PartialEq, Clone)] @@ -170,14 +170,6 @@ impl Module { } } - /// New PublicPass instance through making a payment. - pub fn make_payment(transactor: &T::AccountId) { - let b = Self::free_balance(transactor); - let transaction_fee = Self::transaction_fee(); - assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); - >::insert(transactor, b - transaction_fee); - } - // PUBLIC DISPATCH /// Transfer some unlocked staking balance to another staker. @@ -571,6 +563,23 @@ impl Module { } } +impl MakePayment for Module { + fn make_payment(transactor: &T::AccountId) { + let b = Self::free_balance(transactor); + let transaction_fee = Self::transaction_fee(); + assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); + >::insert(transactor, b - transaction_fee); + } +} + +#[cfg(any(feature = "std", test))] +pub struct DummyContractAddressFor; +impl ContractAddressFor for DummyContractAddressFor { + fn contract_address_for(_code: &[u8], origin: &u64) -> u64 { + origin + 1 + } +} + #[cfg(any(feature = "std", test))] pub struct TestingConfig { pub sessions_per_era: T::BlockNumber, From 0fda874a0d26f34d06abb34915b66cbd118853a0 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 28 Mar 2018 17:13:15 +0900 Subject: [PATCH 51/76] Enable other tests in executive --- substrate/runtime/executive/src/lib.rs | 99 +++++++++++--------------- substrate/runtime/session/src/lib.rs | 16 ++++- substrate/runtime/staking/src/lib.rs | 16 +++++ 3 files changed, 71 insertions(+), 60 deletions(-) diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 2b22a107f8b72..3286cf40f5a3e 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -24,6 +24,7 @@ extern crate substrate_runtime_io as runtime_io; extern crate substrate_codec as codec; extern crate substrate_runtime_primitives as primitives; extern crate substrate_runtime_system as system; +#[cfg(test)] #[macro_use] extern crate hex_literal; #[cfg(test)] extern crate substrate_primitives; #[cfg(test)] extern crate substrate_runtime_consensus as consensus; #[cfg(test)] extern crate substrate_runtime_session as session; @@ -197,7 +198,7 @@ mod tests { } type TestXt = primitives::testing::TestXt>; - type Executive = super::Executive, staking::Module, ()>; + type Executive = super::Executive, staking::Module, (session::Module, staking::Module)>; #[test] fn staking_balance_transfer_dispatch_works() { @@ -220,77 +221,61 @@ mod tests { }); } -/* - fn new_test_ext() -> TestExternalities { - staking::testing::externalities(2, 2, 0) + fn new_test_ext() -> runtime_io::TestExternalities { + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(consensus::TestingConfig::::default().test_externalities()); + t.extend(session::TestingConfig::::default().test_externalities()); + t.extend(staking::TestingConfig::::default().test_externalities()); + t } #[test] fn block_import_works() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("93dde1251278e65430baf291337ba219bacfa9ad583c52513b12cf1974109a97").into(), + extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); }); } #[test] #[should_panic] fn block_import_of_bad_state_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: [0u8; 32].into(), + extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); }); } #[test] #[should_panic] - fn block_import_of_bad_transaction_root_fails() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), - transaction_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - transactions: vec![], - }; - - with_externalities(&mut t, || { - execute_block(b); + fn block_import_of_bad_extrinsic_root_fails() { + with_externalities(&mut new_test_ext(), || { + Executive::execute_block(Block { + header: Header { + parent_hash: [69u8; 32].into(), + number: 1, + state_root: hex!("93dde1251278e65430baf291337ba219bacfa9ad583c52513b12cf1974109a97").into(), + extrinsics_root: [0u8; 32].into(), + digest: Digest { logs: vec![], }, + }, + extrinsics: vec![], + }); }); } -*/ } diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 6f8ca8dd26f30..c026bf40fb056 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -153,7 +153,7 @@ pub struct TestingConfig { pub validators: Vec, } -#[cfg(any(feature = "std", test))] +#[cfg(any(feature = "std", test))] impl TestingConfig where T::AccountId: From { pub fn simple() -> Self where T::AccountId: From<[u8; 32]> { use primitives::As; @@ -176,8 +176,18 @@ impl TestingConfig where T::AccountId: From { } #[cfg(any(feature = "std", test))] -impl primitives::MakeTestExternalities for TestingConfig where - T::AccountId: From +impl Default for TestingConfig { + fn default() -> Self { + use primitives::As; + TestingConfig { + session_length: T::BlockNumber::sa(1000), + validators: vec![], + } + } +} + +#[cfg(any(feature = "std", test))] +impl primitives::MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { use runtime_io::twox_128; diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 9e074673c1302..5c46f37173ddc 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -630,6 +630,22 @@ impl TestingConfig where T::AccountId: From { } } +#[cfg(any(feature = "std", test))] +impl Default for TestingConfig { + fn default() -> Self { + use primitives::As; + TestingConfig { + sessions_per_era: T::BlockNumber::sa(1000), + current_era: T::BlockNumber::sa(0), + balances: vec![], + intentions: vec![], + validator_count: 0, + bonding_duration: T::BlockNumber::sa(1000), + transaction_fee: T::Balance::sa(0), + } + } +} + #[cfg(any(feature = "std", test))] impl primitives::MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { From 5ca74435b905114d42b931638a10ea603c098fe6 Mon Sep 17 00:00:00 2001 From: Gav Date: Thu, 29 Mar 2018 12:24:42 +0900 Subject: [PATCH 52/76] Session tests reinstated, minor refactoring of keyring. --- substrate/keyring/src/lib.rs | 55 +++++++- substrate/runtime/consensus/src/lib.rs | 21 +-- substrate/runtime/executive/src/lib.rs | 2 +- substrate/runtime/primitives/src/lib.rs | 4 + substrate/runtime/session/src/lib.rs | 165 +++++++++++++----------- 5 files changed, 156 insertions(+), 91 deletions(-) diff --git a/substrate/keyring/src/lib.rs b/substrate/keyring/src/lib.rs index 9749ef13449cf..9d9fcee99e898 100644 --- a/substrate/keyring/src/lib.rs +++ b/substrate/keyring/src/lib.rs @@ -27,6 +27,7 @@ use ed25519::{Pair, Public, Signature}; /// Set of test accounts. #[derive(Clone, Copy, PartialEq, Eq, Hash)] pub enum Keyring { + None, Alice, Bob, Charlie, @@ -71,6 +72,7 @@ impl Keyring { pub fn pair(self) -> Pair { match self { + Keyring::None => { panic!(); }, Keyring::Alice => Pair::from_seed(b"Alice "), Keyring::Bob => Pair::from_seed(b"Bob "), Keyring::Charlie => Pair::from_seed(b"Charlie "), @@ -86,6 +88,7 @@ impl Keyring { impl From for &'static str { fn from(k: Keyring) -> Self { match k { + Keyring::None => { panic!(); }, Keyring::Alice => "Alice", Keyring::Bob => "Bob", Keyring::Charlie => "Charlie", @@ -98,6 +101,38 @@ impl From for &'static str { } } +impl From for u64 { + fn from(k: Keyring) -> Self { + match k { + Keyring::None => 0, + Keyring::Alice => 1, + Keyring::Bob => 2, + Keyring::Charlie => 3, + Keyring::Dave => 4, + Keyring::Eve => 5, + Keyring::Ferdie => 6, + Keyring::One => 7, + Keyring::Two => 8, + } + } +} + +impl From for Keyring { + fn from(k: u64) -> Keyring { + match k { + 1 => Keyring::Alice, + 2 => Keyring::Bob, + 3 => Keyring::Charlie, + 4 => Keyring::Dave, + 5 => Keyring::Eve, + 6 => Keyring::Ferdie, + 7 => Keyring::One, + 8 => Keyring::Two, + _ => Keyring::None, + } + } +} + lazy_static! { static ref PRIVATE_KEYS: HashMap = { [ @@ -113,7 +148,13 @@ lazy_static! { }; static ref PUBLIC_KEYS: HashMap = { - PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect() + let mut m: HashMap<_, _> = PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect(); + m.insert(Keyring::None, Public(Default::default())); + m + }; + + static ref U64_KEYS: HashMap = { + (0u64..9).map(|n| (n.into(), n)).collect() }; } @@ -147,6 +188,12 @@ impl AsRef<[u8; 32]> for Keyring { } } +impl AsRef for Keyring { + fn as_ref(&self) -> &u64 { + (*U64_KEYS).get(self).unwrap() + } +} + impl AsRef for Keyring { fn as_ref(&self) -> &Public { (*PUBLIC_KEYS).get(self).unwrap() @@ -154,9 +201,9 @@ impl AsRef for Keyring { } impl Deref for Keyring { - type Target = [u8; 32]; - fn deref(&self) -> &[u8; 32] { - (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() + type Target = u64; + fn deref(&self) -> &u64 { + (*U64_KEYS).get(self).unwrap() } } diff --git a/substrate/runtime/consensus/src/lib.rs b/substrate/runtime/consensus/src/lib.rs index 6d98fcd4f34cc..78e49996fb990 100644 --- a/substrate/runtime/consensus/src/lib.rs +++ b/substrate/runtime/consensus/src/lib.rs @@ -25,7 +25,6 @@ extern crate substrate_runtime_primitives as primitives; extern crate substrate_codec as codec; use rstd::prelude::*; -#[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; use runtime_support::{storage, Parameter}; use runtime_support::storage::unhashed::StorageVec; @@ -79,12 +78,16 @@ impl Module { } #[cfg(any(feature = "std", test))] -pub struct TestingConfig(PhantomData); +pub struct TestingConfig { + pub authorities: Vec, +} #[cfg(any(feature = "std", test))] impl Default for TestingConfig { fn default() -> Self { - TestingConfig(PhantomData) + TestingConfig { + authorities: vec![], + } } } @@ -93,11 +96,11 @@ impl primitives::MakeTestExternalities for TestingConfig { fn test_externalities(self) -> runtime_io::TestExternalities { use codec::{Slicable, KeyedVec}; - - map![ - b":auth:len".to_vec() => 2u32.encode(), - 0u32.to_keyed_vec(b":auth:") => vec![11; 32], - 1u32.to_keyed_vec(b":auth:") => vec![21; 32] - ] + let auth_count = self.authorities.len() as u32; + let mut r: runtime_io::TestExternalities = self.authorities.into_iter().enumerate().map(|(i, v)| + ((i as u32).to_keyed_vec(b":auth:"), v.encode()) + ).collect(); + r.insert(b":auth:len".to_vec(), auth_count.encode()); + r } } diff --git a/substrate/runtime/executive/src/lib.rs b/substrate/runtime/executive/src/lib.rs index 3286cf40f5a3e..fb62363a4a080 100644 --- a/substrate/runtime/executive/src/lib.rs +++ b/substrate/runtime/executive/src/lib.rs @@ -236,7 +236,7 @@ mod tests { header: Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("93dde1251278e65430baf291337ba219bacfa9ad583c52513b12cf1974109a97").into(), + state_root: hex!("9228e363883f4f5a01981985b5598d1a767e987eb3ccea017a0e14cac7acc79d").into(), extrinsics_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }, diff --git a/substrate/runtime/primitives/src/lib.rs b/substrate/runtime/primitives/src/lib.rs index 25b3aadfe807d..9920030dfbbed 100644 --- a/substrate/runtime/primitives/src/lib.rs +++ b/substrate/runtime/primitives/src/lib.rs @@ -47,6 +47,10 @@ pub trait MakePayment { fn make_payment(who: &AccountId); } +impl MakePayment for () { + fn make_payment(_: &T) {} +} + pub trait Convert { fn convert(a: A) -> B; } diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index c026bf40fb056..52324382067b4 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -23,6 +23,7 @@ #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; extern crate substrate_codec as codec; +#[cfg(any(feature = "std", test))] extern crate substrate_primitives; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; @@ -201,121 +202,131 @@ impl primitives::MakeTestExternalities for TestingConfig } } -/* #[cfg(test)] mod tests { use super::*; - use super::public::*; - use super::privileged::Dispatch as PrivDispatch; - use super::internal::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use demo_primitives::AccountId; - use runtime::session; - use consensus; - - fn simple_setup() -> TestExternalities { - map![ - twox_128(SessionLength::key()).to_vec() => vec![].and(&2u64), - twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), - // the validators (10, 20, ...) - twox_128(Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), - // initial session keys (11, 21, ...) - b":auth:len".to_vec() => vec![].and(&2u32), - 0u32.to_keyed_vec(b":auth:") => vec![11; 32], - 1u32.to_keyed_vec(b":auth:") => vec![21; 32] - ] + use runtime_io::with_externalities; + use substrate_primitives::H256; + use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::testing::{Digest, Header}; + + pub struct Test; + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl Trait for Test { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; + } + + fn new_test_ext() -> runtime_io::TestExternalities { + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(consensus::TestingConfig::{ + authorities: vec![1, 2, 3], + }.test_externalities()); + t.extend(TestingConfig::{ + session_length: 2, + validators: vec![1, 2, 3], + }.test_externalities()); + t } #[test] fn simple_setup_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - assert_eq!(length(), 2u64); - assert_eq!(validators(), vec![[10u8; 32], [20u8; 32]]); + with_externalities(&mut new_test_ext(), || { + assert_eq!(>::authorities(), vec![1, 2, 3]); + assert_eq!(>::length(), 2); + assert_eq!(>::validators(), vec![1, 2, 3]); }); } #[test] fn session_length_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { + with_externalities(&mut new_test_ext(), || { // Block 1: Change to length 3; no visible change. - system::testing::set_block_number(1); - PrivPass::test().set_length(3); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 0); + >::set_block_number(1); + >::set_length(3); + >::check_rotate_session(); + assert_eq!(>::length(), 2); + assert_eq!(>::current_index(), 0); // Block 2: Length now changed to 3. Index incremented. - system::testing::set_block_number(2); - PrivPass::test().set_length(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); + >::set_block_number(2); + >::set_length(3); + >::check_rotate_session(); + assert_eq!(>::length(), 3); + assert_eq!(>::current_index(), 1); // Block 3: Length now changed to 3. Index incremented. - system::testing::set_block_number(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); + >::set_block_number(3); + >::check_rotate_session(); + assert_eq!(>::length(), 3); + assert_eq!(>::current_index(), 1); // Block 4: Change to length 2; no visible change. - system::testing::set_block_number(4); - PrivPass::test().set_length(2); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); + >::set_block_number(4); + >::set_length(2); + >::check_rotate_session(); + assert_eq!(>::length(), 3); + assert_eq!(>::current_index(), 1); // Block 5: Length now changed to 2. Index incremented. - system::testing::set_block_number(5); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); + >::set_block_number(5); + >::check_rotate_session(); + assert_eq!(>::length(), 2); + assert_eq!(>::current_index(), 2); // Block 6: No change. - system::testing::set_block_number(6); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); + >::set_block_number(6); + >::check_rotate_session(); + assert_eq!(>::length(), 2); + assert_eq!(>::current_index(), 2); // Block 7: Next index. - system::testing::set_block_number(7); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 3); + >::set_block_number(7); + >::check_rotate_session(); + assert_eq!(>::length(), 2); + assert_eq!(>::current_index(), 3); }); } #[test] fn session_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { + with_externalities(&mut new_test_ext(), || { // Block 1: No change - system::testing::set_block_number(1); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + >::set_block_number(1); + >::check_rotate_session(); + assert_eq!(>::authorities(), vec![1, 2, 3]); // Block 2: Session rollover, but no change. - system::testing::set_block_number(2); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + >::set_block_number(2); + >::check_rotate_session(); + assert_eq!(>::authorities(), vec![1, 2, 3]); // Block 3: Set new key for validator 2; no visible change. - system::testing::set_block_number(3); - PublicPass::test(&[20; 32]).set_key([22; 32]); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + >::set_block_number(3); + >::set_key(&2, 5); + assert_eq!(>::authorities(), vec![1, 2, 3]); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); + >::check_rotate_session(); + assert_eq!(>::authorities(), vec![1, 2, 3]); // Block 4: Session rollover, authority 2 changes. - system::testing::set_block_number(4); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]); + >::set_block_number(4); + >::check_rotate_session(); + assert_eq!(>::authorities(), vec![1, 5, 3]); }); } } -*/ From 92350f29fb1663bb87dbd729021a449ac17d0b30 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 00:10:57 +0900 Subject: [PATCH 53/76] Fix staking tests. --- Cargo.lock | 1 + substrate/runtime/session/src/lib.rs | 100 +++--- substrate/runtime/staking/Cargo.toml | 1 + substrate/runtime/staking/src/lib.rs | 459 ++++++++++++++------------- 4 files changed, 292 insertions(+), 269 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d10984579ee91..7401491e409cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1898,6 +1898,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-session 0.1.0", diff --git a/substrate/runtime/session/src/lib.rs b/substrate/runtime/session/src/lib.rs index 52324382067b4..62b2216017313 100644 --- a/substrate/runtime/session/src/lib.rs +++ b/substrate/runtime/session/src/lib.rs @@ -231,6 +231,10 @@ mod tests { type ConvertAccountIdToSessionKey = Identity; } + type System = system::Module; + type Consensus = consensus::Module; + type Session = Module; + fn new_test_ext() -> runtime_io::TestExternalities { let mut t = system::TestingConfig::::default().test_externalities(); t.extend(consensus::TestingConfig::{ @@ -246,9 +250,9 @@ mod tests { #[test] fn simple_setup_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(>::authorities(), vec![1, 2, 3]); - assert_eq!(>::length(), 2); - assert_eq!(>::validators(), vec![1, 2, 3]); + assert_eq!(Consensus::authorities(), vec![1, 2, 3]); + assert_eq!(Session::length(), 2); + assert_eq!(Session::validators(), vec![1, 2, 3]); }); } @@ -256,49 +260,49 @@ mod tests { fn session_length_change_should_work() { with_externalities(&mut new_test_ext(), || { // Block 1: Change to length 3; no visible change. - >::set_block_number(1); - >::set_length(3); - >::check_rotate_session(); - assert_eq!(>::length(), 2); - assert_eq!(>::current_index(), 0); + System::set_block_number(1); + Session::set_length(3); + Session::check_rotate_session(); + assert_eq!(Session::length(), 2); + assert_eq!(Session::current_index(), 0); // Block 2: Length now changed to 3. Index incremented. - >::set_block_number(2); - >::set_length(3); - >::check_rotate_session(); - assert_eq!(>::length(), 3); - assert_eq!(>::current_index(), 1); + System::set_block_number(2); + Session::set_length(3); + Session::check_rotate_session(); + assert_eq!(Session::length(), 3); + assert_eq!(Session::current_index(), 1); // Block 3: Length now changed to 3. Index incremented. - >::set_block_number(3); - >::check_rotate_session(); - assert_eq!(>::length(), 3); - assert_eq!(>::current_index(), 1); + System::set_block_number(3); + Session::check_rotate_session(); + assert_eq!(Session::length(), 3); + assert_eq!(Session::current_index(), 1); // Block 4: Change to length 2; no visible change. - >::set_block_number(4); - >::set_length(2); - >::check_rotate_session(); - assert_eq!(>::length(), 3); - assert_eq!(>::current_index(), 1); + System::set_block_number(4); + Session::set_length(2); + Session::check_rotate_session(); + assert_eq!(Session::length(), 3); + assert_eq!(Session::current_index(), 1); // Block 5: Length now changed to 2. Index incremented. - >::set_block_number(5); - >::check_rotate_session(); - assert_eq!(>::length(), 2); - assert_eq!(>::current_index(), 2); + System::set_block_number(5); + Session::check_rotate_session(); + assert_eq!(Session::length(), 2); + assert_eq!(Session::current_index(), 2); // Block 6: No change. - >::set_block_number(6); - >::check_rotate_session(); - assert_eq!(>::length(), 2); - assert_eq!(>::current_index(), 2); + System::set_block_number(6); + Session::check_rotate_session(); + assert_eq!(Session::length(), 2); + assert_eq!(Session::current_index(), 2); // Block 7: Next index. - >::set_block_number(7); - >::check_rotate_session(); - assert_eq!(>::length(), 2); - assert_eq!(>::current_index(), 3); + System::set_block_number(7); + Session::check_rotate_session(); + assert_eq!(Session::length(), 2); + assert_eq!(Session::current_index(), 3); }); } @@ -306,27 +310,27 @@ mod tests { fn session_change_should_work() { with_externalities(&mut new_test_ext(), || { // Block 1: No change - >::set_block_number(1); - >::check_rotate_session(); - assert_eq!(>::authorities(), vec![1, 2, 3]); + System::set_block_number(1); + Session::check_rotate_session(); + assert_eq!(Consensus::authorities(), vec![1, 2, 3]); // Block 2: Session rollover, but no change. - >::set_block_number(2); - >::check_rotate_session(); - assert_eq!(>::authorities(), vec![1, 2, 3]); + System::set_block_number(2); + Session::check_rotate_session(); + assert_eq!(Consensus::authorities(), vec![1, 2, 3]); // Block 3: Set new key for validator 2; no visible change. - >::set_block_number(3); - >::set_key(&2, 5); - assert_eq!(>::authorities(), vec![1, 2, 3]); + System::set_block_number(3); + Session::set_key(&2, 5); + assert_eq!(Consensus::authorities(), vec![1, 2, 3]); - >::check_rotate_session(); - assert_eq!(>::authorities(), vec![1, 2, 3]); + Session::check_rotate_session(); + assert_eq!(Consensus::authorities(), vec![1, 2, 3]); // Block 4: Session rollover, authority 2 changes. - >::set_block_number(4); - >::check_rotate_session(); - assert_eq!(>::authorities(), vec![1, 5, 3]); + System::set_block_number(4); + Session::check_rotate_session(); + assert_eq!(Consensus::authorities(), vec![1, 5, 3]); }); } } diff --git a/substrate/runtime/staking/Cargo.toml b/substrate/runtime/staking/Cargo.toml index b046b97dd07f1..75350d1319bed 100644 --- a/substrate/runtime/staking/Cargo.toml +++ b/substrate/runtime/staking/Cargo.toml @@ -14,6 +14,7 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } substrate-runtime-system = { path = "../system", default_features = false } substrate-runtime-session = { path = "../session", default_features = false } diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 5c46f37173ddc..2a5d8ddd7c0be 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -20,13 +20,13 @@ #[cfg(feature = "std")] extern crate serde; -#[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; - extern crate substrate_codec as codec; +extern crate substrate_primitives; #[cfg_attr(feature = "std", macro_use)] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_session as session; extern crate substrate_runtime_system as system; @@ -303,8 +303,8 @@ impl Module { >::put(&(>::get() + One::one())); // Enact era length change. - if let Some(next_spe) = >::get() { - if next_spe != >::get() { + if let Some(next_spe) = Self::next_sessions_per_era() { + if next_spe != Self::sessions_per_era() { >::put(&next_spe); >::put(&>::block_number()); } @@ -332,7 +332,7 @@ impl Module { /// Hook to be called after to transaction processing. fn check_new_era() { // check block number and call new_era if necessary. - if (>::block_number() - >::get()) % Self::era_length() == Zero::zero() { + if (>::block_number() - Self::last_era_length_change()) % Self::era_length() == Zero::zero() { Self::new_era(); } } @@ -592,16 +592,15 @@ pub struct TestingConfig { } #[cfg(any(feature = "std", test))] -impl TestingConfig where T::AccountId: From { +impl TestingConfig where T::AccountId: From { pub fn simple() -> Self { use primitives::As; - use keyring::Keyring::*; TestingConfig { sessions_per_era: T::BlockNumber::sa(2), current_era: T::BlockNumber::sa(0), - balances: vec![(T::AccountId::from(Alice), T::Balance::sa(111))], - intentions: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], - validator_count: 3u64, + balances: vec![(T::AccountId::from(1), T::Balance::sa(111))], + intentions: vec![T::AccountId::from(1), T::AccountId::from(2), T::AccountId::from(3)], + validator_count: 3, bonding_duration: T::BlockNumber::sa(0), transaction_fee: T::Balance::sa(0), } @@ -609,21 +608,20 @@ impl TestingConfig where T::AccountId: From { pub fn extended() -> Self { use primitives::As; - use keyring::Keyring::*; TestingConfig { sessions_per_era: T::BlockNumber::sa(3), current_era: T::BlockNumber::sa(1), balances: vec![ - (T::AccountId::from(Alice), T::Balance::sa(10)), - (T::AccountId::from(Bob), T::Balance::sa(20)), - (T::AccountId::from(Charlie), T::Balance::sa(30)), - (T::AccountId::from(Dave), T::Balance::sa(40)), - (T::AccountId::from(Eve), T::Balance::sa(50)), - (T::AccountId::from(Ferdie), T::Balance::sa(60)), - (T::AccountId::from(One), T::Balance::sa(1)) + (T::AccountId::from(1), T::Balance::sa(10)), + (T::AccountId::from(2), T::Balance::sa(20)), + (T::AccountId::from(3), T::Balance::sa(30)), + (T::AccountId::from(4), T::Balance::sa(40)), + (T::AccountId::from(5), T::Balance::sa(50)), + (T::AccountId::from(6), T::Balance::sa(60)), + (T::AccountId::from(7), T::Balance::sa(1)) ], - intentions: vec![T::AccountId::from(Alice), T::AccountId::from(Bob), T::AccountId::from(Charlie)], - validator_count: 3u64, + intentions: vec![T::AccountId::from(1), T::AccountId::from(2), T::AccountId::from(3)], + validator_count: 3, bonding_duration: T::BlockNumber::sa(0), transaction_fee: T::Balance::sa(1), } @@ -670,328 +668,347 @@ impl primitives::MakeTestExternalities for TestingConfig { r } } -/* + #[cfg(test)] mod tests { use super::*; - use super::internal::*; - use super::privileged::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use runtime::{staking, session}; - use runtime_support::PrivPass; - use runtime::staking::public::{Call, Dispatch}; - use runtime::staking::privileged::{Call as PCall, Dispatch as PDispatch}; + use runtime_io::with_externalities; + use substrate_primitives::H256; + use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::testing::{Digest, Header}; + + pub struct Test; + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl session::Trait for Test { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; + } + impl Trait for Test { + type Balance = u64; + type DetermineContractAddress = DummyContractAddressFor; + } + + fn new_test_ext(session_length: u64, sessions_per_era: u64, current_era: u64, monied: bool) -> runtime_io::TestExternalities { + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(consensus::TestingConfig::{ + authorities: vec![], + }.test_externalities()); + t.extend(session::TestingConfig::{ + session_length, + validators: vec![10, 20], + }.test_externalities()); + t.extend(TestingConfig::{ + sessions_per_era, + current_era, + balances: if monied { vec![(1, 10), (2, 20), (3, 30), (4, 40)] } else { vec![] }, + intentions: vec![], + validator_count: 2, + bonding_duration: 3, + transaction_fee: 0, + }.test_externalities()); + t + } + + type System = system::Module; + type Session = session::Module; + type Staking = Module; #[test] fn staking_should_work() { - let mut t: TestExternalities = map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), - twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), - twox_128(BondingDuration::key()).to_vec() => vec![].and(&3u64), - twox_128(TotalStake::key()).to_vec() => vec![].and(&100u64), - twox_128(TransactionFee::key()).to_vec() => vec![].and(&0u64), - twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![].and(&10u64), - twox_128(&FreeBalance::key_for(*Bob)).to_vec() => vec![].and(&20u64), - twox_128(&FreeBalance::key_for(*Charlie)).to_vec() => vec![].and(&30u64), - twox_128(&FreeBalance::key_for(*Dave)).to_vec() => vec![].and(&40u64) - ]; - - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(>::get(), 2); - assert_eq!(>::get(), 3); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); + with_externalities(&mut new_test_ext(1, 2, 0, true), || { + assert_eq!(Staking::era_length(), 2); + assert_eq!(Staking::validator_count(), 2); + assert_eq!(Staking::bonding_duration(), 3); + assert_eq!(Session::validators(), vec![10, 20]); // Block 1: Add three validators. No obvious change. - system::testing::set_block_number(1); - public::Call::stake().dispatch(public_pass_from_payment(&Alice)); - public_pass_from_payment(&Bob).stake(); - public_pass_from_payment(&Dave).stake(); - check_new_era(); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); + System::set_block_number(1); + Staking::stake(&1); + Staking::stake(&2); + Staking::stake(&4); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![10, 20]); // Block 2: New validator set now. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(session::validators(), vec![Dave.to_raw_public(), Bob.into()]); + System::set_block_number(2); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![4, 2]); // Block 3: Unstake highest, introduce another staker. No change yet. - system::testing::set_block_number(3); - public_pass_from_payment(&Charlie).stake(); - public_pass_from_payment(&Dave).unstake(); - check_new_era(); + System::set_block_number(3); + Staking::stake(&3); + Staking::unstake(&4); + Staking::check_new_era(); // Block 4: New era - validators change. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(session::validators(), vec![Charlie.to_raw_public(), Bob.into()]); + System::set_block_number(4); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![3, 2]); // Block 5: Transfer stake from highest to lowest. No change yet. - system::testing::set_block_number(5); - public_pass_from_payment(&Dave).transfer(Alice.to_raw_public(), 40); - check_new_era(); + System::set_block_number(5); + Staking::transfer(&4, 1, 40); + Staking::check_new_era(); // Block 6: Lowest now validator. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); + System::set_block_number(6); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![1, 3]); // Block 7: Unstake three. No change yet. - system::testing::set_block_number(7); - public_pass_from_payment(&Charlie).unstake(); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); + System::set_block_number(7); + Staking::unstake(&3); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![1, 3]); // Block 8: Back to one and two. - system::testing::set_block_number(8); - check_new_era(); - assert_eq!(session::validators(), vec![Alice.to_raw_public(), Bob.into()]); + System::set_block_number(8); + Staking::check_new_era(); + assert_eq!(Session::validators(), vec![1, 2]); }); } #[test] fn staking_eras_work() { - let mut t: TestExternalities = map![ - twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), - twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), - twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), - twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64) - ]; - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(>::get(), 2u64); - assert_eq!(>::get(), 0u64); - assert_eq!(>::get(), 0u64); + with_externalities(&mut new_test_ext(1, 2, 0, true), || { + assert_eq!(Staking::era_length(), 2); + assert_eq!(Staking::sessions_per_era(), 2); + assert_eq!(Staking::last_era_length_change(), 0); + assert_eq!(Staking::current_era(), 0); // Block 1: No change. - system::testing::set_block_number(1); - check_new_era(); - assert_eq!(>::get(), 2u64); - assert_eq!(>::get(), 0u64); - assert_eq!(>::get(), 0u64); + System::set_block_number(1); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 2); + assert_eq!(Staking::last_era_length_change(), 0); + assert_eq!(Staking::current_era(), 0); // Block 2: Simple era change. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(>::get(), 2u64); - assert_eq!(>::get(), 0u64); - assert_eq!(>::get(), 1u64); + System::set_block_number(2); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 2); + assert_eq!(Staking::last_era_length_change(), 0); + assert_eq!(Staking::current_era(), 1); // Block 3: Schedule an era length change; no visible changes. - system::testing::set_block_number(3); - PrivPass::test().set_sessions_per_era(3); - check_new_era(); - assert_eq!(>::get(), 2u64); - assert_eq!(>::get(), 0u64); - assert_eq!(>::get(), 1u64); + System::set_block_number(3); + Staking::set_sessions_per_era(3); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 2); + assert_eq!(Staking::last_era_length_change(), 0); + assert_eq!(Staking::current_era(), 1); // Block 4: Era change kicks in. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(>::get(), 3u64); - assert_eq!(>::get(), 4u64); - assert_eq!(>::get(), 2u64); + System::set_block_number(4); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 3); + assert_eq!(Staking::last_era_length_change(), 4); + assert_eq!(Staking::current_era(), 2); // Block 5: No change. - system::testing::set_block_number(5); - check_new_era(); - assert_eq!(>::get(), 3u64); - assert_eq!(>::get(), 4u64); - assert_eq!(>::get(), 2u64); + System::set_block_number(5); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 3); + assert_eq!(Staking::last_era_length_change(), 4); + assert_eq!(Staking::current_era(), 2); // Block 6: No change. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(>::get(), 3u64); - assert_eq!(>::get(), 4u64); - assert_eq!(>::get(), 2u64); + System::set_block_number(6); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 3); + assert_eq!(Staking::last_era_length_change(), 4); + assert_eq!(Staking::current_era(), 2); // Block 7: Era increment. - system::testing::set_block_number(7); - check_new_era(); - assert_eq!(>::get(), 3u64); - assert_eq!(>::get(), 4u64); - assert_eq!(>::get(), 3u64); + System::set_block_number(7); + Staking::check_new_era(); + assert_eq!(Staking::sessions_per_era(), 3); + assert_eq!(Staking::last_era_length_change(), 4); + assert_eq!(Staking::current_era(), 3); }); } #[test] fn staking_balance_works() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 42); - assert_eq!(>::get(*Alice), 42); - assert_eq!(>::get(*Alice), 0); - assert_eq!(balance(&Alice), 42); - assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 0); - assert_eq!(balance(&Bob), 0); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 42); + assert_eq!(Staking::free_balance(&1), 42); + assert_eq!(Staking::reserved_balance(&1), 0); + assert_eq!(Staking::balance(&1), 42); + assert_eq!(Staking::free_balance(&2), 0); + assert_eq!(Staking::reserved_balance(&2), 0); + assert_eq!(Staking::balance(&2), 0); }); } #[test] fn staking_balance_transfer_works() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 112); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); - assert_eq!(balance(&Alice), 42); - assert_eq!(balance(&Bob), 69); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::transfer(&1, 2, 69); + assert_eq!(Staking::balance(&1), 42); + assert_eq!(Staking::balance(&2), 69); }); } #[test] #[should_panic] fn staking_balance_transfer_when_bonded_panics() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - public_pass_from_payment(&Alice).stake(); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::stake(&1); + Staking::transfer(&1, 2, 69); }); } #[test] fn reserving_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); - assert_eq!(balance(&Alice), 111); - assert_eq!(>::get(*Alice), 111); - assert_eq!(>::get(*Alice), 0); + assert_eq!(Staking::balance(&1), 111); + assert_eq!(Staking::free_balance(&1), 111); + assert_eq!(Staking::reserved_balance(&1), 0); - reserve_balance(&Alice, 69); + Staking::reserve_balance(&1, 69); - assert_eq!(balance(&Alice), 111); - assert_eq!(>::get(*Alice), 42); - assert_eq!(>::get(*Alice), 69); + assert_eq!(Staking::balance(&1), 111); + assert_eq!(Staking::free_balance(&1), 42); + assert_eq!(Staking::reserved_balance(&1), 69); }); } #[test] #[should_panic] fn staking_balance_transfer_when_reserved_panics() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 69); - public_pass_from_payment(&Alice).transfer(Bob.to_raw_public(), 69); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 69); + Staking::transfer(&1, 2, 69); }); } #[test] fn deducting_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - assert!(deduct_unbonded(&Alice, 69)); - assert_eq!(>::get(*Alice), 42); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + assert!(Staking::deduct_unbonded(&1, 69)); + assert_eq!(Staking::free_balance(&1), 42); }); } #[test] fn deducting_balance_should_fail_when_bonded() { - let mut t: TestExternalities = map![ - twox_128(&FreeBalance::key_for(*Alice)).to_vec() => vec![].and(&111u64), - twox_128(&Bondage::key_for(*Alice)).to_vec() => vec![].and(&2u64) - ]; - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(unlock_block(&Alice), LockStatus::LockedUntil(2)); - assert!(!deduct_unbonded(&Alice, 69)); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + >::insert(1, 2); + System::set_block_number(1); + assert_eq!(Staking::unlock_block(&1), LockStatus::LockedUntil(2)); + assert!(!Staking::deduct_unbonded(&1, 69)); }); } #[test] fn refunding_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 42); - refund(&Alice, 69); - assert_eq!(>::get(*Alice), 111); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 42); + Staking::refund(&1, 69); + assert_eq!(Staking::free_balance(&1), 111); }); } #[test] fn slashing_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 69); - assert!(slash(&Alice, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 42); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 69); + assert!(Staking::slash(&1, 69)); + assert_eq!(Staking::free_balance(&1), 0); + assert_eq!(Staking::reserved_balance(&1), 42); }); } #[test] fn slashing_incomplete_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 42); - reserve_balance(&Alice, 21); - assert!(!slash(&Alice, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 0); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 42); + Staking::reserve_balance(&1, 21); + assert!(!Staking::slash(&1, 69)); + assert_eq!(Staking::free_balance(&1), 0); + assert_eq!(Staking::reserved_balance(&1), 0); }); } #[test] fn unreserving_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 111); - unreserve_balance(&Alice, 42); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 42); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 111); + Staking::unreserve_balance(&1, 42); + assert_eq!(Staking::reserved_balance(&1), 69); + assert_eq!(Staking::free_balance(&1), 42); }); } #[test] fn slashing_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 111); - assert!(slash_reserved(&Alice, 42)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 111); + assert!(Staking::slash_reserved(&1, 42)); + assert_eq!(Staking::reserved_balance(&1), 69); + assert_eq!(Staking::free_balance(&1), 0); }); } #[test] fn slashing_incomplete_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 42); - assert!(!slash_reserved(&Alice, 69)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 42); + assert!(!Staking::slash_reserved(&1, 69)); + assert_eq!(Staking::free_balance(&1), 69); + assert_eq!(Staking::reserved_balance(&1), 0); }); } #[test] fn transferring_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 111); - assert!(transfer_reserved_balance(&Alice, &Bob, 42)); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 42); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 111); + assert!(Staking::transfer_reserved_balance(&1, &2, 42)); + assert_eq!(Staking::reserved_balance(&1), 69); + assert_eq!(Staking::free_balance(&1), 0); + assert_eq!(Staking::reserved_balance(&2), 0); + assert_eq!(Staking::free_balance(&2), 42); }); } #[test] fn transferring_incomplete_reserved_balance_should_work() { - with_externalities(&mut testing::externalities(1, 3, 1), || { - >::insert(*Alice, 111); - reserve_balance(&Alice, 42); - assert!(!transfer_reserved_balance(&Alice, &Bob, 69)); - assert_eq!(>::get(*Alice), 0); - assert_eq!(>::get(*Alice), 69); - assert_eq!(>::get(*Bob), 0); - assert_eq!(>::get(*Bob), 42); + with_externalities(&mut new_test_ext(1, 3, 1, false), || { + >::insert(1, 111); + Staking::reserve_balance(&1, 42); + assert!(!Staking::transfer_reserved_balance(&1, &2, 69)); + assert_eq!(Staking::reserved_balance(&1), 0); + assert_eq!(Staking::free_balance(&1), 69); + assert_eq!(Staking::reserved_balance(&2), 0); + assert_eq!(Staking::free_balance(&2), 42); }); } } -*/ From bbf9f6f6b71c64de0f5efca6416cb0acf1a3a6ea Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:11:12 +0900 Subject: [PATCH 54/76] Fix up democracy tests. --- Cargo.lock | 1 + substrate/runtime/democracy/Cargo.toml | 2 + substrate/runtime/democracy/src/lib.rs | 375 ++++++++++++++----------- substrate/runtime/staking/src/lib.rs | 18 +- 4 files changed, 229 insertions(+), 167 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7401491e409cd..6f73f73bd4556 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1814,6 +1814,7 @@ dependencies = [ "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", "substrate-runtime-session 0.1.0", diff --git a/substrate/runtime/democracy/Cargo.toml b/substrate/runtime/democracy/Cargo.toml index 92ee4f32ee221..74007bb9e06d2 100644 --- a/substrate/runtime/democracy/Cargo.toml +++ b/substrate/runtime/democracy/Cargo.toml @@ -13,6 +13,7 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } substrate-runtime-session = { path = "../session", default_features = false } substrate-runtime-staking = { path = "../staking", default_features = false } substrate-runtime-system = { path = "../system", default_features = false } @@ -28,6 +29,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-primitives/std", + "substrate-runtime-consensus/std", "substrate-runtime-session/std", "substrate-runtime-staking/std", "substrate-runtime-system/std", diff --git a/substrate/runtime/democracy/src/lib.rs b/substrate/runtime/democracy/src/lib.rs index 7b90f71f2c12a..fb0f5654de8c9 100644 --- a/substrate/runtime/democracy/src/lib.rs +++ b/substrate/runtime/democracy/src/lib.rs @@ -21,10 +21,12 @@ #[cfg(feature = "std")] extern crate serde; extern crate substrate_codec as codec; +#[cfg(feature = "std")] extern crate substrate_primitives; #[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; extern crate substrate_runtime_system as system; @@ -293,7 +295,7 @@ impl TestingConfig { } } -#[cfg(any(feature = "std", test))] +#[cfg(any(feature = "std", test))] impl Default for TestingConfig { fn default() -> Self { TestingConfig { @@ -318,107 +320,170 @@ impl primitives::MakeTestExternalities for TestingConfig ] } } -/* + #[cfg(test)] mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use dispatch::PrivCall as T::Proposal; - use runtime_support::PublicPass; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; - use runtime::{staking, session, democracy}; - - fn new_test_ext() -> TestExternalities { - testing::externalities() + use runtime_io::with_externalities; + use substrate_primitives::H256; + use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::testing::{Digest, Header}; + + impl_outer_dispatch! { + pub enum Proposal { + Staking = 0, + Democracy = 1, + } } + impl IsCancelReferendum for Proposal { + fn is_cancel_referendum(&self) -> Option { + if let &Proposal::Democracy(PrivCall::cancel_referendum(ref ref_index)) = self { + Some(*ref_index) + } else { + None + } + } + } + + pub struct Test; + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl session::Trait for Test { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; + } + impl staking::Trait for Test { + type Balance = u64; + type DetermineContractAddress = staking::DummyContractAddressFor; + } + impl Trait for Test { + type Proposal = Proposal; + } + + fn new_test_ext() -> runtime_io::TestExternalities { + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(consensus::TestingConfig::{ + authorities: vec![], + }.test_externalities()); + t.extend(session::TestingConfig::{ + session_length: 1, //??? or 2? + validators: vec![10, 20], + }.test_externalities()); + t.extend(staking::TestingConfig::{ + sessions_per_era: 1, + current_era: 0, + balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], + intentions: vec![], + validator_count: 2, + bonding_duration: 3, + transaction_fee: 0, + }.test_externalities()); + t.extend(TestingConfig::{ + launch_period: 1, + voting_period: 1, + minimum_deposit: 1, + }.test_externalities()); + t + } + + type System = system::Module; + type Session = session::Module; + type Staking = staking::Module; + type Democracy = Module; #[test] fn params_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(launch_period(), 1u64); - assert_eq!(voting_period(), 1u64); - assert_eq!(minimum_deposit(), 1u64); - assert_eq!(referendum_count(), 0u32); - assert_eq!(staking::sessions_per_era(), 1u64); - assert_eq!(staking::total_stake(), 210u64); + assert_eq!(Democracy::launch_period(), 1); + assert_eq!(Democracy::voting_period(), 1); + assert_eq!(Democracy::minimum_deposit(), 1); + assert_eq!(Democracy::referendum_count(), 0); + assert_eq!(Staking::sessions_per_era(), 1); + assert_eq!(Staking::total_stake(), 210); }); } - // TODO: test VoteThreshold - - fn propose_sessions_per_era(who: &AccountId, value: u64, locked: T::Balance) { - PublicPass::test(who). - propose(Box::new(T::Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value))), locked); + fn propose_sessions_per_era(who: u64, value: u64, locked: u64) { + Democracy::propose(&who, Box::new(Proposal::Staking(staking::PrivCall::set_sessions_per_era(value))), locked); } #[test] fn locked_for_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 2u64); - propose_sessions_per_era(&Alice, 4, 4u64); - propose_sessions_per_era(&Alice, 3, 3u64); - assert_eq!(locked_for(0), Some(2)); - assert_eq!(locked_for(1), Some(4)); - assert_eq!(locked_for(2), Some(3)); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 2); + propose_sessions_per_era(1, 4, 4); + propose_sessions_per_era(1, 3, 3); + assert_eq!(Democracy::locked_for(0), Some(2)); + assert_eq!(Democracy::locked_for(1), Some(4)); + assert_eq!(Democracy::locked_for(2), Some(3)); }); } #[test] fn single_proposal_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 1u64); - democracy::internal::end_block(system::block_number()); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 1); + Democracy::end_block(System::block_number()); - system::testing::set_block_number(2); + System::set_block_number(2); let r = 0; - PublicPass::test(&Alice).vote(r, true); + Democracy::vote(&1, r, true); - assert_eq!(referendum_count(), 1); - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(true)); - assert_eq!(tally(r), (10, 0)); + assert_eq!(Democracy::referendum_count(), 1); + assert_eq!(Democracy::voters_for(r), vec![1]); + assert_eq!(Democracy::vote_of((r, 1)), Some(true)); + assert_eq!(Democracy::tally(r), (10, 0)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 2u64); + assert_eq!(Staking::era_length(), 2); }); } #[test] fn deposit_for_proposals_should_be_taken() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 5u64); - PublicPass::test(&Bob).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - assert_eq!(staking::balance(&Alice), 5u64); - assert_eq!(staking::balance(&Bob), 15u64); - assert_eq!(staking::balance(&Eve), 35u64); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 5); + Democracy::second(&2, 0); + Democracy::second(&5, 0); + Democracy::second(&5, 0); + Democracy::second(&5, 0); + assert_eq!(Staking::balance(&1), 5); + assert_eq!(Staking::balance(&2), 15); + assert_eq!(Staking::balance(&5), 35); }); } #[test] fn deposit_for_proposals_should_be_returned() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 5u64); - PublicPass::test(&Bob).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - PublicPass::test(&Eve).second(0); - democracy::internal::end_block(system::block_number()); - assert_eq!(staking::balance(&Alice), 10u64); - assert_eq!(staking::balance(&Bob), 20u64); - assert_eq!(staking::balance(&Eve), 50u64); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 5); + Democracy::second(&2, 0); + Democracy::second(&5, 0); + Democracy::second(&5, 0); + Democracy::second(&5, 0); + Democracy::end_block(System::block_number()); + assert_eq!(Staking::balance(&1), 10); + assert_eq!(Staking::balance(&2), 20); + assert_eq!(Staking::balance(&5), 50); }); } @@ -426,8 +491,8 @@ mod tests { #[should_panic] fn proposal_with_deposit_below_minimum_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 0u64); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 0); }); } @@ -435,8 +500,8 @@ mod tests { #[should_panic] fn poor_proposer_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Alice, 2, 11u64); + System::set_block_number(1); + propose_sessions_per_era(1, 2, 11); }); } @@ -444,160 +509,156 @@ mod tests { #[should_panic] fn poor_seconder_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - propose_sessions_per_era(&Bob, 2, 11u64); - PublicPass::test(&Alice).second(0); + System::set_block_number(1); + propose_sessions_per_era(2, 2, 11); + Democracy::second(&1, 0); }); } - fn propose_bonding_duration(who: &AccountId, value: u64, locked: T::Balance) { - PublicPass::test(who). - propose(Box::new(T::Proposal::Staking(staking::privileged::Call::set_bonding_duration(value))), locked); + fn propose_bonding_duration(who: u64, value: u64, locked: u64) { + Democracy::propose(&who, Box::new(Proposal::Staking(staking::PrivCall::set_bonding_duration(value))), locked); } #[test] fn runners_up_should_come_after() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(0); - propose_bonding_duration(&Alice, 2, 2u64); - propose_bonding_duration(&Alice, 4, 4u64); - propose_bonding_duration(&Alice, 3, 3u64); - democracy::internal::end_block(system::block_number()); - - system::testing::set_block_number(1); - PublicPass::test(&Alice).vote(0, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 4u64); - - system::testing::set_block_number(2); - PublicPass::test(&Alice).vote(1, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 3u64); - - system::testing::set_block_number(3); - PublicPass::test(&Alice).vote(2, true); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); - assert_eq!(staking::bonding_duration(), 2u64); + System::set_block_number(0); + propose_bonding_duration(1, 2, 2); + propose_bonding_duration(1, 4, 4); + propose_bonding_duration(1, 3, 3); + Democracy::end_block(System::block_number()); + + System::set_block_number(1); + Democracy::vote(&1, 0, true); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); + assert_eq!(Staking::bonding_duration(), 4); + + System::set_block_number(2); + Democracy::vote(&1, 1, true); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); + assert_eq!(Staking::bonding_duration(), 3); + + System::set_block_number(3); + Democracy::vote(&1, 2, true); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); + assert_eq!(Staking::bonding_duration(), 2); }); } - fn sessions_per_era_propsal(value: u64) -> T::Proposal { - T::Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) + fn sessions_per_era_propsal(value: u64) -> Proposal { + Proposal::Staking(staking::PrivCall::set_sessions_per_era(value)) } #[test] fn simple_passing_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&1, r, true); - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(true)); - assert_eq!(tally(r), (10, 0)); + assert_eq!(Democracy::voters_for(r), vec![1]); + assert_eq!(Democracy::vote_of((r, 1)), Some(true)); + assert_eq!(Democracy::tally(r), (10, 0)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 2u64); + assert_eq!(Staking::era_length(), 2); }); } #[test] fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); - PrivPass::test().cancel_referendum(r); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&1, r, true); + Democracy::cancel_referendum(r); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 1u64); + assert_eq!(Staking::era_length(), 1); }); } #[test] fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, false); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&1, r, false); - assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((r, *Alice)), Some(false)); - assert_eq!(tally(r), (0, 10)); + assert_eq!(Democracy::voters_for(r), vec![1]); + assert_eq!(Democracy::vote_of((r, 1)), Some(false)); + assert_eq!(Democracy::tally(r), (0, 10)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 1u64); + assert_eq!(Staking::era_length(), 1); }); } #[test] fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Alice).vote(r, true); - PublicPass::test(&Bob).vote(r, false); - PublicPass::test(&Charlie).vote(r, false); - PublicPass::test(&Dave).vote(r, true); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&1, r, true); + Democracy::vote(&2, r, false); + Democracy::vote(&3, r, false); + Democracy::vote(&4, r, true); + Democracy::vote(&5, r, false); + Democracy::vote(&6, r, true); - assert_eq!(tally(r), (110, 100)); + assert_eq!(Democracy::tally(r), (110, 100)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 2u64); + assert_eq!(Staking::era_length(), 2); }); } #[test] fn controversial_low_turnout_voting_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&5, r, false); + Democracy::vote(&6, r, true); - assert_eq!(tally(r), (60, 50)); + assert_eq!(Democracy::tally(r), (60, 50)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 1u64); + assert_eq!(Staking::era_length(), 1); }); } #[test] fn passing_low_turnout_voting_should_work() { with_externalities(&mut new_test_ext(), || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::total_stake(), 210u64); + assert_eq!(Staking::era_length(), 1); + assert_eq!(Staking::total_stake(), 210); - system::testing::set_block_number(1); - let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); - PublicPass::test(&Dave).vote(r, true); - PublicPass::test(&Eve).vote(r, false); - PublicPass::test(&Ferdie).vote(r, true); + System::set_block_number(1); + let r = Democracy::inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + Democracy::vote(&4, r, true); + Democracy::vote(&5, r, false); + Democracy::vote(&6, r, true); - assert_eq!(tally(r), (100, 50)); + assert_eq!(Democracy::tally(r), (100, 50)); - democracy::internal::end_block(system::block_number()); - staking::internal::check_new_era(); + Democracy::end_block(System::block_number()); + Staking::check_new_era(); - assert_eq!(staking::era_length(), 2u64); + assert_eq!(Staking::era_length(), 2); }); } } - - -*/ diff --git a/substrate/runtime/staking/src/lib.rs b/substrate/runtime/staking/src/lib.rs index 2a5d8ddd7c0be..8e648523ed5be 100644 --- a/substrate/runtime/staking/src/lib.rs +++ b/substrate/runtime/staking/src/lib.rs @@ -294,6 +294,14 @@ impl Module { slash == value } + /// Hook to be called after to transaction processing. + pub fn check_new_era() { + // check block number and call new_era if necessary. + if (>::block_number() - Self::last_era_length_change()) % Self::era_length() == Zero::zero() { + Self::new_era(); + } + } + /// The era has changed - enact new staking set. /// /// NOTE: This always happens immediately before a session change to ensure that new validators @@ -326,16 +334,6 @@ impl Module { .collect::>() ); } - - // NON-PUBLIC - - /// Hook to be called after to transaction processing. - fn check_new_era() { - // check block number and call new_era if necessary. - if (>::block_number() - Self::last_era_length_change()) % Self::era_length() == Zero::zero() { - Self::new_era(); - } - } } impl Executable for Module { From bd7826774289dff26fc11055c0a84bc94d678c8c Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 09:29:54 +0900 Subject: [PATCH 55/76] First few tests in council. --- Cargo.lock | 1 + substrate/runtime/council/Cargo.toml | 2 + substrate/runtime/council/src/lib.rs | 879 ++++++++++++++------------- 3 files changed, 473 insertions(+), 409 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f73f73bd4556..066d82996125d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1795,6 +1795,7 @@ dependencies = [ "substrate-codec 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", "substrate-runtime-democracy 0.1.0", "substrate-runtime-io 0.1.0", "substrate-runtime-primitives 0.1.0", diff --git a/substrate/runtime/council/Cargo.toml b/substrate/runtime/council/Cargo.toml index 449e6bc34e0c8..e3a5fe93e13de 100644 --- a/substrate/runtime/council/Cargo.toml +++ b/substrate/runtime/council/Cargo.toml @@ -15,6 +15,7 @@ substrate-runtime-std = { path = "../../runtime-std", default_features = false } substrate-runtime-io = { path = "../../runtime-io", default_features = false } substrate-runtime-support = { path = "../../runtime-support", default_features = false } substrate-runtime-primitives = { path = "../primitives", default_features = false } +substrate-runtime-consensus = { path = "../consensus", default_features = false } substrate-runtime-democracy = { path = "../democracy", default_features = false } substrate-runtime-session = { path = "../session", default_features = false } substrate-runtime-staking = { path = "../staking", default_features = false } @@ -32,6 +33,7 @@ std = [ "substrate-runtime-io/std", "substrate-runtime-support/std", "substrate-runtime-primitives/std", + "substrate-runtime-consensus/std", "substrate-runtime-democracy/std", "substrate-runtime-session/std", "substrate-runtime-staking/std", diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index a275d5bb09565..102daa02d6be4 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -22,11 +22,13 @@ extern crate integer_sqrt; extern crate substrate_codec as codec; +extern crate substrate_primitives; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; #[macro_use] extern crate substrate_runtime_std as rstd; extern crate substrate_runtime_io as runtime_io; #[macro_use] extern crate substrate_runtime_support as runtime_support; extern crate substrate_runtime_primitives as primitives; +extern crate substrate_runtime_consensus as consensus; extern crate substrate_runtime_democracy as democracy; extern crate substrate_runtime_session as session; extern crate substrate_runtime_staking as staking; @@ -543,7 +545,7 @@ impl TestingConfig { } } -#[cfg(any(feature = "std", test))] +#[cfg(any(feature = "std", test))] impl Default for TestingConfig { fn default() -> Self { TestingConfig { @@ -583,110 +585,169 @@ impl primitives::MakeTestExternalities for TestingConfig } } -/* -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use codec::Joiner; - use runtime::democracy; - - pub fn externalities() -> TestExternalities { - let extras: TestExternalities = map![ - twox_128(CandidacyBond::key()).to_vec() => vec![].and(&9u64), - twox_128(VotingBond::key()).to_vec() => vec![].and(&3u64), - twox_128(PresentSlashPerVoter::key()).to_vec() => vec![].and(&1u64), - twox_128(CarryCount::key()).to_vec() => vec![].and(&2u32), - twox_128(PresentationDuration::key()).to_vec() => vec![].and(&2u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&4u64), - twox_128(TermDuration::key()).to_vec() => vec![].and(&5u64), - twox_128(DesiredSeats::key()).to_vec() => vec![].and(&2u32), - twox_128(InactiveGracePeriod::key()).to_vec() => vec![].and(&1u32) - ]; - democracy::testing::externalities() - .into_iter().chain(extras.into_iter()).collect() - } -} - #[cfg(test)] mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::*; - use demo_primitives::AccountId; - use runtime::{staking, session, democracy}; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; + use runtime_io::with_externalities; + use substrate_primitives::H256; + use primitives::{HasPublicAux, Identity, MakeTestExternalities}; + use primitives::testing::{Digest, Header}; + + impl_outer_dispatch! { + pub enum Proposal { + Staking = 0, + Democracy = 1, + } + } + impl democracy::IsCancelReferendum for Proposal { + fn is_cancel_referendum(&self) -> Option { + if let &Proposal::Democracy(democracy::PrivCall::cancel_referendum(ref ref_index)) = self { + Some(*ref_index) + } else { + None + } + } + } - fn new_test_ext() -> TestExternalities { - testing::externalities() + pub struct Test; + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl session::Trait for Test { + type PublicAux = ::PublicAux; + type ConvertAccountIdToSessionKey = Identity; + } + impl staking::Trait for Test { + type Balance = u64; + type DetermineContractAddress = staking::DummyContractAddressFor; + } + impl democracy::Trait for Test { + type Proposal = Proposal; + } + impl Trait for Test {} + + fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { + let mut t = system::TestingConfig::::default().test_externalities(); + t.extend(consensus::TestingConfig::{ + authorities: vec![], + }.test_externalities()); + t.extend(session::TestingConfig::{ + session_length: 1, //??? or 2? + validators: vec![10, 20], + }.test_externalities()); + t.extend(staking::TestingConfig::{ + sessions_per_era: 1, + current_era: 0, + balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], + intentions: vec![], + validator_count: 2, + bonding_duration: 3, + transaction_fee: 0, + }.test_externalities()); + t.extend(democracy::TestingConfig::{ + launch_period: 1, + voting_period: 1, + minimum_deposit: 1, + }.test_externalities()); + t.extend(TestingConfig::{ + active_council: if with_council { vec![ + (1, 10), + (2, 10), + (3, 10) + ] } else { vec![] }, + approval_voting_period: 4, + presentation_period: 2, + desired_seats: 2, + term_duration: 5, + cooloff_period: 2, + voting_period: 1, + }.test_externalities()); + t } + type System = system::Module; + type Session = session::Module; + type Staking = staking::Module; + type Democracy = democracy::Module; + type Council = Module; + #[test] - fn basic_environment_works() { - let mut t = new_test_ext(); - with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(next_vote_from(1), 4); - assert_eq!(next_vote_from(4), 4); - assert_eq!(next_vote_from(5), 8); - assert_eq!(vote_index(), 0); - assert_eq!(candidacy_bond(), 9); - assert_eq!(voting_bond(), 3); - assert_eq!(present_slash_per_voter(), 1); - assert_eq!(presentation_duration(), 2); - assert_eq!(voting_period(), 4); - assert_eq!(term_duration(), 5); - assert_eq!(desired_seats(), 2); - assert_eq!(carry_count(), 2); - - assert_eq!(active_council(), vec![]); - assert_eq!(next_tally(), Some(4)); - assert_eq!(presentation_active(), false); - assert_eq!(next_finalise(), None); - - assert_eq!(candidates(), Vec::::new()); - assert_eq!(is_a_candidate(&Alice), false); - assert_eq!(candidate_reg_info(*Alice), None); - - assert_eq!(voters(), Vec::::new()); - assert_eq!(voter_last_active(*Alice), None); - assert_eq!(approvals_of(*Alice), vec![]); + fn params_should_work() { + with_externalities(&mut new_test_ext(false), || { + System::set_block_number(1); + assert_eq!(Council::next_vote_from(1), 4); + assert_eq!(Council::next_vote_from(4), 4); + assert_eq!(Council::next_vote_from(5), 8); + assert_eq!(Council::vote_index(), 0); + assert_eq!(Council::candidacy_bond(), 9); + assert_eq!(Council::voting_bond(), 3); + assert_eq!(Council::present_slash_per_voter(), 1); + assert_eq!(Council::presentation_duration(), 2); + assert_eq!(Council::voting_period(), 4); + assert_eq!(Council::term_duration(), 5); + assert_eq!(Council::desired_seats(), 2); + assert_eq!(Council::carry_count(), 2); + + assert_eq!(Council::active_council(), vec![]); + assert_eq!(Council::next_tally(), Some(4)); + assert_eq!(Council::presentation_active(), false); + assert_eq!(Council::next_finalise(), None); + + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Council::is_a_candidate(&1), false); + assert_eq!(Council::candidate_reg_info(1), None); + + assert_eq!(Council::voters(), Vec::::new()); + assert_eq!(Council::voter_last_active(1), None); + assert_eq!(Council::approvals_of(1), vec![]); }); } #[test] fn simple_candidate_submission_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - assert_eq!(candidate_reg_info(*Alice), None); - assert_eq!(candidate_reg_info(*Bob), None); - assert_eq!(is_a_candidate(&Alice), false); - assert_eq!(is_a_candidate(&Bob), false); - - PublicPass::test(&Alice).submit_candidacy(0); - assert_eq!(candidates(), vec![Alice.to_raw_public()]); - assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(*Bob), None); - assert_eq!(is_a_candidate(&Alice), true); - assert_eq!(is_a_candidate(&Bob), false); - - PublicPass::test(&Bob).submit_candidacy(1); - assert_eq!(candidates(), vec![Alice.to_raw_public(), Bob.into()]); - assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(*Bob), Some((0 as VoteIndex, 1u32))); - assert_eq!(is_a_candidate(&Alice), true); - assert_eq!(is_a_candidate(&Bob), true); + with_externalities(&mut new_test_ext(false), || { + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Council::candidate_reg_info(1), None); + assert_eq!(Council::candidate_reg_info(2), None); + assert_eq!(Council::is_a_candidate(&1), false); + assert_eq!(Council::is_a_candidate(&2), false); + + Council::submit_candidacy(&1, 0); + assert_eq!(Council::candidates(), vec![1]); + assert_eq!(Council::candidate_reg_info(1), Some((0, 0))); + assert_eq!(Council::candidate_reg_info(2), None); + assert_eq!(Council::is_a_candidate(&1), true); + assert_eq!(Council::is_a_candidate(&2), false); + + Council::submit_candidacy(&2, 1); + assert_eq!(Council::candidates(), vec![1, 2]); + assert_eq!(Council::candidate_reg_info(1), Some((0, 0))); + assert_eq!(Council::candidate_reg_info(2), Some((0, 1))); + assert_eq!(Council::is_a_candidate(&1), true); + assert_eq!(Council::is_a_candidate(&2), true); }); } - fn new_test_ext_with_candidate_holes() -> TestExternalities { - let mut t = new_test_ext(); - t.insert(twox_128(Candidates::key()).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()])); - t.insert(twox_128(CandidateCount::key()).to_vec(), vec![].and(&1u32)); - t.insert(twox_128(&RegisterInfoOf::key_for(*Alice)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); + fn new_test_ext_with_candidate_holes() -> runtime_io::TestExternalities { + let mut t = new_test_ext(false); + with_externalities(&mut t, || { + >::put(vec![0, 0, 1]); + >::put(1); + >::insert(1, (0, 2)); + }); t } @@ -695,30 +756,30 @@ mod tests { let mut t = new_test_ext_with_candidate_holes(); with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()]); + System::set_block_number(1); + assert_eq!(Council::candidates(), vec![0, 0, 1]); - PublicPass::test(&Bob).submit_candidacy(1); - assert_eq!(candidates(), vec![AccountId::default(), Bob.into(), Alice.to_raw_public()]); + Council::submit_candidacy(&2, 1); + assert_eq!(Council::candidates(), vec![0, 2, 1]); - PublicPass::test(&Charlie).submit_candidacy(0); - assert_eq!(candidates(), vec![Charlie.into(), Bob.into(), Alice.to_raw_public()]); + Council::submit_candidacy(&3, 0); + assert_eq!(Council::candidates(), vec![3, 2, 1]); }); } - +/* #[test] fn candidate_submission_using_alternative_free_slot_should_work() { let mut t = new_test_ext_with_candidate_holes(); with_externalities(&mut t, || { - system::testing::set_block_number(1); - assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); + System::set_block_number(1); + assert_eq!(Council::candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); - PublicPass::test(&Bob).submit_candidacy(0); - assert_eq!(candidates(), vec![Bob.into(), AccountId::default(), Alice.into()]); + Council::submit_candidacy(&2, 0); + assert_eq!(Council::candidates(), vec![2, AccountId::default(), Alice.into()]); - PublicPass::test(&Charlie).submit_candidacy(1); - assert_eq!(candidates(), vec![Bob.to_raw_public(), Charlie.into(), Alice.into()]); + Council::submit_candidacy(&3, 1); + assert_eq!(Council::candidates(), vec![Bob.to_raw_public(), 3, Alice.into()]); }); } @@ -728,8 +789,8 @@ mod tests { let mut t = new_test_ext_with_candidate_holes(); with_externalities(&mut t, || { - system::testing::set_block_number(1); - PublicPass::test(&Dave).submit_candidacy(3); + System::set_block_number(1); + Council::submit_candidacy(&Dave, 3); }); } @@ -737,9 +798,9 @@ mod tests { #[should_panic(expected = "invalid candidate slot")] fn bad_candidate_slot_submission_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(1); + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + Council::submit_candidacy(&1, 1); }); } @@ -747,10 +808,10 @@ mod tests { #[should_panic(expected = "invalid candidate slot")] fn non_free_candidate_slot_submission_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Bob).submit_candidacy(0); + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + Council::submit_candidacy(&1, 0); + Council::submit_candidacy(&2, 0); }); } @@ -758,10 +819,10 @@ mod tests { #[should_panic(expected = "duplicate candidate submission")] fn dupe_candidate_submission_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Alice).submit_candidacy(1); + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + Council::submit_candidacy(&1, 0); + Council::submit_candidacy(&1, 1); }); } @@ -769,54 +830,54 @@ mod tests { #[should_panic(expected = "candidate has not enough funds")] fn poor_candidate_submission_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(candidates(), Vec::::new()); - PublicPass::test(&One).submit_candidacy(0); + System::set_block_number(1); + assert_eq!(Council::candidates(), Vec::::new()); + Council::submit_candidacy(&One, 0); }); } #[test] fn voting_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + System::set_block_number(1); - PublicPass::test(&Eve).submit_candidacy(0); + Council::submit_candidacy(&Eve, 0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Dave).set_approvals(vec![true], 0); + Council::set_approvals(&1, vec![true], 0); + Council::set_approvals(&Dave, vec![true], 0); - assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(1), vec![true]); assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into()]); + assert_eq!(voters(), vec![1, Dave.into()]); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); + Council::submit_candidacy(&2, 1); + Council::submit_candidacy(&3, 2); - PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); + Council::set_approvals(&2, vec![false, true, true], 0); + Council::set_approvals(&3, vec![false, true, true], 0); - assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(1), vec![true]); assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(2), vec![false, true, true]); assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into(), Bob.into(), Charlie.into()]); + assert_eq!(voters(), vec![1, Dave.into(), 2, 3]); }); } #[test] fn resubmitting_voting_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + System::set_block_number(1); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Dave).set_approvals(vec![true], 0); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Dave, vec![true], 0); assert_eq!(approvals_of(*Dave), vec![true]); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); + Council::submit_candidacy(&2, 1); + Council::submit_candidacy(&3, 2); + Council::set_approvals(&Dave, vec![true, false, true], 0); assert_eq!(approvals_of(*Dave), vec![true, false, true]); }); @@ -825,44 +886,44 @@ mod tests { #[test] fn retracting_voter_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + System::set_block_number(1); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Charlie).submit_candidacy(2); + Council::submit_candidacy(&Eve, 0); + Council::submit_candidacy(&2, 1); + Council::submit_candidacy(&3, 2); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); - PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); + Council::set_approvals(&1, vec![true], 0); + Council::set_approvals(&2, vec![false, true, true], 0); + Council::set_approvals(&3, vec![false, true, true], 0); + Council::set_approvals(&Dave, vec![true, false, true], 0); - assert_eq!(voters(), vec![Alice.to_raw_public(), Bob.into(), Charlie.into(), Dave.into()]); - assert_eq!(approvals_of(*Alice), vec![true]); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(voters(), vec![1, 2, 3, Dave.into()]); + assert_eq!(approvals_of(1), vec![true]); + assert_eq!(approvals_of(2), vec![false, true, true]); assert_eq!(approvals_of(*Charlie), vec![false, true, true]); assert_eq!(approvals_of(*Dave), vec![true, false, true]); - PublicPass::test(&Alice).retract_voter(0); + Council::retract_voter(&1, 0); - assert_eq!(voters(), vec![Dave.to_raw_public(), Bob.into(), Charlie.into()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(voters(), vec![Dave.to_raw_public(), 2, 3]); + assert_eq!(approvals_of(1), Vec::::new()); + assert_eq!(approvals_of(2), vec![false, true, true]); assert_eq!(approvals_of(*Charlie), vec![false, true, true]); assert_eq!(approvals_of(*Dave), vec![true, false, true]); - PublicPass::test(&Bob).retract_voter(1); + Council::retract_voter(&2, 1); - assert_eq!(voters(), vec![Dave.to_raw_public(), Charlie.into()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(voters(), vec![Dave.to_raw_public(), 3]); + assert_eq!(approvals_of(1), Vec::::new()); + assert_eq!(approvals_of(2), Vec::::new()); assert_eq!(approvals_of(*Charlie), vec![false, true, true]); assert_eq!(approvals_of(*Dave), vec![true, false, true]); - PublicPass::test(&Charlie).retract_voter(1); + Council::retract_voter(&3, 1); assert_eq!(voters(), vec![Dave.to_raw_public()]); - assert_eq!(approvals_of(*Alice), Vec::::new()); - assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(approvals_of(1), Vec::::new()); + assert_eq!(approvals_of(2), Vec::::new()); assert_eq!(approvals_of(*Charlie), Vec::::new()); assert_eq!(approvals_of(*Dave), vec![true, false, true]); }); @@ -872,11 +933,11 @@ mod tests { #[should_panic(expected = "retraction index mismatch")] fn invalid_retraction_index_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); - PublicPass::test(&Alice).retract_voter(1); + System::set_block_number(1); + Council::submit_candidacy(&3, 0); + Council::set_approvals(&1, vec![true], 0); + Council::set_approvals(&2, vec![true], 0); + Council::retract_voter(&1, 1); }); } @@ -884,10 +945,10 @@ mod tests { #[should_panic(expected = "retraction index invalid")] fn overflow_retraction_index_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Alice).retract_voter(1); + System::set_block_number(1); + Council::submit_candidacy(&3, 0); + Council::set_approvals(&1, vec![true], 0); + Council::retract_voter(&1, 1); }); } @@ -895,40 +956,40 @@ mod tests { #[should_panic(expected = "cannot retract non-voter")] fn non_voter_retraction_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - PublicPass::test(&Charlie).submit_candidacy(0); - PublicPass::test(&Alice).set_approvals(vec![true], 0); - PublicPass::test(&Bob).retract_voter(0); + System::set_block_number(1); + Council::submit_candidacy(&3, 0); + Council::set_approvals(&1, vec![true], 0); + Council::retract_voter(&2, 0); }); } #[test] fn simple_tally_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); + System::set_block_number(4); assert!(!presentation_active()); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + Council::submit_candidacy(&2, 0); + Council::submit_candidacy(&Eve, 1); + Council::set_approvals(&2, vec![true, false], 0); + Council::set_approvals(&Eve, vec![false, true], 0); internal::end_block(); - system::testing::set_block_number(6); + System::set_block_number(6); assert!(presentation_active()); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, Bob.into()), (41, Eve.into())])); + Council::present_winner(&Dave, 2, 11, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); + assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, 2), (41, Eve.into())])); internal::end_block(); assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); + assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (2, 11)]); - assert!(!is_a_candidate(&Bob)); + assert!(!is_a_candidate(&2)); assert!(!is_a_candidate(&Eve)); assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(2), Some(0)); assert_eq!(voter_last_active(*Eve), Some(0)); }); } @@ -938,20 +999,20 @@ mod tests { with_externalities(&mut new_test_ext(), || { assert!(staking::can_slash(&Dave, 10)); - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::submit_candidacy(&Eve, 1); + Council::set_approvals(&2, vec![true, false], 0); + Council::set_approvals(&Eve, vec![false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); internal::end_block(); - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (Bob.into(), 11)]); + assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (2, 11)]); assert_eq!(staking::balance(&Dave), 38); }); } @@ -959,33 +1020,33 @@ mod tests { #[test] fn retracting_inactive_voter_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Eve, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + System::set_block_number(10); + Council::present_winner(&Dave, Eve.into(), 41, 1); internal::end_block(); - PublicPass::test(&Eve).reap_inactive_voter( + Council::reap_inactive_voter(&Eve, voters().iter().position(|&i| i == *Eve).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2, voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(*Bob).len(), 0); - assert_eq!(staking::balance(&Bob), 17); + assert_eq!(approvals_of(2).len(), 0); + assert_eq!(staking::balance(&2), 17); assert_eq!(staking::balance(&Eve), 53); }); } @@ -994,58 +1055,58 @@ mod tests { #[should_panic(expected = "candidate must not form a duplicated member if elected")] fn presenting_for_double_election_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + System::set_block_number(10); + Council::present_winner(&Dave, 2, 11, 1); }); } #[test] fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Eve, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + System::set_block_number(10); + Council::present_winner(&Dave, Eve.into(), 41, 1); internal::end_block(); - system::testing::set_block_number(11); - PublicPass::test(&Alice).submit_candidacy(0); + System::set_block_number(11); + Council::submit_candidacy(&1, 0); - PublicPass::test(&Eve).reap_inactive_voter( + Council::reap_inactive_voter(&Eve, voters().iter().position(|&i| i == *Eve).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2, voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(*Bob).len(), 0); - assert_eq!(staking::balance(&Bob), 17); + assert_eq!(approvals_of(2).len(), 0); + assert_eq!(staking::balance(&2), 17); assert_eq!(staking::balance(&Eve), 53); }); } @@ -1054,27 +1115,27 @@ mod tests { #[should_panic(expected = "bad reporter index")] fn retracting_inactive_voter_with_bad_reporter_index_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 8, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Eve, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); + System::set_block_number(10); + Council::present_winner(&Dave, Eve.into(), 38, 1); internal::end_block(); - PublicPass::test(&Bob).reap_inactive_voter( + Council::reap_inactive_voter(&2, 42, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2, voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); }); @@ -1084,27 +1145,27 @@ mod tests { #[should_panic(expected = "bad target index")] fn retracting_inactive_voter_with_bad_target_index_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 8, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Eve, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); + System::set_block_number(10); + Council::present_winner(&Dave, Eve.into(), 38, 1); internal::end_block(); - PublicPass::test(&Bob).reap_inactive_voter( - voters().iter().position(|&i| i == *Bob).unwrap() as u32, - Bob.into(), 42, + Council::reap_inactive_voter(&2, + voters().iter().position(|&i| i == 2).unwrap() as u32, + 2, 42, 2 ); }); @@ -1113,40 +1174,40 @@ mod tests { #[test] fn attempting_to_retract_active_voter_should_slash_reporter() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Charlie).submit_candidacy(1); - PublicPass::test(&Dave).submit_candidacy(2); - PublicPass::test(&Eve).submit_candidacy(3); - PublicPass::test(&Bob).set_approvals(vec![true, false, false, false], 0); - PublicPass::test(&Charlie).set_approvals(vec![false, true, false, false], 0); - PublicPass::test(&Dave).set_approvals(vec![false, false, true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::submit_candidacy(&3, 1); + Council::submit_candidacy(&Dave, 2); + Council::submit_candidacy(&Eve, 3); + Council::set_approvals(&2, vec![true, false, false, false], 0); + Council::set_approvals(&3, vec![false, true, false, false], 0); + Council::set_approvals(&Dave, vec![false, false, true, false], 0); + Council::set_approvals(&Eve, vec![false, false, false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); + Council::present_winner(&Dave, 3, 21, 0); + Council::present_winner(&Dave, Dave.into(), 31, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); internal::end_block(); - system::testing::set_block_number(8); + System::set_block_number(8); PrivPass::test().set_desired_seats(3); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 1); + System::set_block_number(10); + Council::present_winner(&Dave, 2, 11, 1); + Council::present_winner(&Dave, 3, 21, 1); internal::end_block(); - PublicPass::test(&Dave).reap_inactive_voter( + Council::reap_inactive_voter(&Dave, voters().iter().position(|&i| i == *Dave).unwrap() as u32, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2, voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); - assert_eq!(voters(), vec![Bob.to_raw_public(), Charlie.into(), Eve.into()]); + assert_eq!(voters(), vec![Bob.to_raw_public(), 3, Eve.into()]); assert_eq!(approvals_of(*Dave).len(), 0); assert_eq!(staking::balance(&Dave), 37); }); @@ -1156,27 +1217,27 @@ mod tests { #[should_panic(expected = "reaper must be a voter")] fn attempting_to_retract_inactive_voter_by_nonvoter_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Bob).set_approvals(vec![true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::set_approvals(&2, vec![true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Eve).submit_candidacy(0); - PublicPass::test(&Eve).set_approvals(vec![true], 1); + System::set_block_number(8); + Council::submit_candidacy(&Eve, 0); + Council::set_approvals(&Eve, vec![true], 1); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); + System::set_block_number(10); + Council::present_winner(&Dave, Eve.into(), 41, 1); internal::end_block(); - PublicPass::test(&Dave).reap_inactive_voter( + Council::reap_inactive_voter(&Dave, 0, - Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 2, voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); }); @@ -1186,56 +1247,56 @@ mod tests { #[should_panic(expected = "candidate not worthy of leaderboard")] fn presenting_loser_should_panic() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&1, 0); + Council::set_approvals(&Ferdie, vec![true], 0); + Council::submit_candidacy(&2, 1); + Council::set_approvals(&2, vec![false, true], 0); + Council::submit_candidacy(&3, 2); + Council::set_approvals(&3, vec![false, false, true], 0); + Council::submit_candidacy(&Dave, 3); + Council::set_approvals(&Dave, vec![false, false, false, true], 0); + Council::submit_candidacy(&Eve, 4); + Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); + System::set_block_number(6); + Council::present_winner(&Dave, Alice.into(), 60, 0); + Council::present_winner(&Dave, 3, 21, 0); + Council::present_winner(&Dave, Dave.into(), 31, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); + Council::present_winner(&Dave, 2, 11, 0); }); } #[test] fn presenting_loser_first_should_not_matter() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&1, 0); + Council::set_approvals(&Ferdie, vec![true], 0); + Council::submit_candidacy(&2, 1); + Council::set_approvals(&2, vec![false, true], 0); + Council::submit_candidacy(&3, 2); + Council::set_approvals(&3, vec![false, false, true], 0); + Council::submit_candidacy(&Dave, 3); + Council::set_approvals(&Dave, vec![false, false, false, true], 0); + Council::submit_candidacy(&Eve, 4); + Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 0); + Council::present_winner(&Dave, Alice.into(), 60, 0); + Council::present_winner(&Dave, 3, 21, 0); + Council::present_winner(&Dave, Dave.into(), 31, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); assert_eq!(leaderboard(), Some(vec![ - (21, Charlie.into()), + (21, 3), (31, Dave.into()), (41, Eve.into()), - (60, Alice.to_raw_public()) + (60, 1) ])); }); } @@ -1244,9 +1305,9 @@ mod tests { #[should_panic(expected = "cannot present outside of presentation period")] fn present_panics_outside_of_presentation_period() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); + System::set_block_number(4); assert!(!presentation_active()); - PublicPass::test(&Eve).present_winner(Eve.into(), 1, 0); + Council::present_winner(&Eve, Eve.into(), 1, 0); }); } @@ -1254,15 +1315,15 @@ mod tests { #[should_panic(expected = "index not current")] fn present_panics_with_invalid_vote_index() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&2, 0); + Council::submit_candidacy(&Eve, 1); + Council::set_approvals(&2, vec![true, false], 0); + Council::set_approvals(&Eve, vec![false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 11, 1); }); } @@ -1270,36 +1331,36 @@ mod tests { #[should_panic(expected = "presenter must have sufficient slashable funds")] fn present_panics_when_presenter_is_poor() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); + System::set_block_number(4); assert!(!presentation_active()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + Council::submit_candidacy(&1, 0); + Council::submit_candidacy(&Eve, 1); + Council::set_approvals(&2, vec![true, false], 0); + Council::set_approvals(&Eve, vec![false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - assert_eq!(staking::balance(&Alice), 1); - PublicPass::test(&Alice).present_winner(Alice.into(), 30, 0); + System::set_block_number(6); + assert_eq!(staking::balance(&1), 1); + Council::present_winner(&1, Alice.into(), 30, 0); }); } #[test] fn invalid_present_tally_should_slash() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); + System::set_block_number(4); assert!(!presentation_active()); assert_eq!(staking::balance(&Dave), 40); - PublicPass::test(&Bob).submit_candidacy(0); - PublicPass::test(&Eve).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![true, false], 0); - PublicPass::test(&Eve).set_approvals(vec![false, true], 0); + Council::submit_candidacy(&2, 0); + Council::submit_candidacy(&Eve, 1); + Council::set_approvals(&2, vec![true, false], 0); + Council::set_approvals(&Eve, vec![false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Bob.into(), 80, 0); + System::set_block_number(6); + Council::present_winner(&Dave, 2, 80, 0); assert_eq!(staking::balance(&Dave), 38); }); @@ -1308,112 +1369,112 @@ mod tests { #[test] fn runners_up_should_be_kept() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); + System::set_block_number(4); assert!(!presentation_active()); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + Council::submit_candidacy(&1, 0); + Council::set_approvals(&Ferdie, vec![true], 0); + Council::submit_candidacy(&2, 1); + Council::set_approvals(&2, vec![false, true], 0); + Council::submit_candidacy(&3, 2); + Council::set_approvals(&3, vec![false, false, true], 0); + Council::submit_candidacy(&Dave, 3); + Council::set_approvals(&Dave, vec![false, false, false, true], 0); + Council::submit_candidacy(&Eve, 4); + Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); internal::end_block(); - system::testing::set_block_number(6); + System::set_block_number(6); assert!(presentation_active()); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); + Council::present_winner(&Dave, Alice.into(), 60, 0); assert_eq!(leaderboard(), Some(vec![ (0, AccountId::default()), (0, AccountId::default()), (0, AccountId::default()), - (60, Alice.to_raw_public()) + (60, 1) ])); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + Council::present_winner(&Dave, 3, 21, 0); + Council::present_winner(&Dave, Dave.into(), 31, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); assert_eq!(leaderboard(), Some(vec![ - (21, Charlie.into()), + (21, 3), (31, Dave.into()), (41, Eve.into()), - (60, Alice.to_raw_public()) + (60, 1) ])); internal::end_block(); assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11)]); + assert_eq!(active_council(), vec![(1, 11), (Eve.into(), 11)]); - assert!(!is_a_candidate(&Alice)); + assert!(!is_a_candidate(&1)); assert!(!is_a_candidate(&Eve)); - assert!(!is_a_candidate(&Bob)); - assert!(is_a_candidate(&Charlie)); - assert!(is_a_candidate(&Dave)); + assert!(!is_a_candidate(&2)); + assert!(Council::is_a_candidate(&3)); + assert!(Council::is_a_candidate(&Dave)); assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(2), Some(0)); assert_eq!(voter_last_active(*Charlie), Some(0)); assert_eq!(voter_last_active(*Dave), Some(0)); assert_eq!(voter_last_active(*Eve), Some(0)); assert_eq!(voter_last_active(*Ferdie), Some(0)); - assert_eq!(candidate_reg_info(*Charlie), Some((0, 2))); - assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); + assert_eq!(Council::candidate_reg_info(*Charlie), Some((0, 2))); + assert_eq!(Council::candidate_reg_info(*Dave), Some((0, 3))); }); } #[test] fn second_tally_should_use_runners_up() { with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(4); - PublicPass::test(&Alice).submit_candidacy(0); - PublicPass::test(&Ferdie).set_approvals(vec![true], 0); - PublicPass::test(&Bob).submit_candidacy(1); - PublicPass::test(&Bob).set_approvals(vec![false, true], 0); - PublicPass::test(&Charlie).submit_candidacy(2); - PublicPass::test(&Charlie).set_approvals(vec![false, false, true], 0); - PublicPass::test(&Dave).submit_candidacy(3); - PublicPass::test(&Dave).set_approvals(vec![false, false, false, true], 0); - PublicPass::test(&Eve).submit_candidacy(4); - PublicPass::test(&Eve).set_approvals(vec![false, false, false, false, true], 0); + System::set_block_number(4); + Council::submit_candidacy(&1, 0); + Council::set_approvals(&Ferdie, vec![true], 0); + Council::submit_candidacy(&2, 1); + Council::set_approvals(&2, vec![false, true], 0); + Council::submit_candidacy(&3, 2); + Council::set_approvals(&3, vec![false, false, true], 0); + Council::submit_candidacy(&Dave, 3); + Council::set_approvals(&Dave, vec![false, false, false, true], 0); + Council::submit_candidacy(&Eve, 4); + Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); internal::end_block(); - system::testing::set_block_number(6); - PublicPass::test(&Dave).present_winner(Alice.into(), 60, 0); - PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 0); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 0); - PublicPass::test(&Dave).present_winner(Eve.into(), 41, 0); + System::set_block_number(6); + Council::present_winner(&Dave, Alice.into(), 60, 0); + Council::present_winner(&Dave, 3, 21, 0); + Council::present_winner(&Dave, Dave.into(), 31, 0); + Council::present_winner(&Dave, Eve.into(), 41, 0); internal::end_block(); - system::testing::set_block_number(8); - PublicPass::test(&Ferdie).set_approvals(vec![false, false, true, false], 1); + System::set_block_number(8); + Council::set_approvals(&Ferdie, vec![false, false, true, false], 1); PrivPass::test().set_desired_seats(3); internal::end_block(); - system::testing::set_block_number(10); - PublicPass::test(&Dave).present_winner(Charlie.into(), 81, 1); - PublicPass::test(&Dave).present_winner(Dave.into(), 31, 1); + System::set_block_number(10); + Council::present_winner(&Dave, 3, 81, 1); + Council::present_winner(&Dave, Dave.into(), 31, 1); internal::end_block(); assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Alice.to_raw_public(), 11), (Eve.into(), 11), (Charlie.into(), 15)]); + assert_eq!(active_council(), vec![(1, 11), (Eve.into(), 11), (3, 15)]); - assert!(!is_a_candidate(&Alice)); - assert!(!is_a_candidate(&Bob)); - assert!(!is_a_candidate(&Charlie)); + assert!(!is_a_candidate(&1)); + assert!(!is_a_candidate(&2)); + assert!(!is_a_candidate(&3)); assert!(!is_a_candidate(&Eve)); - assert!(is_a_candidate(&Dave)); + assert!(Council::is_a_candidate(&Dave)); assert_eq!(vote_index(), 2); - assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(2), Some(0)); assert_eq!(voter_last_active(*Charlie), Some(0)); assert_eq!(voter_last_active(*Dave), Some(0)); assert_eq!(voter_last_active(*Eve), Some(0)); assert_eq!(voter_last_active(*Ferdie), Some(1)); - assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); + assert_eq!(Council::candidate_reg_info(*Dave), Some((0, 3))); }); } -} */ +} From ef2157623094c196a09415af05002403b43e2e96 Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 10:37:28 +0900 Subject: [PATCH 56/76] Council tests reinstated :) --- substrate/runtime/council/src/lib.rs | 614 ++++++++++++------------ substrate/runtime/council/src/voting.rs | 343 ++++++------- 2 files changed, 460 insertions(+), 497 deletions(-) diff --git a/substrate/runtime/council/src/lib.rs b/substrate/runtime/council/src/lib.rs index 102daa02d6be4..bb4426ddbe45a 100644 --- a/substrate/runtime/council/src/lib.rs +++ b/substrate/runtime/council/src/lib.rs @@ -587,9 +587,9 @@ impl primitives::MakeTestExternalities for TestingConfig #[cfg(test)] mod tests { - use super::*; - use runtime_io::with_externalities; - use substrate_primitives::H256; + pub use super::*; + pub use runtime_io::with_externalities; + pub use substrate_primitives::H256; use primitives::{HasPublicAux, Identity, MakeTestExternalities}; use primitives::testing::{Digest, Header}; @@ -638,7 +638,7 @@ mod tests { } impl Trait for Test {} - fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { + pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities { let mut t = system::TestingConfig::::default().test_externalities(); t.extend(consensus::TestingConfig::{ authorities: vec![], @@ -653,12 +653,12 @@ mod tests { balances: vec![(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)], intentions: vec![], validator_count: 2, - bonding_duration: 3, + bonding_duration: 0, transaction_fee: 0, }.test_externalities()); t.extend(democracy::TestingConfig::{ launch_period: 1, - voting_period: 1, + voting_period: 3, minimum_deposit: 1, }.test_externalities()); t.extend(TestingConfig::{ @@ -677,11 +677,10 @@ mod tests { t } - type System = system::Module; - type Session = session::Module; - type Staking = staking::Module; - type Democracy = democracy::Module; - type Council = Module; + pub type System = system::Module; + pub type Staking = staking::Module; + pub type Democracy = democracy::Module; + pub type Council = Module; #[test] fn params_should_work() { @@ -766,20 +765,20 @@ mod tests { assert_eq!(Council::candidates(), vec![3, 2, 1]); }); } -/* + #[test] fn candidate_submission_using_alternative_free_slot_should_work() { let mut t = new_test_ext_with_candidate_holes(); with_externalities(&mut t, || { System::set_block_number(1); - assert_eq!(Council::candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); + assert_eq!(Council::candidates(), vec![0, 0, 1]); Council::submit_candidacy(&2, 0); - assert_eq!(Council::candidates(), vec![2, AccountId::default(), Alice.into()]); + assert_eq!(Council::candidates(), vec![2, 0, 1]); Council::submit_candidacy(&3, 1); - assert_eq!(Council::candidates(), vec![Bob.to_raw_public(), 3, Alice.into()]); + assert_eq!(Council::candidates(), vec![2, 3, 1]); }); } @@ -790,16 +789,16 @@ mod tests { with_externalities(&mut t, || { System::set_block_number(1); - Council::submit_candidacy(&Dave, 3); + Council::submit_candidacy(&4, 3); }); } #[test] #[should_panic(expected = "invalid candidate slot")] fn bad_candidate_slot_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Council::candidates(), Vec::::new()); Council::submit_candidacy(&1, 1); }); } @@ -807,9 +806,9 @@ mod tests { #[test] #[should_panic(expected = "invalid candidate slot")] fn non_free_candidate_slot_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Council::candidates(), Vec::::new()); Council::submit_candidacy(&1, 0); Council::submit_candidacy(&2, 0); }); @@ -818,9 +817,9 @@ mod tests { #[test] #[should_panic(expected = "duplicate candidate submission")] fn dupe_candidate_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_eq!(Council::candidates(), Vec::::new()); + assert_eq!(Council::candidates(), Vec::::new()); Council::submit_candidacy(&1, 0); Council::submit_candidacy(&1, 1); }); @@ -829,26 +828,26 @@ mod tests { #[test] #[should_panic(expected = "candidate has not enough funds")] fn poor_candidate_submission_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - assert_eq!(Council::candidates(), Vec::::new()); - Council::submit_candidacy(&One, 0); + assert_eq!(Council::candidates(), Vec::::new()); + Council::submit_candidacy(&7, 0); }); } #[test] fn voting_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - Council::submit_candidacy(&Eve, 0); + Council::submit_candidacy(&5, 0); Council::set_approvals(&1, vec![true], 0); - Council::set_approvals(&Dave, vec![true], 0); + Council::set_approvals(&4, vec![true], 0); - assert_eq!(approvals_of(1), vec![true]); - assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(voters(), vec![1, Dave.into()]); + assert_eq!(Council::approvals_of(1), vec![true]); + assert_eq!(Council::approvals_of(4), vec![true]); + assert_eq!(Council::voters(), vec![1, 4]); Council::submit_candidacy(&2, 1); Council::submit_candidacy(&3, 2); @@ -856,83 +855,83 @@ mod tests { Council::set_approvals(&2, vec![false, true, true], 0); Council::set_approvals(&3, vec![false, true, true], 0); - assert_eq!(approvals_of(1), vec![true]); - assert_eq!(approvals_of(*Dave), vec![true]); - assert_eq!(approvals_of(2), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(Council::approvals_of(1), vec![true]); + assert_eq!(Council::approvals_of(4), vec![true]); + assert_eq!(Council::approvals_of(2), vec![false, true, true]); + assert_eq!(Council::approvals_of(3), vec![false, true, true]); - assert_eq!(voters(), vec![1, Dave.into(), 2, 3]); + assert_eq!(Council::voters(), vec![1, 4, 2, 3]); }); } #[test] fn resubmitting_voting_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Dave, vec![true], 0); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&4, vec![true], 0); - assert_eq!(approvals_of(*Dave), vec![true]); + assert_eq!(Council::approvals_of(4), vec![true]); Council::submit_candidacy(&2, 1); Council::submit_candidacy(&3, 2); - Council::set_approvals(&Dave, vec![true, false, true], 0); + Council::set_approvals(&4, vec![true, false, true], 0); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); + assert_eq!(Council::approvals_of(4), vec![true, false, true]); }); } #[test] fn retracting_voter_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); - Council::submit_candidacy(&Eve, 0); + Council::submit_candidacy(&5, 0); Council::submit_candidacy(&2, 1); Council::submit_candidacy(&3, 2); Council::set_approvals(&1, vec![true], 0); Council::set_approvals(&2, vec![false, true, true], 0); Council::set_approvals(&3, vec![false, true, true], 0); - Council::set_approvals(&Dave, vec![true, false, true], 0); + Council::set_approvals(&4, vec![true, false, true], 0); - assert_eq!(voters(), vec![1, 2, 3, Dave.into()]); - assert_eq!(approvals_of(1), vec![true]); - assert_eq!(approvals_of(2), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); + assert_eq!(Council::voters(), vec![1, 2, 3, 4]); + assert_eq!(Council::approvals_of(1), vec![true]); + assert_eq!(Council::approvals_of(2), vec![false, true, true]); + assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::approvals_of(4), vec![true, false, true]); Council::retract_voter(&1, 0); - assert_eq!(voters(), vec![Dave.to_raw_public(), 2, 3]); - assert_eq!(approvals_of(1), Vec::::new()); - assert_eq!(approvals_of(2), vec![false, true, true]); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); + assert_eq!(Council::voters(), vec![4, 2, 3]); + assert_eq!(Council::approvals_of(1), Vec::::new()); + assert_eq!(Council::approvals_of(2), vec![false, true, true]); + assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::approvals_of(4), vec![true, false, true]); Council::retract_voter(&2, 1); - assert_eq!(voters(), vec![Dave.to_raw_public(), 3]); - assert_eq!(approvals_of(1), Vec::::new()); - assert_eq!(approvals_of(2), Vec::::new()); - assert_eq!(approvals_of(*Charlie), vec![false, true, true]); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); + assert_eq!(Council::voters(), vec![4, 3]); + assert_eq!(Council::approvals_of(1), Vec::::new()); + assert_eq!(Council::approvals_of(2), Vec::::new()); + assert_eq!(Council::approvals_of(3), vec![false, true, true]); + assert_eq!(Council::approvals_of(4), vec![true, false, true]); Council::retract_voter(&3, 1); - assert_eq!(voters(), vec![Dave.to_raw_public()]); - assert_eq!(approvals_of(1), Vec::::new()); - assert_eq!(approvals_of(2), Vec::::new()); - assert_eq!(approvals_of(*Charlie), Vec::::new()); - assert_eq!(approvals_of(*Dave), vec![true, false, true]); + assert_eq!(Council::voters(), vec![4]); + assert_eq!(Council::approvals_of(1), Vec::::new()); + assert_eq!(Council::approvals_of(2), Vec::::new()); + assert_eq!(Council::approvals_of(3), Vec::::new()); + assert_eq!(Council::approvals_of(4), vec![true, false, true]); }); } #[test] #[should_panic(expected = "retraction index mismatch")] fn invalid_retraction_index_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); Council::submit_candidacy(&3, 0); Council::set_approvals(&1, vec![true], 0); @@ -944,7 +943,7 @@ mod tests { #[test] #[should_panic(expected = "retraction index invalid")] fn overflow_retraction_index_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); Council::submit_candidacy(&3, 0); Council::set_approvals(&1, vec![true], 0); @@ -955,7 +954,7 @@ mod tests { #[test] #[should_panic(expected = "cannot retract non-voter")] fn non_voter_retraction_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(1); Council::submit_candidacy(&3, 0); Council::set_approvals(&1, vec![true], 0); @@ -965,177 +964,177 @@ mod tests { #[test] fn simple_tally_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert!(!presentation_active()); + assert!(!Council::presentation_active()); Council::submit_candidacy(&2, 0); - Council::submit_candidacy(&Eve, 1); + Council::submit_candidacy(&5, 1); Council::set_approvals(&2, vec![true, false], 0); - Council::set_approvals(&Eve, vec![false, true], 0); - internal::end_block(); + Council::set_approvals(&5, vec![false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - assert!(presentation_active()); - Council::present_winner(&Dave, 2, 11, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - assert_eq!(leaderboard(), Some(vec![(0, AccountId::default()), (0, AccountId::default()), (11, 2), (41, Eve.into())])); + assert!(Council::presentation_active()); + Council::present_winner(&4, 2, 11, 0); + Council::present_winner(&4, 5, 41, 0); + assert_eq!(Council::leaderboard(), Some(vec![(0, 0), (0, 0), (11, 2), (41, 5)])); - internal::end_block(); + Council::end_block(System::block_number()); - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (2, 11)]); + assert!(!Council::presentation_active()); + assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); - assert!(!is_a_candidate(&2)); - assert!(!is_a_candidate(&Eve)); - assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(2), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); + assert!(!Council::is_a_candidate(&2)); + assert!(!Council::is_a_candidate(&5)); + assert_eq!(Council::vote_index(), 1); + assert_eq!(Council::voter_last_active(2), Some(0)); + assert_eq!(Council::voter_last_active(5), Some(0)); }); } #[test] fn double_presentations_should_be_punished() { - with_externalities(&mut new_test_ext(), || { - assert!(staking::can_slash(&Dave, 10)); + with_externalities(&mut new_test_ext(false), || { + assert!(Staking::can_slash(&4, 10)); System::set_block_number(4); Council::submit_candidacy(&2, 0); - Council::submit_candidacy(&Eve, 1); + Council::submit_candidacy(&5, 1); Council::set_approvals(&2, vec![true, false], 0); - Council::set_approvals(&Eve, vec![false, true], 0); - internal::end_block(); + Council::set_approvals(&5, vec![false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::present_winner(&4, 5, 41, 0); + Council::present_winner(&4, 5, 41, 0); + Council::end_block(System::block_number()); - assert_eq!(active_council(), vec![(Eve.to_raw_public(), 11), (2, 11)]); - assert_eq!(staking::balance(&Dave), 38); + assert_eq!(Council::active_council(), vec![(5, 11), (2, 11)]); + assert_eq!(Staking::balance(&4), 38); }); } #[test] fn retracting_inactive_voter_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Eve, vec![true], 1); - internal::end_block(); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&5, vec![true], 1); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, Eve.into(), 41, 1); - internal::end_block(); + Council::present_winner(&4, 5, 41, 1); + Council::end_block(System::block_number()); - Council::reap_inactive_voter(&Eve, - voters().iter().position(|&i| i == *Eve).unwrap() as u32, - 2, voters().iter().position(|&i| i == 2).unwrap() as u32, + Council::reap_inactive_voter(&5, + Council::voters().iter().position(|&i| i == 5).unwrap() as u32, + 2, Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); - assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(2).len(), 0); - assert_eq!(staking::balance(&2), 17); - assert_eq!(staking::balance(&Eve), 53); + assert_eq!(Council::voters(), vec![5]); + assert_eq!(Council::approvals_of(2).len(), 0); + assert_eq!(Staking::balance(&2), 17); + assert_eq!(Staking::balance(&5), 53); }); } #[test] #[should_panic(expected = "candidate must not form a duplicated member if elected")] fn presenting_for_double_election_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::end_block(System::block_number()); System::set_block_number(8); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 1); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, 2, 11, 1); + Council::present_winner(&4, 2, 11, 1); }); } #[test] fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Eve, vec![true], 1); - internal::end_block(); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&5, vec![true], 1); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, Eve.into(), 41, 1); - internal::end_block(); + Council::present_winner(&4, 5, 41, 1); + Council::end_block(System::block_number()); System::set_block_number(11); Council::submit_candidacy(&1, 0); - Council::reap_inactive_voter(&Eve, - voters().iter().position(|&i| i == *Eve).unwrap() as u32, - 2, voters().iter().position(|&i| i == 2).unwrap() as u32, + Council::reap_inactive_voter(&5, + Council::voters().iter().position(|&i| i == 5).unwrap() as u32, + 2, Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); - assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(2).len(), 0); - assert_eq!(staking::balance(&2), 17); - assert_eq!(staking::balance(&Eve), 53); + assert_eq!(Council::voters(), vec![5]); + assert_eq!(Council::approvals_of(2).len(), 0); + assert_eq!(Staking::balance(&2), 17); + assert_eq!(Staking::balance(&5), 53); }); } #[test] #[should_panic(expected = "bad reporter index")] fn retracting_inactive_voter_with_bad_reporter_index_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 8, 0); - internal::end_block(); + Council::present_winner(&4, 2, 8, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Eve, vec![true], 1); - internal::end_block(); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&5, vec![true], 1); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, Eve.into(), 38, 1); - internal::end_block(); + Council::present_winner(&4, 5, 38, 1); + Council::end_block(System::block_number()); Council::reap_inactive_voter(&2, 42, - 2, voters().iter().position(|&i| i == 2).unwrap() as u32, + 2, Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); }); @@ -1144,27 +1143,27 @@ mod tests { #[test] #[should_panic(expected = "bad target index")] fn retracting_inactive_voter_with_bad_target_index_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 8, 0); - internal::end_block(); + Council::present_winner(&4, 2, 8, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Eve, vec![true], 1); - internal::end_block(); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&5, vec![true], 1); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, Eve.into(), 38, 1); - internal::end_block(); + Council::present_winner(&4, 5, 38, 1); + Council::end_block(System::block_number()); Council::reap_inactive_voter(&2, - voters().iter().position(|&i| i == 2).unwrap() as u32, + Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2, 42, 2 ); @@ -1173,71 +1172,71 @@ mod tests { #[test] fn attempting_to_retract_active_voter_should_slash_reporter() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::submit_candidacy(&3, 1); - Council::submit_candidacy(&Dave, 2); - Council::submit_candidacy(&Eve, 3); + Council::submit_candidacy(&4, 2); + Council::submit_candidacy(&5, 3); Council::set_approvals(&2, vec![true, false, false, false], 0); Council::set_approvals(&3, vec![false, true, false, false], 0); - Council::set_approvals(&Dave, vec![false, false, true, false], 0); - Council::set_approvals(&Eve, vec![false, false, false, true], 0); - internal::end_block(); + Council::set_approvals(&4, vec![false, false, true, false], 0); + Council::set_approvals(&5, vec![false, false, false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - Council::present_winner(&Dave, 3, 21, 0); - Council::present_winner(&Dave, Dave.into(), 31, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::present_winner(&4, 3, 21, 0); + Council::present_winner(&4, 4, 31, 0); + Council::present_winner(&4, 5, 41, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - PrivPass::test().set_desired_seats(3); - internal::end_block(); + Council::set_desired_seats(3); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, 2, 11, 1); - Council::present_winner(&Dave, 3, 21, 1); - internal::end_block(); + Council::present_winner(&4, 2, 11, 1); + Council::present_winner(&4, 3, 21, 1); + Council::end_block(System::block_number()); - Council::reap_inactive_voter(&Dave, - voters().iter().position(|&i| i == *Dave).unwrap() as u32, - 2, voters().iter().position(|&i| i == 2).unwrap() as u32, + Council::reap_inactive_voter(&4, + Council::voters().iter().position(|&i| i == 4).unwrap() as u32, + 2, Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); - assert_eq!(voters(), vec![Bob.to_raw_public(), 3, Eve.into()]); - assert_eq!(approvals_of(*Dave).len(), 0); - assert_eq!(staking::balance(&Dave), 37); + assert_eq!(Council::voters(), vec![2, 3, 5]); + assert_eq!(Council::approvals_of(4).len(), 0); + assert_eq!(Staking::balance(&4), 37); }); } #[test] #[should_panic(expected = "reaper must be a voter")] fn attempting_to_retract_inactive_voter_by_nonvoter_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); Council::set_approvals(&2, vec![true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - internal::end_block(); + Council::present_winner(&4, 2, 11, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::submit_candidacy(&Eve, 0); - Council::set_approvals(&Eve, vec![true], 1); - internal::end_block(); + Council::submit_candidacy(&5, 0); + Council::set_approvals(&5, vec![true], 1); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, Eve.into(), 41, 1); - internal::end_block(); + Council::present_winner(&4, 5, 41, 1); + Council::end_block(System::block_number()); - Council::reap_inactive_voter(&Dave, + Council::reap_inactive_voter(&4, 0, - 2, voters().iter().position(|&i| i == 2).unwrap() as u32, + 2, Council::voters().iter().position(|&i| i == 2).unwrap() as u32, 2 ); }); @@ -1246,56 +1245,56 @@ mod tests { #[test] #[should_panic(expected = "candidate not worthy of leaderboard")] fn presenting_loser_should_panic() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&1, 0); - Council::set_approvals(&Ferdie, vec![true], 0); + Council::set_approvals(&6, vec![true], 0); Council::submit_candidacy(&2, 1); Council::set_approvals(&2, vec![false, true], 0); Council::submit_candidacy(&3, 2); Council::set_approvals(&3, vec![false, false, true], 0); - Council::submit_candidacy(&Dave, 3); - Council::set_approvals(&Dave, vec![false, false, false, true], 0); - Council::submit_candidacy(&Eve, 4); - Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); - internal::end_block(); + Council::submit_candidacy(&4, 3); + Council::set_approvals(&4, vec![false, false, false, true], 0); + Council::submit_candidacy(&5, 4); + Council::set_approvals(&5, vec![false, false, false, false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, Alice.into(), 60, 0); - Council::present_winner(&Dave, 3, 21, 0); - Council::present_winner(&Dave, Dave.into(), 31, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - Council::present_winner(&Dave, 2, 11, 0); + Council::present_winner(&4, 1, 60, 0); + Council::present_winner(&4, 3, 21, 0); + Council::present_winner(&4, 4, 31, 0); + Council::present_winner(&4, 5, 41, 0); + Council::present_winner(&4, 2, 11, 0); }); } #[test] fn presenting_loser_first_should_not_matter() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&1, 0); - Council::set_approvals(&Ferdie, vec![true], 0); + Council::set_approvals(&6, vec![true], 0); Council::submit_candidacy(&2, 1); Council::set_approvals(&2, vec![false, true], 0); Council::submit_candidacy(&3, 2); Council::set_approvals(&3, vec![false, false, true], 0); - Council::submit_candidacy(&Dave, 3); - Council::set_approvals(&Dave, vec![false, false, false, true], 0); - Council::submit_candidacy(&Eve, 4); - Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); - internal::end_block(); + Council::submit_candidacy(&4, 3); + Council::set_approvals(&4, vec![false, false, false, true], 0); + Council::submit_candidacy(&5, 4); + Council::set_approvals(&5, vec![false, false, false, false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 0); - Council::present_winner(&Dave, Alice.into(), 60, 0); - Council::present_winner(&Dave, 3, 21, 0); - Council::present_winner(&Dave, Dave.into(), 31, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); + Council::present_winner(&4, 2, 11, 0); + Council::present_winner(&4, 1, 60, 0); + Council::present_winner(&4, 3, 21, 0); + Council::present_winner(&4, 4, 31, 0); + Council::present_winner(&4, 5, 41, 0); - assert_eq!(leaderboard(), Some(vec![ + assert_eq!(Council::leaderboard(), Some(vec![ (21, 3), - (31, Dave.into()), - (41, Eve.into()), + (31, 4), + (41, 5), (60, 1) ])); }); @@ -1304,177 +1303,176 @@ mod tests { #[test] #[should_panic(expected = "cannot present outside of presentation period")] fn present_panics_outside_of_presentation_period() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert!(!presentation_active()); - Council::present_winner(&Eve, Eve.into(), 1, 0); + assert!(!Council::presentation_active()); + Council::present_winner(&5, 5, 1, 0); }); } #[test] #[should_panic(expected = "index not current")] fn present_panics_with_invalid_vote_index() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&2, 0); - Council::submit_candidacy(&Eve, 1); + Council::submit_candidacy(&5, 1); Council::set_approvals(&2, vec![true, false], 0); - Council::set_approvals(&Eve, vec![false, true], 0); - internal::end_block(); + Council::set_approvals(&5, vec![false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 11, 1); + Council::present_winner(&4, 2, 11, 1); }); } #[test] #[should_panic(expected = "presenter must have sufficient slashable funds")] fn present_panics_when_presenter_is_poor() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert!(!presentation_active()); + assert!(!Council::presentation_active()); Council::submit_candidacy(&1, 0); - Council::submit_candidacy(&Eve, 1); + Council::submit_candidacy(&5, 1); Council::set_approvals(&2, vec![true, false], 0); - Council::set_approvals(&Eve, vec![false, true], 0); - internal::end_block(); + Council::set_approvals(&5, vec![false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - assert_eq!(staking::balance(&1), 1); - Council::present_winner(&1, Alice.into(), 30, 0); + assert_eq!(Staking::balance(&1), 1); + Council::present_winner(&1, 1, 30, 0); }); } #[test] fn invalid_present_tally_should_slash() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert!(!presentation_active()); - assert_eq!(staking::balance(&Dave), 40); + assert!(!Council::presentation_active()); + assert_eq!(Staking::balance(&4), 40); Council::submit_candidacy(&2, 0); - Council::submit_candidacy(&Eve, 1); + Council::submit_candidacy(&5, 1); Council::set_approvals(&2, vec![true, false], 0); - Council::set_approvals(&Eve, vec![false, true], 0); - internal::end_block(); + Council::set_approvals(&5, vec![false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, 2, 80, 0); + Council::present_winner(&4, 2, 80, 0); - assert_eq!(staking::balance(&Dave), 38); + assert_eq!(Staking::balance(&4), 38); }); } #[test] fn runners_up_should_be_kept() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); - assert!(!presentation_active()); + assert!(!Council::presentation_active()); Council::submit_candidacy(&1, 0); - Council::set_approvals(&Ferdie, vec![true], 0); + Council::set_approvals(&6, vec![true], 0); Council::submit_candidacy(&2, 1); Council::set_approvals(&2, vec![false, true], 0); Council::submit_candidacy(&3, 2); Council::set_approvals(&3, vec![false, false, true], 0); - Council::submit_candidacy(&Dave, 3); - Council::set_approvals(&Dave, vec![false, false, false, true], 0); - Council::submit_candidacy(&Eve, 4); - Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); + Council::submit_candidacy(&4, 3); + Council::set_approvals(&4, vec![false, false, false, true], 0); + Council::submit_candidacy(&5, 4); + Council::set_approvals(&5, vec![false, false, false, false, true], 0); - internal::end_block(); + Council::end_block(System::block_number()); System::set_block_number(6); - assert!(presentation_active()); - Council::present_winner(&Dave, Alice.into(), 60, 0); - assert_eq!(leaderboard(), Some(vec![ - (0, AccountId::default()), - (0, AccountId::default()), - (0, AccountId::default()), + assert!(Council::presentation_active()); + Council::present_winner(&4, 1, 60, 0); + assert_eq!(Council::leaderboard(), Some(vec![ + (0, 0), + (0, 0), + (0, 0), (60, 1) ])); - Council::present_winner(&Dave, 3, 21, 0); - Council::present_winner(&Dave, Dave.into(), 31, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - assert_eq!(leaderboard(), Some(vec![ + Council::present_winner(&4, 3, 21, 0); + Council::present_winner(&4, 4, 31, 0); + Council::present_winner(&4, 5, 41, 0); + assert_eq!(Council::leaderboard(), Some(vec![ (21, 3), - (31, Dave.into()), - (41, Eve.into()), + (31, 4), + (41, 5), (60, 1) ])); - internal::end_block(); + Council::end_block(System::block_number()); - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(1, 11), (Eve.into(), 11)]); + assert!(!Council::presentation_active()); + assert_eq!(Council::active_council(), vec![(1, 11), (5, 11)]); - assert!(!is_a_candidate(&1)); - assert!(!is_a_candidate(&Eve)); - assert!(!is_a_candidate(&2)); + assert!(!Council::is_a_candidate(&1)); + assert!(!Council::is_a_candidate(&5)); + assert!(!Council::is_a_candidate(&2)); assert!(Council::is_a_candidate(&3)); - assert!(Council::is_a_candidate(&Dave)); - assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(2), Some(0)); - assert_eq!(voter_last_active(*Charlie), Some(0)); - assert_eq!(voter_last_active(*Dave), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); - assert_eq!(voter_last_active(*Ferdie), Some(0)); - assert_eq!(Council::candidate_reg_info(*Charlie), Some((0, 2))); - assert_eq!(Council::candidate_reg_info(*Dave), Some((0, 3))); + assert!(Council::is_a_candidate(&4)); + assert_eq!(Council::vote_index(), 1); + assert_eq!(Council::voter_last_active(2), Some(0)); + assert_eq!(Council::voter_last_active(3), Some(0)); + assert_eq!(Council::voter_last_active(4), Some(0)); + assert_eq!(Council::voter_last_active(5), Some(0)); + assert_eq!(Council::voter_last_active(6), Some(0)); + assert_eq!(Council::candidate_reg_info(3), Some((0, 2))); + assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); } #[test] fn second_tally_should_use_runners_up() { - with_externalities(&mut new_test_ext(), || { + with_externalities(&mut new_test_ext(false), || { System::set_block_number(4); Council::submit_candidacy(&1, 0); - Council::set_approvals(&Ferdie, vec![true], 0); + Council::set_approvals(&6, vec![true], 0); Council::submit_candidacy(&2, 1); Council::set_approvals(&2, vec![false, true], 0); Council::submit_candidacy(&3, 2); Council::set_approvals(&3, vec![false, false, true], 0); - Council::submit_candidacy(&Dave, 3); - Council::set_approvals(&Dave, vec![false, false, false, true], 0); - Council::submit_candidacy(&Eve, 4); - Council::set_approvals(&Eve, vec![false, false, false, false, true], 0); - internal::end_block(); + Council::submit_candidacy(&4, 3); + Council::set_approvals(&4, vec![false, false, false, true], 0); + Council::submit_candidacy(&5, 4); + Council::set_approvals(&5, vec![false, false, false, false, true], 0); + Council::end_block(System::block_number()); System::set_block_number(6); - Council::present_winner(&Dave, Alice.into(), 60, 0); - Council::present_winner(&Dave, 3, 21, 0); - Council::present_winner(&Dave, Dave.into(), 31, 0); - Council::present_winner(&Dave, Eve.into(), 41, 0); - internal::end_block(); + Council::present_winner(&4, 1, 60, 0); + Council::present_winner(&4, 3, 21, 0); + Council::present_winner(&4, 4, 31, 0); + Council::present_winner(&4, 5, 41, 0); + Council::end_block(System::block_number()); System::set_block_number(8); - Council::set_approvals(&Ferdie, vec![false, false, true, false], 1); - PrivPass::test().set_desired_seats(3); - internal::end_block(); + Council::set_approvals(&6, vec![false, false, true, false], 1); + Council::set_desired_seats(3); + Council::end_block(System::block_number()); System::set_block_number(10); - Council::present_winner(&Dave, 3, 81, 1); - Council::present_winner(&Dave, Dave.into(), 31, 1); - internal::end_block(); - - assert!(!presentation_active()); - assert_eq!(active_council(), vec![(1, 11), (Eve.into(), 11), (3, 15)]); - - assert!(!is_a_candidate(&1)); - assert!(!is_a_candidate(&2)); - assert!(!is_a_candidate(&3)); - assert!(!is_a_candidate(&Eve)); - assert!(Council::is_a_candidate(&Dave)); - assert_eq!(vote_index(), 2); - assert_eq!(voter_last_active(2), Some(0)); - assert_eq!(voter_last_active(*Charlie), Some(0)); - assert_eq!(voter_last_active(*Dave), Some(0)); - assert_eq!(voter_last_active(*Eve), Some(0)); - assert_eq!(voter_last_active(*Ferdie), Some(1)); - - assert_eq!(Council::candidate_reg_info(*Dave), Some((0, 3))); + Council::present_winner(&4, 3, 81, 1); + Council::present_winner(&4, 4, 31, 1); + Council::end_block(System::block_number()); + + assert!(!Council::presentation_active()); + assert_eq!(Council::active_council(), vec![(1, 11), (5, 11), (3, 15)]); + + assert!(!Council::is_a_candidate(&1)); + assert!(!Council::is_a_candidate(&2)); + assert!(!Council::is_a_candidate(&3)); + assert!(!Council::is_a_candidate(&5)); + assert!(Council::is_a_candidate(&4)); + assert_eq!(Council::vote_index(), 2); + assert_eq!(Council::voter_last_active(2), Some(0)); + assert_eq!(Council::voter_last_active(3), Some(0)); + assert_eq!(Council::voter_last_active(4), Some(0)); + assert_eq!(Council::voter_last_active(5), Some(0)); + assert_eq!(Council::voter_last_active(6), Some(1)); + + assert_eq!(Council::candidate_reg_info(4), Some((0, 3))); }); } -*/ } diff --git a/substrate/runtime/council/src/voting.rs b/substrate/runtime/council/src/voting.rs index c964eefbca3b0..3e81dd5093484 100644 --- a/substrate/runtime/council/src/voting.rs +++ b/substrate/runtime/council/src/voting.rs @@ -198,300 +198,265 @@ impl Executable for Council { } } -/* - -#[cfg(test)] -pub mod testing { - use super::*; - use runtime_io::{twox_128, TestExternalities}; - use keyring::Keyring::{Alice, Bob, Charlie}; - use codec::Joiner; - use runtime::{council, democracy}; - - pub fn externalities() -> TestExternalities { - let expiry: BlockNumber = 10; - let extras: TestExternalities = map![ - twox_128(council::ActiveCouncil::key()).to_vec() => vec![].and(&vec![ - (Alice.to_raw_public(), expiry), - (Bob.into(), expiry), - (Charlie.into(), expiry) - ]), - twox_128(CooloffPeriod::key()).to_vec() => vec![].and(&2u64), - twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), - twox_128(democracy::VotingPeriod::key()).to_vec() => vec![].and(&3u64) - ]; - council::testing::externalities() - .into_iter().chain(extras.into_iter()).collect() - } -} - #[cfg(test)] mod tests { use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring::{Alice, Bob, Charlie, Dave}; - use demo_primitives::AccountId; - use runtime::democracy::VoteThreshold; - use runtime::{staking, council, democracy}; - use super::public::Dispatch; - use super::privileged::Dispatch as PrivDispatch; + use ::tests::*; + use runtime_support::Hashable; + use democracy::VoteThreshold; - fn new_test_ext() -> TestExternalities { - testing::externalities() - } + type CouncilVoting = super::Module; #[test] fn basic_environment_works() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); - assert_eq!(staking::bonding_duration(), 0); - assert_eq!(cooloff_period(), 2); - assert_eq!(voting_period(), 1); - assert_eq!(will_still_be_councillor_at(&Alice, 1), true); - assert_eq!(will_still_be_councillor_at(&Alice, 10), false); - assert_eq!(will_still_be_councillor_at(&Dave, 10), false); - assert_eq!(is_councillor(&Alice), true); - assert_eq!(is_councillor(&Dave), false); - assert_eq!(proposals(), Vec::<(BlockNumber, ProposalHash)>::new()); - assert_eq!(proposal_voters(ProposalHash::default()), Vec::::new()); - assert_eq!(is_vetoed(&ProposalHash::default()), false); - assert_eq!(vote_of((*Alice, ProposalHash::default())), None); - assert_eq!(tally(&ProposalHash::default()), (0, 0, 3)); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); + assert_eq!(Staking::bonding_duration(), 0); + assert_eq!(CouncilVoting::cooloff_period(), 2); + assert_eq!(CouncilVoting::voting_period(), 1); + assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 1), true); + assert_eq!(CouncilVoting::will_still_be_councillor_at(&1, 10), false); + assert_eq!(CouncilVoting::will_still_be_councillor_at(&4, 10), false); + assert_eq!(CouncilVoting::is_councillor(&1), true); + assert_eq!(CouncilVoting::is_councillor(&4), false); + assert_eq!(CouncilVoting::proposals(), Vec::<(u64, H256)>::new()); + assert_eq!(CouncilVoting::proposal_voters(H256::default()), Vec::::new()); + assert_eq!(CouncilVoting::is_vetoed(&H256::default()), false); + assert_eq!(CouncilVoting::vote_of((H256::default(), 1)), None); + assert_eq!(CouncilVoting::tally(&H256::default()), (0, 0, 3)); }); } fn sessions_per_era_proposal(value: u64) -> Proposal { - Proposal::Staking(staking::privileged::Call::set_sessions_per_era(value)) + Proposal::Staking(staking::PrivCall::set_sessions_per_era(value)) } fn bonding_duration_proposal(value: u64) -> Proposal { - Proposal::Staking(staking::privileged::Call::set_bonding_duration(value)) + Proposal::Staking(staking::PrivCall::set_bonding_duration(value)) } fn cancel_referendum_proposal(id: u32) -> Proposal { - Proposal::Democracy(democracy::privileged::Call::cancel_referendum(id)) + Proposal::Democracy(democracy::PrivCall::cancel_referendum(id)) } #[test] fn referendum_cancellation_should_work_when_unanimous() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + assert_eq!(Democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - staking::public_pass_from_payment(&Charlie).vote(hash, true); - assert_eq!(proposals(), vec![(2, hash)]); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![]); - assert_eq!(staking::bonding_duration(), 0); + let hash = cancellation.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(cancellation)); + CouncilVoting::vote(&2, hash, true); + CouncilVoting::vote(&3, hash, true); + assert_eq!(CouncilVoting::proposals(), vec![(2, hash)]); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(Democracy::active_referendums(), vec![]); + assert_eq!(Staking::bonding_duration(), 0); }); } #[test] fn referendum_cancellation_should_fail_when_not_unanimous() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - staking::public_pass_from_payment(&Charlie).vote(hash, false); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + let hash = cancellation.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(cancellation)); + CouncilVoting::vote(&2, hash, true); + CouncilVoting::vote(&3, hash, false); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(Democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); }); } #[test] fn referendum_cancellation_should_fail_when_abstentions() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + Democracy::internal_start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); let cancellation = cancel_referendum_proposal(0); - let hash = cancellation.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(cancellation)); - staking::public_pass_from_payment(&Bob).vote(hash, true); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); + let hash = cancellation.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(cancellation)); + CouncilVoting::vote(&2, hash, true); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(Democracy::active_referendums(), vec![(0, 4, proposal, VoteThreshold::SuperMajorityApprove)]); }); } #[test] fn veto_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums().len(), 0); }); } #[test] #[should_panic] fn double_veto_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); + System::set_block_number(3); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); }); } #[test] #[should_panic] fn retry_in_cooloff_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); - system::testing::set_block_number(2); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); + System::set_block_number(2); + CouncilVoting::propose(&1, Box::new(proposal.clone())); }); } #[test] fn retry_after_cooloff_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(hash, false); - staking::public_pass_from_payment(&Charlie).vote(hash, true); - internal::end_block(3); - - system::testing::set_block_number(4); - internal::end_block(4); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 7, bonding_duration_proposal(42), VoteThreshold::SimpleMajority)]); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); + + System::set_block_number(3); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::vote(&2, hash, false); + CouncilVoting::vote(&3, hash, true); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(4); + CouncilVoting::end_block(System::block_number()); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums(), vec![(0, 7, bonding_duration_proposal(42), VoteThreshold::SimpleMajority)]); }); } #[test] fn alternative_double_veto_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).veto(hash); - - system::testing::set_block_number(3); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Charlie).veto(hash); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&2, hash); + + System::set_block_number(3); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::veto(&3, hash); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums().len(), 0); }); } #[test] fn simple_propose_should_work() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - let hash = proposal.blake2_256(); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - assert_eq!(proposals().len(), 1); - assert_eq!(proposal_voters(&hash), vec![Alice.to_raw_public()]); - assert_eq!(vote_of((hash, *Alice)), Some(true)); - assert_eq!(tally(&hash), (1, 0, 2)); + let hash = proposal.blake2_256().into(); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + assert_eq!(CouncilVoting::proposals().len(), 1); + assert_eq!(CouncilVoting::proposal_voters(&hash), vec![1]); + assert_eq!(CouncilVoting::vote_of((hash, 1)), Some(true)); + assert_eq!(CouncilVoting::tally(&hash), (1, 0, 2)); }); } #[test] fn unvoted_proposal_should_expire_without_action() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - assert_eq!(tally(&proposal.blake2_256()), (1, 0, 2)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums().len(), 0); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (1, 0, 2)); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums().len(), 0); }); } #[test] fn unanimous_proposal_should_expire_with_biased_referendum() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); - staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), true); - assert_eq!(tally(&proposal.blake2_256()), (3, 0, 0)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SuperMajorityAgainst)]); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::vote(&2, proposal.blake2_256().into(), true); + CouncilVoting::vote(&3, proposal.blake2_256().into(), true); + assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (3, 0, 0)); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SuperMajorityAgainst)]); }); } #[test] fn majority_proposal_should_expire_with_unbiased_referendum() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Alice).propose(Box::new(proposal.clone())); - staking::public_pass_from_payment(&Bob).vote(proposal.blake2_256(), true); - staking::public_pass_from_payment(&Charlie).vote(proposal.blake2_256(), false); - assert_eq!(tally(&proposal.blake2_256()), (2, 1, 0)); - internal::end_block(1); - - system::testing::set_block_number(2); - internal::end_block(2); - assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SimpleMajority)]); + CouncilVoting::propose(&1, Box::new(proposal.clone())); + CouncilVoting::vote(&2, proposal.blake2_256().into(), true); + CouncilVoting::vote(&3, proposal.blake2_256().into(), false); + assert_eq!(CouncilVoting::tally(&proposal.blake2_256().into()), (2, 1, 0)); + CouncilVoting::end_block(System::block_number()); + + System::set_block_number(2); + CouncilVoting::end_block(System::block_number()); + assert_eq!(CouncilVoting::proposals().len(), 0); + assert_eq!(Democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SimpleMajority)]); }); } #[test] #[should_panic] fn propose_by_public_should_panic() { - with_externalities(&mut new_test_ext(), || { - system::testing::set_block_number(1); + with_externalities(&mut new_test_ext(true), || { + System::set_block_number(1); let proposal = bonding_duration_proposal(42); - staking::public_pass_from_payment(&Dave).propose(Box::new(proposal)); + CouncilVoting::propose(&4, Box::new(proposal)); }); } } -*/ From d34753071379f0b2889daefacf93c75631c30f6e Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 30 Mar 2018 10:48:06 +0900 Subject: [PATCH 57/76] Avoid hardcoding blake2 into Header. --- Cargo.lock | 2 ++ demo/runtime/src/extrinsic.rs | 3 +-- polkadot/consensus/Cargo.toml | 1 + polkadot/consensus/src/lib.rs | 4 +++- substrate/bft/Cargo.toml | 1 + substrate/bft/src/lib.rs | 12 +++++++----- substrate/client/src/client.rs | 4 ++-- substrate/network/src/test/mod.rs | 2 +- substrate/runtime/democracy/src/lib.rs | 1 - 9 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 066d82996125d..d7ae173256190 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1176,6 +1176,7 @@ dependencies = [ "substrate-bft 0.1.0", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-support 0.1.0", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1627,6 +1628,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-support 0.1.0", "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/demo/runtime/src/extrinsic.rs b/demo/runtime/src/extrinsic.rs index 4e7c082b28082..a67ee5a738b97 100644 --- a/demo/runtime/src/extrinsic.rs +++ b/demo/runtime/src/extrinsic.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd::ops; use codec::{Input, Slicable}; use demo_primitives::{AccountId, TxOrder, Signature}; -use runtime::{Call, Staking}; +use runtime::Call; use runtime_primitives::{Checkable, Applyable}; use runtime_support::AuxDispatchable; @@ -173,7 +173,6 @@ impl Applyable for CheckedExtrinsic { fn apply(self) { let tx = self.0.extrinsic; - Staking::make_payment(&tx.signed); tx.function.dispatch(&tx.signed); } } diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml index b7ccbc6534b04..e6cdc1424b624 100644 --- a/polkadot/consensus/Cargo.toml +++ b/polkadot/consensus/Cargo.toml @@ -18,3 +18,4 @@ polkadot-transaction-pool = { path = "../transaction-pool" } substrate-bft = { path = "../../substrate/bft" } substrate-codec = { path = "../../substrate/codec" } substrate-primitives = { path = "../../substrate/primitives" } +substrate-runtime-support = { path = "../../substrate/runtime-support" } diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index a5c34e30ee406..ba05597c27126 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -41,6 +41,7 @@ extern crate polkadot_transaction_pool as transaction_pool; extern crate substrate_bft as bft; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; +extern crate substrate_runtime_support as runtime_support; #[macro_use] extern crate error_chain; @@ -54,6 +55,7 @@ use std::sync::Arc; use codec::Slicable; use table::{Table, Context as TableContextTrait}; use table::generic::Statement as GenericStatement; +use runtime_support::Hashable; use polkadot_api::{PolkadotApi, BlockBuilder}; use polkadot_primitives::{Hash, Timestamp}; use polkadot_primitives::block::Block as PolkadotBlock; @@ -474,7 +476,7 @@ impl bft::ProposerFactory for ProposerFactory type Error = Error; fn init(&self, parent_header: &SubstrateHeader, authorities: &[AuthorityId], sign_with: Arc) -> Result { - let parent_hash = parent_header.hash(); + let parent_hash = parent_header.blake2_256().into(); let checked_id = self.client.check_id(BlockId::Hash(parent_hash))?; let duty_roster = self.client.duty_roster(&checked_id)?; diff --git a/substrate/bft/Cargo.toml b/substrate/bft/Cargo.toml index 5d9fa23c63406..4c5978429f5cb 100644 --- a/substrate/bft/Cargo.toml +++ b/substrate/bft/Cargo.toml @@ -7,6 +7,7 @@ authors = ["Parity Technologies "] futures = "0.1.17" substrate-codec = { path = "../codec" } substrate-primitives = { path = "../primitives" } +substrate-runtime-support = { path = "../runtime-support" } ed25519 = { path = "../ed25519" } tokio-timer = "0.1.2" parking_lot = "0.4" diff --git a/substrate/bft/src/lib.rs b/substrate/bft/src/lib.rs index f9d870799d38c..c8440b0a70b8d 100644 --- a/substrate/bft/src/lib.rs +++ b/substrate/bft/src/lib.rs @@ -21,6 +21,7 @@ pub mod generic; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; +extern crate substrate_runtime_support as runtime_support; extern crate ed25519; extern crate tokio_timer; extern crate parking_lot; @@ -37,6 +38,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use codec::Slicable; use ed25519::LocalizedSignature; +use runtime_support::Hashable; use primitives::bft::{Message as PrimitiveMessage, Action as PrimitiveAction, Justification as PrimitiveJustification}; use primitives::block::{Block, Id as BlockId, Header, HeaderHash}; use primitives::AuthorityId; @@ -177,7 +179,7 @@ impl generic::Context for BftInstance