From f35763cc869ed46848001b0b37affa716938c787 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 19 Mar 2018 03:51:50 +0100 Subject: [PATCH] Modularised dispatch (#95) * Completely rework dispatch mechanism into something modular. Not yet complete but 75% there. * Council vote tests. * Fix tests. * whitespace. * Fix demo runtime tests. * Fix up tests. * Remove dead code. * Use match for Id * Make PrivPass better protected. * Address other grumbles. * Give PrivPass a private member. * Testing PrivPass. * Add docs. --- substrate/Cargo.lock | 2 + substrate/demo/executor/src/lib.rs | 50 +- substrate/demo/primitives/src/block.rs | 33 -- substrate/demo/primitives/src/lib.rs | 4 +- substrate/demo/primitives/src/transaction.rs | 495 ----------------- substrate/demo/runtime/Cargo.toml | 4 + substrate/demo/runtime/src/block.rs | 52 ++ substrate/demo/runtime/src/dispatch.rs | 292 +++++++--- substrate/demo/runtime/src/lib.rs | 49 +- substrate/demo/runtime/src/runtime/council.rs | 517 +++++++++--------- .../demo/runtime/src/runtime/council_vote.rs | 201 ++++--- .../demo/runtime/src/runtime/democracy.rs | 222 +++++--- substrate/demo/runtime/src/runtime/session.rs | 73 +-- substrate/demo/runtime/src/runtime/staking.rs | 244 +++++---- substrate/demo/runtime/src/runtime/system.rs | 51 +- .../demo/runtime/src/runtime/timestamp.rs | 14 +- substrate/demo/runtime/src/transaction.rs | 188 +++++++ .../release/demo_runtime.compact.wasm | Bin 155223 -> 160453 bytes .../release/demo_runtime.wasm | Bin 155272 -> 160504 bytes .../release/polkadot_runtime.compact.wasm | Bin 134774 -> 134847 bytes .../release/polkadot_runtime.wasm | Bin 134823 -> 134896 bytes .../substrate/codec/src/endiansensitive.rs | 81 --- substrate/substrate/codec/src/lib.rs | 2 - substrate/substrate/codec/src/slicable.rs | 150 +++-- substrate/substrate/ed25519/src/lib.rs | 2 +- .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 27 files changed, 1388 insertions(+), 1338 deletions(-) delete mode 100644 substrate/demo/primitives/src/transaction.rs create mode 100644 substrate/demo/runtime/src/block.rs create mode 100644 substrate/demo/runtime/src/transaction.rs delete mode 100644 substrate/substrate/codec/src/endiansensitive.rs diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index e59cafc4f3..3c5128bdef 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -255,6 +255,8 @@ 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)", + "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", diff --git a/substrate/demo/executor/src/lib.rs b/substrate/demo/executor/src/lib.rs index 1740897add..6e07f3c5fb 100644 --- a/substrate/demo/executor/src/lib.rs +++ b/substrate/demo/executor/src/lib.rs @@ -41,11 +41,13 @@ mod tests { use codec::{KeyedVec, Slicable, Joiner}; use keyring::Keyring::{self, Alice, Bob}; use runtime_support::Hashable; - use demo_runtime::runtime::staking::{self, balance, BALANCE_OF}; use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; - use demo_primitives::{Hash, Header, BlockNumber, Block, Digest, Transaction, - UncheckedTransaction, Function}; + use demo_primitives::{Hash, Header, BlockNumber, Digest}; + use demo_runtime::transaction::{Transaction, UncheckedTransaction}; + use demo_runtime::block::Block; + use demo_runtime::runtime::staking::{self, balance, BALANCE_OF}; + use demo_runtime::dispatch; use ed25519::{Public, Pair}; const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -62,7 +64,7 @@ mod tests { let transaction = Transaction { signed: Alice.into(), nonce: 0, - function: Function::StakingTransfer(Bob.into(), 69), + function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 69)), }; let signature = Keyring::from_raw_public(transaction.signed).unwrap() .sign(&transaction.encode()); @@ -73,7 +75,8 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -83,7 +86,8 @@ mod tests { #[test] fn panic_execution_with_native_equivalent_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -93,7 +97,8 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -108,7 +113,8 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -152,11 +158,11 @@ mod tests { construct_block( 1, [69u8; 32].into(), - hex!("970ae19447bef129c88ee80c72797fa9dfeda4ca1a26d10102b669d776eb0ccf").into(), + hex!("cfb76a83e40aa6a0d3f92255e6229e74808cae31d9f46053f31129b797540d03").into(), vec![Transaction { signed: Alice.into(), nonce: 0, - function: Function::StakingTransfer(Bob.into(), 69), + function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 69)), }] ) } @@ -165,17 +171,17 @@ mod tests { construct_block( 2, block1().1, - hex!("347ece6ef0d193bd7c2bfbda17706b82eb24c0965f415784a44b138f0df034cd").into(), + hex!("c713bd003e303648e8d904bcfa44084865c9b70c398547e678028cc7cf60907f").into(), vec![ Transaction { signed: Bob.into(), nonce: 0, - function: Function::StakingTransfer(Alice.into(), 5), + function: dispatch::PubCall::Staking(staking::public::Call::transfer(Alice.into(), 5)), }, Transaction { signed: Alice.into(), nonce: 1, - function: Function::StakingTransfer(Bob.into(), 15), + function: dispatch::PubCall::Staking(staking::public::Call::transfer(Bob.into(), 15)), } ] ) @@ -188,15 +194,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), 42); + assert_eq!(balance(&Alice), 41); assert_eq!(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), 32); - assert_eq!(balance(&Bob), 79); + assert_eq!(balance(&Alice), 30); + assert_eq!(balance(&Bob), 78); }); } @@ -207,22 +213,23 @@ mod tests { WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 42); + assert_eq!(balance(&Alice), 41); assert_eq!(balance(&Bob), 69); }); WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Alice), 32); - assert_eq!(balance(&Bob), 79); + assert_eq!(balance(&Alice), 30); + assert_eq!(balance(&Bob), 78); }); } #[test] fn panic_execution_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -233,7 +240,8 @@ mod tests { #[test] fn successful_execution_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); diff --git a/substrate/demo/primitives/src/block.rs b/substrate/demo/primitives/src/block.rs index 4183498fc7..f5119ac4b3 100644 --- a/substrate/demo/primitives/src/block.rs +++ b/substrate/demo/primitives/src/block.rs @@ -21,7 +21,6 @@ use primitives::bytes; use primitives::H256; use rstd::vec::Vec; use codec::{Input, Slicable}; -use transaction::UncheckedTransaction; pub use primitives::block::Id; @@ -31,9 +30,6 @@ pub type Number = u64; /// Hash used to refer to a block hash. pub type HeaderHash = H256; -/// Hash used to refer to a transaction hash. -pub type TransactionHash = H256; - /// Execution log (event) #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] @@ -69,35 +65,6 @@ impl Slicable for Digest { } } -/// The block "body": A bunch of transactions. -pub type Body = Vec; - -/// A block on the chain. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Block { - /// The block header. - pub header: Header, - /// All relay-chain transactions. - pub transactions: Body, -} - -impl Slicable for Block { - fn decode(input: &mut I) -> Option { - let (header, transactions) = try_opt!(Slicable::decode(input)); - Some(Block { header, transactions }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.header.encode()); - v.extend(self.transactions.encode()); - - v - } -} - /// Header for a block. #[derive(PartialEq, Eq, Clone)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] diff --git a/substrate/demo/primitives/src/lib.rs b/substrate/demo/primitives/src/lib.rs index e68d6d8727..c65d4a63ef 100644 --- a/substrate/demo/primitives/src/lib.rs +++ b/substrate/demo/primitives/src/lib.rs @@ -45,11 +45,9 @@ macro_rules! try_opt { } pub mod block; -pub mod transaction; -pub use self::block::{Header, Block, Log, Digest}; +pub use self::block::{Header, Log, Digest}; pub use self::block::Number as BlockNumber; -pub use self::transaction::{Transaction, UncheckedTransaction, Function, Proposal, VoteThreshold}; /// 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/substrate/demo/primitives/src/transaction.rs b/substrate/demo/primitives/src/transaction.rs deleted file mode 100644 index 8f0027459a..0000000000 --- a/substrate/demo/primitives/src/transaction.rs +++ /dev/null @@ -1,495 +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 . - -//! Transaction type. - -use rstd::prelude::*; -use codec::{Input, Slicable, NonTrivialSlicable}; -use {AccountId, SessionKey}; - -#[cfg(feature = "std")] -use std::fmt; - -use block::Number as BlockNumber; - -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[repr(u8)] -enum InternalFunctionId { - SystemSetCode = 0x00, - - SessionSetLength = 0x10, - SessionForceNewSession = 0x11, - - StakingSetSessionsPerEra = 0x20, - StakingSetBondingDuration = 0x21, - StakingSetValidatorCount = 0x22, - StakingForceNewEra = 0x23, - - DemocracyCancelReferendum = 0x30, - DemocracyStartReferendum = 0x31, - - CouncilSetDesiredSeats = 0x40, - CouncilRemoveMember = 0x41, - CouncilSetPresentationDuration = 0x42, - CouncilSetTermDuration = 0x43, - - CouncilVoteSetCooloffPeriod = 0x50, - CouncilVoteSetVotingPeriod = 0x51, -} - -impl InternalFunctionId { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - let functions = [ - InternalFunctionId::SystemSetCode, - InternalFunctionId::SessionSetLength, - InternalFunctionId::SessionForceNewSession, - InternalFunctionId::StakingSetSessionsPerEra, - InternalFunctionId::StakingSetBondingDuration, - InternalFunctionId::StakingSetValidatorCount, - InternalFunctionId::StakingForceNewEra, - InternalFunctionId::DemocracyCancelReferendum, - InternalFunctionId::DemocracyStartReferendum, - InternalFunctionId::CouncilSetDesiredSeats, - InternalFunctionId::CouncilRemoveMember, - InternalFunctionId::CouncilSetPresentationDuration, - InternalFunctionId::CouncilSetTermDuration, - InternalFunctionId::CouncilVoteSetCooloffPeriod, - InternalFunctionId::CouncilVoteSetVotingPeriod, - ]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// A means of determining whether a referendum has gone through or not. -#[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 { - u8::decode(input).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 { - match *self { - VoteThreshold::SuperMajorityApprove => 0u8, - VoteThreshold::SuperMajorityAgainst => 1u8, - VoteThreshold::SimpleMajority => 2u8, - }.using_encoded(f) - } -} -impl NonTrivialSlicable for VoteThreshold {} - -/// Internal functions that can be dispatched to. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[allow(missing_docs)] -pub enum Proposal { - SystemSetCode(Vec), - SessionSetLength(BlockNumber), - SessionForceNewSession, - StakingSetSessionsPerEra(BlockNumber), - StakingSetBondingDuration(BlockNumber), - StakingSetValidatorCount(u32), - StakingForceNewEra, - DemocracyStartReferendum(Box, VoteThreshold), - DemocracyCancelReferendum(u32), - CouncilSetDesiredSeats(u32), - CouncilRemoveMember(AccountId), - CouncilSetPresentationDuration(BlockNumber), - CouncilSetTermDuration(BlockNumber), - CouncilVoteSetCooloffPeriod(BlockNumber), - CouncilVoteSetVotingPeriod(BlockNumber), -} - -impl Slicable for Proposal { - fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(InternalFunctionId::from_u8)?; - let function = match id { - InternalFunctionId::SystemSetCode => - Proposal::SystemSetCode(Slicable::decode(input)?), - InternalFunctionId::SessionSetLength => - Proposal::SessionSetLength(Slicable::decode(input)?), - InternalFunctionId::SessionForceNewSession => - Proposal::SessionForceNewSession, - InternalFunctionId::StakingSetSessionsPerEra => - Proposal::StakingSetSessionsPerEra(Slicable::decode(input)?), - InternalFunctionId::StakingSetBondingDuration => - Proposal::StakingSetBondingDuration(Slicable::decode(input)?), - InternalFunctionId::StakingSetValidatorCount => - Proposal::StakingSetValidatorCount(Slicable::decode(input)?), - InternalFunctionId::StakingForceNewEra => - Proposal::StakingForceNewEra, - InternalFunctionId::DemocracyStartReferendum => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - Proposal::DemocracyStartReferendum(Box::new(a), b) - } - InternalFunctionId::DemocracyCancelReferendum => - Proposal::DemocracyCancelReferendum(Slicable::decode(input)?), - InternalFunctionId::CouncilSetDesiredSeats => - Proposal::CouncilSetDesiredSeats(Slicable::decode(input)?), - InternalFunctionId::CouncilRemoveMember => - Proposal::CouncilRemoveMember(Slicable::decode(input)?), - InternalFunctionId::CouncilSetPresentationDuration => - Proposal::CouncilSetPresentationDuration(Slicable::decode(input)?), - InternalFunctionId::CouncilSetTermDuration => - Proposal::CouncilSetTermDuration(Slicable::decode(input)?), - InternalFunctionId::CouncilVoteSetCooloffPeriod => - Proposal::CouncilVoteSetCooloffPeriod(Slicable::decode(input)?), - InternalFunctionId::CouncilVoteSetVotingPeriod => - Proposal::CouncilVoteSetVotingPeriod(Slicable::decode(input)?), - }; - - Some(function) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Proposal::SystemSetCode(ref data) => { - (InternalFunctionId::SystemSetCode as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Proposal::SessionSetLength(ref data) => { - (InternalFunctionId::SessionSetLength as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Proposal::SessionForceNewSession => { - (InternalFunctionId::SessionForceNewSession as u8).using_encoded(|s| v.extend(s)); - } - Proposal::StakingSetSessionsPerEra(ref data) => { - (InternalFunctionId::StakingSetSessionsPerEra as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingSetBondingDuration(ref data) => { - (InternalFunctionId::StakingSetBondingDuration as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingSetValidatorCount(ref data) => { - (InternalFunctionId::StakingSetValidatorCount as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingForceNewEra => { - (InternalFunctionId::StakingForceNewEra as u8).using_encoded(|s| v.extend(s)); - } - Proposal::DemocracyCancelReferendum(ref data) => { - (InternalFunctionId::DemocracyCancelReferendum as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - _ => { unimplemented!() } - } - - v - } -} - -/// Public functions that can be dispatched to. -#[derive(Clone, Copy, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[repr(u8)] -enum FunctionId { - TimestampSet = 0x00, - - SessionSetKey = 0x10, - - StakingStake = 0x20, - StakingUnstake = 0x21, - StakingTransfer = 0x22, - - CouncilVotePropose = 0x30, - CouncilVoteVote = 0x31, - CouncilVoteVeto = 0x32, - - CouncilSetApprovals = 0x40, - CouncilReapInactiveVoter = 0x41, - CouncilRetractVoter = 0x42, - CouncilSubmitCandidacy = 0x43, - CouncilPresentWinner = 0x44, - - DemocracyPropose = 0x50, - DemocracySecond = 0x51, - DemocracyVote = 0x52, -} - -impl FunctionId { - /// Derive `Some` value from a `u8`, or `None` if it's invalid. - fn from_u8(value: u8) -> Option { - use self::*; - let functions = [FunctionId::StakingStake, FunctionId::StakingUnstake, - FunctionId::StakingTransfer, FunctionId::SessionSetKey, FunctionId::TimestampSet, - FunctionId::CouncilVotePropose, FunctionId::CouncilVoteVote, FunctionId::CouncilVoteVeto, - FunctionId::CouncilSetApprovals, FunctionId::CouncilReapInactiveVoter, - FunctionId::CouncilRetractVoter, FunctionId::CouncilSubmitCandidacy, - FunctionId::CouncilPresentWinner, FunctionId::DemocracyPropose, - FunctionId::DemocracySecond, FunctionId::DemocracyVote, - ]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// Functions on the runtime. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[allow(missing_docs)] -pub enum Function { - TimestampSet(u64), - - SessionSetKey(SessionKey), - - StakingStake, - StakingUnstake, - StakingTransfer(AccountId, u64), - - CouncilVotePropose(Proposal), - CouncilVoteVote([u8; 32], bool), - CouncilVoteVeto([u8; 32]), - - CouncilSetApprovals(Vec, u32), - CouncilReapInactiveVoter(u32, AccountId, u32, u32), - CouncilRetractVoter(u32), - CouncilSubmitCandidacy(u32), - CouncilPresentWinner(AccountId, u64, u32), - - DemocracyPropose(Proposal, u64), - DemocracySecond(u32), - DemocracyVote(u32, bool), -} - -impl Slicable for Function { - fn decode(input: &mut I) -> Option { - let id = u8::decode(input).and_then(FunctionId::from_u8)?; - Some(match id { - FunctionId::TimestampSet => - Function::TimestampSet(Slicable::decode(input)?), - FunctionId::SessionSetKey => - Function::SessionSetKey(Slicable::decode(input)?), - FunctionId::StakingStake => Function::StakingStake, - FunctionId::StakingUnstake => Function::StakingUnstake, - FunctionId::StakingTransfer => { - let to = Slicable::decode(input)?; - let amount = Slicable::decode(input)?; - Function::StakingTransfer(to, amount) - } - FunctionId::CouncilVotePropose => Function::CouncilVotePropose(Slicable::decode(input)?), - FunctionId::CouncilVoteVote => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - Function::CouncilVoteVote(a, b) - } - FunctionId::CouncilVoteVeto => Function::CouncilVoteVeto(Slicable::decode(input)?), - FunctionId::CouncilSetApprovals => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - Function::CouncilSetApprovals(a, b) - } - FunctionId::CouncilReapInactiveVoter => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - let c = Slicable::decode(input)?; - let d = Slicable::decode(input)?; - Function::CouncilReapInactiveVoter(a, b, c, d) - } - FunctionId::CouncilRetractVoter => Function::CouncilRetractVoter(Slicable::decode(input)?), - FunctionId::CouncilSubmitCandidacy => Function::CouncilSubmitCandidacy(Slicable::decode(input)?), - FunctionId::CouncilPresentWinner => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - let c = Slicable::decode(input)?; - Function::CouncilPresentWinner(a, b, c) - } - FunctionId::DemocracyPropose => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - Function::DemocracyPropose(a, b) - } - FunctionId::DemocracySecond => Function::DemocracySecond(Slicable::decode(input)?), - FunctionId::DemocracyVote => { - let a = Slicable::decode(input)?; - let b = Slicable::decode(input)?; - Function::DemocracyVote(a, b) - } - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Function::TimestampSet(ref data) => { - (FunctionId::TimestampSet as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Function::SessionSetKey(ref data) => { - (FunctionId::SessionSetKey as u8).using_encoded(|s| v.extend(s)); - data.using_encoded(|s| v.extend(s)); - } - Function::StakingStake => { - (FunctionId::StakingStake as u8).using_encoded(|s| v.extend(s)); - } - Function::StakingUnstake => { - (FunctionId::StakingUnstake as u8).using_encoded(|s| v.extend(s)); - } - Function::StakingTransfer(ref to, ref amount) => { - (FunctionId::StakingTransfer as u8).using_encoded(|s| v.extend(s)); - to.using_encoded(|s| v.extend(s)); - amount.using_encoded(|s| v.extend(s)); - } - _ => { unimplemented!() } - } - - v - } - - fn using_encoded R>(&self, f: F) -> R { - f(self.encode().as_slice()) - } -} - -/// A vetted and verified transaction from the external world. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Transaction { - /// Who signed it (note this is not a signature). - pub signed: super::AccountId, - /// The number of transactions have come before from the same signer. - pub nonce: super::TxOrder, - /// The function that should be called. - pub function: Function, -} - -impl Slicable for Transaction { - fn decode(input: &mut I) -> Option { - Some(Transaction { - signed: try_opt!(Slicable::decode(input)), - nonce: try_opt!(Slicable::decode(input)), - function: try_opt!(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 - } -} - -impl ::codec::NonTrivialSlicable for Transaction {} - -/// A transactions right from the external world. Unchecked. -#[derive(Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct UncheckedTransaction { - /// The actual transaction information. - pub transaction: Transaction, - /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. - pub signature: super::Signature, -} - -impl Slicable for UncheckedTransaction { - 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 = try_opt!(Slicable::decode(input)); - - Some(UncheckedTransaction { - transaction: try_opt!(Slicable::decode(input)), - signature: try_opt!(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.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.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 ::codec::NonTrivialSlicable for UncheckedTransaction {} - -impl PartialEq for UncheckedTransaction { - 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 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "UncheckedTransaction({:?})", self.transaction) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use primitives; - use ::codec::Slicable; - use primitives::hexdisplay::HexDisplay; - - #[test] - fn serialize_unchecked() { - let tx = UncheckedTransaction { - transaction: Transaction { - signed: [1; 32], - nonce: 999u64, - function: Function::TimestampSet(135135), - }, - signature: primitives::hash::H512([0; 64]), - }; - // 71000000 - // 0101010101010101010101010101010101010101010101010101010101010101 - // e703000000000000 - // 00 - // df0f0200 - // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - - let v = Slicable::encode(&tx); - println!("{}", HexDisplay::from(&v)); - assert_eq!(UncheckedTransaction::decode(&mut &v[..]).unwrap(), tx); - } -} diff --git a/substrate/demo/runtime/Cargo.toml b/substrate/demo/runtime/Cargo.toml index bcd3f5dcf0..4033111d7d 100644 --- a/substrate/demo/runtime/Cargo.toml +++ b/substrate/demo/runtime/Cargo.toml @@ -7,6 +7,8 @@ authors = ["Parity Technologies "] rustc-hex = "1.0" 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 } substrate-codec = { path = "../../substrate/codec" } substrate-runtime-std = { path = "../../substrate/runtime-std" } substrate-runtime-io = { path = "../../substrate/runtime-io" } @@ -25,5 +27,7 @@ std = [ "substrate-runtime-support/std", "substrate-primitives/std", "demo-primitives/std", + "serde_derive", + "serde/std", "log" ] diff --git a/substrate/demo/runtime/src/block.rs b/substrate/demo/runtime/src/block.rs new file mode 100644 index 0000000000..182f9ca89b --- /dev/null +++ b/substrate/demo/runtime/src/block.rs @@ -0,0 +1,52 @@ +// 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 transaction::UncheckedTransaction; + +pub use demo_primitives::block::{Header, Digest, Log, Number, HeaderHash}; + +/// The block "body": A bunch of transactions. +pub type Body = Vec; + +/// A block on the chain. +#[derive(PartialEq, Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +pub struct Block { + /// The block header. + pub header: Header, + /// All relay-chain transactions. + pub transactions: Body, +} + +impl Slicable for Block { + fn decode(input: &mut I) -> Option { + let (header, transactions) = Slicable::decode(input)?; + Some(Block { header, transactions }) + } + + fn encode(&self) -> Vec { + let mut v = Vec::new(); + + v.extend(self.header.encode()); + v.extend(self.transactions.encode()); + + v + } +} diff --git a/substrate/demo/runtime/src/dispatch.rs b/substrate/demo/runtime/src/dispatch.rs index ee5c03d952..8290d071aa 100644 --- a/substrate/demo/runtime/src/dispatch.rs +++ b/substrate/demo/runtime/src/dispatch.rs @@ -16,79 +16,231 @@ //! Dispatch system. Just dispatches calls. -use demo_primitives::{Function, Proposal, AccountId}; -use runtime::{staking, system, session, democracy, council, council_vote, timestamp}; +use runtime::{staking, democracy}; +pub use rstd::prelude::Vec; +pub use codec::{Slicable, Input, NonTrivialSlicable}; -/// Dispatch a proposal. -pub fn proposal(proposal: Proposal) { - match proposal { - Proposal::SystemSetCode(ref a) => - system::privileged::set_code(a), - Proposal::SessionSetLength(a) => - session::privileged::set_length(a), - Proposal::SessionForceNewSession => - session::privileged::force_new_session(), - Proposal::StakingSetSessionsPerEra(a) => - staking::privileged::set_sessions_per_era(a), - Proposal::StakingSetBondingDuration(a) => - staking::privileged::set_bonding_duration(a), - Proposal::StakingSetValidatorCount(a) => - staking::privileged::set_validator_count(a), - Proposal::StakingForceNewEra => - staking::privileged::force_new_era(), - Proposal::DemocracyCancelReferendum(a) => - democracy::privileged::cancel_referendum(a), - Proposal::DemocracyStartReferendum(a, b) => - democracy::privileged::start_referendum(*a, b), - Proposal::CouncilSetDesiredSeats(a) => - council::privileged::set_desired_seats(a), - Proposal::CouncilRemoveMember(a) => - council::privileged::remove_member(&a), - Proposal::CouncilSetPresentationDuration(a) => - council::privileged::set_presentation_duration(a), - Proposal::CouncilSetTermDuration(a) => - council::privileged::set_term_duration(a), - Proposal::CouncilVoteSetCooloffPeriod(a) => - council_vote::privileged::set_cooloff_period(a), - Proposal::CouncilVoteSetVotingPeriod(a) => - council_vote::privileged::set_voting_period(a), +/// 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 {} + } } } -/// Dispatch a function. -pub fn function(function: &Function, transactor: &AccountId) { - match *function { - Function::StakingStake => - staking::public::stake(transactor), - Function::StakingUnstake => - staking::public::unstake(transactor), - Function::StakingTransfer(dest, value) => - staking::public::transfer(transactor, &dest, value), - Function::SessionSetKey(session) => - session::public::set_key(transactor, &session), - Function::TimestampSet(t) => - timestamp::public::set(t), - Function::CouncilVotePropose(ref a) => - council_vote::public::propose(transactor, a), - Function::CouncilVoteVote(ref a, b) => - council_vote::public::vote(transactor, a, b), - Function::CouncilVoteVeto(ref a) => - council_vote::public::veto(transactor, a), - Function::CouncilSetApprovals(ref a, b) => - council::public::set_approvals(transactor, a, b), - Function::CouncilReapInactiveVoter(a, ref b, c, d) => - council::public::reap_inactive_voter(transactor, a, b, c, d), - Function::CouncilRetractVoter(a) => - council::public::retract_voter(transactor, a), - Function::CouncilSubmitCandidacy(a) => - council::public::submit_candidacy(transactor, a), - Function::CouncilPresentWinner(ref a, b, c) => - council::public::present_winner(transactor, a, b, c), - Function::DemocracyPropose(ref a, b) => - democracy::public::propose(transactor, a, b), - Function::DemocracySecond(a) => - democracy::public::second(transactor, a), - Function::DemocracyVote(a, b) => - democracy::public::vote(transactor, a, b), +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 {} + } } } + +impl_meta_dispatch! { + pub mod public; + path 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; +} + +impl_meta_dispatch! { + pub mod privileged; + path 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; +} + +pub use self::privileged::Call as PrivCall; +pub use self::public::Call as PubCall; diff --git a/substrate/demo/runtime/src/lib.rs b/substrate/demo/runtime/src/lib.rs index a351da4230..1df77cc8cb 100644 --- a/substrate/demo/runtime/src/lib.rs +++ b/substrate/demo/runtime/src/lib.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Substrate Demo. If not, see . -//! The Substrate Demo runtime. This can be compiled with #[no_std], ready for Wasm. +//! The Substrate Demo runtime. This can be compiled with ``#[no_std]`, ready for Wasm. #![cfg_attr(not(feature = "std"), no_std)] @@ -23,6 +23,9 @@ extern crate substrate_runtime_support as runtime_support; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; +#[cfg(feature = "std")] extern crate serde; + #[cfg(feature = "std")] extern crate rustc_hex; extern crate substrate_codec as codec; @@ -33,48 +36,12 @@ extern crate demo_primitives; extern crate integer_sqrt; +#[macro_use] pub mod dispatch; + +pub mod block; +pub mod transaction; pub mod environment; pub mod runtime; pub mod api; -pub mod dispatch; #[cfg(feature = "std")] pub mod genesismap; - -/// Type definitions and helpers for transactions. -pub mod transaction { - use rstd::ops; - use demo_primitives::Signature; - pub use demo_primitives::{Transaction, UncheckedTransaction}; - - /// A type-safe indicator that a transaction has been checked. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug))] - pub struct CheckedTransaction(UncheckedTransaction); - - impl CheckedTransaction { - /// Get a reference to the checked signature. - pub fn signature(&self) -> &Signature { - &self.0.signature - } - } - - impl ops::Deref for CheckedTransaction { - type Target = Transaction; - - fn deref(&self) -> &Transaction { - &self.0.transaction - } - } - - /// Check the signature on a transaction. - /// - /// On failure, return the transaction back. - pub fn check(tx: UncheckedTransaction) -> Result { - let msg = ::codec::Slicable::encode(&tx.transaction); - if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { - Ok(CheckedTransaction(tx)) - } else { - Err(tx) - } - } -} diff --git a/substrate/demo/runtime/src/runtime/council.rs b/substrate/demo/runtime/src/runtime/council.rs index fc93748ac1..504461cf19 100644 --- a/substrate/demo/runtime/src/runtime/council.rs +++ b/substrate/demo/runtime/src/runtime/council.rs @@ -19,9 +19,10 @@ use rstd::prelude::*; use codec::KeyedVec; use runtime_support::storage; -use demo_primitives::{Proposal, AccountId, Hash, BlockNumber}; +use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{staking, system, session}; -use runtime::staking::Balance; +use runtime::democracy::PrivPass; +use runtime::staking::{PublicPass, Balance}; // no polynomial attacks: // @@ -255,25 +256,32 @@ pub fn leaderboard() -> Option> { storage::get(LEADERBOARD) } -pub mod public { - use super::*; +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; +} +impl<'a> public::Dispatch for PublicPass<'a> { /// Set candidate approvals. Approval slots stay valid as long as candidates in those slots /// are registered. - pub fn set_approvals(signed: &AccountId, votes: &Vec, index: VoteIndex) { + fn set_approvals(self, votes: Vec, index: VoteIndex) { assert!(!presentation_active()); assert_eq!(index, vote_index()); - if !storage::exists(&signed.to_keyed_vec(LAST_ACTIVE_OF)) { + if !storage::exists(&self.to_keyed_vec(LAST_ACTIVE_OF)) { // not yet a voter - deduct bond. - staking::internal::reserve_balance(signed, voting_bond()); + staking::internal::reserve_balance(&self, voting_bond()); storage::put(VOTERS, &{ let mut v: Vec = storage::get_or_default(VOTERS); - v.push(signed.clone()); + v.push(self.clone()); v }); } - storage::put(&signed.to_keyed_vec(APPROVALS_OF), votes); - storage::put(&signed.to_keyed_vec(LAST_ACTIVE_OF), &index); + storage::put(&self.to_keyed_vec(APPROVALS_OF), &votes); + storage::put(&self.to_keyed_vec(LAST_ACTIVE_OF), &index); } /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices @@ -281,21 +289,21 @@ pub mod public { /// the voter gave their last approval set. /// /// May be called by anyone. Returns the voter deposit to `signed`. - pub fn reap_inactive_voter(signed: &AccountId, signed_index: u32, who: &AccountId, who_index: u32, assumed_vote_index: VoteIndex) { + 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(signed).is_some(), "reaper must be a voter"); - let last_active = voter_last_active(who).expect("target for inactivity cleanup must be active"); + 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] == *signed, "bad reporter index"); - assert!(who_index < voters.len() && voters[who_index] == *who, "bad target index"); + 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() + let valid = !approvals_of(&who).iter() .zip(candidates().iter()) .any(|(&appr, addr)| appr && @@ -304,35 +312,35 @@ pub mod public { .expect("all items in candidates list are registered").0 <= last_active); remove_voter( - if valid { who } else { signed }, + if valid { &who } else { &self }, if valid { who_index } else { signed_index }, voters ); if valid { - staking::internal::transfer_reserved_balance(who, signed, voting_bond()); + staking::internal::transfer_reserved_balance(&who, &self, voting_bond()); } else { - staking::internal::slash_reserved(signed, voting_bond()); + staking::internal::slash_reserved(&self, voting_bond()); } } /// Remove a voter. All votes are cancelled and the voter deposit is returned. - pub fn retract_voter(signed: &AccountId, index: u32) { + fn retract_voter(self, index: u32) { assert!(!presentation_active(), "cannot retract when presenting"); - assert!(storage::exists(&signed.to_keyed_vec(LAST_ACTIVE_OF)), "cannot retract non-voter"); + assert!(storage::exists(&self.to_keyed_vec(LAST_ACTIVE_OF)), "cannot retract non-voter"); let voters = voters(); let index = index as usize; assert!(index < voters.len(), "retraction index invalid"); - assert!(voters[index] == *signed, "retraction index mismatch"); - remove_voter(signed, index, voters); - staking::internal::unreserve_balance(signed, voting_bond()); + 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. - pub fn submit_candidacy(signed: &AccountId, slot: u32) { - assert!(!is_a_candidate(signed), "duplicate candidate submission"); - assert!(staking::internal::deduct_unbonded(signed, candidacy_bond()), "candidate has not enough funds"); + 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 = storage::get_or_default::(CANDIDATE_COUNT) as usize; @@ -345,31 +353,31 @@ pub mod public { let mut candidates = candidates; if slot == candidates.len() { - candidates.push(signed.clone()); + candidates.push(self.clone()); } else { - candidates[slot] = signed.clone(); + candidates[slot] = self.clone(); } storage::put(CANDIDATES, &candidates); storage::put(CANDIDATE_COUNT, &(count as u32 + 1)); - storage::put(&signed.to_keyed_vec(REGISTER_INFO_OF), &(vote_index(), slot)); + storage::put(&self.to_keyed_vec(REGISTER_INFO_OF), &(vote_index(), slot)); } /// 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 - pub fn present_winner(signed: &AccountId, candidate: &AccountId, total: Balance, index: VoteIndex) { + fn present_winner(self, candidate: AccountId, total: Balance, index: VoteIndex) { assert_eq!(index, vote_index(), "index not current"); let (_, _, expiring): (BlockNumber, u32, Vec) = storage::get(NEXT_FINALISE) .expect("cannot present outside of presentation period"); let stakes: Vec = storage::get_or_default(SNAPSHOTED_STAKES); let voters: Vec = storage::get_or_default(VOTERS); let bad_presentation_punishment = present_slash_per_voter() * voters.len() as Balance; - assert!(staking::can_slash(signed, bad_presentation_punishment), "presenter must have sufficient slashable funds"); + 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) { + 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"); } @@ -385,55 +393,60 @@ pub mod public { _ => None, }) .sum(); - let dupe = leaderboard.iter().find(|&&(_, ref c)| c == candidate).is_some(); + 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); storage::put(LEADERBOARD, &leaderboard); } else { - staking::internal::slash(signed, bad_presentation_punishment); + staking::internal::slash(&self, bad_presentation_punishment); } } } -pub mod privileged { - use super::*; +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; +} +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. - pub fn set_desired_seats(count: u32) { + fn set_desired_seats(self, count: u32) { storage::put(DESIRED_SEATS, &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. - pub fn remove_member(who: &AccountId) { + fn remove_member(self, who: AccountId) { let new_council: Vec<(AccountId, BlockNumber)> = active_council() .into_iter() - .filter(|i| i.0 != *who) + .filter(|i| i.0 != who) .collect(); storage::put(ACTIVE_COUNCIL, &new_council); } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. - pub fn set_presentation_duration(count: BlockNumber) { + fn set_presentation_duration(self, count: BlockNumber) { storage::put(PRESENTATION_DURATION, &count); } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. - pub fn set_term_duration(count: BlockNumber) { + fn set_term_duration(self, count: BlockNumber) { storage::put(TERM_DURATION, &count); } } pub mod internal { use super::*; - use demo_primitives::Proposal; /// Check there's nothing to do this block pub fn end_block() { @@ -574,8 +587,10 @@ mod tests { use codec::{KeyedVec, Joiner}; use keyring::Keyring::*; use environment::with_env; - use demo_primitives::{AccountId, Proposal}; + 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() @@ -624,14 +639,14 @@ mod tests { assert_eq!(is_a_candidate(&Alice), false); assert_eq!(is_a_candidate(&Bob), false); - public::submit_candidacy(&Alice, 0); + 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); - public::submit_candidacy(&Bob, 1); + 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))); @@ -656,10 +671,10 @@ mod tests { with_env(|e| e.block_number = 1); assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()]); - public::submit_candidacy(&Bob, 1); + PublicPass::test(&Bob).submit_candidacy(1); assert_eq!(candidates(), vec![AccountId::default(), Bob.into(), Alice.to_raw_public()]); - public::submit_candidacy(&Charlie, 0); + PublicPass::test(&Charlie).submit_candidacy(0); assert_eq!(candidates(), vec![Charlie.into(), Bob.into(), Alice.to_raw_public()]); }); } @@ -672,10 +687,10 @@ mod tests { with_env(|e| e.block_number = 1); assert_eq!(candidates(), vec![AccountId::default(), AccountId::default(), Alice.into()]); - public::submit_candidacy(&Bob, 0); + PublicPass::test(&Bob).submit_candidacy(0); assert_eq!(candidates(), vec![Bob.into(), AccountId::default(), Alice.into()]); - public::submit_candidacy(&Charlie, 1); + PublicPass::test(&Charlie).submit_candidacy(1); assert_eq!(candidates(), vec![Bob.to_raw_public(), Charlie.into(), Alice.into()]); }); } @@ -687,7 +702,7 @@ mod tests { with_externalities(&mut t, || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Dave, 3); + PublicPass::test(&Dave).submit_candidacy(3); }); } @@ -697,7 +712,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); assert_eq!(candidates(), Vec::::new()); - public::submit_candidacy(&Alice, 1); + PublicPass::test(&Alice).submit_candidacy(1); }); } @@ -707,8 +722,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); assert_eq!(candidates(), Vec::::new()); - public::submit_candidacy(&Alice, 0); - public::submit_candidacy(&Bob, 0); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Bob).submit_candidacy(0); }); } @@ -718,8 +733,8 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); assert_eq!(candidates(), Vec::::new()); - public::submit_candidacy(&Alice, 0); - public::submit_candidacy(&Alice, 1); + PublicPass::test(&Alice).submit_candidacy(0); + PublicPass::test(&Alice).submit_candidacy(1); }); } @@ -729,7 +744,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); assert_eq!(candidates(), Vec::::new()); - public::submit_candidacy(&One, 0); + PublicPass::test(&One).submit_candidacy(0); }); } @@ -738,20 +753,20 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Eve, 0); + PublicPass::test(&Eve).submit_candidacy(0); - public::set_approvals(&Alice, &vec![true], 0); - public::set_approvals(&Dave, &vec![true], 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()]); - public::submit_candidacy(&Bob, 1); - public::submit_candidacy(&Charlie, 2); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Charlie).submit_candidacy(2); - public::set_approvals(&Bob, &vec![false, true, true], 0); - public::set_approvals(&Charlie, &vec![false, true, true], 0); + 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]); @@ -759,8 +774,6 @@ mod tests { assert_eq!(approvals_of(&Charlie), vec![false, true, true]); assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into(), Bob.into(), Charlie.into()]); - - }); } @@ -769,14 +782,14 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Dave, &vec![true], 0); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Dave).set_approvals(vec![true], 0); assert_eq!(approvals_of(&Dave), vec![true]); - public::submit_candidacy(&Bob, 1); - public::submit_candidacy(&Charlie, 2); - public::set_approvals(&Dave, &vec![true, false, true], 0); + 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]); }); @@ -787,14 +800,14 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Eve, 0); - public::submit_candidacy(&Bob, 1); - public::submit_candidacy(&Charlie, 2); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Bob).submit_candidacy(1); + PublicPass::test(&Charlie).submit_candidacy(2); - public::set_approvals(&Alice, &vec![true], 0); - public::set_approvals(&Bob, &vec![false, true, true], 0); - public::set_approvals(&Charlie, &vec![false, true, true], 0); - public::set_approvals(&Dave, &vec![true, false, true], 0); + 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]); @@ -802,7 +815,7 @@ mod tests { assert_eq!(approvals_of(&Charlie), vec![false, true, true]); assert_eq!(approvals_of(&Dave), vec![true, false, true]); - public::retract_voter(&Alice, 0); + 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()); @@ -810,7 +823,7 @@ mod tests { assert_eq!(approvals_of(&Charlie), vec![false, true, true]); assert_eq!(approvals_of(&Dave), vec![true, false, true]); - public::retract_voter(&Bob, 1); + PublicPass::test(&Bob).retract_voter(1); assert_eq!(voters(), vec![Dave.to_raw_public(), Charlie.into()]); assert_eq!(approvals_of(&Alice), Vec::::new()); @@ -818,7 +831,7 @@ mod tests { assert_eq!(approvals_of(&Charlie), vec![false, true, true]); assert_eq!(approvals_of(&Dave), vec![true, false, true]); - public::retract_voter(&Charlie, 1); + PublicPass::test(&Charlie).retract_voter(1); assert_eq!(voters(), vec![Dave.to_raw_public()]); assert_eq!(approvals_of(&Alice), Vec::::new()); @@ -833,10 +846,10 @@ mod tests { fn invalid_retraction_index_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Charlie, 0); - public::set_approvals(&Alice, &vec![true], 0); - public::set_approvals(&Bob, &vec![true], 0); - public::retract_voter(&Alice, 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); }); } @@ -845,9 +858,9 @@ mod tests { fn overflow_retraction_index_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Charlie, 0); - public::set_approvals(&Alice, &vec![true], 0); - public::retract_voter(&Alice, 1); + PublicPass::test(&Charlie).submit_candidacy(0); + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Alice).retract_voter(1); }); } @@ -856,9 +869,9 @@ mod tests { fn non_voter_retraction_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::submit_candidacy(&Charlie, 0); - public::set_approvals(&Alice, &vec![true], 0); - public::retract_voter(&Bob, 0); + PublicPass::test(&Charlie).submit_candidacy(0); + PublicPass::test(&Alice).set_approvals(vec![true], 0); + PublicPass::test(&Bob).retract_voter(0); }); } @@ -868,16 +881,16 @@ mod tests { with_env(|e| e.block_number = 4); assert!(!presentation_active()); - public::submit_candidacy(&Bob, 0); - public::submit_candidacy(&Eve, 1); - public::set_approvals(&Bob, &vec![true, false], 0); - public::set_approvals(&Eve, &vec![false, true], 0); + 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(); with_env(|e| e.block_number = 6); assert!(presentation_active()); - public::present_winner(&Dave, &Bob, 11, 0); - public::present_winner(&Dave, &Eve, 41, 0); + 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(); @@ -899,16 +912,16 @@ mod tests { assert!(staking::can_slash(&Dave, 10)); with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::submit_candidacy(&Eve, 1); - public::set_approvals(&Bob, &vec![true, false], 0); - public::set_approvals(&Eve, &vec![false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); - public::present_winner(&Dave, &Eve, 41, 0); - public::present_winner(&Dave, &Eve, 41, 0); + 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)]); @@ -920,26 +933,26 @@ mod tests { fn retracting_inactive_voter_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Eve, &vec![true], 1); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Eve, 41, 1); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); internal::end_block(); - public::reap_inactive_voter( - &Eve, voters().iter().position(|&i| i == *Eve).unwrap() as u32, - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 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 ); @@ -955,21 +968,21 @@ mod tests { fn presenting_for_double_election_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 1); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Bob, 11, 1); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); }); } @@ -977,29 +990,29 @@ mod tests { fn retracting_inactive_voter_with_other_candidates_in_slots_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Eve, &vec![true], 1); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Eve, 41, 1); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); internal::end_block(); with_env(|e| e.block_number = 11); - public::submit_candidacy(&Alice, 0); + PublicPass::test(&Alice).submit_candidacy(0); - public::reap_inactive_voter( - &Eve, voters().iter().position(|&i| i == *Eve).unwrap() as u32, - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 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 ); @@ -1015,26 +1028,26 @@ mod tests { fn retracting_inactive_voter_with_bad_reporter_index_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 8, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Eve, &vec![true], 1); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Eve, 38, 1); + PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); internal::end_block(); - public::reap_inactive_voter( - &Bob, 42, - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, + PublicPass::test(&Bob).reap_inactive_voter( + 42, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, 2 ); }); @@ -1045,26 +1058,26 @@ mod tests { fn retracting_inactive_voter_with_bad_target_index_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 8, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 8, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Eve, &vec![true], 1); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Eve, 38, 1); + PublicPass::test(&Dave).present_winner(Eve.into(), 38, 1); internal::end_block(); - public::reap_inactive_voter( - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, - &Bob, 42, + PublicPass::test(&Bob).reap_inactive_voter( + voters().iter().position(|&i| i == *Bob).unwrap() as u32, + Bob.into(), 42, 2 ); }); @@ -1074,35 +1087,35 @@ mod tests { fn attempting_to_retract_active_voter_should_slash_reporter() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::submit_candidacy(&Charlie, 1); - public::submit_candidacy(&Dave, 2); - public::submit_candidacy(&Eve, 3); - public::set_approvals(&Bob, &vec![true, false, false, false], 0); - public::set_approvals(&Charlie, &vec![false, true, false, false], 0); - public::set_approvals(&Dave, &vec![false, false, true, false], 0); - public::set_approvals(&Eve, &vec![false, false, false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); - public::present_winner(&Dave, &Charlie, 21, 0); - public::present_winner(&Dave, &Dave, 31, 0); - public::present_winner(&Dave, &Eve, 41, 0); + 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(); with_env(|e| e.block_number = 8); - privileged::set_desired_seats(3); + PrivPass::test().set_desired_seats(3); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Bob, 11, 1); - public::present_winner(&Dave, &Charlie, 21, 1); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); + PublicPass::test(&Dave).present_winner(Charlie.into(), 21, 1); internal::end_block(); - public::reap_inactive_voter( - &Dave, voters().iter().position(|&i| i == *Dave).unwrap() as u32, - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, + 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 ); @@ -1117,26 +1130,26 @@ mod tests { fn attempting_to_retract_inactive_voter_by_nonvoter_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::set_approvals(&Bob, &vec![true], 0); + PublicPass::test(&Bob).submit_candidacy(0); + PublicPass::test(&Bob).set_approvals(vec![true], 0); internal::end_block(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); internal::end_block(); with_env(|e| e.block_number = 8); - public::submit_candidacy(&Eve, 0); - public::set_approvals(&Eve, &vec![true], 1); + PublicPass::test(&Eve).submit_candidacy(0); + PublicPass::test(&Eve).set_approvals(vec![true], 1); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Eve, 41, 1); + PublicPass::test(&Dave).present_winner(Eve.into(), 41, 1); internal::end_block(); - public::reap_inactive_voter( - &Dave, 0, - &Bob, voters().iter().position(|&i| i == *Bob).unwrap() as u32, + PublicPass::test(&Dave).reap_inactive_voter( + 0, + Bob.into(), voters().iter().position(|&i| i == *Bob).unwrap() as u32, 2 ); }); @@ -1147,24 +1160,24 @@ mod tests { fn presenting_loser_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Alice, 0); - public::set_approvals(&Ferdie, &vec![true], 0); - public::submit_candidacy(&Bob, 1); - public::set_approvals(&Bob, &vec![false, true], 0); - public::submit_candidacy(&Charlie, 2); - public::set_approvals(&Charlie, &vec![false, false, true], 0); - public::submit_candidacy(&Dave, 3); - public::set_approvals(&Dave, &vec![false, false, false, true], 0); - public::submit_candidacy(&Eve, 4); - public::set_approvals(&Eve, &vec![false, false, false, false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Alice, 60, 0); - public::present_winner(&Dave, &Charlie, 21, 0); - public::present_winner(&Dave, &Dave, 31, 0); - public::present_winner(&Dave, &Eve, 41, 0); - public::present_winner(&Dave, &Bob, 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); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 0); }); } @@ -1172,24 +1185,24 @@ mod tests { fn presenting_loser_first_should_not_matter() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Alice, 0); - public::set_approvals(&Ferdie, &vec![true], 0); - public::submit_candidacy(&Bob, 1); - public::set_approvals(&Bob, &vec![false, true], 0); - public::submit_candidacy(&Charlie, 2); - public::set_approvals(&Charlie, &vec![false, false, true], 0); - public::submit_candidacy(&Dave, 3); - public::set_approvals(&Dave, &vec![false, false, false, true], 0); - public::submit_candidacy(&Eve, 4); - public::set_approvals(&Eve, &vec![false, false, false, false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 0); - public::present_winner(&Dave, &Alice, 60, 0); - public::present_winner(&Dave, &Charlie, 21, 0); - public::present_winner(&Dave, &Dave, 31, 0); - public::present_winner(&Dave, &Eve, 41, 0); + 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()), @@ -1206,7 +1219,7 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); assert!(!presentation_active()); - public::present_winner(&Eve, &Eve, 1, 0); + PublicPass::test(&Eve).present_winner(Eve.into(), 1, 0); }); } @@ -1215,14 +1228,14 @@ mod tests { fn present_panics_with_invalid_vote_index() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Bob, 0); - public::submit_candidacy(&Eve, 1); - public::set_approvals(&Bob, &vec![true, false], 0); - public::set_approvals(&Eve, &vec![false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 11, 1); + PublicPass::test(&Dave).present_winner(Bob.into(), 11, 1); }); } @@ -1233,15 +1246,15 @@ mod tests { with_env(|e| e.block_number = 4); assert!(!presentation_active()); - public::submit_candidacy(&Alice, 0); - public::submit_candidacy(&Eve, 1); - public::set_approvals(&Bob, &vec![true, false], 0); - public::set_approvals(&Eve, &vec![false, true], 0); + 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(); with_env(|e| e.block_number = 6); assert_eq!(staking::balance(&Alice), 1); - public::present_winner(&Alice, &Alice, 30, 0); + PublicPass::test(&Alice).present_winner(Alice.into(), 30, 0); }); } @@ -1252,14 +1265,14 @@ mod tests { assert!(!presentation_active()); assert_eq!(staking::balance(&Dave), 40); - public::submit_candidacy(&Bob, 0); - public::submit_candidacy(&Eve, 1); - public::set_approvals(&Bob, &vec![true, false], 0); - public::set_approvals(&Eve, &vec![false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Bob, 80, 0); + PublicPass::test(&Dave).present_winner(Bob.into(), 80, 0); assert_eq!(staking::balance(&Dave), 38); }); @@ -1271,31 +1284,31 @@ mod tests { with_env(|e| e.block_number = 4); assert!(!presentation_active()); - public::submit_candidacy(&Alice, 0); - public::set_approvals(&Ferdie, &vec![true], 0); - public::submit_candidacy(&Bob, 1); - public::set_approvals(&Bob, &vec![false, true], 0); - public::submit_candidacy(&Charlie, 2); - public::set_approvals(&Charlie, &vec![false, false, true], 0); - public::submit_candidacy(&Dave, 3); - public::set_approvals(&Dave, &vec![false, false, false, true], 0); - public::submit_candidacy(&Eve, 4); - public::set_approvals(&Eve, &vec![false, false, false, false, true], 0); + 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(); with_env(|e| e.block_number = 6); assert!(presentation_active()); - public::present_winner(&Dave, &Alice, 60, 0); + 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()) ])); - public::present_winner(&Dave, &Charlie, 21, 0); - public::present_winner(&Dave, &Dave, 31, 0); - public::present_winner(&Dave, &Eve, 41, 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()), @@ -1328,33 +1341,33 @@ mod tests { fn second_tally_should_use_runners_up() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 4); - public::submit_candidacy(&Alice, 0); - public::set_approvals(&Ferdie, &vec![true], 0); - public::submit_candidacy(&Bob, 1); - public::set_approvals(&Bob, &vec![false, true], 0); - public::submit_candidacy(&Charlie, 2); - public::set_approvals(&Charlie, &vec![false, false, true], 0); - public::submit_candidacy(&Dave, 3); - public::set_approvals(&Dave, &vec![false, false, false, true], 0); - public::submit_candidacy(&Eve, 4); - public::set_approvals(&Eve, &vec![false, false, false, false, true], 0); + 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(); with_env(|e| e.block_number = 6); - public::present_winner(&Dave, &Alice, 60, 0); - public::present_winner(&Dave, &Charlie, 21, 0); - public::present_winner(&Dave, &Dave, 31, 0); - public::present_winner(&Dave, &Eve, 41, 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); internal::end_block(); with_env(|e| e.block_number = 8); - public::set_approvals(&Ferdie, &vec![false, false, true, false], 1); - privileged::set_desired_seats(3); + PublicPass::test(&Ferdie).set_approvals(vec![false, false, true, false], 1); + PrivPass::test().set_desired_seats(3); internal::end_block(); with_env(|e| e.block_number = 10); - public::present_winner(&Dave, &Charlie, 81, 1); - public::present_winner(&Dave, &Dave, 31, 1); + PublicPass::test(&Dave).present_winner(Charlie.into(), 81, 1); + PublicPass::test(&Dave).present_winner(Dave.into(), 31, 1); internal::end_block(); assert!(!presentation_active()); diff --git a/substrate/demo/runtime/src/runtime/council_vote.rs b/substrate/demo/runtime/src/runtime/council_vote.rs index 9887d14cae..9b58c7eeb4 100644 --- a/substrate/demo/runtime/src/runtime/council_vote.rs +++ b/substrate/demo/runtime/src/runtime/council_vote.rs @@ -20,9 +20,11 @@ use rstd::prelude::*; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; use runtime_support::Hashable; use runtime_support::storage; -use demo_primitives::{Proposal, AccountId, Hash, BlockNumber}; +use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{system, democracy, council}; -use runtime::staking::Balance; +use runtime::staking::{PublicPass, Balance}; +use runtime::democracy::PrivPass; +use dispatch::PrivCall as Proposal; type ProposalHash = [u8; 32]; @@ -119,12 +121,17 @@ fn take_proposal_if_expiring_at(n: BlockNumber) -> Option<(Proposal, ProposalHas } } -pub mod public { - use super::*; +impl_dispatch! { + pub mod public; + fn propose(proposal: Box) = 0; + fn vote(proposal: ProposalHash, approve: bool) = 1; + fn veto(proposal_hash: ProposalHash) = 2; +} - pub fn propose(signed: &AccountId, proposal: &Proposal) { +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(signed, expiry)); + assert!(will_still_be_councillor_at(&self, expiry)); let proposal_hash = proposal.blake2_256(); @@ -135,64 +142,69 @@ pub mod public { proposals.sort_by_key(|&(expiry, _)| expiry); set_proposals(&proposals); - storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_OF), proposal); - storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS), &vec![*signed]); - storage::put(&(proposal_hash, *signed).to_keyed_vec(COUNCIL_VOTE_OF), &true); + storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_OF), &proposal); + storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS), &vec![*self]); + storage::put(&(proposal_hash, *self).to_keyed_vec(COUNCIL_VOTE_OF), &true); } - pub fn vote(signed: &AccountId, proposal: &ProposalHash, approve: bool) { - if vote_of(signed, proposal).is_none() { - let mut voters = proposal_voters(proposal); - voters.push(*signed); + fn vote(self, proposal: ProposalHash, approve: bool) { + if vote_of(&self, &proposal).is_none() { + let mut voters = proposal_voters(&proposal); + voters.push(*self); storage::put(&proposal.to_keyed_vec(PROPOSAL_VOTERS), &voters); } - storage::put(&(*proposal, *signed).to_keyed_vec(COUNCIL_VOTE_OF), &approve); + storage::put(&(proposal, *self).to_keyed_vec(COUNCIL_VOTE_OF), &approve); } - pub fn veto(signed: &AccountId, proposal_hash: &ProposalHash) { - assert!(is_councillor(signed), "only councillors may veto council proposals"); + fn veto(self, proposal_hash: ProposalHash) { + assert!(is_councillor(&self), "only councillors may veto council proposals"); assert!(storage::exists(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS)), "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(signed) + let insert_position = existing_vetoers.binary_search(&self) .expect_err("a councillor may not veto a proposal twice"); - existing_vetoers.insert(insert_position, *signed); + 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::>()); + set_proposals(&proposals().into_iter().filter(|&(_, h)| h != proposal_hash).collect::>()); storage::kill(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS)); storage::kill(&proposal_hash.to_keyed_vec(PROPOSAL_OF)); for (c, _) in council::active_council() { - storage::kill(&(*proposal_hash, c).to_keyed_vec(COUNCIL_VOTE_OF)); + storage::kill(&(proposal_hash, c).to_keyed_vec(COUNCIL_VOTE_OF)); } } } -pub mod privileged { - use super::*; +impl_dispatch! { + pub mod privileged; + fn set_cooloff_period(blocks: BlockNumber) = 0; + fn set_voting_period(blocks: BlockNumber) = 1; +} - pub fn set_cooloff_period(blocks: BlockNumber) { +impl privileged::Dispatch for PrivPass { + fn set_cooloff_period(self, blocks: BlockNumber) { storage::put(COOLOFF_PERIOD, &blocks); } - pub fn set_voting_period(blocks: BlockNumber) { + fn set_voting_period(self, blocks: BlockNumber) { storage::put(VOTING_PERIOD, &blocks); } } pub mod internal { use super::*; - use runtime::democracy::privileged::start_referendum; - use demo_primitives::VoteThreshold; + 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::DemocracyCancelReferendum(ref_index) = &proposal { + if let &Proposal::Democracy(democracy::privileged::Call::cancel_referendum(ref_index)) = &proposal { if let (_, 0, 0) = tally { - democracy::privileged::cancel_referendum(ref_index); + democracy::internal::cancel_referendum(ref_index); } } else { if tally.0 > tally.1 + tally.2 { @@ -239,8 +251,11 @@ mod tests { use codec::{KeyedVec, Joiner}; use keyring::Keyring::{Alice, Bob, Charlie, Dave}; use environment::with_env; - use demo_primitives::{AccountId, Proposal, VoteThreshold}; + 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() @@ -266,19 +281,31 @@ mod tests { }); } + 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(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); - democracy::privileged::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + 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 = Proposal::DemocracyCancelReferendum(0); + let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - public::propose(&Alice, &cancellation); - public::vote(&Bob, &hash, true); - public::vote(&Charlie, &hash, true); + PublicPass::new(&Alice).propose(Box::new(cancellation)); + PublicPass::new(&Bob).vote(hash, true); + PublicPass::new(&Charlie).vote(hash, true); assert_eq!(proposals(), vec![(2, hash)]); internal::end_block(1); @@ -293,14 +320,14 @@ mod tests { fn referendum_cancellation_should_fail_when_not_unanimous() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); - democracy::privileged::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + let proposal = bonding_duration_proposal(42); + democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - let cancellation = Proposal::DemocracyCancelReferendum(0); + let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - public::propose(&Alice, &cancellation); - public::vote(&Bob, &hash, true); - public::vote(&Charlie, &hash, false); + PublicPass::new(&Alice).propose(Box::new(cancellation)); + PublicPass::new(&Bob).vote(hash, true); + PublicPass::new(&Charlie).vote(hash, false); internal::end_block(1); with_env(|e| e.block_number = 2); @@ -313,13 +340,13 @@ mod tests { fn referendum_cancellation_should_fail_when_abstentions() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); - democracy::privileged::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); + let proposal = bonding_duration_proposal(42); + democracy::internal::start_referendum(proposal.clone(), VoteThreshold::SuperMajorityApprove); - let cancellation = Proposal::DemocracyCancelReferendum(0); + let cancellation = cancel_referendum_proposal(0); let hash = cancellation.blake2_256(); - public::propose(&Alice, &cancellation); - public::vote(&Bob, &hash, true); + PublicPass::new(&Alice).propose(Box::new(cancellation)); + PublicPass::new(&Bob).vote(hash, true); internal::end_block(1); with_env(|e| e.block_number = 2); @@ -332,10 +359,10 @@ mod tests { fn veto_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); assert_eq!(proposals().len(), 0); assert_eq!(democracy::active_referendums().len(), 0); }); @@ -346,14 +373,14 @@ mod tests { fn double_veto_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); with_env(|e| e.block_number = 3); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); }); } @@ -362,13 +389,13 @@ mod tests { fn retry_in_cooloff_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); with_env(|e| e.block_number = 2); - public::propose(&Alice, &proposal); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); }); } @@ -376,21 +403,21 @@ mod tests { fn retry_after_cooloff_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); with_env(|e| e.block_number = 3); - public::propose(&Alice, &proposal); - public::vote(&Bob, &hash, false); - public::vote(&Charlie, &hash, true); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).vote(hash, false); + PublicPass::new(&Charlie).vote(hash, true); internal::end_block(3); with_env(|e| e.block_number = 4); internal::end_block(4); assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 7, Proposal::StakingSetBondingDuration(42), VoteThreshold::SimpleMajority)]); + assert_eq!(democracy::active_referendums(), vec![(0, 7, bonding_duration_proposal(42), VoteThreshold::SimpleMajority)]); }); } @@ -398,14 +425,14 @@ mod tests { fn alternative_double_veto_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); - public::veto(&Bob, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Bob).veto(hash); with_env(|e| e.block_number = 3); - public::propose(&Alice, &proposal); - public::veto(&Charlie, &hash); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + PublicPass::new(&Charlie).veto(hash); assert_eq!(proposals().len(), 0); assert_eq!(democracy::active_referendums().len(), 0); }); @@ -415,9 +442,9 @@ mod tests { fn simple_propose_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let proposal = Proposal::StakingSetBondingDuration(42); + let proposal = bonding_duration_proposal(42); let hash = proposal.blake2_256(); - public::propose(&Alice, &proposal); + PublicPass::new(&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(&Alice, &hash), Some(true)); @@ -429,8 +456,9 @@ mod tests { fn unvoted_proposal_should_expire_without_action() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(42)); - assert_eq!(tally(&Proposal::StakingSetBondingDuration(42).blake2_256()), (1, 0, 2)); + let proposal = bonding_duration_proposal(42); + PublicPass::new(&Alice).propose(Box::new(proposal.clone())); + assert_eq!(tally(&proposal.blake2_256()), (1, 0, 2)); internal::end_block(1); with_env(|e| e.block_number = 2); @@ -444,16 +472,17 @@ mod tests { fn unanimous_proposal_should_expire_with_biased_referendum() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(42)); - public::vote(&Bob, &Proposal::StakingSetBondingDuration(42).blake2_256(), true); - public::vote(&Charlie, &Proposal::StakingSetBondingDuration(42).blake2_256(), true); - assert_eq!(tally(&Proposal::StakingSetBondingDuration(42).blake2_256()), (3, 0, 0)); + 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); + assert_eq!(tally(&proposal.blake2_256()), (3, 0, 0)); internal::end_block(1); with_env(|e| e.block_number = 2); internal::end_block(2); assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, Proposal::StakingSetBondingDuration(42), VoteThreshold::SuperMajorityAgainst)]); + assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SuperMajorityAgainst)]); }); } @@ -461,16 +490,17 @@ mod tests { fn majority_proposal_should_expire_with_unbiased_referendum() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(42)); - public::vote(&Bob, &Proposal::StakingSetBondingDuration(42).blake2_256(), true); - public::vote(&Charlie, &Proposal::StakingSetBondingDuration(42).blake2_256(), false); - assert_eq!(tally(&Proposal::StakingSetBondingDuration(42).blake2_256()), (2, 1, 0)); + 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); + assert_eq!(tally(&proposal.blake2_256()), (2, 1, 0)); internal::end_block(1); with_env(|e| e.block_number = 2); internal::end_block(2); assert_eq!(proposals().len(), 0); - assert_eq!(democracy::active_referendums(), vec![(0, 5, Proposal::StakingSetBondingDuration(42), VoteThreshold::SimpleMajority)]); + assert_eq!(democracy::active_referendums(), vec![(0, 5, proposal, VoteThreshold::SimpleMajority)]); }); } @@ -479,7 +509,8 @@ mod tests { fn propose_by_public_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Dave, &Proposal::StakingSetBondingDuration(42)); + let proposal = bonding_duration_proposal(42); + PublicPass::new(&Dave).propose(Box::new(proposal)); }); } } diff --git a/substrate/demo/runtime/src/runtime/democracy.rs b/substrate/demo/runtime/src/runtime/democracy.rs index 2273628188..ea945245e7 100644 --- a/substrate/demo/runtime/src/runtime/democracy.rs +++ b/substrate/demo/runtime/src/runtime/democracy.rs @@ -20,13 +20,58 @@ use rstd::prelude::*; use integer_sqrt::IntegerSquareRoot; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; use runtime_support::storage; -use demo_primitives::{Proposal, AccountId, Hash, BlockNumber, VoteThreshold}; +use demo_primitives::{AccountId, Hash, BlockNumber}; +use dispatch::PrivCall as Proposal; use runtime::{staking, system, session}; -use runtime::staking::Balance; +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((),) } +} + +/// 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 { + u8::decode(input).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 { + match *self { + VoteThreshold::SuperMajorityApprove => 0u8, + VoteThreshold::SuperMajorityAgainst => 1u8, + VoteThreshold::SimpleMajority => 2u8, + }.using_encoded(f) + } +} +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 @@ -151,55 +196,79 @@ pub fn next_free_ref_index() -> ReferendumIndex { storage::get_or_default(REFERENDUM_COUNT) } -pub mod public { - use super::*; +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; +} +impl<'a> public::Dispatch for PublicPass<'a> { /// Propose a sensitive action to be taken. - pub fn propose(signed: &AccountId, proposal: &Proposal, value: Balance) { + fn propose(self, proposal: Box, value: Balance) { assert!(value >= minimum_deposit()); - assert!(staking::internal::deduct_unbonded(signed, value)); + assert!(staking::internal::deduct_unbonded(&self, value)); let index: PropIndex = storage::get_or_default(PUBLIC_PROP_COUNT); storage::put(PUBLIC_PROP_COUNT, &(index + 1)); - storage::put(&index.to_keyed_vec(DEPOSIT_OF), &(value, vec![*signed])); + storage::put(&index.to_keyed_vec(DEPOSIT_OF), &(value, vec![*self])); let mut props = public_props(); - props.push((index, proposal.clone(), *signed)); + props.push((index, (*proposal).clone(), *self)); storage::put(PUBLIC_PROPS, &props); } /// Propose a sensitive action to be taken. - pub fn second(signed: &AccountId, proposal: PropIndex) { + fn second(self, proposal: PropIndex) { let key = proposal.to_keyed_vec(DEPOSIT_OF); let mut deposit: (Balance, Vec) = storage::get(&key).expect("can only second an existing proposal"); - assert!(staking::internal::deduct_unbonded(signed, deposit.0)); + assert!(staking::internal::deduct_unbonded(&self, deposit.0)); - deposit.1.push(*signed); + deposit.1.push(*self); storage::put(&key, &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.. - pub fn vote(signed: &AccountId, ref_index: ReferendumIndex, approve_proposal: bool) { + fn vote(self, ref_index: ReferendumIndex, approve_proposal: bool) { if !is_active_referendum(ref_index) { panic!("vote given for invalid referendum.") } - if staking::balance(signed) == 0 { + if staking::balance(&self) == 0 { panic!("transactor must have balance to signal approval."); } - let key = (*signed, ref_index).to_keyed_vec(VOTE_OF); + let key = (*self, ref_index).to_keyed_vec(VOTE_OF); if !storage::exists(&key) { let mut voters = voters_for(ref_index); - voters.push(signed.clone()); + voters.push(self.clone()); storage::put(&ref_index.to_keyed_vec(VOTERS_FOR), &voters); } storage::put(&key, &approve_proposal); } } -pub mod privileged { +impl_dispatch! { + pub mod privileged; + fn start_referendum(proposal: Box, vote_threshold: VoteThreshold) = 0; + fn cancel_referendum(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) { @@ -210,12 +279,6 @@ pub mod privileged { pub fn cancel_referendum(ref_index: ReferendumIndex) { clear_referendum(ref_index); } -} - -pub mod internal { - use super::*; - use demo_primitives::Proposal; - use dispatch; /// Current era is ending; we should finish up any proposals. pub fn end_block(now: BlockNumber) { @@ -245,7 +308,7 @@ pub mod internal { let total_stake = staking::total_stake(); clear_referendum(index); if vote_threshold.approved(approve, against, total_stake) { - dispatch::proposal(proposal); + proposal.dispatch(PrivPass::new()); } storage::put(NEXT_TALLY, &(index + 1)); } @@ -307,6 +370,7 @@ pub mod testing { twox_128(staking::SESSIONS_PER_ERA).to_vec() => vec![].and(&1u64), twox_128(staking::VALIDATOR_COUNT).to_vec() => vec![].and(&3u64), twox_128(staking::CURRENT_ERA).to_vec() => vec![].and(&1u64), + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![].and(&1u64), twox_128(LAUNCH_PERIOD).to_vec() => vec![].and(&1u64), twox_128(VOTING_PERIOD).to_vec() => vec![].and(&1u64), @@ -322,7 +386,11 @@ mod tests { use codec::{KeyedVec, Joiner}; use keyring::Keyring::*; use environment::with_env; - use demo_primitives::{AccountId, Proposal}; + use demo_primitives::AccountId; + use dispatch::PrivCall as Proposal; + use runtime::staking::PublicPass; + use super::public::Dispatch; + use super::privileged::Dispatch as PrivDispatch; use runtime::{staking, session, democracy}; fn new_test_ext() -> TestExternalities { @@ -343,13 +411,18 @@ mod tests { // 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(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 2u64); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(4), 4u64); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(3), 3u64); + 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)); @@ -360,12 +433,12 @@ mod tests { fn single_proposal_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 1u64); + propose_sessions_per_era(&Alice, 2, 1u64); democracy::internal::end_block(system::block_number()); with_env(|e| e.block_number = 2); let r = 0; - public::vote(&Alice, r, true); + PublicPass::test(&Alice).vote(r, true); assert_eq!(next_free_ref_index(), 1); assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); @@ -383,11 +456,11 @@ mod tests { fn deposit_for_proposals_should_be_taken() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 5u64); - public::second(&Bob, 0); - public::second(&Eve, 0); - public::second(&Eve, 0); - public::second(&Eve, 0); + 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); @@ -398,11 +471,11 @@ mod tests { fn deposit_for_proposals_should_be_returned() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 5u64); - public::second(&Bob, 0); - public::second(&Eve, 0); - public::second(&Eve, 0); - public::second(&Eve, 0); + 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); @@ -415,7 +488,7 @@ mod tests { fn proposal_with_deposit_below_minimum_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 0u64); + propose_sessions_per_era(&Alice, 2, 0u64); }); } @@ -424,7 +497,7 @@ mod tests { fn poor_proposer_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Alice, &Proposal::StakingSetSessionsPerEra(2), 11u64); + propose_sessions_per_era(&Alice, 2, 11u64); }); } @@ -433,46 +506,55 @@ mod tests { fn poor_seconder_should_panic() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - public::propose(&Bob, &Proposal::StakingSetSessionsPerEra(2), 11u64); - public::second(&Alice, 0); + 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(), || { with_env(|e| e.block_number = 0); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(2), 2u64); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(4), 4u64); - public::propose(&Alice, &Proposal::StakingSetBondingDuration(3), 3u64); + 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()); with_env(|e| e.block_number = 1); - public::vote(&Alice, 0, true); + PublicPass::test(&Alice).vote(0, true); democracy::internal::end_block(system::block_number()); staking::internal::check_new_era(); assert_eq!(staking::bonding_duration(), 4u64); with_env(|e| e.block_number = 2); - public::vote(&Alice, 1, true); + PublicPass::test(&Alice).vote(1, true); democracy::internal::end_block(system::block_number()); staking::internal::check_new_era(); assert_eq!(staking::bonding_duration(), 3u64); with_env(|e| e.block_number = 3); - public::vote(&Alice, 2, true); + 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(), || { with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Alice, r, true); + 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(&Alice, r), Some(true)); @@ -489,9 +571,9 @@ mod tests { fn cancel_referendum_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Alice, r, true); - privileged::cancel_referendum(r); + let r = inject_referendum(1, sessions_per_era_propsal(2), VoteThreshold::SuperMajorityApprove); + PublicPass::test(&Alice).vote(r, true); + PrivPass::new().cancel_referendum(r); democracy::internal::end_block(system::block_number()); staking::internal::check_new_era(); @@ -504,8 +586,8 @@ mod tests { fn simple_failing_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Alice, r, false); + 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(&Alice, r), Some(false)); @@ -522,13 +604,13 @@ mod tests { fn controversial_voting_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Alice, r, true); - public::vote(&Bob, r, false); - public::vote(&Charlie, r, false); - public::vote(&Dave, r, true); - public::vote(&Eve, r, false); - public::vote(&Ferdie, r, true); + 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)); @@ -543,9 +625,9 @@ mod tests { fn controversial_low_turnout_voting_should_work() { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Eve, r, false); - public::vote(&Ferdie, r, true); + 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)); @@ -563,10 +645,10 @@ mod tests { assert_eq!(staking::total_stake(), 210u64); with_env(|e| e.block_number = 1); - let r = inject_referendum(1, Proposal::StakingSetSessionsPerEra(2), VoteThreshold::SuperMajorityApprove); - public::vote(&Dave, r, true); - public::vote(&Eve, r, false); - public::vote(&Ferdie, r, true); + 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)); diff --git a/substrate/demo/runtime/src/runtime/session.rs b/substrate/demo/runtime/src/runtime/session.rs index c5c5387dd9..a0983c1608 100644 --- a/substrate/demo/runtime/src/runtime/session.rs +++ b/substrate/demo/runtime/src/runtime/session.rs @@ -22,6 +22,8 @@ use codec::KeyedVec; use runtime_support::{storage, StorageVec}; use demo_primitives::{AccountId, SessionKey, BlockNumber}; use runtime::{system, staking, consensus}; +use runtime::democracy::PrivPass; +use runtime::staking::PublicPass; pub const SESSION_LENGTH: &[u8] = b"ses:len"; pub const CURRENT_INDEX: &[u8] = b"ses:ind"; @@ -62,28 +64,35 @@ pub fn last_length_change() -> BlockNumber { storage::get_or(LAST_LENGTH_CHANGE, 0) } -pub mod public { - use super::*; +impl_dispatch! { + pub mod public; + fn set_key(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 /// session. - pub fn set_key(validator: &AccountId, key: &SessionKey) { + fn set_key(self, key: SessionKey) { // set new value for next session - storage::put(&validator.to_keyed_vec(NEXT_KEY_FOR), key); + storage::put(&self.to_keyed_vec(NEXT_KEY_FOR), &key); } } -pub mod privileged { - use super::*; +impl_dispatch! { + pub mod privileged; + fn set_length(new: BlockNumber) = 0; + fn force_new_session() = 1; +} +impl privileged::Dispatch for PrivPass { /// Set a new era length. Won't kick in until the next era change (at current length). - pub fn set_length(new: BlockNumber) { + fn set_length(self, new: BlockNumber) { storage::put(NEXT_SESSION_LENGTH, &new); } /// Forces a new session. - pub fn force_new_session() { - rotate_session(); + fn force_new_session(self) { + internal::rotate_session(); } } @@ -110,27 +119,27 @@ pub mod internal { rotate_session(); } } -} -/// Move onto next session: register the new authority set. -fn rotate_session() { - // Increment current session index. - storage::put(CURRENT_INDEX, &(current_index() + 1)); + /// Move onto next session: register the new authority set. + pub fn rotate_session() { + // Increment current session index. + storage::put(CURRENT_INDEX, &(current_index() + 1)); - // Enact era length change. - if let Some(next_len) = storage::get::(NEXT_SESSION_LENGTH) { - storage::put(SESSION_LENGTH, &next_len); - storage::put(LAST_LENGTH_CHANGE, &system::block_number()); - storage::kill(NEXT_SESSION_LENGTH); - } - - // Update any changes in session keys. - validators().iter().enumerate().for_each(|(i, v)| { - let k = v.to_keyed_vec(NEXT_KEY_FOR); - if let Some(n) = storage::take(&k) { - consensus::internal::set_authority(i as u32, &n); + // Enact era length change. + if let Some(next_len) = storage::get::(NEXT_SESSION_LENGTH) { + storage::put(SESSION_LENGTH, &next_len); + storage::put(LAST_LENGTH_CHANGE, &system::block_number()); + storage::kill(NEXT_SESSION_LENGTH); } - }); + + // Update any changes in session keys. + validators().iter().enumerate().for_each(|(i, v)| { + let k = v.to_keyed_vec(NEXT_KEY_FOR); + if let Some(n) = storage::take(&k) { + consensus::internal::set_authority(i as u32, &n); + } + }); + } } #[cfg(any(feature = "std", test))] @@ -161,7 +170,7 @@ pub mod testing { mod tests { use super::*; use super::public::*; - use super::privileged::*; + use super::privileged::Dispatch as PrivDispatch; use super::internal::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; use codec::{KeyedVec, Joiner}; @@ -200,14 +209,14 @@ mod tests { with_externalities(&mut t, || { // Block 1: Change to length 3; no visible change. with_env(|e| e.block_number = 1); - set_length(3); + 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. with_env(|e| e.block_number = 2); - set_length(3); + PrivPass::test().set_length(3); check_rotate_session(); assert_eq!(length(), 3); assert_eq!(current_index(), 1); @@ -220,7 +229,7 @@ mod tests { // Block 4: Change to length 2; no visible change. with_env(|e| e.block_number = 4); - set_length(2); + PrivPass::test().set_length(2); check_rotate_session(); assert_eq!(length(), 3); assert_eq!(current_index(), 1); @@ -261,7 +270,7 @@ mod tests { // Block 3: Set new key for validator 2; no visible change. with_env(|e| e.block_number = 3); - set_key(&[20; 32], &[22; 32]); + PublicPass::test(&[20; 32]).set_key([22; 32]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); check_rotate_session(); diff --git a/substrate/demo/runtime/src/runtime/staking.rs b/substrate/demo/runtime/src/runtime/staking.rs index 6a30a74314..629700503f 100644 --- a/substrate/demo/runtime/src/runtime/staking.rs +++ b/substrate/demo/runtime/src/runtime/staking.rs @@ -17,14 +17,14 @@ //! Staking manager: Handles balances and periodically determines the best set of validators. use rstd::prelude::*; -use rstd::cmp; +use rstd::{ops, cmp}; use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use runtime_io::{print, blake2_256}; -use codec::KeyedVec; +use codec::{Slicable, Input, KeyedVec}; use runtime_support::{storage, StorageVec}; use demo_primitives::{BlockNumber, AccountId}; -use runtime::{system, session}; +use runtime::{system, session, democracy}; /// The balance of an account. pub type Balance = u64; @@ -41,6 +41,7 @@ pub const LAST_ERA_LENGTH_CHANGE: &[u8] = b"sta:lec"; pub const TOTAL_STAKE: &[u8] = b"sta:tot"; pub const INTENTION_AT: &[u8] = b"sta:wil:"; pub const INTENTION_COUNT: &[u8] = b"sta:wil:len"; +pub const TRANSACTION_FEE: &[u8] = b"sta:fee"; pub const BALANCE_OF: &[u8] = b"sta:bal:"; pub const RESERVED_BALANCE_OF: &[u8] = b"sta:lbo:"; @@ -54,6 +55,11 @@ impl StorageVec for IntentionStorageVec { const PREFIX: &'static[u8] = INTENTION_AT; } +/// The fee to be paid for making a transaction. +pub fn transaction_fee() -> Balance { + storage::get(TRANSACTION_FEE).expect("All basic parameters should be defined") +} + /// The length of the bonding duration in eras. pub fn bonding_duration() -> BlockNumber { storage::get_or_default(BONDING_DURATION) @@ -133,17 +139,131 @@ pub fn total_stake() -> Balance { storage::get_or(TOTAL_STAKE, 0) } +pub struct PublicPass<'a> (&'a AccountId); + +const NOBODY: AccountId = [0u8; 32]; + +impl<'a> PublicPass<'a> { + pub fn new(transactor: &AccountId) -> PublicPass { + let b = free_balance(&transactor); + let transaction_fee = transaction_fee(); + assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); + internal::set_free_balance(&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); + } + } +} + +impl<'a> ops::Deref for PublicPass<'a> { + type Target = AccountId; + fn deref(&self) -> &AccountId { + self.0 + } +} + +impl_dispatch! { + pub mod public; + fn transfer(dest: AccountId, value: Balance) = 0; + fn stake() = 1; + fn unstake() = 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 = IntentionStorageVec::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()); + IntentionStorageVec::set_items(&intentions); + storage::put(&self.to_keyed_vec(BONDAGE_OF), &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 = IntentionStorageVec::items(); + if let Some(position) = intentions.iter().position(|&t| t == *self) { + intentions.swap_remove(position); + } else { + panic!("Cannot unstake if not already staked."); + } + IntentionStorageVec::set_items(&intentions); + storage::put(&self.to_keyed_vec(BONDAGE_OF), &(current_era() + bonding_duration())); + } +} + +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; +} + +impl privileged::Dispatch for democracy::PrivPass { + /// Set the number of sessions in an era. + fn set_sessions_per_era(self, new: BlockNumber) { + storage::put(NEXT_SESSIONS_PER_ERA, &new); + } + + /// The length of the bonding duration in eras. + fn set_bonding_duration(self, new: BlockNumber) { + storage::put(BONDING_DURATION, &new); + } + + /// The length of a staking era in sessions. + fn set_validator_count(self, new: u32) { + storage::put(VALIDATOR_COUNT, &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 <= current_era(): inactive: free to be transferred. // - ~0: active: currently representing a validator. // - n | n > current_era(): deactivating: recently representing a validator and not yet // ready for transfer. -pub mod public { +mod private { use super::*; #[derive(Default)] - struct ChangeEntry { + pub struct ChangeEntry { balance: Option, code: Option>, storage: BTreeMap, Option>>, @@ -157,7 +277,7 @@ pub mod public { type State = BTreeMap; - trait Externalities { + 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; @@ -173,7 +293,7 @@ pub mod public { do_get_balance: F5, } - struct DirectExt; + pub struct DirectExt; impl Externalities for DirectExt { fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option> { let mut v = account.to_keyed_vec(STORAGE_OF); @@ -204,7 +324,7 @@ pub mod public { } } - fn commit_state(s: State) { + pub fn commit_state(s: State) { for (address, changed) in s.into_iter() { if let Some(balance) = changed.balance { storage::put(&address.to_keyed_vec(BALANCE_OF), &balance); @@ -245,15 +365,7 @@ pub mod public { } } - /// Create a smart-contract account. - pub fn create(transactor: &AccountId, code: &[u8], value: Balance) { - // commit anything that made it this far to storage - if let Some(commit) = effect_create(transactor, code, value, DirectExt) { - commit_state(commit); - } - } - - fn effect_create( + pub fn effect_create( transactor: &AccountId, code: &[u8], value: Balance, @@ -282,16 +394,7 @@ pub mod public { Some(local) } - /// Transfer some unlocked staking balance to another staker. - /// TODO: probably want to state gas-limit and gas-price. - pub fn transfer(transactor: &AccountId, dest: &AccountId, value: Balance) { - // commit anything that made it this far to storage - if let Some(commit) = effect_transfer(transactor, dest, value, DirectExt) { - commit_state(commit); - } - } - - fn effect_transfer( + pub fn effect_transfer( transactor: &AccountId, dest: &AccountId, value: Balance, @@ -362,57 +465,6 @@ pub mod public { None } } - - /// Declare the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - pub fn stake(transactor: &AccountId) { - let mut intentions = IntentionStorageVec::items(); - // can't be in the list twice. - assert!(intentions.iter().find(|t| *t == transactor).is_none(), "Cannot stake if already staked."); - intentions.push(transactor.clone()); - IntentionStorageVec::set_items(&intentions); - storage::put(&transactor.to_keyed_vec(BONDAGE_OF), &u64::max_value()); - } - - /// Retract the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - pub fn unstake(transactor: &AccountId) { - let mut intentions = IntentionStorageVec::items(); - if let Some(position) = intentions.iter().position(|t| t == transactor) { - intentions.swap_remove(position); - } else { - panic!("Cannot unstake if not already staked."); - } - IntentionStorageVec::set_items(&intentions); - storage::put(&transactor.to_keyed_vec(BONDAGE_OF), &(current_era() + bonding_duration())); - } -} - -pub mod privileged { - use super::*; - - /// Set the number of sessions in an era. - pub fn set_sessions_per_era(new: BlockNumber) { - storage::put(NEXT_SESSIONS_PER_ERA, &new); - } - - /// The length of the bonding duration in eras. - pub fn set_bonding_duration(new: BlockNumber) { - storage::put(BONDING_DURATION, &new); - } - - /// The length of a staking era in sessions. - pub fn set_validator_count(new: u32) { - storage::put(VALIDATOR_COUNT, &new); - } - - /// Force there to be a new era. This also forces a new session immediately after. - pub fn force_new_era() { - new_era(); - session::privileged::force_new_session(); - } } pub mod internal { @@ -540,6 +592,8 @@ pub mod testing { 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![ @@ -549,6 +603,7 @@ pub mod testing { twox_128(&2u32.to_keyed_vec(INTENTION_AT)).to_vec() => Charlie.to_raw_public_vec(), twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&sessions_per_era), twox_128(VALIDATOR_COUNT).to_vec() => vec![].and(&3u64), + twox_128(TRANSACTION_FEE).to_vec() => vec![].and(&1u64), twox_128(CURRENT_ERA).to_vec() => vec![].and(¤t_era), twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ]; @@ -560,7 +615,6 @@ pub mod testing { mod tests { use super::*; use super::internal::*; - use super::public::*; use super::privileged::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; @@ -569,6 +623,9 @@ mod tests { use environment::with_env; use demo_primitives::AccountId; use runtime::{staking, session}; + use runtime::democracy::PrivPass; + use runtime::staking::public::{Call, Dispatch}; + use runtime::staking::privileged::{Call as PCall, Dispatch as PDispatch}; #[test] fn staking_should_work() { @@ -581,6 +638,7 @@ mod tests { twox_128(VALIDATOR_COUNT).to_vec() => vec![].and(&2u32), twox_128(BONDING_DURATION).to_vec() => vec![].and(&3u64), twox_128(TOTAL_STAKE).to_vec() => vec![].and(&100u64), + twox_128(TRANSACTION_FEE).to_vec() => vec![].and(&0u64), twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&10u64), twox_128(&Bob.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&20u64), twox_128(&Charlie.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&30u64), @@ -595,9 +653,9 @@ mod tests { // Block 1: Add three validators. No obvious change. with_env(|e| e.block_number = 1); - stake(&Alice); - stake(&Bob); - stake(&Dave); + public::Call::stake().dispatch(PublicPass::new(&Alice)); + PublicPass::new(&Bob).stake(); + PublicPass::new(&Dave).stake(); check_new_era(); assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); @@ -608,8 +666,8 @@ mod tests { // Block 3: Unstake highest, introduce another staker. No change yet. with_env(|e| e.block_number = 3); - stake(&Charlie); - unstake(&Dave); + PublicPass::new(&Charlie).stake(); + PublicPass::new(&Dave).unstake(); check_new_era(); // Block 4: New era - validators change. @@ -619,7 +677,7 @@ mod tests { // Block 5: Transfer stake from highest to lowest. No change yet. with_env(|e| e.block_number = 5); - transfer(&Dave, &Alice, 40); + PublicPass::new(&Dave).transfer(Alice.to_raw_public(), 40); check_new_era(); // Block 6: Lowest now validator. @@ -629,7 +687,7 @@ mod tests { // Block 7: Unstake three. No change yet. with_env(|e| e.block_number = 7); - unstake(&Charlie); + PublicPass::new(&Charlie).unstake(); check_new_era(); assert_eq!(session::validators(), vec![Alice.to_raw_public(), Charlie.into()]); @@ -668,7 +726,7 @@ mod tests { // Block 3: Schedule an era length change; no visible changes. with_env(|e| e.block_number = 3); - set_sessions_per_era(3); + PrivPass::test().set_sessions_per_era(3); check_new_era(); assert_eq!(sessions_per_era(), 2u64); assert_eq!(last_era_length_change(), 0u64); @@ -719,9 +777,9 @@ mod tests { #[test] fn staking_balance_transfer_works() { - with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); - transfer(&Alice, &Bob, 69); + with_externalities(&mut testing::externalities(1, 3, 1), || { + set_free_balance(&Alice, 112); + PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); assert_eq!(balance(&Alice), 42); assert_eq!(balance(&Bob), 69); }); @@ -732,8 +790,8 @@ mod tests { fn staking_balance_transfer_when_bonded_panics() { with_externalities(&mut TestExternalities::default(), || { set_free_balance(&Alice, 111); - stake(&Alice); - transfer(&Alice, &Bob, 69); + PublicPass::new(&Alice).stake(); + PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); }); } @@ -760,7 +818,7 @@ mod tests { with_externalities(&mut TestExternalities::default(), || { set_free_balance(&Alice, 111); reserve_balance(&Alice, 69); - transfer(&Alice, &Bob, 69); + PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); }); } diff --git a/substrate/demo/runtime/src/runtime/system.rs b/substrate/demo/runtime/src/runtime/system.rs index 4add4dd146..e3a6e19ef5 100644 --- a/substrate/demo/runtime/src/runtime/system.rs +++ b/substrate/demo/runtime/src/runtime/system.rs @@ -23,15 +23,18 @@ use runtime_io::{print, storage_root, enumerated_trie_root}; use codec::{KeyedVec, Slicable}; use runtime_support::{Hashable, storage}; use environment::with_env; -use demo_primitives::{AccountId, Hash, TxOrder, BlockNumber, Block, Header, - UncheckedTransaction, Function, Log}; +use demo_primitives::{AccountId, Hash, TxOrder, BlockNumber, Header, Log}; +use block::Block; +use transaction::UncheckedTransaction; use runtime::{staking, session}; +use runtime::democracy::PrivPass; use dispatch; pub const NONCE_OF: &[u8] = b"sys:non:"; pub const BLOCK_HASH_AT: &[u8] = b"sys:old:"; pub const CODE: &[u8] = b"sys:cod"; + /// The current block number being processed. Set by `execute_block`. pub fn block_number() -> BlockNumber { with_env(|e| e.block_number) @@ -42,12 +45,15 @@ pub fn block_hash(number: BlockNumber) -> Hash { storage::get_or_default(&number.to_keyed_vec(BLOCK_HASH_AT)) } -pub mod privileged { - use super::*; +impl_dispatch! { + pub mod privileged; + fn set_code(new: Vec) = 0; +} +impl privileged::Dispatch for PrivPass { /// Set the new code. - pub fn set_code(new: &[u8]) { - storage::unhashed::put_raw(b":code", new); + fn set_code(self, new: Vec) { + storage::unhashed::put_raw(b":code", &new); } } @@ -137,16 +143,19 @@ fn execute_transaction(utx: UncheckedTransaction) { Err(_) => panic!("All transactions should be properly signed"), }; - // check nonce - let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); - let expected_nonce: TxOrder = storage::get_or(&nonce_key, 0); - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); + { + // check nonce + let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); + let expected_nonce: TxOrder = storage::get_or(&nonce_key, 0); + assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); - // increment nonce in storage - storage::put(&nonce_key, &(expected_nonce + 1)); + // increment nonce in storage + storage::put(&nonce_key, &(expected_nonce + 1)); + } // decode parameters and dispatch - dispatch::function(&tx.function, &tx.signed); + let tx = tx.drain().transaction; + tx.function.dispatch(staking::PublicPass::new(&tx.signed)); } fn initial_checks(block: &Block) { @@ -226,27 +235,31 @@ mod tests { use keyring::Keyring::*; use environment::with_env; use primitives::hexdisplay::HexDisplay; - use demo_primitives::{Header, Digest, UncheckedTransaction, Transaction, Function}; + 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(&One.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&One.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TRANSACTION_FEE).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0] ]; let tx = UncheckedTransaction { transaction: Transaction { signed: One.into(), nonce: 0, - function: Function::StakingTransfer(Two.into(), 69), + function: PubCall::Staking(StakingCall::transfer(Two.into(), 69)), }, - signature: hex!("5f9832c5a4a39e2dd4a3a0c5b400e9836beb362cb8f7d845a8291a2ae6fe366612e080e4acd0b5a75c3d0b6ee69614a68fb63698c1e76bf1f2dcd8fa617ddf05").into(), + signature: hex!("3a682213cb10e8e375fe0817fe4d220a4622d910088809ed7fc8b4ea3871531dbadb22acfedd28a100a0b7bd2d274e0ff873655b13c88f4640b5569db3222706").into(), }; with_externalities(&mut t, || { internal::execute_transaction(tx, Header::from_block_number(1)); - assert_eq!(staking::balance(&One), 42); + assert_eq!(staking::balance(&One), 32); assert_eq!(staking::balance(&Two), 69); }); } @@ -262,7 +275,7 @@ mod tests { let h = Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("f4f6408fe3ce1d78d30bb7ed625b32f91e45b8b566023df309cfd93c6f4af9a4").into(), + state_root: hex!("584e0c1f4d4b96153591e3906d756762493dffeb5fa7159e7107014aec8d9c3d").into(), transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }; diff --git a/substrate/demo/runtime/src/runtime/timestamp.rs b/substrate/demo/runtime/src/runtime/timestamp.rs index 52b6cbe2d7..ff2c18b9bd 100644 --- a/substrate/demo/runtime/src/runtime/timestamp.rs +++ b/substrate/demo/runtime/src/runtime/timestamp.rs @@ -17,6 +17,7 @@ //! Timestamp manager: just handles the current timestamp. use runtime_support::storage; +use runtime::staking::PublicPass; pub type Timestamp = u64; @@ -27,11 +28,14 @@ pub fn get() -> Timestamp { storage::get_or_default(CURRENT_TIMESTAMP) } -pub mod public { - use super::*; +impl_dispatch! { + pub mod public; + fn set(now: Timestamp) = 0; +} +impl<'a> public::Dispatch for PublicPass<'a> { /// Set the current time. - pub fn set(now: Timestamp) { + fn set(self, now: Timestamp) { storage::put(CURRENT_TIMESTAMP, &now); } } @@ -44,6 +48,8 @@ mod tests { use runtime_io::{with_externalities, twox_128, TestExternalities}; use runtime::timestamp; use codec::{Joiner, KeyedVec}; + use demo_primitives::AccountId; + use runtime::staking::PublicPass; #[test] fn timestamp_works() { @@ -53,7 +59,7 @@ mod tests { with_externalities(&mut t, || { assert_eq!(get(), 42); - set(69); + PublicPass::nobody().set(69); assert_eq!(get(), 69); }); } diff --git a/substrate/demo/runtime/src/transaction.rs b/substrate/demo/runtime/src/transaction.rs new file mode 100644 index 0000000000..de769b5a16 --- /dev/null +++ b/substrate/demo/runtime/src/transaction.rs @@ -0,0 +1,188 @@ +// 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 . + +//! Transaction type. + +use rstd::prelude::*; +use rstd::ops; +use codec::{Input, Slicable}; +use demo_primitives::{AccountId, TxOrder, Signature}; +use dispatch::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))] +pub struct Transaction { + /// Who signed it (note this is not a signature). + pub signed: AccountId, + /// The number of transactions have come before from the same signer. + pub nonce: TxOrder, + /// The function that should be called. + pub function: PubCall, +} + +impl Slicable for Transaction { + fn decode(input: &mut I) -> Option { + Some(Transaction { + 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 + } +} + +impl ::codec::NonTrivialSlicable for Transaction {} + +/// A transactions right from the external world. Unchecked. +#[derive(Eq, Clone)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct UncheckedTransaction { + /// The actual transaction information. + pub transaction: Transaction, + /// The signature; should be an Ed25519 signature applied to the serialised `transaction` field. + pub signature: Signature, +} + +impl Slicable for UncheckedTransaction { + 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(UncheckedTransaction { + transaction: 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.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.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 ::codec::NonTrivialSlicable for UncheckedTransaction {} + +impl PartialEq for UncheckedTransaction { + 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 { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "UncheckedTransaction({:?})", 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); + +impl CheckedTransaction { + /// Get a reference to the checked signature. + pub fn signature(&self) -> &Signature { + &self.0.signature + } + + /// Get the inner object. + pub fn drain(self) -> UncheckedTransaction { + self.0 + } +} + +impl ops::Deref for CheckedTransaction { + type Target = Transaction; + + fn deref(&self) -> &Transaction { + &self.0.transaction + } +} + +/// Check the signature on a transaction. +/// +/// On failure, return the transaction back. +pub fn check(tx: UncheckedTransaction) -> Result { + let msg = ::codec::Slicable::encode(&tx.transaction); + if ::runtime_io::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { + Ok(CheckedTransaction(tx)) + } else { + Err(tx) + } +} + + +#[cfg(test)] +mod tests { + use super::*; + use primitives; + use codec::Slicable; + use primitives::hexdisplay::HexDisplay; + use dispatch::public::Call; + use runtime::timestamp::public::Call as TimestampCall; + + #[test] + fn serialize_unchecked() { + let tx = UncheckedTransaction { + transaction: Transaction { + signed: [1; 32], + nonce: 999u64, + function: Call::Timestamp(TimestampCall::set(135135)), + }, + signature: primitives::hash::H512([0; 64]), + }; + // 71000000 + // 0101010101010101010101010101010101010101010101010101010101010101 + // e703000000000000 + // 00 + // df0f0200 + // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + + let v = Slicable::encode(&tx); + println!("{}", HexDisplay::from(&v)); + assert_eq!(UncheckedTransaction::decode(&mut &v[..]).unwrap(), tx); + } +} diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 71363e96d9632d80c4f0546a3e3ac8b88bcfc2fa..8d4177558c879383d18ca9954e22d0c54b394113 100644 GIT binary patch literal 160453 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 z zf^d;`J1o&CbqoRsn-P3v9W#Lxs{y3(iQY0#gn_~sAaDhaPxN#O{lgM}R^@63GEb`% zwg`_xo~j_xrmd2Aoj}*A>R88g?nc1I=WgUa<0wW#9Lc#ReJ1$x{K1WGCu(Pt(4TnW zPEEEk09r$Uj?6#WMjDxb4aKRsR=&-CBOe+vC&m$2d2Y?rXu zSiz)<_Kdp(C2nltbFDO=K_Fi_Z%t62PC#EDcIfA(*Q9@KNaE`ADi^RW8SFSo60tC13At{oQo^?-0S}oionl3dsdHu;JfV?GHK5 zHGD;xleS^aHfiLd2Rko)$JDhnlZnYl=XznW*JV~lD(9WU13rE_j<8xIa>TkE46yy? zJ*)f{2G~@uEsZ@h@Ol7A3&v;De8N-B%aUM|=ryDpnyY-@)2wkTC+sjqj|XVD!Cd!P zG3NvF=Fs+AK;B!(C}k(O-Ctdn3V%%c2_3kmd7hb5GAJkr<<>2jW7?uE#HeRg5w(co zfmQ0TcnBjPnFPgvx!^1mM_*%dWc0PS?fqIwNY2~oJkZ;RQ8DorBsxalX~E7Je5tz_ zAd~9XHvI|@j``=X5z)~7p+Hkl&G00wm7erE#t3Ratr{p!VcIHZnOu%9u5t>iVS?YW zV<@f_b9!;^0bzunj5`2=X3$;u#@Q`SOH&FByi z$Rs5eKs|^*XnL+#i|JgLS*~xSfWfQ%zge_#at1CZ5JC`H20b(K7-{%i@J-=pQJYda zEpLo*Vhwpd+QAd1?lV98<);Y`>3!NwldryCE1y)92BV876T>Y{>Cw)EEO%NfAM+zX zQuIzehhfHa!3FN>6;%UXkH*e~l8ObWr+SpOl;m)-$2s!9k3Zym&^AOy}T(Kn_C-pqJmf+}bDA$b!tkF=n1mTl3;X=#W%I(T6~}hNM9uDD+70@Ua{l zYIKa`$hu>U=KJWMCi&Gdv=)tU-l<(QawUW2WeGntT-{{iURXWMN`+18;W4X6Aq_?R z0Ap4C?wt^li&(fzKOnWsQ)I(v*pRF~Fkj#+D=kKS<{)u%;p3;pMzfr`Jwvo}f?p0E ziH1QQ_(i*lD9Oea3IPZzl?SImYWZ`g`on{ThznurxB@h-oSyk&j(9EMr1G^ z5D8C(=}7p@rsLVXkqr}zft&scz|))`S~l>8~iw@R31LEsV4WUNmlM2 zDf)QIM+kg=r|8z9@(cX5`0(9V-XP~V|5SD=GaChtM*nqOp-qk+XVRnXU@NV_x4D(@ zN?d=NdaAE*ysqdry(cwf)pDZ8bRc3v533+-u2mJ((-CPFLYq6$73pOzr|llWoQ*92 zl~|s{o+wapg2;N>vCIqgR1AL5DNtpHM5!n8mL?I;ip1~QLJ4)-iMZM5g2EImBI&2C z^aiXjg{--oi;LDUvCLh5BA0Ydi)<(Ew8)=}*7kGJ764on0_LL792c$U=c4sfT(o?O zi&jr@(K0A5O4;C|Kp+>TW^j>*#6^od_}ND)SdF0-xjoWduazBIiC2$w`*o4EBSolV zi4%Th&8BJX9C46WMvj5&2{03Y1q}?C<`Y0CMCb{=XnFz!8Gj1B%UT5uXc0XYfbB@o zq~uz&h_+y?T%<;bv^x#ndjvVO`_fcQy2~4WRQ+}Y8qq|=t21AI;Elnez6dx(1x2Rk zjYqng(=?)pPN-kWB6BS|5%RX8g_Pn^#kSPP{Dy2Y6I9)9GSeFEilAiX5YtlF$-$+t zLljD~aM#DYw^MG~`#9xBfms-Aid)BsX$NIHX;UFv2G_olp+{IuiF()-_zwJ#vQbjt zq-CLkVKT6|t8Cw@zvIC$GuB8X3^0s^!2l(yOcayAm11Bffj~$j!er>vNF#8S5i%A7 z%gh-8xn|rdqH)beDKS}9p{k4wSSJT78_j3CyV+<$XrooNQKW1hS+xKIDW6B_2!o-K z154TQ91n)c2EXB8SWo=TH%5bDO91#UG8pEl`=ng8&4!!HCREAI-B&A-8*y_dWH3$R zH)FGRxya3x3P>*Qaxtm3J)?wO%-|+qU3hX}0^<%c7F>c>nM-K6wrwT9Vn0IU7=drX zgrDJ65_DKP!aH(pne|a8b_%(+TiI-5Y7(2CcbJ#NA|7o;A027sZM$3PV*IHE`5ZG3 z_^`jpxAgkDv!_cIw7Trx^YLkQQyzGzUbMM=84S_n=^}OFnT1HeK9X;`GQ^P4eG*gl21= zk${F#8>}cM8|U=wnA!KH8_h<8(;IExD5uwrCQfg(x(BDvHhL}QzZ$1k&8m%2PLDVS z2*5pxus6uGT?a9q=*^CBy7rV%sdV`+PT!Ii;H5^`+iC9ha<`;ivJbx{J0`<>i(Xgr z3bux{4tz$Ivk53gzjx&4DxSV91-q(jHeD3x4fZIuasPP9>%vA|-grfcysO!%O;(Kv zSI#Tcr>R8ZCwLhevI()~cDW^t-F360t0KKS=ICzk;ph^)FZOhFSw|rMcihpHW88Ff zSHsbz8Npz;qdWUxZ>qplc(6Cko8joP%2kf87Q4!f*kbOz;phU)8Qy>?XW{$^DkVpE z9uD2@=n{ik!>>YZ%-?{cdlI+0>F1LAZN8_ENwO#kAM)iE{oIqon|E`oZZVX<7%%ta z4Li9jIJxt7a!H33F^XzI9Js}uv6H(s;^fXYoLo}WB}+%0+?g>a*T%TL(J=@23)uxw zBs`3NIYin2eeR8E5`GU4K|TTE-~A&15E!kUHQUKJ2eR1N!dkwWDzWE;yfyt~+lgGt z=GFNpJ5R`kQU%6zPBC;gp@<^Ua$XP}rZYZ|3&QNb`Mm}RA?1mc=HeKQDx8$$GLed5 zmq}X|dv4}>03jM1`(?@ZRKOku7W>l=S2gtvmZRK)TM3%O-bguWDE82xfDaA}lGVVY3q?%Rgy#EMM28q9F;Av^_8DMYS z8{SpJBhwRlEzft%BhwSQ?-5#|sy`aA`Xi6bGbrbx4Ksi;&M3cA3=k6yfXQ>PVXe5ALHSta6`ap`{zx8dGen|9%{Pk>>JAE$UA(4{A|Z3l|F)*%(mZoMP3^YoUZ47 zc4XYc?wHo{9x#emWiv3^VEhQ#WgB1114X~^y?3d)+E(Sn|2QE=tt3&GWftO2JBvxy z{i?68Z+|#lf6do>Tfd&JA05S3WqD#rxz>XaXo;A96Jm$Ndm-!HXbE~9c-4Z@7)B4aDhStDWI#kW>tgY zL+{kt=GalOy;{Uv#uDRg`H!W=TT)ThNCIk03@O`$)jbbjXIbZfZY-hu+47!9kJlzj zQN1~~F|0-lEwZWS0IM|=6#_f&(`dP*Zejh7X69d`3$!Ik%WL`j_=BJtfpc02I5t=# z(qEpv5V`UniYvVH253FqXo;)O&~v;;gF4Ncbrpx8(Oy<=u><+ULx`< zDI6O$AxBp;v@BOVsiJu`#YfBo?knA9>Iiw^&O1WEe32WBqKI8so<(skfE+1M0MpTp zct1!o70~C=HY%4TzY;Zsijg)n*i^t*WTlNvz^e>$ZqC1(Ux2)(uPRnhP)LD215@4g z=DY49<{pBu$NZU=!6OUgLlKF3n2BBs8)(4^9Lyqkqil<1W>y$bw(2XRzcO9=EApzZ zQv+qZ7kI0cdTHR{Nhn^g0{)p&j4Z85poIqD$Kb5Ea)O|V5*xL#Pl0XN7d4;Zh0-3r z=CDN?hCpoV9F)wSD(yiJ>X=XSm;VV<2~abQm@wK{Q3B0ytJ-wn=8*=Bu}w6~8R-KT znf*k<_8+&ZUsO0Tfj=|PwUBBA)u0Ew-|Fp zf-DKFxQlM-kz`c#TnX@U*(9y)T-PJ$w*(T9*Tp1!%Ro8F1 z$8<0@DM6F4FS|Q786(3wb?y~Dz+>J>>oU7_rNG2M^N-pIQ`5rQ2~$(Ypv5~|Xd6tK zecA?-sj6GkH=#Tl91>!;p*#fJAn7ba$AxNW6Fb{6N1Ano^@n|CB&*fS$P-9FUWT4D z^b5v><}@$p5mw)f0}8fvg<)D#loyjPC(hFf?w(pmCHT|%nG9LlSP3JoVcQPLys7%4 zTC_5@7+vw`MlN@i{uF8eO<6^+!y>BV$Tm;HYO=ZL%{WC>(yw#+tZ$GVmF*}Kiuq5< z?ZVsnkq=)vKUq$KDLL^;#2|A>g|R4*cNx6O9t~pVdPhvrdD;mx$F0(K``Rxin~<_z z&IKyQIrS#^G@N!NOJo~hO*X)q4FD2NR=gqO3hsMepO=@~;XEI24GN8hG-C95V)mRV zUFF4!WW^WasUK7Ihr`J|DXuAsIJr&Z!rHJ|hy-(d46yvJVkF#uHeK0$jr)6BpG()z zH^WX!$q;8q$P*i~vH>`6^&|q;xb-%?TCtD4uG*D*ELDpNufUvNYOc%Ze z;P{pnp_Tik!CJt8C(1YElZuWFnYfin${STXwHY&HmdVD8ogLvn+v?-%Al;cTRv?yDlx7$hgbrcV5iwGgFI6I4DHyPcDvr2RwIaw z3=F{7n-)N5GMKhm+O`dNBAq!f!!cCZiiu@zZIKH{P~}n%pvpfveyU;Qn3XwvDvH=| zoA+Q`2RIXLWxA_ugi2=A@`3SkWAiV`3Coo}pbFVwr=fO2EhiYu$>_hfqcTNh5*wu~ zDvm4_;r`+xG%Jddl=1079`bFC-rROaM-QYB1rxDYfH5x=fM8)kfh#^1yI=`EdDCC!OVeT5N*yDBKz)O!C}Qp!jq2rajx{{oH_hv zBCq9hv9BarxfxPN7k#K&nsLU$w4sZ}L+cT)Fu2lQH{;ub-FSefZp-bZAWEf}Z-_k0 z=OxtQ+^X9-%?jR;loEiYXGQ2p`YiIX0Eb1)VXkRY_`hm&1UP!WOKb>G2?d+wAug-`o44Qu3&;7*^is(F!9=JNG2}8c=%xs1^Vaz+F0O+Nivxy>}DpF-#kfiM@9N z7{S2}hb66g&7c{@d^jwL-XSdLy~o^5-qt9)YjraIt`fZqg)4_W9E^4`zE$2-F;Te) z)WIDff{{xEXe9#|G$3aI7lk7-^V957Og9=$E=8kNwNW^Vun$jIE`?^e;v21&eX2O+ z!#8LS_fR)_bJV4v0Z-rr{b5Y!BSB@1hqL9KabWlUBb{R!eoWiux$9sc_9DRk4&6r( zN>+0^0+k??6k-ZKiRE?d>1>Wg$x~C?eHJ&&RTO_?rJ)6fsf2)ArV^a>0{XZf`t=OP;f8yqN|N z2Xc&Y3s;I+$7V!{VX_pc8G}j@B>8r`;!utuB{CM_H5yYXjn&728*GV~>*K&x8tF9= z6_b#LmUA9_XlPvIdTFF;0HF#Mg1b1%oX+V0&XNu!MPf-tnG#DzW<3=JyR6_yo|3;- zRLZF(mi?jN?$lf-xRmfeXYB?aZzE2{%TkVF3D{JOiRBMl*kX}80?N}m4EYZ!Y&nEB z#RpXpWKFt8E)r{y9U3lILN&|Y^5ZPAn(bCduG&>2=>Q$}%(ckcol504;S|wXu%>SG z>X^tP&rx&Ej6jm(^;}WcW)dA1TrmmKu4a6je*_RovRLTA!sY1gtoDm3I^X5;3B6dSEaY(YG|gx zIKm(;%{JOjNF@WK*+!@#t$~&rGETEtb9$W9k26lQ^b<}iH6)6KzZJ|8PPGA$2kIH^ zRk^<*vxt5$AYHR2;9`My$pffBHyqB9FR{9ftVwp0YhNkr|;4!*}IP*977dYx=A^( z(^Z<~@y14)#ER)H9Xl>%+ZJQ!*l|>D-00Zxq;Tz%**_xkGmIl_%S(sZCpxQPpaDiK z16-t^+VXbP6m6b6jy&CEPEJ^FswXBiNjlqDWoH=&s{a9 z&~y++g9*n7%qX@N!yomR1<>ru3OHg~X`$veuOTV+BS?rO8Zg)U4s@twQgvmyAIz;t)!cRny(4P=LhVpb?F`JUo!!Ws+ z3al{OFuAUZP%MM&H-(&v!%(v z%l_%%lve;WBQPj|IBc^m3D7PtbRHXaw2uZFO%p>CY~au?&$S;Lvd~^TVN5D1?93!N z51dps!A=?4o~F>zxsxQ@cd5?b2RHi#+i6S?5$jNEo+jE)4&>DrT1w}S79>B=GbWY# zsn@X%mnj_n|IM53`TAZRUl{H8tH1ubJ@Moo@MbYX6WmI){+dGjpWQUHwIkzhI$?1| zv)||1U+a$FJeho5!29O;QXIG&-oio?;1|q?UrWCH_)SyF)LsNWIZEKH`2R}^-&+v= zM!Vg4I!o+IT6c@~>7t{>O6{U^YKV;1T4Q7{a(1X6?Gu{>D_U>vb>iJP94?9Uc9Dpt zBiSw3cVeBEe_D)FrD$7>vs@H0E+0qY+q(rzXIOmCqie=;)sfx5+-`SMm#Yq|N6}mL zaDs2pdi1cJdWfb#Gf3(1>7pZb(;e6bRktSSp%jUJTFrQrNzstQBt?Vm&RWkA1*0BT zdgTw>o$k}^r{a71x9Z*v!L##`wI1r8_z9Oz8yF%)#Mc84jvGqHg!u#W)y1uqP^lS4cF)XfeJ zY5x~7w10npXZ`8vr?MGyaq{$VL;Iz)z1>gA53L65aA zv3X+Mt(vx|e_2aVMwHTQr#w)V@rKQ>&fyjt z!(4>I54V;`{NmCjXRGt7R-2v6I_23(yAg9m7v32zs83PIx4XrB_2IL0hY!yexk_|z zq3Gr+I%@dh#BlST&RH5Rbmgn%m5#^JD;9D^7tz*&cmDSm_3qh;dpcKS0QOSFxnhAn zRnM<<-14lC9T?61dzv^wRvPrvUM+KS0`$}^V;#|nDC@x?R0IB~QE!pcv-xBdFo z96z2t$BzYm{61e?@o^EMtO=j7G0Or=&%ZJ%GnkrES>1$!fLKY5DYT?kM2f41O>i{&|a{+>2xm?mic5qmh zESN2pB@6aZo@7C zuVg_K(PwrWOT5nDLl#`@0-g2LBGVSl=NG$fai(erQPq4dS;A1$NG#At1`y$Um(zXs z>YAPJmaX15F6^5Z8Py_#ogs}?M20j6@*PV+@|`WxDy%LWtEBjUL(!GAAQgD9uC$Nt zV11rclUpF6q)Zwlly#PfD8v&IW(ic?5E;$wNk(iIeOqJ{C>^c`#fr8@X(W?TugFzG zr8KDH+GMm=QAb5aE7g(jO)^?9))E=@s?%)zJdx2{)evLegN)KhEV&y*Zo)y^xV$2x ztmfha6T>DCh>V8J-Gg)BferT#N&mBxRv$1&lyf#(oEZeC-rws(bKB+8V0mHrYe*~f z_AhCrgUI>1qLl)Xa|`m}22_m1{SC>6zf>`qq5lF@%%KIgPqaCYY&f7Jx-N3^>`oF3 zh??vGAf%E7tV%DioypP8`(<_e6`hPB8(iV=8PpZ|v$AmK`aiAbGlN+yAoK%ev{R7L zxXkv%49_RDW8NVwQx0#o*{~F`;JV7;?J9?NPH)Z1h+I%RIv#<~(Lv^DquC+$F&#hB znZSr~Pt*l(Pst9+VOq~=7?M2Qw}erohUFWnk?@Q{d2m{89O60H&t}Z)3)A{q@(ku_ zO{Nv@+lXGoFOYGyr)I>g;?vAa>7;_N(R4OJ{*}$Q;B{#C z;p8h~^JCViv-9`$FsyEex1^14$9!W~WWm+z#?VTkcQFjIZI<=!LXoS4-et}(SGl&{ zMakxhw&*Z9I6aVW8d(kV4Q-n$E)(GBtIcG-rIFa18yP^DZ!WL&?zK8E zy}P||U~j6q0n=^E7BPp@&Ov-8_1(mG1I=vaX69*zaMR5@4EFeFOm@N*msnbqA4E#vVZ2puGuRZJvFY=Ry3 zc0vfs+u5N-%zkRflWEZRA%-(!S)X zmgWD~#Hm-cTZ0u!|4)C6RQ=`h%7j*q%c>AVLkqfB@$sT^j;Q zU=&j|VUP{Zb&O?& zFet6g+jEdrM(_)kfBjPluL{~Hu>j^}e)52@R)?J57)FOf-BiXw66L`p8#?8NK8I+q zK&6FZISnTYAWN~BM#>iy$8xM`=lGeY-i?IX`QQLYoI}~$PY_&0#47TdtSogq*s5+Z zvqEmX*|fBj4fPRL(5SFpv%yvY1?$+Is##$?vTau2%nS#=nyiq6WA%WV5{^{Z<&V6F zD8nS2v3R?j5e+bGMsYiwu^ya(FQb?vjbS8ay33qFWF{Ub&cI^KRcwbgrGq#lV)SUe zkeTy2$`6~&C$Y(47-k2=CfrMF2<3H0A449qHGKL6!d4$|M1=NY2cqmx4Av}orT{Ny z-|Yz=B8HXVky`zaO7u=k2Lg-Y_62ZA@E|k1#;d@=z`CXi5^Ka!k|weSHWQJJl2}cH zdlJ|lqBnbtwxF0V8+RKmQ?Zz)X)xI-$&;GFwUzwFwatyh`yx9{CxzgScSFuut7gTa zk*W1^0jclNNh1fVWHzzrlE@1_3PD!QsM#C4hJf$fE;TcgeFM~-@oNe1jvDw4L&7d^ z(vpaZrXdkZbX0|oYOoO_BE&>|WW7c}cwW_R6xLR528M<0il6oe!J)+zu*;kS7R>Z_eo6pY#`lPotyCh;wbIUQz zM4=7!mmbS9q{`UTGf3QuiCr#oY3SA^+e@h-DQ6W_M1+Ny9${2Adv+;ink!{#-z!Wn zWPa7Jvu+G)tQuB%CTcPBQq@usBkYeF6>>6YKW3zXQwKGYgCQ7Pxi`t0U`@+X)u0Rv z8eA;;xt3d@&$5E_`;7W8(Xo4c%mb!|X6mnGD<>H|*(za%ynC)qlk4}kKE$>Br|nb4 zfpA4X%+GzwTV~q2Ep(*FpYO;?UnsU6bS$5t;(l>cr+ki|HT0h4t_IvExufTRMK%97 z?$+W%pW)|9eCT<8dIdiu!OsF8?a%pd>D}*%PrXRtPJ}uq?rmLCkN*#fCbh7sQ~q0i zPQ~o{zvJgY?by&M{~vx%N9mvQvqszh$DPU9)&5`Z=-%1McuOeINx=QPWXW=u1Dh9+ z%XqLuiz7v0zRRMU)Q^LEg*H2Ez~wk>_R(pVR;dgg%~ZM@ngu9GkEH6j6C31`i{byn zkhuhoRGmf%^&5@GCvqEnLZhfZajxUajZZ{_l;=-08XNB+k3`*B(sJ%$ak~p6MKoCjarX*_F%=oK4WO*w0$t}OE4OFL)uEHYC?mTr8!N)23;4qhz(*G4ruBEj;{>Y^;WKu_zVT0x;7{{++*i?3?^ z<2LDmff3#$w^WNxmSUW-{A)N>w2=l<%mH)ib&6C)IG|&578tI=5Tb>XV3S(Usneic z)re(OEvbl>$Y@Ij0OZ4J#`Zm(pF?TpSQ8df^YPEQy>`{iYi`dny1-254~9@=*1{Nx@W{8c*wPMQ3Hdc>Kt$ zlgu|wEv!Lv5E5bt@CA3@gai{Ig#??YEmY|pX=@>|^_}P!JS$)0j`V9$OiF%DmNy3^ zh)!xhZDt?^{fCDAdpc6on*2Q1#xj^%SgN#G{fi)0k{>?O#X1g=oysh5CD9~*Lh=M^ zf_*HC7K^E16iY3cLoT*?IDzGEA-IQ0!b-vWhf@+}%3qsGT8XU&td$rEOe#JePL$mf zy0K`bBfR3>WT}E}Z%T>oc+*6QTy?_LrWy5YH5z^eJF~zuGiat*i&mV`D36up5*xs> z6)c!QLO3S;;zJqotE$5EO^g$d)2ZJ6>JeDuC{dWlGwcagO|jbYxuD2 z%f<3a+xF#~+ifpRC|baW%>AV&WWBe`Y31naBSYox_kX7Fg|&1P+TBz&J=ar;=l}1u z>l>9AFuJ28P+4iI6T_Br5-IlH$Er`fuKM31nhbd)ANwxpNzzXMjP?KDip zsrWYb(Qvx5Ql|xpnPgIO5_Gasr<0Ys*ORbP$DU*>bvjw8*@&Gi0B#E#qNR-DaVvE? zTdD5G=sPg!c+M1KV2)lPzTQ@VtN!nsv>J%6Drc6zeXawtxqv86^ zB8~!d^I=3wO|<(@iY2dZ_(ERbz_b0gYWN~{r)Bu+Fh@&ToAA4B)ohz)c{&F+B++#_ zhs+rtaWO_L1syF$h~;{=s>IN5*=Y@hxR;?S+h*KQMT=d{P?abOCBS;Fc4d1-A?jng zm>kn!yA0KCA(?RlhH4I3Wfi!$p~?hOYHm+Mb+U?lwMXqonYnWB>p?X8zNevjjh-JS zXp#F%FmRWlI>)9**{Ywd0MHIobh270Bb7RCsMg(z&W;3Jo4-lY7JwD)V3lIu>Ch&6h08jl6S~>M!kvrvQ`fYcYg3tBpz^+GSGSx0 z-9&q$+DW1~Eehr^wQK)zs6h$Gow7%~5cqT!7h5u_rWU4qGmBVHI1H__ZHpf|Gq7XS zN@AEarS)~%v8BBBJjNibW`FDnOcMW<^<)Qu8%^2Cbi#F@Sq14hY;vy;m@M!z^y=uR zO(v7^L=yu+?rPU$BL_v3-@LY09klo)`7m0OO`Zx%z@!}}6`tr)vRs$ISIFUVwkiP) zE$fn2ITtN&5D1h8a3`0Ud#P^NyF_}xPaGn-r{zV(z$jiF9g@8_!g0F?Yj19GuP2bF zjyBP{YOL4%FZ%PS-zamoI-O`|hl3 z%87lX*2^mqt(q;?kF;KF$70g;@;tH(pm}NOx*lEhqsK`dq3nFSN$WJC>f^iDur`s? zg7jTKjZc=O`GtU-VJ#;OQ)6%t`9Kl{2A;=sKK1=$z8-CTJl%gHT|epTy{&(quD{hT zuf&-6kjHc}dQZ2XNh6wV4CTDb)H4-6uA%T@!Qtvd@Y6kpKqDH$aPy?sWNx{!jpE?D zip{@$y!BQ@-mRkP%o|70BpAXYEbVHd>1>oXM;C|^3^ls5V2UoN-qi=^r+W-;D&Yqw zV!hZp-eyxx2;dgUZe%b*u$QI83gP3G3i7Z?pRFW7!gKQ-UEUj9*C z`i1)EAM2+$t?u`qq@wbDqaY4WpyEX;I5ZU8up7FG4Q>m#@L+&9fXbM(TUIry;ap=} zJ~PH+U}Qs#k*LPlNZH#xI_<&5kTX{>9CL-x3<{BZwGBBTG1`k#89 z`i!}z4yJyN^)U5qL<%iP*r%S{WCw2k%OhC7*)R7I-61QU{Zy-b=?!e5R~GAsJ3mMG zlgs0*sc3Od&MnF@0`D{WtWbt`E6lPz+?b@MA^`qIk-d9;BYGmmgztmGuec)+wEyvtE8eGs0ZS zg<$G$z5M4~rFrn3$w6$f_KB6;U0N&8vdgG@M%I=!85Zt-%IP5cd#__IK)Cui8sl)M zKhRbp-er!daP2@g8Fx&4%gW>2$jtB^BuGjuZ!7Ub-D`lBtkmeSBr66)=7kH^i8UwC zj2@|rDy%F$-d5FJlGVxttH(hIi5{yDm{mcEe9t$R(!DN{tZpn-FQh18d?wEn73AbV z!H)jRoWjwPz2ml2ggr%SYATv5mhwX+Oy_awYhDGIdR1E~=2un3tE_fPMQlcqAL`Zf z7+}WB*?4z}tqSwID&k!x^hSyp)v}Lwa_7{@MH)Hl4ge}Tu&?f(4R{(^Df(3-7Y%zB z(C6VuOwxenrRIx$sUF9jr(ZgDDD_DdPkOZVAg?#JdPwz1t~P*TSN|!Y`%8`PQvwM3 zyL-=M>21+$pe87E`KqL8KpQoET+s?#OwJ`B&DMPtxC$c}@2rArMkh-mn{X8t&#TEy zJ=X(lh#5)APx5yv#N^pF7L3*^_W!C^ZNkm(_g;H*k}|W!fd_k{6b4WnNbgzN@E-d* z@Lr-}6ENLh%55pW_a`yvV%Agww0i!KftO1i5u7Xb#$N^84 z_XHCHlm2+;{6H*}6ITR64DE-J3e+5@Dkkn_XenJ(L=6cbMjCcBkTtHs-1zr3ZB z9+3UgPSZu5cQRwbmWHeH^V?;*4%_(7BJMgkNm5t#QhY^xqyFlqU~JNi>K`V ze4;l?8WrE%*yEeUbw0Iv6Q3f9BaiVa-@D$|Zen0susk4SLLlj}0l*q;fQNSZng@oP z5YZeU0pcqaZ1!_b7y$(KRo<`5p@)VWn`~Ax2N`PL^I~IDTf%Zt4Q75*rGuNaur3%- z!1JBr;O0Zag-z_5Rd!o9QdwSOAgxrN(2;EV#L6bxX;olZ2TiNRN_>Q3_VTWpRn2vM z2e-QZ&N|;&+hlo**5vV>15}vtcjl|_Xfs>Ay`Nbl9!gSBeSds~!W}i4hcd5E_&~}$ zlzBdJU=#b}K-nqVdT)O*zX?1}6@-4)I9-BVN_IRsH6YPO9Z5aVS2X|+yY7O(I77YW z_Y-NRN~`L^N^_K}bYW(5aKK!&UmxViCzQr&IZt4SbxWC%K=%HQ5Zr#}(Cgdb4mAWU zfDsEh;ND;lfF!n{Ct?T2&j59fGpwU0@q(#ijtnvcQgPrkYv(vXU8de-vHC>WW?GVH z2I?0htyR8{k56&sQ|$ISSfMU6vRO*-CGTLj7U&tQ(i3e-ukSMuesOpUhiCynFvRjF zcI4x`G_+c5A{Q0y)9LM-J(8&~(Uco$jGO5vw03K<;{0HAjf^2OZhv!l5R*-V9pQb$ zYo_e*HP?FzyU6r2=gtWwJ8$Eejx&`l!a^8CGsTMjyAb^#@a?YdxpxdSg{bST+GK3<63`H$?8}N|xoaewrHHSY&w2(Y*@5 z$a+Jcs3T-~YOq2_ARjiuD;;pQu(QlN+{E>q)o=!g2*5bnzZ=(5*bQ9M-YBjCK-G*m zjCK^4$poXK-LMh;IpbSLTy$H3?}rg*8Q)-6#3Fnb8SAl*E_tBPZU zgMiFWp=pf`>!Vr1rxvO${I_y<1s{+v44 z5J$lf{nOB42YsH*C~~HRoaw4N6>_Eo>3kecC43Q48bF@w*;0cyj~pEs(-7ejzYXMI zn&zk1L{3FfP2^;9s*wZR*-|p^`(JAC?fE*pKF7tc1UtY+D z^>~w+&A^Ld;KgEpFfa+8*#@DXNdU}<&(Tba^54wjGsP0^!e6;LnH^MkfZ3@1#nJ;L zFk1TWFVD1XVaS}-&Xdr~;GhZ*pwmbL#OR+LtfN#22%VN7`e|9cX8G0fgBM$G8TQom z^32nyi(<2wdq9TJ1H+Yfu*gvQD3+ugfRHoz6DK}Xx;>+PdOse(41|2~I-rK?oVQ9k6+hlBQ7@}%NLgPRsq5SF$Qya8L->|Xx z;UmvwoDVp=h?yKy=n(sw#=*E6&v1K4APkwwH)wpLkoy+mFW#FQY^wE{;vnGRMO>#1 zhP1(s!d{HCRbK3%Jd1}M!l0HTZFUAolRBkW{Q5Our@x2}RkI z=8v}ycf1G@H=B^IcGpsfbC#BVx>$sgA0z?8R3?!j8*Yj}d>bgpyYDhLI`bqH@E~eq){qC>zW`1W>OKM&B6; ze#(J)dL8r?wo8D!p%G~daGTZua8o0~c{8@Z6n%kA(oi=v)D6=Z)giTMz#9}rOX@w% zsL_$3iX<5-mri~@lz8LjnnM*gBAcJ1cU>pfKl?AR7aH%Tav;5bzEs1|W7Tk~NDkgo|8-zsso3AYhtBAu zAlmg_{&d9Jc(>$_%Q*ZPv;pdEFcpgD>i-toi?b7x(=$^oR(27n31nsnR)Ry=1!i(N zE0`rm87oPdo7>9bPwx%LF`z&x{KCi1Lp?S^p}=_^@RDc|&45~ZpvM#lPssB~DCXTZ z1&|$&35u}_Yg>7y3gaL@MIcV_6CJkOK)l%mj8rW6>>m+x8zQd(Oa*X~2)4+d{w6b6n zn6TcI*jKb9aWo9W(8QiLl1ANr6cCnU8ccTk6${wq_6t%CR}f# z73c!H7-3^>G{(3+g36%JhF=JHyMlGIszn=2vgHnED;tY`FYK`8XS3#*MURD(pC*gG zIfgJA8$-z7lG`8R4H!#a$zWWO<#QuGe-J2wPw<3fp$yC?kIpcIfEu;*0A-cF0XGr7I!}# zckhS`VPnl9zB4XATb|h=7h|Km+|uOXh8D~LI*h;8->XMh*>+j!%Sy{qxIp=~wEXf2yA{l087-@vEsMG9Gp#N|*ybRgS?P z<9bvxYerWZ7i4~`Bb!Jg+eCVSberd!#r9Lf?Z^_^%oG6oZoRA6PMJa;4ik9B*ZX}v z+WLFx{(nr@f8guAt$&!V|A>UHz#niPqs|YsGkK2DCevvR;%s@SS4ZGpWXJ4^k+%u* zicO~m1?AlwW2LSKV=MmIZD{aZd;~>w_@qxOe5yLUkm94pO9Sew$8Sx zxO>>mqlCZlBhnK%d^nqL;PK&HW2}kGtIVb#`7Dqj?*%#@Tt4h+w1F|x2v7SB3|cT> zla7?r1aMQIQ*Tp0Qx8Y`hUNh)qiTZvPpW?0%;zNyHIQdN)hge!<@}GlO~=W zTy?nfNv+k6n(Mk=XyXNHkR5K1V{(bl$pYeCogvgIi?{b5SH*QQjJWg%5U(PO^2{b} zaUz71_Ht7YA!kBZyV!Vu^ss*e)I=55_zBJ7U|E|GCt4qLyW)mR$f0#v*IikMk-!|K z*l8@3mU-ALh1%FQG_*|^16@DAWRcZ%V^}{aeE=y&kuAQQZV^Q^(<5{j848j-9qr-8I)YMQ;qS8ddj{`*hyzRG(;AaJF+E#W7YB zDU-#CJR9XNk#C|`6C5B}Zh$QR1_-p-(*U7;7;?O|;U|fYBoldM1vlH!ZjUCNr=km; zFuL+^$}309md8S79oUndeXX$~o{n@M<&;=@{2m<;*O>=+>DHM(9(fl#-SSzmhl<$z zT;7(Pf&il?P&_|N(QM4m>Y-YH1`50&3Y7TgT}{zJpe8pJL4k9@^Ash5&V+XX!c+I3 zi&w=e;i^Xwui}f36hSNElT^#2yQlkRt9 zsx8Ob3JyetYLjEF8>)84!q_Ob$tA~#f@zO*-yA~>>JYCxh9nb)X2gx@J}MN|Jun%q zz`GO(R3mRxO=^KT`a+r^H7j3qqUb0gt0NB*LiT#|b!BZ?MpPAe|y53;dTZQwM_n_PNh?#tP|{Y-x$+?Qn5(5o??meg^XcyYH0cTFX2HbhA; zGk)8E%TlDAu_~$+^dQDIA(tv-5~UDTm(nU`lJzaZR!gTU(jvZu2Df7)u+x}CZzfL_ znX+}7P(=wAkfY>@fDYLz1e-m4%y*MLB(rlPss)WB9dc3Pu_m8rZEJqvIbNV6`+{TL ztcqwu>8Yt!#V4Vq=?3xX{4neCP8DRYbooB=RU1t}@~CpAz)~Tnrlnu~`dxhs)#m;d z9&)q0l+asQnRx(|(AnOu&K9s)Zk~^(`t`Bn7CwbBR3io(CRLPlZFIdtLsGWV=sdQB zQxTm~s%o={UP*AJqJ#!?CDfI~Bs-#IU7W>aZ7D=88mY6Bv$73&nQWOP9Nm*-%QV|n z5sft3r6)9CTc)z}8sD(#XVR=qkxQXc8||u*OJU}aike2jc9`iG+wbO)xu&)ym-FiCcxIec9G%my4R={eHgXc&YwNDE zAsaxpSxIYS_MVj8B@Xz6lLJC6iB;5y3BflAIh%R9Nl@k|QyIkZxP(|P+4hM^kYWXC zRX#OXDvJU0)wbPPjjFsdVp_H2()>{+u=a7&kWdkfeLf@ECyu}hYQsY~mss)21Kq%beOe2+Etc5Fw^$POP8Ms3C7Ds&aQnb! z|8MD?)_^6o!y`qTdFPF7ZM19(7ac0;Cqtd$EEy;lwVT#Div`SDG?nr70s; z7*r)Am=drgmW)ujrKfi^cP0w6&k*HcQ5*O&#Ch3z-T_m&_k75Q6LSg_Km`a`h28t8 z%&zHjEVYD55>-o>{{QB#Ji4u`%u9Mt>y>Rei{m6-o*gH#W5<##S(24FiP9!*N+(I_ z2Bp+~mY!`jvLv)P$;@FYrzudnsWXLU%4TLlo0dXdPFbduR?KNb%7Mn6)6x!PsLz~m zCVwzs4h+*_pqbxy-(op-fWklM`1$H?-~H})zx!?Xy(jWJ5T3&WUu$EC&9#wdguon+ zE+86*6Dbpq($J|CHx6-J!XFgVvcS#o{Kn~Ls#F`%ty+!RvvYVlo;*Kzg@)$`kqgk2 z6(kbrFr0W4r^44(EdcB)|BpeA76B(+Zq7vLelKz*vfn+C>U&4b~M4Reh z7FN6ywQU~F;eCz=oQP1|YWCo62W~QxPQWWlDcnR~@i-hESJ7A3lAsfn)~azQ`dUX1 zh~US|IPZ{YTun0WwO||b$N?hooOF(NA3A{VsN$oM4K|UA9$;%hOHM(Zca~7kgynMn z2?XRZJ`j-q(i+fL3FshB6NuADkt3vLP!Xlt&Y?GM;74N6hqjDrqAd7aL?|0PF!j`k zaxTLkqnvwDt`@oKU8O>+(@F(S9Q5LwOWQ)s*j4l*Xb^{!gl{LJ)Z*RbL1pzOasXqz zE?e6?fJkglYuV<+0g?U{DX*de;)Lpj??n8UJ89!2h3M7q5>{X-9sZmH1W09AZJ0D} zE`YahND`W?Dn;;(q7FQ`&Pl*2fn!==EP>+}i4Xb-JjVq;P*o41Wk-vCz=QVM@i*)9sqYBE)CQ9 z_spY8K%z7KItPg+F8sM@(g|J#ls`>o#Vlha0@btd>Zi$;K1KG-i|_vVvfuOQS**N0 zR__Vm&W@AYJs~9ehhZH>y zi(n~UF6jZUBXK}E(-XfYA0^vNK{Xdrb5S+fPD#|XLrr!{^vXFg=A-S*Arf%0%M@wH z>-=euMy?~(3|0830=P&>8r66Rm+rjfrTRkLjgSQ)4k!lvst75D?h6t6q2A1VEs(^jNK6lM0@T(^x6X)AKCdAfQ zi=59Zxk56NmPX}dN=ZbeWICZ7k+u&?DJ5-+`B+^lIU=W0nYedSiTCF6^nQQVi0-Bq zTs~ZNxXxKjCMQx;Y|g}*FAG%#S~9c7VYF?=r2`OwpbFpwYG+VWk82j!N?hMHz|WXj zeO%7U@nqqsl$lg=qp8ecJZ@%YD-A?*^5G#J+4F#AGOJJ|q_BofXK^uHCiqEgWja%k zjw%HyIgw2%6H2j`~iQ^ z-|r9k!~TeWpwHLm@9XOe^acC+`$B!;zDVCdz!&fb`T~JKFwh?e1;T+yU?AuV`h$JJ zKrk5W4~Bx_U?e!u@9X#X_w@(*gZ=&eq5g1xq<JNoN;ZP(r5cY-r z;l6Mn91Qn|L*Z~Z5*~>7BK}BUBoGNk`Xix8I1-5r3;@Le3_k$S1L!t@B2({GM>=acZnPT_az@RAYMrj!-k?sK2V>MD!?4)g>PXK*7d1=MQR)7QJ#3`c_1@A;A z!5LxB#=7I!KuSUyK9D8;h(?R)!#O$I*)=R-x z&WxQ|KhWFT`$23#J8PV^s=QROnM@5pz=sqV0=+lw%rk>pn$njX`mVZwdos&tQ;X7R zq`=!WgVcj`q3_2WtZe3BP%Po14+y|N)hV^1OX4+`Zv%e&gKY@z?}KBCop3Hp>1j*} zv%^GBIa%W_Oo3J@i*)fSRh+C-C(;}`Y(gs!TA@2$hio$8uWI5Koa~vuxQP>iX`Lio z^r>C|BOm)TTOiK!261NC0z2jlIfET%8Dk?y3yLP^A+H(RBqj3_i9uP4kIOk}BvVW$ z@9%VMgv%yCdF1q0SHj}JLwu}@$b zR0f=>T^9LSG#*A{35`ogX(NKpxbIrkt&0$hN`-NS)FPn{g;d8@NF$g5m8#8o`9pQg zGY442wev{ZIn0wNtsu7wxq1VwN*!CJ3lO4@Vl4h#9kZ!GG5tE$uG0#-YfO#tP%W=phfJ9oUM5%rMd#b!3$4Bd=K)*~1$6h#Knof}AVlCAk1Na~@X1XNKj} zisn7+y(Y6@wK{BqU355{9@l!d*4=XP#pXD+0Da+%QC&Vv0eq;GR>+i&Ogo{oX1NCgi@}(n3@44?EeK)^v_+$6n zTW)Ip_u9JmT-)p2dFuy@4NrOzkB@YXTSN<>6gFzsNI7gW>45!F|_! z@c8|xdgj@0p8oDDXV3q{B-YgO+UT}Dd-q*)TS7Vh;HN(G@+)V>n)-K1ZyMILwC=rX|AF`2a_en>d&gH_dhPXd^S}7-T>gPV@skg~>>b+F z>wWC0ufOn}vv0ih$gYP^czqAFUVQ4Ei?3YVf8dr6*d2AA&EB8=Je>&-?%chn{NOtm zuOBO(d3pBLH~;NF-?<3hTg6Vpl^JS3_Lg|;O2>MuwSMZ!+HKZD{Vffpw}iD0Gv2fA z5`&^$Fxzc*4?9@5!hWN}A~w04fY`#P>T(cQ!V;8k~DwrH|Xbc+$N_^nYHQ`r#(L0o+>p zLjBZ)=Sb%k+qGipKC$$?uwJM`uwu4>?KauWW=z=v&bGL4=bFb{FRrkzT(Qcs+Oke) zvNnqy=G%osmgg+5T3&O%?)-t}4a*PBbJh!%pGouLFUI- zifH!smX0+G{<kvD{PDhZLOXaDsv%%#kofr_}4yUid+9s^G zns-IS_gFhcL3BEt_Fd9u(d`TgQR_Op=(Zo+7Y@_}?6#@l)~TueVoTi>wQKDz+m-Ik z&LZ0x+hW^hb=j`7nXMkdTDs@9_NyJP(xbPv?_n-m&B}0}Fu6A7C zJTPV7>uMIR+7}jT9j;@K-ucLAk(FNj_;bg-54?Kps?Y!Pu>t!Q(K5Wrwb#{YU3q7A z5A%BJcUf8<{;!qCe))x(sn+YJ?!8+)WUUdLcF*4rmwxTaJJM_RmY%)YxuSIc)K$V= zyX#ipb+G%Rub1BFdXLp5T8>X|x0%Hot?Pr9soEYf;l9aLBit$u4m8*Fh)!^(t@Oy9 zuQLKzaNpSN7J;{|)6w!?w>T&?t!nHv*RA=;S{OX*Sz`tAmkgeHq?Z^x>));JUB9gQ zI^M(_5Zuwj$y5}ku$D`WWRQEP395}uNPH+&b>&Hv?m~|6d3r$^G%bM7DfwcmpxVPt z%o2q@m`5i$l~d%zQRr$?&E$8Lni*Lw#*?j3;OOTf=~k3VXyr!g zL#obaUSe1CZ&ZtmKD^&0DYctmU?ZAQ9HeX^}uo)Lr{cl!ep9*rGQI3 zrO4@G)>t!jJX7p@fHwy_w;G;gz&nrH3Ti1}q>t8S)c$q@^Gu_bqCs_FYT`)9oeqRT zP>MgJ&qkxqNz`UhMc%6pag$M7>40zm?dQ^NfJawMlam87#b!t)SAJlFj7MQZ;I^LK|7LH$JY!55bb>!5>)L7_T}+wvn}9 zQ1YoD;j&Vqm?JM`EC>FUXp>{mxs9x0GGlmR)HYts<*=3*dJ}7)ju=#z6|zK);kQh0 zVw;wMUCjr42$CabHX&38@1UCUy9_$bp>`fz&{##qm{I#SYG*I0z0#;HZ$^|3wG^7t zS747(JF}Us%_)e9@qn00IB6o8pO6djafmx~UQ(S*BLG5#nMbWLK@J1XX?m+R{c>j& zY1LZp32O5PnIUpJf%+xW-ftjx2DLMn)KYXu-Oh8JBzlX{cpAd|0-Bc5w3@GPFq)RS z7C3h;I2T$9oLlZ<4cc557!QtB2J1T0#gSK;Q5u(3w_8bPieux_D7VhM_M%B0wyj@FWpa-?;gvwhO1s?fF(o$Z7@6{=_p-aL=pXxe2 zPxYkpB`UyYxi$!@ZCQ|$Np#_@V&!hORa;hVt;qf4kp(D)W!bmVt*%8r54xP`hK#{N z^kQ6{<1z;Hxo+l%aDw_D$;i2cx^0vrwA&AlBeJazAZ0;yMbZV=Lp|UH0NqdpG-m*v z>0ui*#GvqiytZ)qo;3FBYXFl4m{1j%BEWE4CN|&0LYH)=-45A0A<2*p+FAo?WnzTn z%&4TKlsFGW&unEI7Wz`R!w^Q}h<%ffZp;_r1YWU@t0pzZn4hAO=*fZ$O^MsxsS2&zjLQ>h+`PUIBezo5M#o@n<< zg`;FRmAsHU5Gz|ik9lw+8E<#vg3*c{asss#l+sG-wGZICYE8~~VSgUYN3rKg`+He$ z46?i`zMhxz zv*&z36%%QyLiN)Is&hV8do^gvDWiO-D5o$udX&+lqpHWFMvti_xP7 z$YI-50<5vx;-d4IICRZX)xij`o~6TpXhlWZF$gV`PEHgjhJauupDd8AR1UHZ>@fu6 zY2}qTMwO7|(u34CaYZIii~CHFH6C1NGF??gh#7+rvq5&%(vjcA1T~y`eL(6&KUNo3 zJw^KT6?qolRgp4-+F2mttE&B$QG2FeU4+R(4vR3`&wTp!fjP$+jc*+oEiyI?S@J|; zIVH(iGVkRSIHD9{?c6*WgGGtsL2d|g)`LkiitV3H6erMbCiExDi1`q6kfMdn4EEJd(lkg#UC`;*17pk^s%>nXxR6NwiFsbjzHUNgsidzMy5GBfzv_6-$_l zgryE44sfN2hNPT^L#SmY$zv;PnZx7>oroZI4EaF|IRFtyss?0>u=XWJBtJY_9I|~a z0^JVNxD}mzNTFm*1w%poG@|l?)y!jT_(kX1G@(y(_*s7Szi5-xGz-JI+&LE{Q$Q`&;y)}c{5=u#{>9uznwPyfU4YH7I z*rA4PxR;R!kVl zEj%zp1F0OmlMOEALPXzEL-_*zA5n(1PN__8NG=%qP&txK=8h60S8z*4SyF>#`b7W1 znCL00&Y~KB1|1$Tsw=48f}=k*EQ2wm3Hd1JY?_nALq1&pNrl5WO#&^@!BC3TmNr_G zeZnaLtiEkx-CUKusK|<&;SIviTmA{Eh-la*V{TFP1zFw^z> zd*;#PGKYob7fpYhio%_LP#2gnEl(L~1Jb834Rv{DQT^vEPx+-wmq)c2`SRd?E=>b+ e(Kdr@<1A1hit4Dm22=#(vB^=r3_(T=G5`PRvBCiW diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index e33dc4212228e9bb5390ec05ff5895d3c1886ec2..68f8fe0114541bf47fc02b224d5c1450d506c2ed 100644 GIT binary patch delta 9901 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 delta 9870 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 delta 9731 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. - -//! Endian manager. - -/// Trait to allow conversion to a know endian representation when sensitive. -/// Types implementing this trait must have a size > 0. -// note: the copy bound and static lifetimes are necessary for safety of `Slicable` blanket -// implementation. -pub trait EndianSensitive: Copy + 'static { - fn to_le(self) -> Self { self } - fn to_be(self) -> Self { self } - fn from_le(self) -> Self { self } - fn from_be(self) -> Self { self } - fn as_be_then T>(&self, f: F) -> T { f(&self) } - fn as_le_then T>(&self, f: F) -> T { f(&self) } -} - -macro_rules! impl_endians { - ( $( $t:ty ),* ) => { $( - impl EndianSensitive for $t { - fn to_le(self) -> Self { <$t>::to_le(self) } - fn to_be(self) -> Self { <$t>::to_be(self) } - fn from_le(self) -> Self { <$t>::from_le(self) } - fn from_be(self) -> Self { <$t>::from_be(self) } - fn as_be_then T>(&self, f: F) -> T { let d = self.to_be(); f(&d) } - fn as_le_then T>(&self, f: F) -> T { let d = self.to_le(); f(&d) } - } - )* } -} -macro_rules! impl_non_endians { - ( $( $t:ty ),* ) => { $( - impl EndianSensitive for $t {} - )* } -} - -// NOTE: See test to ensure correctness. -impl EndianSensitive for bool {} - -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], - [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]); - -#[cfg(test)] -mod tests { - use super::EndianSensitive; - - #[test] - fn endian_sensitive_is_copy() { - fn _takes_copy() { } - fn _takes_endian_sensitive() { _takes_copy::() } - } - - #[test] - fn endian_sensitive_outlives_static() { - fn _takes_static() { } - fn _takes_endian_sensitive() { _takes_static::() } - } - - #[test] - fn bool_is_not_endian_sensitive() { - let b = true; - assert_eq!(b.to_be(), b.to_le()); - let b = false; - assert_eq!(b.to_be(), b.to_le()); - } -} diff --git a/substrate/substrate/codec/src/lib.rs b/substrate/substrate/codec/src/lib.rs index 92df92d449..15ff92b4f6 100644 --- a/substrate/substrate/codec/src/lib.rs +++ b/substrate/substrate/codec/src/lib.rs @@ -23,12 +23,10 @@ #[cfg_attr(not(feature = "std"), macro_use)] extern crate substrate_runtime_std as rstd; -mod endiansensitive; mod slicable; mod joiner; mod keyedvec; -pub use self::endiansensitive::EndianSensitive; pub use self::slicable::{Input, Slicable, NonTrivialSlicable}; pub use self::joiner::Joiner; pub use self::keyedvec::KeyedVec; diff --git a/substrate/substrate/codec/src/slicable.rs b/substrate/substrate/codec/src/slicable.rs index eb2b01db52..3a312df9ce 100644 --- a/substrate/substrate/codec/src/slicable.rs +++ b/substrate/substrate/codec/src/slicable.rs @@ -16,10 +16,9 @@ //! Serialisation. +use rstd::prelude::*; use rstd::{mem, slice}; -use rstd::vec::Vec; use super::joiner::Joiner; -use super::endiansensitive::EndianSensitive; /// Trait that allows reading of data into a slice. pub trait Input { @@ -56,39 +55,6 @@ pub trait Slicable: Sized { // TODO: under specialization, remove this and simply specialize in place serializable types. pub trait NonTrivialSlicable: Slicable {} -impl Slicable for T { - fn decode(input: &mut I) -> Option { - let size = mem::size_of::(); - assert!(size > 0, "EndianSensitive can never be implemented for a zero-sized type."); - let mut val: T = unsafe { mem::zeroed() }; - - unsafe { - let raw: &mut [u8] = slice::from_raw_parts_mut( - &mut val as *mut T as *mut u8, - size - ); - if input.read(raw) != size { return None } - } - Some(val.from_le()) - } - - fn using_encoded R>(&self, f: F) -> R { - self.as_le_then(|le| { - let size = mem::size_of::(); - let value_slice = unsafe { - let ptr = le as *const _ as *const u8; - if size != 0 { - slice::from_raw_parts(ptr, size) - } else { - &[] - } - }; - - f(value_slice) - }) - } -} - impl Slicable for Option { fn decode(input: &mut I) -> Option { u8::decode(input).and_then(|v| match v { @@ -109,6 +75,16 @@ impl Slicable for Option { } impl NonTrivialSlicable for Option {} +impl Slicable for Box { + fn decode(input: &mut I) -> Option { + Some(Box::new(T::decode(input)?)) + } + + fn using_encoded R>(&self, f: F) -> R { + self.as_ref().using_encoded(f) + } +} + impl Slicable for Vec { fn decode(input: &mut I) -> Option { u32::decode(input).and_then(move |len| { @@ -173,7 +149,7 @@ macro_rules! impl_vec_simple_array { ($($size:expr),*) => { $( impl Slicable for Vec<[T; $size]> - where [T; $size]: EndianSensitive + where [T; $size]: Slicable { fn decode(input: &mut I) -> Option { u32::decode(input).and_then(move |len| { @@ -325,6 +301,108 @@ mod inner_tuple_impl { tuple_impl!(A, B, C, D, E, F, G, H, I, J, K,); } +/// Trait to allow conversion to a know endian representation when sensitive. +/// Types implementing this trait must have a size > 0. +// note: the copy bound and static lifetimes are necessary for safety of `Slicable` blanket +// implementation. +trait EndianSensitive: Copy + 'static { + fn to_le(self) -> Self { self } + fn to_be(self) -> Self { self } + fn from_le(self) -> Self { self } + fn from_be(self) -> Self { self } + fn as_be_then T>(&self, f: F) -> T { f(&self) } + fn as_le_then T>(&self, f: F) -> T { f(&self) } +} + +macro_rules! impl_endians { + ( $( $t:ty ),* ) => { $( + impl EndianSensitive for $t { + fn to_le(self) -> Self { <$t>::to_le(self) } + fn to_be(self) -> Self { <$t>::to_be(self) } + fn from_le(self) -> Self { <$t>::from_le(self) } + fn from_be(self) -> Self { <$t>::from_be(self) } + fn as_be_then T>(&self, f: F) -> T { let d = self.to_be(); f(&d) } + fn as_le_then T>(&self, f: F) -> T { let d = self.to_le(); f(&d) } + } + + impl Slicable for $t { + fn decode(input: &mut I) -> Option { + let size = mem::size_of::<$t>(); + assert!(size > 0, "EndianSensitive can never be implemented for a zero-sized type."); + let mut val: $t = unsafe { mem::zeroed() }; + + unsafe { + let raw: &mut [u8] = slice::from_raw_parts_mut( + &mut val as *mut $t as *mut u8, + size + ); + if input.read(raw) != size { return None } + } + Some(val.from_le()) + } + + fn using_encoded R>(&self, f: F) -> R { + self.as_le_then(|le| { + let size = mem::size_of::<$t>(); + let value_slice = unsafe { + let ptr = le as *const _ as *const u8; + if size != 0 { + slice::from_raw_parts(ptr, size) + } else { + &[] + } + }; + + f(value_slice) + }) + } + } + )* } +} +macro_rules! impl_non_endians { + ( $( $t:ty ),* ) => { $( + impl EndianSensitive for $t {} + + impl Slicable for $t { + fn decode(input: &mut I) -> Option { + let size = mem::size_of::<$t>(); + assert!(size > 0, "EndianSensitive can never be implemented for a zero-sized type."); + let mut val: $t = unsafe { mem::zeroed() }; + + unsafe { + let raw: &mut [u8] = slice::from_raw_parts_mut( + &mut val as *mut $t as *mut u8, + size + ); + if input.read(raw) != size { return None } + } + Some(val.from_le()) + } + + fn using_encoded R>(&self, f: F) -> R { + self.as_le_then(|le| { + let size = mem::size_of::<$t>(); + let value_slice = unsafe { + let ptr = le as *const _ as *const u8; + if size != 0 { + slice::from_raw_parts(ptr, size) + } else { + &[] + } + }; + + f(value_slice) + }) + } + } + )* } +} + +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], + [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); + #[cfg(test)] mod tests { diff --git a/substrate/substrate/ed25519/src/lib.rs b/substrate/substrate/ed25519/src/lib.rs index 3e6f5d25a9..87085eddbf 100644 --- a/substrate/substrate/ed25519/src/lib.rs +++ b/substrate/substrate/ed25519/src/lib.rs @@ -244,7 +244,7 @@ mod test { let pair = Pair::from_seed(b"12345678901234567890123456789012"); let public = pair.public(); assert_eq!(public, Public::from_raw(hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee"))); - let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000002228000000d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); + let message = hex!("2f8c6129d816cf51c374bc7f08c3e63ed156cf78aefb4a6550d97b87997977ee00000000000000000200d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a4500000000000000"); let signature = pair.sign(&message[..]); println!("Correct signature: {}", HexDisplay::from(&signature.0)); assert!(verify_strong(&signature, &message[..], &public)); diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index e97060c601271bdf6eff78d5cd119a39e205916b..b7150f9c4c350640c84ef908d233c9c9618f2dc4 100644 GIT binary patch delta 318 zcmZqr#n|+Val=+dE*>5p77h*`R#v9T`x$*SG=)~%>+2aawU8!3>kbLT90wkr}Eg6kAhqxzk1C7}pRLH2iSu@yqzwQB@6i^sm+JXS-saAjh delta 318 zcmZqr#n|+Val=+dE*1_RAYf%>;+VXj(MLmDIJF`*xwIrTzN9EIuQ)NeBr`vcL5D9b zGcPeGvp6+ADJMTUn?ZN8F%zpYqv2#r)fYfgN$m}gc3@EnC3cXgf)a~>o}!=vgC;YBf?yaglY)SwMwSADqd}HqhpZ!q09dhx z5-UitffA>H-sb%pa~UUJ_6P^sq3xN+Xt;TnXN|z*7%e+Sqsa@kt7K?hr&1kThIqfpj=Ihzof&lZ*R|fz9 diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index 96bd1a82b292baa6a6247b7b0d9c5e582902b2a3..e7533bbd880e220b5de92621dde2562f93cf6e01 100644 GIT binary patch delta 318 zcmccgi}BJg#tkPKxp;VZSU5O%SXr4SUuG=Q&=F3pNKGy+NsTWlO3W)xOfJdH&tuT# zOUukl%*iZHjZezSPtIo0+nmcJt;}dTxl{E8kStPr10>_sGlAqub$>y91py5v4kcy~ zC7{G1U^H1%V}%`9R6>azB&wjqB4DH_sKB7f%%C6`#>=E2;HZ(Mz~E?*<=7$X$RPk$ ztf9mTQf#2aDPXjjUvnyEnR14&bN6Cj!8Zpmo6d5L=xH_#aN;6g@&&6UA+%#4PccZ98D rp1ejY9H@vzI}fO+Si44Gb9(F>Zbp;MA(@w%Hm5}~GH+JT(G~;%l2ckN delta 317 zcmccgi}BJg#tkPKxmY-OfPj^iiDU9*#v%!W;yyC>$%;MDeq@4WZYzBkPxlGc^j3$#iRbK$fBDFU_GG09sNS;*p7t~P@&|uXtMd0XN|z*HClFzrjtKv$xVu8+sv;m%gCrZ zSyv~5(P(p<&LcLU+Dv16Ai2``J&>Gf0&;DWX+DtrWNHE=)y*t{CMB9BaRW^`;#kP2 oyV=aij+xPPbE)e(=FMuEjLe(UqTX;b8gC9xyUes%Jx5y*0BXutwEzGB