From 6a99c9a43d443696c31de5aef0913e271e293b53 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Thu, 5 Apr 2018 17:13:12 +0200 Subject: [PATCH] Make Polkadot use the Substrate traity libraries (#105) * Initial stuff. * Various fixes. * Fix tests. * Fix another test * Fix another test. * Docs in polkadot runtime. * Fix up ser/de tests. * Update god keys * Syntax * Fix * Merge remote-tracking branch 'origin/master' into gav-merge-runtime * Permissions on init.sh * Port-over the whitespace from @rphmeier * Rename * Merge branch 'master' into gav-merge-runtime * Fix typo. * Fix grumbles. * Make more idiomatic. * Move `Ed25519Signature` out of traits. --- polkadot/api/Cargo.toml | 3 + polkadot/api/src/lib.rs | 176 ++++--- polkadot/consensus/Cargo.toml | 1 + polkadot/consensus/src/lib.rs | 55 +- polkadot/executor/src/lib.rs | 278 ---------- polkadot/primitives/Cargo.toml | 2 + polkadot/primitives/src/block.rs | 375 ------------- polkadot/primitives/src/lib.rs | 35 +- polkadot/primitives/src/parachain.rs | 42 +- polkadot/primitives/src/transaction.rs | 487 ----------------- polkadot/primitives/src/validator.rs | 8 +- polkadot/runtime/Cargo.toml | 35 +- polkadot/runtime/src/api.rs | 29 - polkadot/runtime/src/environment.rs | 81 --- polkadot/runtime/src/genesismap.rs | 91 ---- polkadot/runtime/src/lib.rs | 334 +++++++++--- polkadot/runtime/src/parachains.rs | 210 ++++++++ polkadot/runtime/src/runtime/consensus.rs | 48 -- polkadot/runtime/src/runtime/governance.rs | 371 ------------- polkadot/runtime/src/runtime/mod.rs | 34 -- polkadot/runtime/src/runtime/parachains.rs | 123 ----- polkadot/runtime/src/runtime/session.rs | 294 ----------- polkadot/runtime/src/runtime/staking.rs | 496 ------------------ polkadot/runtime/src/runtime/system.rs | 450 ---------------- polkadot/runtime/src/runtime/timestamp.rs | 63 --- polkadot/runtime/wasm/Cargo.lock | 198 ++++++- polkadot/runtime/wasm/Cargo.toml | 31 +- polkadot/runtime/wasm/genesis.wasm | Bin 76656 -> 134951 bytes .../release/polkadot_runtime.compact.wasm | Bin 134951 -> 190956 bytes .../release/polkadot_runtime.wasm | Bin 135000 -> 206587 bytes polkadot/service/Cargo.toml | 5 +- polkadot/service/src/lib.rs | 76 ++- polkadot/transaction-pool/Cargo.toml | 2 + polkadot/transaction-pool/src/lib.rs | 160 ++++-- 34 files changed, 1076 insertions(+), 3517 deletions(-) delete mode 100644 polkadot/primitives/src/block.rs delete mode 100644 polkadot/primitives/src/transaction.rs delete mode 100644 polkadot/runtime/src/api.rs delete mode 100644 polkadot/runtime/src/environment.rs delete mode 100644 polkadot/runtime/src/genesismap.rs create mode 100644 polkadot/runtime/src/parachains.rs delete mode 100644 polkadot/runtime/src/runtime/consensus.rs delete mode 100644 polkadot/runtime/src/runtime/governance.rs delete mode 100644 polkadot/runtime/src/runtime/mod.rs delete mode 100644 polkadot/runtime/src/runtime/parachains.rs delete mode 100644 polkadot/runtime/src/runtime/session.rs delete mode 100644 polkadot/runtime/src/runtime/staking.rs delete mode 100644 polkadot/runtime/src/runtime/system.rs delete mode 100644 polkadot/runtime/src/runtime/timestamp.rs mode change 100644 => 100755 polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm diff --git a/polkadot/api/Cargo.toml b/polkadot/api/Cargo.toml index 5e78af8c12..13c19b7570 100644 --- a/polkadot/api/Cargo.toml +++ b/polkadot/api/Cargo.toml @@ -8,7 +8,10 @@ error-chain = "0.11" polkadot-executor = { path = "../executor" } polkadot-runtime = { path = "../runtime" } polkadot-primitives = { path = "../primitives" } +substrate-codec = { path = "../../substrate/codec" } +substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-client = { path = "../../substrate/client" } +substrate-primitives = { path = "../../substrate/primitives" } substrate-executor = { path = "../../substrate/executor" } substrate-state-machine = { path = "../../substrate/state-machine" } diff --git a/polkadot/api/src/lib.rs b/polkadot/api/src/lib.rs index 049e59e197..848bf0c72c 100644 --- a/polkadot/api/src/lib.rs +++ b/polkadot/api/src/lib.rs @@ -18,10 +18,13 @@ //! runtime. extern crate polkadot_executor; -extern crate polkadot_runtime; +extern crate polkadot_runtime as runtime; extern crate polkadot_primitives as primitives; +extern crate substrate_codec as codec; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_client as client; extern crate substrate_executor as substrate_executor; +extern crate substrate_primitives; extern crate substrate_state_machine as state_machine; #[macro_use] @@ -32,14 +35,12 @@ extern crate substrate_keyring as keyring; use client::backend::Backend; use client::Client; -use polkadot_runtime::runtime; use polkadot_executor::Executor as LocalDispatch; use substrate_executor::{NativeExecutionDispatch, NativeExecutor}; use state_machine::OverlayedChanges; -use primitives::{AccountId, SessionKey, Timestamp, TxOrder}; -use primitives::block::{Id as BlockId, Block, Header, Body}; -use primitives::transaction::UncheckedTransaction; +use primitives::{AccountId, BlockId, Index, SessionKey, Timestamp}; use primitives::parachain::DutyRoster; +use runtime::{Block, Header, UncheckedExtrinsic, Extrinsic, Call, TimestampCall}; error_chain! { errors { @@ -53,15 +54,15 @@ error_chain! { description("Unknown block") display("Unknown block") } - /// Attempted to push an inherent transaction manually. - PushedInherentTransaction(tx: UncheckedTransaction) { - description("Attempted to push an inherent transaction to a block."), - display("Pushed inherent transaction to a block: {:?}", tx), + /// Attempted to push an inherent extrinsic manually. + PushedInherentTransaction(xt: UncheckedExtrinsic) { + description("Attempted to push an inherent extrinsic to a block."), + display("Pushed inherent extrinsic to a block: {:?}", xt), } - /// Badly-formed transaction. - BadlyFormedTransaction(tx: UncheckedTransaction) { - description("Attempted to push a badly-formed transaction to a block."), - display("Pushed badly-formed transaction to a block: {:?}", tx), + /// Badly-formed extrinsic. + BadlyFormedTransaction(xt: UncheckedExtrinsic) { + description("Attempted to push a badly-formed extrinsic to a block."), + display("Pushed badly-formed extrinsic to a block: {:?}", xt), } /// Some other error. // TODO: allow to be specified as associated type of PolkadotApi @@ -87,8 +88,8 @@ impl From for Error { /// A builder for blocks. pub trait BlockBuilder: Sized { - /// Push a non-inherent transaction. - fn push_transaction(&mut self, transaction: UncheckedTransaction) -> Result<()>; + /// Push a non-inherent extrinsic. + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()>; /// Finalise the block. fn bake(self) -> Block; @@ -127,8 +128,8 @@ pub trait PolkadotApi { /// Get the timestamp registered at a block. fn timestamp(&self, at: &Self::CheckedBlockId) -> Result; - /// Get the nonce of an account at a block. - fn nonce(&self, at: &Self::CheckedBlockId, account: AccountId) -> Result; + /// Get the index of an account at a block. + fn index(&self, at: &Self::CheckedBlockId, account: AccountId) -> Result; /// Evaluate a block and see if it gives an error. @@ -179,27 +180,27 @@ impl PolkadotApi for Client> } fn session_keys(&self, at: &CheckedId) -> Result> { - with_runtime!(self, at, ::runtime::consensus::authorities) + with_runtime!(self, at, ::runtime::Consensus::authorities) } fn validators(&self, at: &CheckedId) -> Result> { - with_runtime!(self, at, ::runtime::session::validators) + with_runtime!(self, at, ::runtime::Session::validators) } fn duty_roster(&self, at: &CheckedId) -> Result { - with_runtime!(self, at, ::runtime::parachains::calculate_duty_roster) + with_runtime!(self, at, ::runtime::Parachains::calculate_duty_roster) } fn timestamp(&self, at: &CheckedId) -> Result { - with_runtime!(self, at, ::runtime::timestamp::get) + with_runtime!(self, at, ::runtime::Timestamp::now) } fn evaluate_block(&self, at: &CheckedId, block: Block) -> Result<()> { - with_runtime!(self, at, || ::runtime::system::internal::execute_block(block)) + with_runtime!(self, at, || ::runtime::Executive::execute_block(block)) } - fn nonce(&self, at: &Self::CheckedBlockId, account: AccountId) -> Result { - with_runtime!(self, at, || ::runtime::system::nonce(account)) + fn index(&self, at: &Self::CheckedBlockId, account: AccountId) -> Result { + with_runtime!(self, at, || ::runtime::System::account_index(account)) } fn build_block(&self, parent: &CheckedId, timestamp: Timestamp) -> Result { @@ -208,14 +209,20 @@ impl PolkadotApi for Client> parent_hash: self.block_hash_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))?, number: self.block_number_from_id(parent)?.ok_or(ErrorKind::UnknownBlock(*parent))? + 1, state_root: Default::default(), - transaction_root: Default::default(), + extrinsics_root: Default::default(), digest: Default::default(), }; - let body = Body { - timestamp: timestamp, - transactions: Vec::new(), - }; + let extrinsics = vec![ + UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: Default::default(), + index: Default::default(), + function: Call::Timestamp(TimestampCall::set(timestamp)), + }, + signature: Default::default(), + } + ]; let mut builder = ClientBlockBuilder { parent: *parent, @@ -223,11 +230,13 @@ impl PolkadotApi for Client> state: self.state_at(parent)?, header, timestamp, - transactions: Vec::new(), + extrinsics: extrinsics.clone(), }; - for inherent in body.inherent_transactions() { - builder.execute_transaction(inherent)?; + builder.initialise_block()?; + + for inherent in extrinsics { + builder.apply_extrinsic(inherent)?; } Ok(builder) @@ -242,34 +251,53 @@ pub struct ClientBlockBuilder { state: S, header: Header, timestamp: Timestamp, - transactions: Vec, + extrinsics: Vec, } impl ClientBlockBuilder where S::Error: Into { - // executes a transaction, inherent or otherwise, without appending to the list - fn execute_transaction(&mut self, transaction: UncheckedTransaction) -> Result<()> { - if !transaction.is_well_formed() { - bail!(ErrorKind::BadlyFormedTransaction(transaction)); - } - + // executes a extrinsic, inherent or otherwise, without appending to the list + fn initialise_block(&mut self) -> Result<()> { let mut ext = state_machine::Ext { overlay: &mut self.changes, backend: &self.state, }; - // TODO: avoid clone - let header = self.header.clone(); + let h = self.header.clone(); + let result = ::substrate_executor::with_native_environment( &mut ext, - move || runtime::system::internal::execute_transaction(transaction, header), + || runtime::Executive::initialise_block(&h), ).map_err(Into::into); match result { - Ok(header) => { + Ok(_) => { + ext.overlay.commit_prospective(); + Ok(()) + } + Err(e) => { + ext.overlay.discard_prospective(); + Err(e) + } + } + } + + // executes a extrinsic, inherent or otherwise, without appending to the list + fn apply_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { + let mut ext = state_machine::Ext { + overlay: &mut self.changes, + backend: &self.state, + }; + + let result = ::substrate_executor::with_native_environment( + &mut ext, + move || runtime::Executive::apply_extrinsic(extrinsic), + ).map_err(Into::into); + + match result { + Ok(_) => { ext.overlay.commit_prospective(); - self.header = header; Ok(()) } Err(e) => { @@ -283,12 +311,13 @@ impl ClientBlockBuilder impl BlockBuilder for ClientBlockBuilder where S::Error: Into { - fn push_transaction(&mut self, transaction: UncheckedTransaction) -> Result<()> { - if transaction.transaction.function.is_inherent() { - bail!(ErrorKind::PushedInherentTransaction(transaction)); + fn push_extrinsic(&mut self, extrinsic: UncheckedExtrinsic) -> Result<()> { + // Check that this is not an "inherent" extrinsic. + if extrinsic.signature == Default::default() { + bail!(ErrorKind::PushedInherentTransaction(extrinsic)); } else { - self.execute_transaction(transaction.clone())?; - self.transactions.push(transaction); + self.apply_extrinsic(extrinsic.clone())?; + self.extrinsics.push(extrinsic); Ok(()) } } @@ -299,18 +328,14 @@ impl BlockBuilder for ClientBlockBuilder backend: &self.state, }; - let old_header = self.header; let final_header = ::substrate_executor::with_native_environment( &mut ext, - move || runtime::system::internal::finalise_block(old_header) - ).expect("all inherent transactions pushed; all other transactions executed correctly; qed"); + move || runtime::Executive::finalise_block() + ).expect("all inherent extrinsics pushed; all other extrinsics executed correctly; qed"); Block { header: final_header, - body: Body { - timestamp: self.timestamp, - transactions: self.transactions, - } + extrinsics: self.extrinsics, } } } @@ -318,10 +343,12 @@ impl BlockBuilder for ClientBlockBuilder #[cfg(test)] mod tests { use super::*; - use client::in_mem::Backend as InMemory; - use polkadot_runtime::genesismap::{additional_storage_with_genesis, GenesisConfig}; - use substrate_executor::NativeExecutionDispatch; + use runtime_io::with_externalities; use keyring::Keyring; + use codec::Slicable; + use client::in_mem::Backend as InMemory; + use substrate_executor::NativeExecutionDispatch; + use runtime::{GenesisConfig, ConsensusConfig, SessionConfig, BuildExternalities}; fn validators() -> Vec { vec![ @@ -331,20 +358,31 @@ mod tests { } fn client() -> Client> { + let genesis_config = GenesisConfig { + consensus: Some(ConsensusConfig { + code: LocalDispatch::native_equivalent().to_vec(), + authorities: validators(), + }), + system: None, + session: Some(SessionConfig { + validators: validators(), + session_length: 100, + }), + council: Some(Default::default()), + democracy: Some(Default::default()), + parachains: Some(Default::default()), + staking: Some(Default::default()), + }; ::client::new_in_mem( LocalDispatch::new(), || { - let config = GenesisConfig::new_simple(validators(), 100); - - // override code entry. - let mut storage = config.genesis_map(); - storage.insert(b":code".to_vec(), LocalDispatch::native_equivalent().to_vec()); - - let block = ::client::genesis::construct_genesis_block( - &config.genesis_map() + let mut storage = genesis_config.build_externalities(); + let block = ::client::genesis::construct_genesis_block(&storage); + with_externalities(&mut storage, || + // TODO: use api.rs to dispatch instead + runtime::System::initialise_genesis_state(&block.header) ); - storage.extend(additional_storage_with_genesis(&block)); - (block.header, storage.into_iter().collect()) + (substrate_primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) } ).unwrap() } diff --git a/polkadot/consensus/Cargo.toml b/polkadot/consensus/Cargo.toml index 103ae1a913..f87a63b87e 100644 --- a/polkadot/consensus/Cargo.toml +++ b/polkadot/consensus/Cargo.toml @@ -13,6 +13,7 @@ log = "0.4" polkadot-api = { path = "../api" } polkadot-collator = { path = "../collator" } polkadot-primitives = { path = "../primitives" } +polkadot-runtime = { path = "../runtime" } polkadot-statement-table = { path = "../statement-table" } polkadot-transaction-pool = { path = "../transaction-pool" } substrate-bft = { path = "../../substrate/bft" } diff --git a/polkadot/consensus/src/lib.rs b/polkadot/consensus/src/lib.rs index ba1e05b05e..1fc6c441f2 100644 --- a/polkadot/consensus/src/lib.rs +++ b/polkadot/consensus/src/lib.rs @@ -38,6 +38,7 @@ extern crate polkadot_collator as collator; extern crate polkadot_statement_table as table; extern crate polkadot_primitives; extern crate polkadot_transaction_pool as transaction_pool; +extern crate polkadot_runtime; extern crate substrate_bft as bft; extern crate substrate_codec as codec; extern crate substrate_primitives as primitives; @@ -62,11 +63,11 @@ use table::generic::Statement as GenericStatement; use runtime_support::Hashable; use polkadot_api::{PolkadotApi, BlockBuilder}; use polkadot_primitives::{Hash, Timestamp}; -use polkadot_primitives::block::Block as PolkadotBlock; use polkadot_primitives::parachain::{Id as ParaId, DutyRoster, BlockData, Extrinsic, CandidateReceipt}; +use polkadot_runtime::Block as PolkadotGenericBlock; use primitives::block::{Block as SubstrateBlock, Header as SubstrateHeader, HeaderHash, Id as BlockId, Number as BlockNumber}; use primitives::AuthorityId; -use transaction_pool::{Ready, TransactionPool}; +use transaction_pool::{Ready, TransactionPool, PolkadotBlock}; use futures::prelude::*; use futures::future; @@ -152,7 +153,7 @@ impl TableContext { } fn sign_statement(&self, statement: table::Statement) -> table::SignedStatement { - let signature = sign_table_statement(&statement, &self.key, &self.parent_hash); + let signature = sign_table_statement(&statement, &self.key, &self.parent_hash).into(); let local_id = self.key.public().0; table::SignedStatement { @@ -552,7 +553,7 @@ impl bft::Proposer for Proposer { if pending_size + pending.encoded_size() >= MAX_TRANSACTIONS_SIZE { break } - match block_builder.push_transaction(pending.as_transaction().clone()) { + match block_builder.push_extrinsic(pending.as_transaction().clone()) { Ok(()) => { pending_size += pending.encoded_size(); } @@ -582,23 +583,23 @@ impl bft::Proposer for Proposer { fn import_misbehavior(&self, misbehavior: Vec<(AuthorityId, bft::Misbehavior)>) { use bft::generic::Misbehavior as GenericMisbehavior; use primitives::bft::{MisbehaviorKind, MisbehaviorReport}; - use polkadot_primitives::transaction::{Function, Transaction, UncheckedTransaction}; + use polkadot_runtime::{Call, Extrinsic, UncheckedExtrinsic, ConsensusCall}; let local_id = self.local_key.public().0; let mut pool = self.transaction_pool.lock(); - let mut next_nonce = { + let mut next_index = { let readiness_evaluator = Ready::create(self.parent_id.clone(), &*self.client); - let cur_nonce = pool.pending(readiness_evaluator) - .filter(|tx| tx.as_transaction().transaction.signed == local_id) + let cur_index = pool.pending(readiness_evaluator) + .filter(|tx| tx.as_ref().as_ref().signed == local_id) .last() - .map(|tx| Ok(tx.as_transaction().transaction.nonce)) - .unwrap_or_else(|| self.client.nonce(&self.parent_id, local_id)); + .map(|tx| Ok(tx.as_ref().as_ref().index)) + .unwrap_or_else(|| self.client.index(&self.parent_id, local_id)); - match cur_nonce { - Ok(cur_nonce) => cur_nonce + 1, + match cur_index { + Ok(cur_index) => cur_index + 1, Err(e) => { - warn!(target: "consensus", "Error computing next transaction nonce: {}", e); + warn!(target: "consensus", "Error computing next transaction index: {}", e); return; } } @@ -618,23 +619,18 @@ impl bft::Proposer for Proposer { => MisbehaviorKind::BftDoubleCommit(round as u32, (h1, s1.signature), (h2, s2.signature)), } }; - - let tx = Transaction { + let extrinsic = Extrinsic { signed: local_id, - nonce: next_nonce, - function: Function::ReportMisbehavior(report), + index: next_index, + function: Call::Consensus(ConsensusCall::report_misbehavior(report)), }; - next_nonce += 1; + next_index += 1; - let message = tx.encode(); - let signature = self.local_key.sign(&message); - let tx = UncheckedTransaction { - transaction: tx, - signature, - }; + let signature = self.local_key.sign(&extrinsic.encode()).into(); + let uxt = UncheckedExtrinsic { extrinsic, signature }; - pool.import(tx).expect("locally signed transaction is valid; qed"); + pool.import(uxt).expect("locally signed extrinsic is valid; qed"); } } } @@ -649,10 +645,11 @@ fn evaluate_proposal( const MAX_TIMESTAMP_DRIFT: Timestamp = 4; let encoded = Slicable::encode(proposal); - let proposal = PolkadotBlock::decode(&mut &encoded[..]) + let proposal = PolkadotGenericBlock::decode(&mut &encoded[..]) + .and_then(|b| PolkadotBlock::from(b).ok()) .ok_or_else(|| ErrorKind::ProposalNotForPolkadot)?; - let transactions_size = proposal.body.transactions.iter().fold(0, |a, tx| { + let transactions_size = proposal.extrinsics.iter().fold(0, |a, tx| { a + Slicable::encode(tx).len() }); @@ -668,7 +665,7 @@ fn evaluate_proposal( // a) we assume the parent is valid. // b) the runtime checks that `proposal.parent_hash` == `block_hash(proposal.number - 1)` - let block_timestamp = proposal.body.timestamp; + let block_timestamp = proposal.timestamp(); // TODO: just defer using `tokio_timer` to delay prepare vote. if block_timestamp > now + MAX_TIMESTAMP_DRIFT { @@ -676,6 +673,6 @@ fn evaluate_proposal( } // execute the block. - client.evaluate_block(parent_id, proposal)?; + client.evaluate_block(parent_id, proposal.into())?; Ok(true) } diff --git a/polkadot/executor/src/lib.rs b/polkadot/executor/src/lib.rs index 186e5469cc..e5e096418b 100644 --- a/polkadot/executor/src/lib.rs +++ b/polkadot/executor/src/lib.rs @@ -27,282 +27,4 @@ extern crate polkadot_primitives as polkadot_primitives; extern crate ed25519; extern crate triehash; -#[cfg(test)] extern crate substrate_keyring as keyring; -#[cfg(test)] extern crate substrate_runtime_support as runtime_support; -#[cfg(test)] #[macro_use] extern crate hex_literal; - native_executor_instance!(pub Executor, polkadot_runtime::api::dispatch, include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm")); - -#[cfg(test)] -mod tests { - use runtime_io; - use super::Executor; - use substrate_executor::WasmExecutor; - use codec::{KeyedVec, Slicable, Joiner}; - use keyring::Keyring; - use runtime_support::Hashable; - use polkadot_runtime::runtime::staking::balance; - use state_machine::{CodeExecutor, TestExternalities}; - use primitives::twox_128; - use polkadot_primitives::{ - Hash, Header, Body, BlockNumber, Block, Digest, Transaction, - UncheckedTransaction, Function, InherentFunction, - }; - use ed25519::{Public, Pair}; - - const BLOATY_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm"); - const COMPACT_CODE: &[u8] = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm"); - - // TODO: move into own crate. - macro_rules! map { - ($( $name:expr => $value:expr ),*) => ( - vec![ $( ( $name, $value ) ),* ].into_iter().collect() - ) - } - - fn new_test_ext() -> TestExternalities { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - - map![ - twox_128(&0u64.to_keyed_vec(b"sys:old:")).to_vec() => [69u8; 32].encode(), - twox_128(b"gov:apr").to_vec() => vec![].and(&667u32), - twox_128(b"ses:len").to_vec() => vec![].and(&2u64), - twox_128(b"ses:val:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"ses:val:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"ses:val:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"ses:val:")).to_vec() => three.to_vec(), - twox_128(b"sta:wil:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"sta:wil:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"sta:wil:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"sta:wil:")).to_vec() => three.to_vec(), - twox_128(b"sta:spe").to_vec() => vec![].and(&2u64), - twox_128(b"sta:vac").to_vec() => vec![].and(&3u64), - twox_128(b"sta:era").to_vec() => vec![].and(&0u64), - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ] - } - - fn set_timestamp(timestamp: u64) -> UncheckedTransaction { - UncheckedTransaction::inherent(InherentFunction::TimestampSet(timestamp)) - } - - fn tx() -> UncheckedTransaction { - let transaction = Transaction { - signed: Keyring::One.to_raw_public(), - nonce: 0, - function: Function::StakingTransfer(Keyring::Two.to_raw_public(), 69), - }; - let signature = Keyring::from_raw_public(transaction.signed).unwrap() - .sign(&transaction.encode()); - - UncheckedTransaction { transaction, signature } - } - - fn execute_tx_on(executor: C, ext: &mut TestExternalities, code: &[u8], tx: UncheckedTransaction, header: Header) - -> Result, C::Error> - where C: CodeExecutor - { - let next_header = executor.call(ext, code, "execute_transaction", &vec![].and(&header).and(&set_timestamp(100_000))).unwrap(); - let next_input = next_header.and(&tx); - - executor.call(ext, code, "execute_transaction", &next_input[..]) - } - - fn construct_block(number: BlockNumber, parent_hash: Hash, state_root: Hash, timestamp: u64, txs: Vec) -> (Vec, Hash) { - use triehash::ordered_trie_root; - - - let transactions = txs.into_iter().map(|transaction| { - let signature = Pair::from(Keyring::from_public(Public::from_raw(transaction.signed)).unwrap()) - .sign(&transaction.encode()); - - UncheckedTransaction { transaction, signature } - }).collect(); - - let header = Header { - parent_hash, - number, - state_root, - transaction_root: Default::default(), - digest: Digest { logs: vec![], }, - }; - - let mut block = Block { - header, - body: Body { timestamp, transactions }, - }; - - let transaction_root = ordered_trie_root(block.all_transactions().map(|tx| Slicable::encode(&tx))).0.into(); - block.header.transaction_root = transaction_root; - - let hash = block.header.blake2_256(); - - (block.encode(), hash.into()) - } - - fn block1() -> (Vec, Hash) { - construct_block( - 1, - [69u8; 32].into(), - hex!("3df569d47a0d7f4a448486f04fba4eea3e9dfca001319c609f88b3a67b0dd1ea").into(), - 100_000, - vec![ - Transaction { - signed: Keyring::One.to_raw_public(), - nonce: 0, - function: Function::StakingTransfer(Keyring::Two.to_raw_public(), 69), - } - ] - ) - } - - fn block2() -> (Vec, Hash) { - construct_block( - 2, - block1().1, - hex!("5604fe023cd6effd93aec9b4a008398abdd32afb3fec988a19aa853ab0424a7c").into(), - 200_000, - vec![ - Transaction { - signed: Keyring::Two.to_raw_public(), - nonce: 0, - function: Function::StakingTransfer(Keyring::One.to_raw_public(), 5), - }, - Transaction { - signed: Keyring::One.to_raw_public(), - nonce: 1, - function: Function::StakingTransfer(Keyring::Two.to_raw_public(), 15), - } - ] - ) - } - - #[test] - fn panic_execution_with_foreign_code_gives_error() { - let one = Keyring::One.to_raw_public(); - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let r = execute_tx_on(Executor::new(), &mut t, BLOATY_CODE, tx(), Header::from_block_number(1)); - assert!(r.is_err()); - } - - #[test] - fn panic_execution_with_native_equivalent_code_gives_error() { - let one = Keyring::One.to_raw_public(); - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let r = execute_tx_on(Executor::new(), &mut t, COMPACT_CODE, tx(), Header::from_block_number(1)); - assert!(r.is_err()); - } - - #[test] - fn successful_execution_with_native_equivalent_code_gives_ok() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let r = execute_tx_on(Executor::new(), &mut t, COMPACT_CODE, tx(), Header::from_block_number(1)); - assert!(r.is_ok()); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&one), 42); - assert_eq!(balance(&two), 69); - }); - } - - #[test] - fn successful_execution_with_foreign_code_gives_ok() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let r = execute_tx_on(Executor::new(), &mut t, BLOATY_CODE, tx(), Header::from_block_number(1)); - assert!(r.is_ok()); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&one), 42); - assert_eq!(balance(&two), 69); - }); - } - - #[test] - fn full_native_block_import_works() { - let mut t = new_test_ext(); - - Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Keyring::One.to_raw_public()), 42); - assert_eq!(balance(&Keyring::Two.to_raw_public()), 69); - }); - - Executor::new().call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Keyring::One.to_raw_public()), 32); - assert_eq!(balance(&Keyring::Two.to_raw_public()), 79); - }); - } - - #[test] - fn full_wasm_block_import_works() { - let mut t = new_test_ext(); - - WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Keyring::One.to_raw_public()), 42); - assert_eq!(balance(&Keyring::Two.to_raw_public()), 69); - }); - - WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&Keyring::One.to_raw_public()), 32); - assert_eq!(balance(&Keyring::Two.to_raw_public()), 79); - }); - } - - #[test] - fn panic_execution_gives_error() { - let one = Keyring::One.to_raw_public(); - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm"); - let r = execute_tx_on(WasmExecutor, &mut t, &foreign_code[..], tx(), Header::from_block_number(1)); - assert!(r.is_err()); - } - - #[test] - fn successful_execution_gives_ok() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm"); - let r = execute_tx_on(WasmExecutor, &mut t, &foreign_code[..], tx(), Header::from_block_number(1)); - assert!(r.is_ok()); - - runtime_io::with_externalities(&mut t, || { - assert_eq!(balance(&one), 42); - assert_eq!(balance(&two), 69); - }); - } -} diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index ec2433c9a7..dc424468dc 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -9,6 +9,7 @@ serde_derive = { version = "1.0", optional = true } substrate-codec = { path = "../../substrate/codec", default_features = false } substrate-primitives = { path = "../../substrate/primitives", default_features = false } substrate-runtime-std = { path = "../../substrate/runtime-std", default_features = false } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives", default_features = false } [dev-dependencies] substrate-serializer = { path = "../../substrate/serializer" } @@ -20,6 +21,7 @@ std = [ "substrate-codec/std", "substrate-primitives/std", "substrate-runtime-std/std", + "substrate-runtime-primitives/std", "serde_derive", "serde/std", ] diff --git a/polkadot/primitives/src/block.rs b/polkadot/primitives/src/block.rs deleted file mode 100644 index e74dd19f4c..0000000000 --- a/polkadot/primitives/src/block.rs +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Block and header type definitions. - -#[cfg(feature = "std")] -use primitives::bytes; -use primitives::H256; -use rstd::vec::Vec; -use codec::{Input, Slicable}; -use transaction::{UncheckedTransaction, Function, InherentFunction}; - -pub use primitives::block::Id; - -/// Used to refer to a block number. -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))] -pub struct Log(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -impl Slicable for Log { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(Log) - } - - fn using_encoded R>(&self, f: F) -> R { - self.0.using_encoded(f) - } -} - - - -/// The digest of a block, useful for light-clients. -#[derive(Clone, Default, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Digest { - /// All logs that have happened in the block. - pub logs: Vec, -} - -impl Slicable for Digest { - fn decode(input: &mut I) -> Option { - Vec::::decode(input).map(|logs| Digest { logs }) - } - - fn using_encoded R>(&self, f: F) -> R { - self.logs.using_encoded(f) - } -} - -/// Iterator over all inherent transactions. -pub struct InherentTransactions<'a> { - number: u64, - body: &'a Body, -} - -impl<'a> Iterator for InherentTransactions<'a> { - type Item = UncheckedTransaction; - - fn next(&mut self) -> Option { - if self.number == InherentFunction::count() { - return None - } - - self.number += 1; - - let function = match self.number { - 1 => Some(InherentFunction::TimestampSet(self.body.timestamp)), - _ => None, - }; - - function.map(UncheckedTransaction::inherent) - } -} - -/// Type alias for an iterator over all transactions in a block. -pub type AllTransactions<'a> = ::rstd::iter::Chain< - InherentTransactions<'a>, - ::rstd::iter::Cloned<::rstd::slice::Iter<'a, UncheckedTransaction>>, ->; - -/// The block body. Contains timestamp and transactions. -// TODO: add candidates update as well. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Body { - /// The timestamp of the block. - pub timestamp: u64, - /// The transactions in the block. - pub transactions: Vec, -} - -impl Body { - /// Get an iterator over all inherent transactions of the body. - pub fn inherent_transactions(&self) -> InherentTransactions { - InherentTransactions { - number: 0, - body: self, - } - } - - /// Get an iterator over all transactions in a block. - pub fn all_transactions(&self) -> AllTransactions { - self.inherent_transactions().chain(self.transactions.iter().cloned()) - } -} - - -/// A Polkadot relay chain block. -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub struct Block { - /// The block header. - pub header: Header, - /// The block body. - pub body: Body, -} - -impl Block { - /// Get an iterator over all inherent transactions of the body. - pub fn inherent_transactions(&self) -> InherentTransactions { - self.body.inherent_transactions() - } - - /// Get an iterator over all transactions in a block. - pub fn all_transactions(&self) -> AllTransactions { - self.body.all_transactions() - } -} - -impl Slicable for Block { - fn decode(input: &mut I) -> Option { - let header = try_opt!(Slicable::decode(input)); - - let transactions_len: u32 = try_opt!(Slicable::decode(input)); - let regular_transactions_len = try_opt!(transactions_len.checked_sub(InherentFunction::count() as u32)); - - let timestamp_tx = try_opt!(UncheckedTransaction::decode(input)); - let timestamp = match timestamp_tx.transaction.function { - Function::Inherent(InherentFunction::TimestampSet(ref t)) if timestamp_tx.is_well_formed() => { t.clone() } - _ => return None, - }; - - let transactions: Option> = (0..regular_transactions_len) - .map(|_| UncheckedTransaction::decode(input)) - .filter(|tx| tx.as_ref().map_or(true, |tx| tx.is_well_formed())) - .collect(); - - let body = Body { - timestamp, - transactions: try_opt!(transactions), - }; - - Some(Block { header, body }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - v.extend(self.header.encode()); - - // encode inherent transactions before non-inherent. - let transactions_len = self.body.transactions.len() as u64 + InherentFunction::count(); - (transactions_len as u32).using_encoded(|s| v.extend(s)); - - let timestamp_set_tx = UncheckedTransaction::inherent( - InherentFunction::TimestampSet(self.body.timestamp) - ); - - v.extend(timestamp_set_tx.encode()); - for non_inherent_transaction in &self.body.transactions { - v.extend(non_inherent_transaction.encode()); - } - - v - } -} - -/// A relay chain block header. -/// -/// https://github.com/w3f/polkadot-spec/blob/master/spec.md#header -#[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -#[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] -#[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Header { - /// Block parent's hash. - pub parent_hash: HeaderHash, - /// Block number. - pub number: Number, - /// State root after this transition. - pub state_root: H256, - /// The root of the trie that represents this block's transactions, indexed by a 32-byte integer. - pub transaction_root: H256, - /// The digest of activity on the block. - pub digest: Digest, -} - -impl Header { - /// Create a new instance with default fields except `number`, which is given as an argument. - pub fn from_block_number(number: Number) -> Self { - Header { - parent_hash: Default::default(), - number, - state_root: Default::default(), - transaction_root: Default::default(), - digest: Default::default(), - } - } -} - -impl Slicable for Header { - fn decode(input: &mut I) -> Option { - Some(Header { - parent_hash: try_opt!(Slicable::decode(input)), - number: try_opt!(Slicable::decode(input)), - state_root: try_opt!(Slicable::decode(input)), - transaction_root: try_opt!(Slicable::decode(input)), - digest: try_opt!(Slicable::decode(input)), - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - - self.parent_hash.using_encoded(|s| v.extend(s)); - self.number.using_encoded(|s| v.extend(s)); - self.state_root.using_encoded(|s| v.extend(s)); - self.transaction_root.using_encoded(|s| v.extend(s)); - self.digest.using_encoded(|s| v.extend(s)); - - v - } -} - -#[cfg(test)] -mod tests { - use super::*; - use codec::Slicable; - use substrate_serializer as ser; - - #[test] - fn test_header_serialization() { - let header = Header { - parent_hash: 5.into(), - number: 67, - state_root: 3.into(), - transaction_root: 6.into(), - digest: Digest { logs: vec![Log(vec![1])] }, - }; - - assert_eq!(ser::to_string_pretty(&header), r#"{ - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", - "number": 67, - "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", - "transactionRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", - "digest": { - "logs": [ - "0x01" - ] - } -}"#); - - let v = header.encode(); - assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); - } - - #[test] - fn block_encoding_round_trip() { - let mut block = Block { - header: Header::from_block_number(1), - body: Body { - timestamp: 100_000_000, - transactions: Vec::new(), - } - }; - - let raw = block.encode(); - let decoded = Block::decode(&mut &raw[..]).unwrap(); - - assert_eq!(block, decoded); - - block.body.transactions.push(UncheckedTransaction { - transaction: ::transaction::Transaction { - function: Function::StakingStake, - signed: Default::default(), - nonce: 10101, - }, - signature: Default::default(), - }); - - let raw = block.encode(); - let decoded = Block::decode(&mut &raw[..]).unwrap(); - - assert_eq!(block, decoded); - } - - #[test] - fn block_encoding_substrate_round_trip() { - let mut block = Block { - header: Header::from_block_number(1), - body: Body { - timestamp: 100_000_000, - transactions: Vec::new(), - } - }; - - block.body.transactions.push(UncheckedTransaction { - transaction: ::transaction::Transaction { - function: Function::StakingStake, - signed: Default::default(), - nonce: 10101, - }, - signature: Default::default(), - }); - - let raw = block.encode(); - let decoded_substrate = ::primitives::block::Block::decode(&mut &raw[..]).unwrap(); - let encoded_substrate = decoded_substrate.encode(); - let decoded = Block::decode(&mut &encoded_substrate[..]).unwrap(); - - assert_eq!(block, decoded); - } - - #[test] - fn decode_body_without_inherents_fails() { - let substrate_blank = ::primitives::block::Block { - header: ::primitives::block::Header::from_block_number(1), - transactions: Vec::new(), - }; - - let encoded_substrate = substrate_blank.encode(); - assert!(Block::decode(&mut &encoded_substrate[..]).is_none()); - } - - #[test] - fn inherent_transactions_iter_contains_all_inherent() { - let block = Block { - header: Header::from_block_number(1), - body: Body { - timestamp: 10101, - transactions: Vec::new(), - } - }; - - let mut iter = block.inherent_transactions(); - - assert_eq!(InherentFunction::count(), 1); // following depends on this assertion. - assert_eq!(iter.next().unwrap(), UncheckedTransaction::inherent(InherentFunction::TimestampSet(10101))); - assert!(iter.next().is_none()); - } -} diff --git a/polkadot/primitives/src/lib.rs b/polkadot/primitives/src/lib.rs index fb02e3d121..012cf57b3d 100644 --- a/polkadot/primitives/src/lib.rs +++ b/polkadot/primitives/src/lib.rs @@ -21,7 +21,6 @@ #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(not(feature = "std"), feature(alloc))] - #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; @@ -30,34 +29,29 @@ extern crate serde; extern crate substrate_runtime_std as rstd; extern crate substrate_primitives as primitives; +extern crate substrate_runtime_primitives as runtime_primitives; #[cfg(test)] extern crate substrate_serializer; extern crate substrate_codec as codec; -macro_rules! try_opt { - ($e: expr) => { - match $e { - Some(x) => x, - None => return None, - } - } -} - pub mod parachain; pub mod validator; -pub mod block; -pub mod transaction; - -pub use self::block::{Header, Body, Block, Log, Digest}; -pub use self::block::Number as BlockNumber; -pub use self::transaction::{Transaction, UncheckedTransaction, Function, InherentFunction, Proposal}; /// Virtual account ID that represents the idea of a dispatch/statement being signed by everybody /// (who matters). Essentially this means that a majority of validators have decided it is /// "correct". pub const EVERYBODY: AccountId = [255u8; 32]; +/// Something that identifies a block. +pub use primitives::block::Id as BlockId; + +/// The type of digest item. +pub use primitives::block::Log as Log; + +/// An index to a block. +pub type BlockNumber = u64; + /// Alias to Ed25519 pubkey that identifies an account on the relay chain. This will almost /// certainly continue to be the same as the substrate's `AuthorityId`. pub type AccountId = primitives::AuthorityId; @@ -67,22 +61,19 @@ pub type AccountId = primitives::AuthorityId; pub type SessionKey = primitives::AuthorityId; /// Indentifier for a chain. -pub type ChainID = u64; +pub type ChainId = u64; /// Index of a transaction in the relay chain. -pub type TxOrder = u64; +pub type Index = u64; /// A hash of some data used by the relay chain. pub type Hash = primitives::H256; /// Alias to 512-bit hash when used in the context of a signature on the relay chain. -pub type Signature = primitives::hash::H512; +pub type Signature = runtime_primitives::Ed25519Signature; /// A timestamp: seconds since the unix epoch. pub type Timestamp = u64; /// The balance of an account. pub type Balance = u64; - -/// The amount of bonding period left in an account. Measured in eras. -pub type Bondage = u64; diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index e94ba03d28..1dde3b508d 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -26,7 +26,7 @@ use ::Hash; /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Id(u32); impl From for u32 { @@ -63,7 +63,7 @@ impl Slicable for Chain { match disc { 0 => Some(Chain::Relay), - 1 => Some(Chain::Parachain(try_opt!(Slicable::decode(input)))), + 1 => Some(Chain::Parachain(Slicable::decode(input)?)), _ => None, } } @@ -102,8 +102,8 @@ pub struct DutyRoster { impl Slicable for DutyRoster { fn decode(input: &mut I) -> Option { Some(DutyRoster { - validator_duty: try_opt!(Slicable::decode(input)), - guarantor_duty: try_opt!(Slicable::decode(input)), + validator_duty: Slicable::decode(input)?, + guarantor_duty: Slicable::decode(input)?, }) } @@ -123,7 +123,7 @@ impl Slicable for DutyRoster { /// Extrinsic data for a parachain. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Extrinsic; @@ -132,7 +132,7 @@ pub struct Extrinsic; /// /// https://github.com/w3f/polkadot-spec/blob/master/spec.md#candidate-para-chain-block #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct Candidate { @@ -150,7 +150,7 @@ pub struct Candidate { /// Candidate receipt type. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct CandidateReceipt { @@ -184,12 +184,12 @@ impl Slicable for CandidateReceipt { fn decode(input: &mut I) -> Option { Some(CandidateReceipt { - parachain_index: try_opt!(Slicable::decode(input)), - collator: try_opt!(Slicable::decode(input)), - head_data: try_opt!(Slicable::decode(input).map(HeadData)), - balance_uploads: try_opt!(Slicable::decode(input)), - egress_queue_roots: try_opt!(Slicable::decode(input)), - fees: try_opt!(Slicable::decode(input)), + parachain_index: Slicable::decode(input)?, + collator: Slicable::decode(input)?, + head_data: Slicable::decode(input).map(HeadData)?, + balance_uploads: Slicable::decode(input)?, + egress_queue_roots: Slicable::decode(input)?, + fees: Slicable::decode(input)?, }) } } @@ -219,7 +219,7 @@ impl Ord for CandidateReceipt { /// Parachain ingress queue message. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Consolidated ingress queue data. @@ -227,34 +227,34 @@ pub struct Message(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec /// This is just an ordered vector of other parachains' egress queues, /// obtained according to the routing rules. #[derive(Default, PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct ConsolidatedIngress(pub Vec<(Id, Vec)>); /// Parachain block data. /// /// contains everything required to validate para-block, may contain block and witness data #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct BlockData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain header raw bytes wrapper type. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Header(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain head data included in the chain. #[derive(PartialEq, Eq, Clone, PartialOrd, Ord)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct HeadData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Parachain validation code. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct ValidationCode(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Activitiy bit field #[derive(PartialEq, Eq, Clone, Default)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct Activity(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); impl Slicable for Activity { @@ -344,7 +344,7 @@ mod tests { fn test_candidate() { assert_eq!(ser::to_string_pretty(&Candidate { parachain_index: 5.into(), - collator_signature: 10.into(), + collator_signature: primitives::hash::H512::from(10).into(), unprocessed_ingress: ConsolidatedIngress(vec![ (Id(1), vec![Message(vec![2])]), (Id(2), vec![Message(vec![2]), Message(vec![3])]), diff --git a/polkadot/primitives/src/transaction.rs b/polkadot/primitives/src/transaction.rs deleted file mode 100644 index f3637034b4..0000000000 --- a/polkadot/primitives/src/transaction.rs +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Transaction type. - -use rstd::vec::Vec; -use codec::{Input, Slicable}; -use primitives::bft::MisbehaviorReport; -use ::Signature; - -#[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 { - /// Set the system's code. - SystemSetCode = 0x00, - - /// Set the session length. - SessionSetLength = 0x10, - /// Force a new session. - SessionForceNewSession = 0x11, - - /// Set the number of sessions per era. - StakingSetSessionsPerEra = 0x20, - /// Set the minimum bonding duration for staking. - StakingSetBondingDuration = 0x21, - /// Set the validator count for staking. - StakingSetValidatorCount = 0x22, - /// Force a new staking era. - StakingForceNewEra = 0x23, - - /// Set the per-mille of validator approval required for governance changes. - GovernanceSetApprovalPpmRequired = 0x30, - -} - -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::GovernanceSetApprovalPpmRequired, - ]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// Internal functions that can be dispatched to. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub enum Proposal { - /// Set the system's code. - SystemSetCode(Vec), - /// Set the session length. - SessionSetLength(BlockNumber), - /// Force a new session. - SessionForceNewSession, - /// Set the number of sessions per era. - StakingSetSessionsPerEra(BlockNumber), - /// Set the minimum bonding duration for staking. - StakingSetBondingDuration(BlockNumber), - /// Set the validator count for staking. - StakingSetValidatorCount(u32), - /// Force a new staking era. - StakingForceNewEra, - /// Set the per-mille of validator approval required for governance changes. - GovernanceSetApprovalPpmRequired(u32), - -} - -impl Slicable for Proposal { - fn decode(input: &mut I) -> Option { - let id = InternalFunctionId::from_u8(input.read_byte()?)?; - let function = match id { - InternalFunctionId::SystemSetCode => - Proposal::SystemSetCode(try_opt!(Slicable::decode(input))), - InternalFunctionId::SessionSetLength => - Proposal::SessionSetLength(try_opt!(Slicable::decode(input))), - InternalFunctionId::SessionForceNewSession => Proposal::SessionForceNewSession, - InternalFunctionId::StakingSetSessionsPerEra => - Proposal::StakingSetSessionsPerEra(try_opt!(Slicable::decode(input))), - InternalFunctionId::StakingSetBondingDuration => - Proposal::StakingSetBondingDuration(try_opt!(Slicable::decode(input))), - InternalFunctionId::StakingSetValidatorCount => - Proposal::StakingSetValidatorCount(try_opt!(Slicable::decode(input))), - InternalFunctionId::StakingForceNewEra => Proposal::StakingForceNewEra, - InternalFunctionId::GovernanceSetApprovalPpmRequired => - Proposal::GovernanceSetApprovalPpmRequired(try_opt!(Slicable::decode(input))), - }; - - Some(function) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Proposal::SystemSetCode(ref data) => { - v.push(InternalFunctionId::SystemSetCode as u8); - data.using_encoded(|s| v.extend(s)); - } - Proposal::SessionSetLength(ref data) => { - v.push(InternalFunctionId::SessionSetLength as u8); - data.using_encoded(|s| v.extend(s)); - } - Proposal::SessionForceNewSession => { - v.push(InternalFunctionId::SessionForceNewSession as u8); - } - Proposal::StakingSetSessionsPerEra(ref data) => { - v.push(InternalFunctionId::StakingSetSessionsPerEra as u8); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingSetBondingDuration(ref data) => { - v.push(InternalFunctionId::StakingSetBondingDuration as u8); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingSetValidatorCount(ref data) => { - v.push(InternalFunctionId::StakingSetValidatorCount as u8); - data.using_encoded(|s| v.extend(s)); - } - Proposal::StakingForceNewEra => { - v.push(InternalFunctionId::StakingForceNewEra as u8); - } - Proposal::GovernanceSetApprovalPpmRequired(ref data) => { - v.push(InternalFunctionId::GovernanceSetApprovalPpmRequired as u8); - data.using_encoded(|s| v.extend(s)); - } - } - - 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 { - /// Set the timestamp. - TimestampSet = 0x00, - /// Set temporary session key as a validator. - SessionSetKey = 0x10, - /// Staking subsystem: begin staking. - StakingStake = 0x20, - /// Staking subsystem: stop staking. - StakingUnstake = 0x21, - /// Staking subsystem: transfer stake. - StakingTransfer = 0x22, - /// Report misbehavior. - StakingReportMisbehavior = 0x23, - /// Make a proposal for the governance system. - GovernancePropose = 0x30, - /// Approve a proposal for the governance system. - GovernanceApprove = 0x31, -} - -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::StakingReportMisbehavior, - FunctionId::SessionSetKey, - FunctionId::TimestampSet, - FunctionId::GovernancePropose, - FunctionId::GovernanceApprove, - ]; - functions.iter().map(|&f| f).find(|&f| value == f as u8) - } -} - -/// Inherent functions on the runtime. -/// These must be called each block by the `EVERYBODY` account. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub enum InherentFunction { - /// Set the timestamp. - TimestampSet(u64), -} - -impl InherentFunction { - /// Get the number of inherent functions. - pub fn count() -> u64 { - 1 - } - - /// Get the index. - pub fn index(&self) -> u64 { - match *self { - InherentFunction::TimestampSet(_) => 0, - } - } -} - -/// Functions on the runtime. -#[derive(Clone, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] -pub enum Function { - /// An inherent function. - Inherent(InherentFunction), - /// Set temporary session key as a validator. - SessionSetKey(::SessionKey), - /// Staking subsystem: begin staking. - StakingStake, - /// Staking subsystem: stop staking. - StakingUnstake, - /// Staking subsystem: transfer stake. - StakingTransfer(::AccountId, u64), - /// Staking subsystem: report misbehavior of a validator. - ReportMisbehavior(MisbehaviorReport), - /// Make a proposal for the governance system. - GovernancePropose(Proposal), - /// Approve a proposal for the governance system. - GovernanceApprove(BlockNumber), -} - -impl Function { - /// The number of inherent functions. - pub fn inherent_functions() -> u64 { InherentFunction::count() } - - /// Whether this function is "inherent": that it must be part of every - /// block at the given index and no other. - /// - /// Transactions containing inherent functions should not be signed. - pub fn is_inherent(&self) -> bool { - match *self { - Function::Inherent(_) => true, - _ => false, - } - } - - /// If this function is inherent, returns the index it should occupy - /// in the block. Otherwise returns `None`. - pub fn inherent_index(&self) -> Option { - match *self { - Function::Inherent(ref inner) => Some(inner.index()), - _ => None, - } - } -} - -impl Slicable for Function { - fn decode(input: &mut I) -> Option { - let id = FunctionId::from_u8(input.read_byte()?)?; - Some(match id { - FunctionId::TimestampSet => - Function::Inherent(InherentFunction::TimestampSet(try_opt!(Slicable::decode(input)))), - FunctionId::SessionSetKey => - Function::SessionSetKey(try_opt!(Slicable::decode(input))), - FunctionId::StakingStake => Function::StakingStake, - FunctionId::StakingUnstake => Function::StakingUnstake, - FunctionId::StakingTransfer => { - let to = try_opt!(Slicable::decode(input)); - let amount = try_opt!(Slicable::decode(input)); - - Function::StakingTransfer(to, amount) - } - FunctionId::StakingReportMisbehavior => Function::ReportMisbehavior(MisbehaviorReport::decode(input)?), - FunctionId::GovernancePropose => - Function::GovernancePropose(try_opt!(Slicable::decode(input))), - FunctionId::GovernanceApprove => - Function::GovernanceApprove(try_opt!(Slicable::decode(input))), - }) - } - - fn encode(&self) -> Vec { - let mut v = Vec::new(); - match *self { - Function::Inherent(InherentFunction::TimestampSet(ref data)) => { - v.push(FunctionId::TimestampSet as u8); - data.using_encoded(|s| v.extend(s)); - } - Function::SessionSetKey(ref data) => { - v.push(FunctionId::SessionSetKey as u8); - data.using_encoded(|s| v.extend(s)); - } - Function::StakingStake => { - v.push(FunctionId::StakingStake as u8); - } - Function::StakingUnstake => { - v.push(FunctionId::StakingUnstake as u8); - } - Function::ReportMisbehavior(ref report) => { - v.push(FunctionId::StakingReportMisbehavior as u8); - report.using_encoded(|s| v.extend(s)); - } - Function::StakingTransfer(ref to, ref amount) => { - v.push(FunctionId::StakingTransfer as u8); - to.using_encoded(|s| v.extend(s)); - amount.using_encoded(|s| v.extend(s)); - } - Function::GovernancePropose(ref data) => { - v.push(FunctionId::GovernancePropose as u8); - data.using_encoded(|s| v.extend(s)); - } - Function::GovernanceApprove(ref data) => { - v.push(FunctionId::GovernanceApprove as u8); - data.using_encoded(|s| v.extend(s)); - } - } - - 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 - } -} - - - -/// 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 UncheckedTransaction { - /// Whether the transaction is well-formed. In particular checks that - /// inherent transactions have the correct signed and signature fields. - /// - /// Does not check signatures on other transactions. - pub fn is_well_formed(&self) -> bool { - if self.transaction.function.is_inherent() { - self.transaction.signed == ::EVERYBODY && self.signature == Signature::zero() - } else { - true - } - } - - /// Whether this transaction invokes an inherent function. - pub fn is_inherent(&self) -> bool { - self.transaction.function.is_inherent() - } - - /// Create a new inherent-style transaction from the given function. - pub fn inherent(function: InherentFunction) -> Self { - UncheckedTransaction { - transaction: Transaction { - function: Function::Inherent(function), - nonce: 0, - signed: ::EVERYBODY - }, - signature: Signature::zero(), - } - } -} - -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 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::Inherent(InherentFunction::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/polkadot/primitives/src/validator.rs b/polkadot/primitives/src/validator.rs index fa622fb629..0bac607594 100644 --- a/polkadot/primitives/src/validator.rs +++ b/polkadot/primitives/src/validator.rs @@ -23,22 +23,22 @@ use parachain; /// Parachain outgoing message. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct EgressPost(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Balance upload. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct BalanceUpload(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// Balance download. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] pub struct BalanceDownload(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); /// The result of parachain validation. #[derive(PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Serialize, Debug))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] pub struct ValidationResult { diff --git a/polkadot/runtime/Cargo.toml b/polkadot/runtime/Cargo.toml index ce4565025a..cb6c99de35 100644 --- a/polkadot/runtime/Cargo.toml +++ b/polkadot/runtime/Cargo.toml @@ -7,26 +7,47 @@ 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 } +safe-mix = { path = "../../safe-mix", default_features = false} substrate-codec = { path = "../../substrate/codec" } +substrate-serializer = { path = "../../substrate/serializer" } substrate-runtime-std = { path = "../../substrate/runtime-std" } substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-runtime-support = { path = "../../substrate/runtime-support" } substrate-primitives = { path = "../../substrate/primitives" } -substrate-misbehavior-check = { path = "../../substrate/misbehavior-check" } -polkadot-primitives = { path = "../primitives" } - -[dev-dependencies] substrate-keyring = { path = "../../substrate/keyring" } +substrate-runtime-consensus = { path = "../../substrate/runtime/consensus" } +substrate-runtime-council = { path = "../../substrate/runtime/council" } +substrate-runtime-democracy = { path = "../../substrate/runtime/democracy" } +substrate-runtime-executive = { path = "../../substrate/runtime/executive" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } +substrate-runtime-session = { path = "../../substrate/runtime/session" } +substrate-runtime-staking = { path = "../../substrate/runtime/staking" } +substrate-runtime-system = { path = "../../substrate/runtime/system" } +substrate-runtime-timestamp = { path = "../../substrate/runtime/timestamp" } +polkadot-primitives = { path = "../primitives" } [features] default = ["std"] std = [ "substrate-codec/std", + "substrate-primitives/std", "substrate-runtime-std/std", "substrate-runtime-io/std", "substrate-runtime-support/std", - "substrate-primitives/std", - "substrate-misbehavior-check/std", + "substrate-runtime-consensus/std", + "substrate-runtime-council/std", + "substrate-runtime-democracy/std", + "substrate-runtime-executive/std", + "substrate-runtime-primitives/std", + "substrate-runtime-session/std", + "substrate-runtime-staking/std", + "substrate-runtime-system/std", + "substrate-runtime-timestamp/std", "polkadot-primitives/std", - "log" + "serde_derive", + "serde/std", + "log", + "safe-mix/std" ] diff --git a/polkadot/runtime/src/api.rs b/polkadot/runtime/src/api.rs deleted file mode 100644 index 7ce51381e9..0000000000 --- a/polkadot/runtime/src/api.rs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -use runtime::{system, parachains, consensus, session}; - -impl_stubs!( - execute_block => |block| system::internal::execute_block(block), - execute_transaction => |(header, utx)| system::internal::execute_transaction(utx, header), - finalise_block => |header| system::internal::finalise_block(header), - validator_count => |()| session::validator_count(), - validators => |()| session::validators(), - authorities => |()| consensus::authorities(), - duty_roster => |()| parachains::calculate_duty_roster(), - timestamp => |()| ::runtime::timestamp::get(), - nonce => |account_id| system::nonce(account_id) -); diff --git a/polkadot/runtime/src/environment.rs b/polkadot/runtime/src/environment.rs deleted file mode 100644 index b7fef7cdd8..0000000000 --- a/polkadot/runtime/src/environment.rs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Environment API: Allows certain information to be accessed throughout the runtime. - -use rstd::boxed::Box; -use rstd::cell::RefCell; -use rstd::rc::Rc; - -use polkadot_primitives::{BlockNumber, Digest, Hash}; - -#[derive(Default)] -/// The information that can be accessed globally. -pub struct Environment { - /// The current block number. - pub block_number: BlockNumber, - /// The current block's parent hash. - pub parent_hash: Hash, - /// The current block digest. - pub digest: Digest, -} - -/// Do something with the environment and return its value. Keep the function short. -pub fn with_env T>(f: F) -> T { - let e = env(); - let mut eb = e.borrow_mut(); - f(&mut *eb) -} - -#[cfg(target_arch = "wasm32")] -fn env() -> Rc> { - // Initialize it to a null value - static mut SINGLETON: *const Rc> = 0 as *const Rc>; - - unsafe { - if SINGLETON == 0 as *const Rc> { - // Make it - let singleton: Rc> = Rc::new(RefCell::new(Default::default())); - - // Put it in the heap so it can outlive this call - SINGLETON = Box::into_raw(Box::new(singleton)) as *const _; - } - - // Now we give out a copy of the data that is safe to use concurrently. - (*SINGLETON).clone() - } -} - -#[cfg(not(target_arch = "wasm32"))] -fn env() -> Rc> { - // Initialize it to a null value - thread_local!{ - static SINGLETON: RefCell<*const Rc>> = RefCell::new(0 as *const Rc>); - } - - SINGLETON.with(|s| unsafe { - if *s.borrow() == 0 as *const Rc> { - // Make it - let singleton: Rc> = Rc::new(RefCell::new(Default::default())); - - // Put it in the heap so it can outlive this call - *s.borrow_mut() = Box::into_raw(Box::new(singleton)) as *const _; - } - - // Now we give out a copy of the data that is safe to use concurrently. - (**s.borrow()).clone() - }) -} diff --git a/polkadot/runtime/src/genesismap.rs b/polkadot/runtime/src/genesismap.rs deleted file mode 100644 index d2b370fe46..0000000000 --- a/polkadot/runtime/src/genesismap.rs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Tool for creating the genesis block. - -use codec::{KeyedVec, Joiner}; -use std::collections::HashMap; -use runtime_io::twox_128; -use runtime_support::Hashable; -use primitives::Block; -use polkadot_primitives::{Balance, BlockNumber, AccountId}; - -/// Configuration of a general Polkadot genesis block. -pub struct GenesisConfig { - pub validators: Vec, - pub authorities: Vec, - pub balances: Vec<(AccountId, Balance)>, - pub block_time: u64, - pub session_length: BlockNumber, - pub sessions_per_era: BlockNumber, - pub bonding_duration: BlockNumber, - pub approval_ratio: u32, -} - -impl GenesisConfig { - pub fn new_simple(authorities_validators: Vec, balance: Balance) -> Self { - GenesisConfig { - validators: authorities_validators.clone(), - authorities: authorities_validators.clone(), - balances: authorities_validators.iter().map(|v| (v.clone(), balance)).collect(), - block_time: 5, // 5 second block time. - session_length: 720, // that's 1 hour per session. - sessions_per_era: 24, // 24 hours per era. - bonding_duration: 90, // 90 days per bond. - approval_ratio: 667, // 66.7% approvals required for legislation. - } - } - - pub fn genesis_map(&self) -> HashMap, Vec> { - let wasm_runtime = include_bytes!("../wasm/genesis.wasm").to_vec(); - vec![ - (&b"gov:apr"[..], vec![].and(&self.approval_ratio)), - (&b"ses:len"[..], vec![].and(&self.session_length)), - (&b"ses:val:len"[..], vec![].and(&(self.validators.len() as u32))), - (&b"sta:wil:len"[..], vec![].and(&0u32)), - (&b"sta:spe"[..], vec![].and(&self.sessions_per_era)), - (&b"sta:vac"[..], vec![].and(&(self.validators.len() as u32))), - (&b"sta:era"[..], vec![].and(&0u64)), - ].into_iter() - .map(|(k, v)| (k.into(), v)) - .chain(self.validators.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(b"ses:val:"), vec![].and(account))) - ).chain(self.authorities.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(b":auth:"), vec![].and(account))) - ).chain(self.balances.iter() - .map(|&(account, balance)| (account.to_keyed_vec(b"sta:bal:"), vec![].and(&balance))) - ) - .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) - .chain(vec![ - (b":code"[..].into(), wasm_runtime), - (b":auth:len"[..].into(), vec![].and(&(self.authorities.len() as u32))), - ].into_iter()) - .chain(self.authorities.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(b":auth:"), vec![].and(account))) - ) - .collect() - } -} - -pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { - use codec::Slicable; - map![ - twox_128(&0u64.to_keyed_vec(b"sys:old:")).to_vec() => genesis_block.header.blake2_256().encode() - ] -} diff --git a/polkadot/runtime/src/lib.rs b/polkadot/runtime/src/lib.rs index caf8cb47c1..11c21ac079 100644 --- a/polkadot/runtime/src/lib.rs +++ b/polkadot/runtime/src/lib.rs @@ -14,84 +14,288 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! The Polkadot runtime. This can be compiled with #[no_std], ready for Wasm. +//! The Polkadot runtime. This can be compiled with ``#[no_std]`, ready for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -extern crate substrate_runtime_std as rstd; -extern crate substrate_runtime_support as runtime_support; -extern crate substrate_codec as codec; -extern crate substrate_misbehavior_check as misbehavior_check; -extern crate polkadot_primitives; - -#[cfg(all(feature = "std", test))] -extern crate substrate_keyring as keyring; - -#[cfg(feature = "std")] -extern crate rustc_hex; - -#[cfg_attr(any(test, feature = "std"), macro_use)] -extern crate substrate_primitives as primitives; - #[macro_use] extern crate substrate_runtime_io as runtime_io; -#[cfg(test)] #[macro_use] -extern crate hex_literal; +extern crate substrate_runtime_support as runtime_support; -pub mod api; -pub mod environment; -pub mod runtime; +#[macro_use] +extern crate substrate_runtime_primitives as runtime_primitives; -#[cfg(feature = "std")] -pub mod genesismap; +#[cfg(test)] +extern crate substrate_serializer; -/// Type definitions and helpers for transactions. -pub mod transaction { - use rstd::ops; - use polkadot_primitives::Signature; - pub use polkadot_primitives::{Transaction, Function, UncheckedTransaction}; +#[cfg_attr(feature = "std", macro_use)] +extern crate substrate_primitives; - /// A type-safe indicator that a transaction has been checked. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug))] - pub struct CheckedTransaction(UncheckedTransaction); +extern crate substrate_runtime_std as rstd; +extern crate substrate_codec as codec; +extern crate substrate_runtime_consensus as consensus; +extern crate substrate_runtime_council as council; +extern crate substrate_runtime_democracy as democracy; +extern crate substrate_runtime_executive as executive; +extern crate substrate_runtime_session as session; +extern crate substrate_runtime_staking as staking; +extern crate substrate_runtime_system as system; +extern crate substrate_runtime_timestamp as timestamp; +extern crate polkadot_primitives; - impl CheckedTransaction { - /// Get a reference to the checked signature. - pub fn signature(&self) -> &Signature { - &self.0.signature - } +mod parachains; + +use runtime_io::BlakeTwo256; +use polkadot_primitives::{AccountId, Balance, BlockNumber, Hash, Index, Log, SessionKey, Signature}; +use runtime_primitives::generic; +use runtime_primitives::traits::{Identity, HasPublicAux}; +#[cfg(feature = "std")] pub use runtime_primitives::BuildExternalities; + +/// Concrete runtime type used to parameterize the various modules. +pub struct Concrete; + +impl HasPublicAux for Concrete { + type PublicAux = AccountId; // TODO: Option +} + +impl system::Trait for Concrete { + type Index = Index; + type BlockNumber = BlockNumber; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Digest = generic::Digest; + type AccountId = AccountId; + type Header = generic::Header; +} +/// System module for this concrete runtime. +pub type System = system::Module; + +impl consensus::Trait for Concrete { + type PublicAux = ::PublicAux; + type SessionKey = SessionKey; +} +/// Consensus module for this concrete runtime. +pub type Consensus = consensus::Module; +pub use consensus::Call as ConsensusCall; + +impl timestamp::Trait for Concrete { + type Value = u64; +} +/// Timestamp module for this concrete runtime. +pub type Timestamp = timestamp::Module; +pub use timestamp::Call as TimestampCall; + +impl session::Trait for Concrete { + type ConvertAccountIdToSessionKey = Identity; +} +/// Session module for this concrete runtime. +pub type Session = session::Module; + +impl staking::Trait for Concrete { + type Balance = Balance; + type DetermineContractAddress = BlakeTwo256; +} +/// Staking module for this concrete runtime. +pub type Staking = staking::Module; + +impl democracy::Trait for Concrete { + type Proposal = PrivCall; +} +/// Democracy module for this concrete runtime. +pub type Democracy = democracy::Module; + +impl council::Trait for Concrete {} +/// Council module for this concrete runtime. +pub type Council = council::Module; +/// Council voting module for this concrete runtime. +pub type CouncilVoting = council::voting::Module; + +impl parachains::Trait for Concrete {} +pub type Parachains = parachains::Module; + +impl_outer_dispatch! { + pub enum Call where aux: ::PublicAux { + Consensus = 0, + Session = 1, + Staking = 2, + Timestamp = 3, + Democracy = 5, + Council = 6, + CouncilVoting = 7, } - impl ops::Deref for CheckedTransaction { - type Target = Transaction; - - fn deref(&self) -> &Transaction { - &self.0.transaction - } - } - - /// Check the validity of a transaction: whether it can appear at the given index - /// and whether it is correctly authenticated. - pub fn check(tx: UncheckedTransaction, index: u64) -> Result { - match tx.transaction.function.inherent_index() { - Some(correct_index) => { - if index != correct_index || !tx.is_well_formed() { return Err(tx) } - return Ok(CheckedTransaction(tx)); - } - None => { - // non-inherent functions must appear after inherent. - if index < Function::inherent_functions() { return Err(tx) } - } - } - - 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) - } + pub enum PrivCall { + Consensus = 0, + Session = 1, + Staking = 2, + Democracy = 5, + Council = 6, + CouncilVoting = 7, + } +} + +/// Block header type as expected by this runtime. +pub type Header = generic::Header; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; +/// Extrinsic type as expected by this runtime. +pub type Extrinsic = generic::Extrinsic; +/// Executive: handles dispatch to the various modules. +pub type Executive = executive::Executive; + +impl_outer_config! { + pub struct GenesisConfig for Concrete { + ConsensusConfig => consensus, + SystemConfig => system, + SessionConfig => session, + StakingConfig => staking, + DemocracyConfig => democracy, + CouncilConfig => council, + ParachainsConfig => parachains, + } +} + +pub mod api { + impl_stubs!( + authorities => |()| super::Consensus::authorities(), + initialise_block => |header| super::Executive::initialise_block(&header), + apply_extrinsic => |extrinsic| super::Executive::apply_extrinsic(extrinsic), + execute_block => |block| super::Executive::execute_block(block), + finalise_block => |()| super::Executive::finalise_block(), + validator_count => |()| super::Session::validator_count(), + validators => |()| super::Session::validators() + ); +} + +#[cfg(test)] +mod tests { + use super::*; + use substrate_primitives as primitives; + use ::codec::Slicable; + use substrate_primitives::hexdisplay::HexDisplay; + use substrate_serializer as ser; + use runtime_primitives::traits::{Digest as DigestT, Header as HeaderT}; + type Digest = generic::Digest; + + #[test] + fn test_header_serialization() { + let header = Header { + parent_hash: 5.into(), + number: 67, + state_root: 3.into(), + extrinsics_root: 6.into(), + digest: { let mut d = Digest::default(); d.push(Log(vec![1])); d }, + }; + + assert_eq!(ser::to_string_pretty(&header), r#"{ + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000005", + "number": 67, + "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000003", + "extrinsicsRoot": "0x0000000000000000000000000000000000000000000000000000000000000006", + "digest": { + "logs": [ + "0x01" + ] + } +}"#); + + let v = header.encode(); + assert_eq!(Header::decode(&mut &v[..]).unwrap(), header); + } + + #[test] + fn block_encoding_round_trip() { + let mut block = Block { + header: Header::new(1, Default::default(), Default::default(), Default::default(), Default::default()), + extrinsics: vec![ + UncheckedExtrinsic { + extrinsic: Extrinsic { + function: Call::Timestamp(timestamp::Call::set(100_000_000)), + signed: Default::default(), + index: Default::default(), + }, + signature: Default::default(), + } + ], + }; + + let raw = block.encode(); + let decoded = Block::decode(&mut &raw[..]).unwrap(); + + assert_eq!(block, decoded); + + block.extrinsics.push(UncheckedExtrinsic { + extrinsic: Extrinsic { + function: Call::Staking(staking::Call::stake()), + signed: Default::default(), + index: 10101, + }, + signature: Default::default(), + }); + + let raw = block.encode(); + let decoded = Block::decode(&mut &raw[..]).unwrap(); + + assert_eq!(block, decoded); + } + + #[test] + fn block_encoding_substrate_round_trip() { + let mut block = Block { + header: Header::new(1, Default::default(), Default::default(), Default::default(), Default::default()), + extrinsics: vec![ + UncheckedExtrinsic { + extrinsic: Extrinsic { + function: Call::Timestamp(timestamp::Call::set(100_000_000)), + signed: Default::default(), + index: Default::default(), + }, + signature: Default::default(), + } + ], + }; + + block.extrinsics.push(UncheckedExtrinsic { + extrinsic: Extrinsic { + function: Call::Staking(staking::Call::stake()), + signed: Default::default(), + index: 10101, + }, + signature: Default::default(), + }); + + let raw = block.encode(); + let decoded_substrate = primitives::block::Block::decode(&mut &raw[..]).unwrap(); + let encoded_substrate = decoded_substrate.encode(); + let decoded = Block::decode(&mut &encoded_substrate[..]).unwrap(); + + assert_eq!(block, decoded); + } + + #[test] + fn serialize_unchecked() { + let tx = UncheckedExtrinsic { + extrinsic: Extrinsic { + signed: [1; 32], + index: 999u64, + function: Call::Timestamp(TimestampCall::set(135135)), + }, + signature: primitives::hash::H512([0; 64]).into(), + }; + // 71000000 + // 0101010101010101010101010101010101010101010101010101010101010101 + // e703000000000000 + // 00 + // df0f0200 + // 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + + let v = Slicable::encode(&tx); + println!("{}", HexDisplay::from(&v)); + assert_eq!(UncheckedExtrinsic::decode(&mut &v[..]).unwrap(), tx); } } diff --git a/polkadot/runtime/src/parachains.rs b/polkadot/runtime/src/parachains.rs new file mode 100644 index 0000000000..18137427a3 --- /dev/null +++ b/polkadot/runtime/src/parachains.rs @@ -0,0 +1,210 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Main parachains logic. For now this is just the determination of which validators do what. + +use polkadot_primitives; +#[cfg(any(feature = "std", test))] use {runtime_io, runtime_primitives}; +use rstd::prelude::*; +#[cfg(any(feature = "std", test))] use rstd::marker::PhantomData; +use codec::{Slicable, Joiner}; +use runtime_support::Hashable; +#[cfg(any(feature = "std", test))] use runtime_support::StorageValue; +use runtime_primitives::traits::Executable; +use polkadot_primitives::parachain::{Id, Chain, DutyRoster}; +use {system, session}; + +pub trait Trait: system::Trait + session::Trait {} + +decl_module! { + pub struct Module; +} + +decl_storage! { + pub trait Store for Module; + // The number of parachains registered at present. + pub Count get(count): b"para:count" => default u32; +} + +impl Module { + /// Calculate the current block's duty roster. + pub fn calculate_duty_roster() -> DutyRoster { + let parachain_count = Self::count(); + let validator_count = >::validator_count(); + let validators_per_parachain = (validator_count - 1) / parachain_count; + + let mut roles_val = (0..validator_count).map(|i| match i { + i if i < parachain_count * validators_per_parachain => + Chain::Parachain(Id::from(i / validators_per_parachain as u32)), + _ => Chain::Relay, + }).collect::>(); + let mut roles_gua = roles_val.clone(); + + let h = >::random_seed(); + let mut seed = h.to_vec().and(b"validator_role_pairs").blake2_256(); + + // shuffle + for i in 0..(validator_count - 1) { + // 8 bytes of entropy used per cycle, 32 bytes entropy per hash + let offset = (i * 8 % 32) as usize; + + // number of roles remaining to select from. + let remaining = (validator_count - i) as usize; + + // 4 * 2 32-bit ints per 256-bit seed. + let val_index = u32::decode(&mut &seed[offset..offset + 4]).expect("using 4 bytes for a 32-bit quantity") as usize % remaining; + let gua_index = u32::decode(&mut &seed[offset + 4..offset + 8]).expect("using 4 bytes for a 32-bit quantity") as usize % remaining; + + if offset == 24 { + // into the last 8 bytes - rehash to gather new entropy + seed = seed.blake2_256(); + } + + // exchange last item with randomly chosen first. + roles_val.swap(remaining - 1, val_index); + roles_gua.swap(remaining - 1, gua_index); + } + + DutyRoster { + validator_duty: roles_val, + guarantor_duty: roles_gua, + } + } +} + +impl Executable for Module { + fn execute() { + } +} + +#[cfg(any(feature = "std", test))] +pub struct GenesisConfig { + pub count: u32, + pub phantom: PhantomData, +} + +#[cfg(any(feature = "std", test))] +impl Default for GenesisConfig { + fn default() -> Self { + GenesisConfig { + count: 0, + phantom: PhantomData, + } + } +} + +#[cfg(any(feature = "std", test))] +impl runtime_primitives::BuildExternalities for GenesisConfig +{ + fn build_externalities(self) -> runtime_io::TestExternalities { + use runtime_io::twox_128; + use codec::Slicable; + map![ + twox_128(>::key()).to_vec() => self.count.encode() + ] + } +} + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::with_externalities; + use substrate_primitives::H256; + use runtime_primitives::BuildExternalities; + use runtime_primitives::traits::{HasPublicAux, Identity}; + use runtime_primitives::testing::{Digest, Header}; + use consensus; + + pub struct Test; + impl HasPublicAux for Test { + type PublicAux = u64; + } + impl consensus::Trait for Test { + type PublicAux = ::PublicAux; + type SessionKey = u64; + } + impl system::Trait for Test { + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = runtime_io::BlakeTwo256; + type Digest = Digest; + type AccountId = u64; + type Header = Header; + } + impl session::Trait for Test { + type ConvertAccountIdToSessionKey = Identity; + } + impl Trait for Test {} + + type System = system::Module; + type Parachains = Module; + + fn new_test_ext() -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::::default().build_externalities(); + t.extend(consensus::GenesisConfig::{ + code: vec![], + authorities: vec![1, 2, 3], + }.build_externalities()); + t.extend(session::GenesisConfig::{ + session_length: 1000, + validators: vec![1, 2, 3, 4, 5, 6, 7, 8], + }.build_externalities()); + t.extend(GenesisConfig::{ + count: 2, + phantom: PhantomData, + }.build_externalities()); + t + } + + #[test] + fn simple_setup_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Parachains::count(), 2); + }); + } + + #[test] + fn should_work() { + with_externalities(&mut new_test_ext(), || { + let check_roster = |duty_roster: &DutyRoster| { + assert_eq!(duty_roster.validator_duty.len(), 8); + assert_eq!(duty_roster.guarantor_duty.len(), 8); + for i in (0..2).map(Id::from) { + assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); + assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); + } + assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); + assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); + }; + + System::set_random_seed([0u8; 32].into()); + let duty_roster_0 = Parachains::calculate_duty_roster(); + check_roster(&duty_roster_0); + + System::set_random_seed([1u8; 32].into()); + let duty_roster_1 = Parachains::calculate_duty_roster(); + check_roster(&duty_roster_1); + assert!(duty_roster_0 != duty_roster_1); + + System::set_random_seed([2u8; 32].into()); + let duty_roster_2 = Parachains::calculate_duty_roster(); + check_roster(&duty_roster_2); + assert!(duty_roster_0 != duty_roster_2); + assert!(duty_roster_1 != duty_roster_2); + }); + } +} diff --git a/polkadot/runtime/src/runtime/consensus.rs b/polkadot/runtime/src/runtime/consensus.rs deleted file mode 100644 index 7841f1d47d..0000000000 --- a/polkadot/runtime/src/runtime/consensus.rs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Conensus module for runtime; manages the authority set ready for the native code. - -use rstd::prelude::*; -use runtime_support::storage::unhashed::StorageVec; -use polkadot_primitives::SessionKey; - -struct AuthorityStorageVec {} -impl StorageVec for AuthorityStorageVec { - type Item = SessionKey; - const PREFIX: &'static [u8] = b":auth:"; -} - -/// Get the current set of authorities. These are the session keys. -pub fn authorities() -> Vec { - AuthorityStorageVec::items() -} - -pub mod internal { - use super::*; - - /// Set the current set of authorities' session keys. - /// - /// Called by `next_session` only. - pub fn set_authorities<'a, I: IntoIterator>(authorities: I) { - AuthorityStorageVec::set_items(authorities); - } - - /// Set a single authority by index. - pub fn set_authority(index: u32, key: &SessionKey) { - AuthorityStorageVec::set_item(index, key); - } -} diff --git a/polkadot/runtime/src/runtime/governance.rs b/polkadot/runtime/src/runtime/governance.rs deleted file mode 100644 index 80620d578f..0000000000 --- a/polkadot/runtime/src/runtime/governance.rs +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Governance system: Handles administration and dispatch of sensitive operations including -//! setting new code, minting new tokens and changing parameters. -//! -//! For now this is limited to a simple qualified majority vote (whose parameter is retrieved from -//! storage) between validators. A single vote may be proposed per era, and at most one approval -//! vote may be cast by each validator. The tally is maintained through a simple tag in storage for -//! each validator that has approved. -//! -//! At the end of the era, all validators approvals are tallied and if there are sufficient to pass -//! the proposal then it is enacted. All items in storage concerning the proposal are reset. - -use rstd::prelude::*; -use codec::KeyedVec; -use runtime_support::storage; -use polkadot_primitives::{Proposal, AccountId, Hash, BlockNumber}; -use runtime::{staking, system, session}; - -const APPROVALS_REQUIRED: &[u8] = b"gov:apr"; -const CURRENT_PROPOSAL: &[u8] = b"gov:pro"; -const APPROVAL_OF: &[u8] = b"gov:app:"; - -/// The proportion of validators required for a propsal to be approved measured as the number out -/// of 1000. -pub fn approval_ppm_required() -> u32 { - storage::get_or(APPROVALS_REQUIRED, 1000) -} - -/// The number of concrete validator approvals required for a proposal to pass. -pub fn approvals_required() -> u32 { - approval_ppm_required() * session::validator_count() / 1000 -} - -pub mod public { - use super::*; - - /// Propose a sensitive action to be taken. Any action that is enactable by `Proposal` is valid. - /// Proposal is by the `transactor` and will automatically count as an approval. Transactor must - /// be a current validator. It is illegal to propose when there is already a proposal in effect. - pub fn propose(validator: &AccountId, proposal: &Proposal) { - if storage::exists(CURRENT_PROPOSAL) { - panic!("there may only be one proposal per era."); - } - storage::put(CURRENT_PROPOSAL, proposal); - approve(validator, staking::current_era()); - } - - /// Approve the current era's proposal. Transactor must be a validator. This may not be done more - /// than once for any validator in an era. - pub fn approve(validator: &AccountId, era_index: BlockNumber) { - if era_index != staking::current_era() { - panic!("approval vote applied on non-current era.") - } - if !storage::exists(CURRENT_PROPOSAL) { - panic!("there must be a proposal in order to approve."); - } - if session::validators().into_iter().position(|v| &v == validator).is_none() { - panic!("transactor must be a validator to approve."); - } - let key = validator.to_keyed_vec(APPROVAL_OF); - if storage::exists(&key) { - panic!("transactor may not approve a proposal twice in one era."); - } - storage::put(&key, &true); - } -} - -pub mod privileged { - use super::*; - - /// Set the proportion of validators that must approve for a proposal to be enacted at the end of - /// its era. The value, `ppm`, is measured as a fraction of 1000 rounded down to the nearest whole - /// validator. `1000` would require the approval of all validators; `667` would require two-thirds - /// (or there abouts) of validators. - pub fn set_approval_ppm_required(ppm: u32) { - storage::put(APPROVALS_REQUIRED, &ppm); - } -} - -pub mod internal { - use super::*; - use polkadot_primitives::Proposal; - - /// Current era is ending; we should finish up any proposals. - pub fn end_of_an_era() { - // tally up votes for the current proposal, if any. enact if there are sufficient approvals. - if let Some(proposal) = storage::take::(CURRENT_PROPOSAL) { - let approvals_required = approvals_required(); - let approved = session::validators().into_iter() - .filter_map(|v| storage::take::(&v.to_keyed_vec(APPROVAL_OF))) - .take(approvals_required as usize) - .count() as u32; - if approved == approvals_required { - enact_proposal(proposal); - } - } - } - - fn enact_proposal(proposal: Proposal) { - match proposal { - Proposal::SystemSetCode(code) => { - system::privileged::set_code(&code); - } - Proposal::SessionSetLength(value) => { - session::privileged::set_length(value); - } - Proposal::SessionForceNewSession => { - session::privileged::force_new_session(); - } - Proposal::StakingSetSessionsPerEra(value) => { - staking::privileged::set_sessions_per_era(value); - } - Proposal::StakingSetBondingDuration(value) => { - staking::privileged::set_bonding_duration(value); - } - Proposal::StakingSetValidatorCount(value) => { - staking::privileged::set_validator_count(value); - } - Proposal::StakingForceNewEra => { - staking::privileged::force_new_era() - } - Proposal::GovernanceSetApprovalPpmRequired(value) => { - self::privileged::set_approval_ppm_required(value); - } - - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use environment::with_env; - use polkadot_primitives::{AccountId, Proposal}; - use runtime::{staking, session}; - - fn new_test_ext() -> TestExternalities { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - - map![ - twox_128(APPROVALS_REQUIRED).to_vec() => vec![].and(&667u32), - twox_128(b"ses:len").to_vec() => vec![].and(&1u64), - twox_128(b"ses:val:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"ses:val:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"ses:val:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"ses:val:")).to_vec() => three.to_vec(), - twox_128(b"sta:wil:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"sta:wil:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"sta:wil:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"sta:wil:")).to_vec() => three.to_vec(), - twox_128(b"sta:spe").to_vec() => vec![].and(&1u64), - twox_128(b"sta:vac").to_vec() => vec![].and(&3u64), - twox_128(b"sta:era").to_vec() => vec![].and(&1u64) - ] - } - - #[test] - fn majority_voting_should_work() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Approve it. Era length changes. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::approve(&two, 1); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 2); - }); - } - - #[test] - fn majority_voting_should_work_after_unsuccessful_previous() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Fail it. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - - // Block 2: Make proposal. Approve it. It should change era length. - system::testing::set_block_number(2); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::approve(&two, 2); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 2); - }); - } - - #[test] - fn minority_voting_should_not_succeed() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } - - #[test] - #[should_panic] - fn old_voting_should_be_illegal() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::approve(&two, 0); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } - - #[test] - #[should_panic] - fn double_voting_should_be_illegal() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::approve(&two, 1); - public::approve(&two, 1); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } - - #[test] - #[should_panic] - fn over_proposing_should_be_illegal() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::propose(&two, &Proposal::StakingSetSessionsPerEra(2)); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } - - #[test] - #[should_panic] - fn approving_without_proposal_should_be_illegal() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::approve(&two, 1); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } - - #[test] - #[should_panic] - fn non_validator_approving_should_be_illegal() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let four = [4u8; 32]; - let mut t = new_test_ext(); - - with_externalities(&mut t, || { - assert_eq!(staking::era_length(), 1u64); - assert_eq!(staking::current_era(), 1u64); - assert_eq!(session::validator_count(), 3u32); - assert_eq!(session::validators(), vec![one.clone(), two.clone(), three.clone()]); - assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); - - // Block 1: Make proposal. Will have only 1 vote. No change. - system::testing::set_block_number(1); - public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); - public::approve(&four, 1); - staking::internal::check_new_era(); - assert_eq!(staking::era_length(), 1); - }); - } -} diff --git a/polkadot/runtime/src/runtime/mod.rs b/polkadot/runtime/src/runtime/mod.rs deleted file mode 100644 index 6a54fa7310..0000000000 --- a/polkadot/runtime/src/runtime/mod.rs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! The Polkadot runtime. - -#[allow(unused)] -pub mod system; -#[allow(unused)] -pub mod consensus; -#[allow(unused)] -pub mod staking; -#[allow(unused)] -pub mod timestamp; -#[allow(unused)] -pub mod session; -#[allow(unused)] -pub mod governance; -#[allow(unused)] -pub mod parachains; - -// TODO: polkadao diff --git a/polkadot/runtime/src/runtime/parachains.rs b/polkadot/runtime/src/runtime/parachains.rs deleted file mode 100644 index 1cd4151cf9..0000000000 --- a/polkadot/runtime/src/runtime/parachains.rs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Main parachains logic. For now this is just the determination of which validators do what. - -use rstd::prelude::*; -use codec::{Slicable, Joiner}; -use runtime_support::{Hashable, storage}; -use environment::with_env; -use runtime::session; -use polkadot_primitives::parachain::{Id, Chain, DutyRoster}; - -const PARACHAIN_COUNT: &[u8] = b"par:cou"; - -/// Get the number of parachains registered at present. -pub fn parachain_count() -> u32 { - storage::get_or(PARACHAIN_COUNT, 0) -} - -/// Calculate the current block's duty roster. -pub fn calculate_duty_roster() -> DutyRoster { - let parachain_count = parachain_count(); - let validator_count = session::validator_count() as u32; - let validators_per_parachain = (validator_count - 1) / parachain_count; - - let mut roles_val = (0..validator_count).map(|i| match i { - i if i < parachain_count * validators_per_parachain => - Chain::Parachain(Id::from(i / validators_per_parachain as u32)), - _ => Chain::Relay, - }).collect::>(); - let mut roles_gua = roles_val.clone(); - - let h = with_env(|e| e.parent_hash.clone()); - let mut seed = Vec::::new().and(&h).and(b"validator_role_pairs").blake2_256(); - - // shuffle - for i in 0..(validator_count - 1) { - // 8 bytes of entropy used per cycle, 32 bytes entropy per hash - let offset = (i * 8 % 32) as usize; - - // number of roles remaining to select from. - let remaining = (validator_count - i) as usize; - - // 4 * 2 32-bit ints per 256-bit seed. - let val_index = u32::decode(&mut &seed[offset..offset + 4]).expect("using 4 bytes for a 32-bit quantity") as usize % remaining; - let gua_index = u32::decode(&mut &seed[offset + 4..offset + 8]).expect("using 4 bytes for a 32-bit quantity") as usize % remaining; - - if offset == 24 { - // into the last 8 bytes - rehash to gather new entropy - seed = seed.blake2_256(); - } - - // exchange last item with randomly chosen first. - roles_val.swap(remaining - 1, val_index); - roles_gua.swap(remaining - 1, gua_index); - } - - DutyRoster { - validator_duty: roles_val, - guarantor_duty: roles_gua, - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use runtime::{consensus, session}; - - fn simple_setup() -> TestExternalities { - map![ - twox_128(b"ses:val:len").to_vec() => vec![].and(&8u32), - twox_128(b"par:cou").to_vec() => vec![].and(&2u32) - ] - } - - #[test] - fn should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - let check_roster = |duty_roster: &DutyRoster| { - assert_eq!(duty_roster.validator_duty.len(), 8); - assert_eq!(duty_roster.guarantor_duty.len(), 8); - for i in (0..2).map(Id::from) { - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); - assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Parachain(i)).count(), 3); - } - assert_eq!(duty_roster.validator_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); - assert_eq!(duty_roster.guarantor_duty.iter().filter(|&&j| j == Chain::Relay).count(), 2); - }; - - with_env(|e| e.parent_hash = [0u8; 32].into()); - let duty_roster_0 = calculate_duty_roster(); - check_roster(&duty_roster_0); - - with_env(|e| e.parent_hash = [1u8; 32].into()); - let duty_roster_1 = calculate_duty_roster(); - check_roster(&duty_roster_1); - assert!(duty_roster_0 != duty_roster_1); - - with_env(|e| e.parent_hash = [2u8; 32].into()); - let duty_roster_2 = calculate_duty_roster(); - check_roster(&duty_roster_2); - assert!(duty_roster_0 != duty_roster_2); - assert!(duty_roster_1 != duty_roster_2); - }); - } -} diff --git a/polkadot/runtime/src/runtime/session.rs b/polkadot/runtime/src/runtime/session.rs deleted file mode 100644 index 4eb5bf5055..0000000000 --- a/polkadot/runtime/src/runtime/session.rs +++ /dev/null @@ -1,294 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Session manager: is told the validators and allows them to manage their session keys for the -//! consensus module. - -use rstd::prelude::*; -use codec::KeyedVec; -use runtime_support::{storage, StorageVec}; -use polkadot_primitives::{AccountId, SessionKey, BlockNumber}; -use runtime::{system, staking, consensus}; - -const SESSION_LENGTH: &[u8] = b"ses:len"; -const CURRENT_INDEX: &[u8] = b"ses:ind"; -const CURRENT_SESSION_START: &[u8] = b"ses:sta"; -const LAST_SESSION_START: &[u8] = b"ses:lst"; -const LAST_LENGTH_CHANGE: &[u8] = b"ses:llc"; -const NEXT_KEY_FOR: &[u8] = b"ses:nxt:"; -const NEXT_SESSION_LENGTH: &[u8] = b"ses:nln"; - -struct ValidatorStorageVec; -impl StorageVec for ValidatorStorageVec { - type Item = AccountId; - const PREFIX: &'static [u8] = b"ses:val:"; -} - -// the session keys before the previous. -struct LastValidators; -impl StorageVec for LastValidators { - type Item = (AccountId, SessionKey); - const PREFIX: &'static [u8] = b"ses:old:"; -} - -/// Get the current set of validators. -pub fn validators() -> Vec { - ValidatorStorageVec::items() -} - -/// The number of blocks in each session. -pub fn length() -> BlockNumber { - storage::get_or(SESSION_LENGTH, 0) -} - -/// The number of validators currently. -pub fn validator_count() -> u32 { - ValidatorStorageVec::count() as u32 -} - -/// The current session index. -pub fn current_index() -> BlockNumber { - storage::get_or(CURRENT_INDEX, 0) -} - -/// Get the starting block of the current session. -pub fn current_start_block() -> BlockNumber { - // this seems like it's computable just by examining the current block number, session length, - // and last length change, but it's not simple to tell whether we are before or after - // a session rotation on a block which will have one. - storage::get_or(CURRENT_SESSION_START, 0) -} - -/// Get the last session's validators, paired with their authority keys. -pub fn last_session_keys() -> Vec<(AccountId, SessionKey)> { - LastValidators::items() -} - -/// Get the start block of the last session. -/// In general this is computable from the session length, -/// but when the current session is the first with a new length it is uncomputable. -pub fn last_session_start() -> Option { - storage::get(LAST_SESSION_START) -} - -/// The block number at which the era length last changed. -pub fn last_length_change() -> BlockNumber { - storage::get_or(LAST_LENGTH_CHANGE, 0) -} - -pub mod public { - use super::*; - - /// 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) { - // set new value for next session - storage::put(&validator.to_keyed_vec(NEXT_KEY_FOR), key); - } -} - -pub mod privileged { - use super::*; - - /// Set a new era length. Won't kick in until the next era change (at current length). - pub fn set_length(new: BlockNumber) { - storage::put(NEXT_SESSION_LENGTH, &new); - } - - /// Forces a new session. - pub fn force_new_session() { - rotate_session(); - } -} - -// INTERNAL API (available to other runtime modules) - -pub mod internal { - use super::*; - - /// Transition to a new era, with a new set of valiators. - /// - /// Called by staking::next_era() only. `next_session` should be called after this in order to - /// update the session keys to the next validator set. - pub fn set_validators(new: &[AccountId]) { - LastValidators::set_items( - new.iter().cloned().zip(consensus::authorities()) - ); - ValidatorStorageVec::set_items(new); - consensus::internal::set_authorities(new); - } - - /// Hook to be called after transaction processing. - pub fn check_rotate_session() { - // do this last, after the staking system has had chance to switch out the authorities for the - // new set. - // check block number and call next_session if necessary. - if (system::block_number() - last_length_change()) % length() == 0 { - 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)); - // 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); - } - - let validators = validators(); - - storage::put(LAST_SESSION_START, ¤t_start_block()); - storage::put(CURRENT_SESSION_START, &system::block_number()); - LastValidators::set_items( - validators.iter() - .cloned() - .zip(consensus::authorities()) - ); - - - // 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) { - // this is fine because the authorities vector currently - // matches the validators length perfectly. - consensus::internal::set_authority(i as u32, &n); - } - }); -} - -#[cfg(test)] -mod tests { - use super::*; - use super::public::*; - use super::privileged::*; - use super::internal::*; - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use environment::with_env; - use polkadot_primitives::AccountId; - use runtime::{consensus, session}; - - fn simple_setup() -> TestExternalities { - map![ - twox_128(SESSION_LENGTH).to_vec() => vec![].and(&2u64), - // the validators (10, 20, ...) - twox_128(b"ses:val:len").to_vec() => vec![].and(&2u32), - twox_128(&0u32.to_keyed_vec(ValidatorStorageVec::PREFIX)).to_vec() => vec![10; 32], - twox_128(&1u32.to_keyed_vec(ValidatorStorageVec::PREFIX)).to_vec() => vec![20; 32], - // initial session keys (11, 21, ...) - b":auth:len".to_vec() => vec![].and(&2u32), - 0u32.to_keyed_vec(b":auth:") => vec![11; 32], - 1u32.to_keyed_vec(b":auth:") => vec![21; 32] - ] - } - - #[test] - fn simple_setup_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - assert_eq!(length(), 2u64); - assert_eq!(validators(), vec![[10u8; 32], [20u8; 32]]); - }); - } - - #[test] - fn session_length_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - // Block 1: Change to length 3; no visible change. - system::testing::set_block_number(1); - set_length(3); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 0); - - // Block 2: Length now changed to 3. Index incremented. - system::testing::set_block_number(2); - set_length(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 3: Length now changed to 3. Index incremented. - system::testing::set_block_number(3); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 4: Change to length 2; no visible change. - system::testing::set_block_number(4); - set_length(2); - check_rotate_session(); - assert_eq!(length(), 3); - assert_eq!(current_index(), 1); - - // Block 5: Length now changed to 2. Index incremented. - system::testing::set_block_number(5); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); - - // Block 6: No change. - system::testing::set_block_number(6); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 2); - - // Block 7: Next index. - system::testing::set_block_number(7); - check_rotate_session(); - assert_eq!(length(), 2); - assert_eq!(current_index(), 3); - }); - } - - #[test] - fn session_change_should_work() { - let mut t = simple_setup(); - with_externalities(&mut t, || { - // Block 1: No change - system::testing::set_block_number(1); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 2: Session rollover, but no change. - system::testing::set_block_number(2); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 3: Set new key for validator 2; no visible change. - system::testing::set_block_number(3); - set_key(&[20; 32], &[22; 32]); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); - - // Block 4: Session rollover, authority 2 changes. - system::testing::set_block_number(4); - check_rotate_session(); - assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]); - }); - } -} diff --git a/polkadot/runtime/src/runtime/staking.rs b/polkadot/runtime/src/runtime/staking.rs deleted file mode 100644 index 7ed94b9202..0000000000 --- a/polkadot/runtime/src/runtime/staking.rs +++ /dev/null @@ -1,496 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Staking manager: Handles balances and periodically determines the best set of validators. - -use rstd::prelude::*; -use rstd::cell::RefCell; -use runtime_io::print; -use codec::KeyedVec; -use runtime_support::{storage, StorageVec}; -use polkadot_primitives::{BlockNumber, AccountId}; -use primitives::bft::{MisbehaviorReport, MisbehaviorKind}; -use runtime::{system, session, governance, consensus}; - -type Balance = u64; -type Bondage = u64; - -struct IntentionStorageVec {} -impl StorageVec for IntentionStorageVec { - type Item = AccountId; - const PREFIX: &'static [u8] = b"sta:wil:"; -} - -const BONDING_DURATION: &[u8] = b"sta:loc"; -const VALIDATOR_COUNT: &[u8] = b"sta:vac"; -const SESSIONS_PER_ERA: &[u8] = b"sta:spe"; -const NEXT_SESSIONS_PER_ERA: &[u8] = b"sta:nse"; -const CURRENT_ERA: &[u8] = b"sta:era"; -const LAST_ERA_LENGTH_CHANGE: &[u8] = b"sta:lec"; -const TOTAL_STAKE: &[u8] = b"sta:tot"; -const BALANCE_OF: &[u8] = b"sta:bal:"; -const BONDAGE_OF: &[u8] = b"sta:bon:"; - -/// The length of the bonding duration in eras. -pub fn bonding_duration() -> BlockNumber { - storage::get_or_default(BONDING_DURATION) -} - -/// The length of a staking era in sessions. -pub fn validator_count() -> usize { - storage::get_or_default::(VALIDATOR_COUNT) as usize -} - -/// The length of a staking era in blocks. -pub fn era_length() -> BlockNumber { - sessions_per_era() * session::length() -} - -/// The length of a staking era in sessions. -pub fn sessions_per_era() -> BlockNumber { - storage::get_or_default(SESSIONS_PER_ERA) -} - -/// The current era index. -pub fn current_era() -> BlockNumber { - storage::get_or_default(CURRENT_ERA) -} - -/// The block number at which the era length last changed. -pub fn last_era_length_change() -> BlockNumber { - storage::get_or_default(LAST_ERA_LENGTH_CHANGE) -} - -/// The balance of a given account. -pub fn balance(who: &AccountId) -> Balance { - storage::get_or_default(&who.to_keyed_vec(BALANCE_OF)) -} - -/// Gives the index of the era where the account's balance will no longer -/// be bonded. -pub fn bondage(who: &AccountId) -> Bondage { - storage::get_or_default(&who.to_keyed_vec(BONDAGE_OF)) -} - -fn set_balance(who: &AccountId, amount: Balance) { - storage::put(&who.to_keyed_vec(BALANCE_OF), &amount) -} - -// 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 { - use super::*; - - /// Transfer some unlocked staking balance to another staker. - pub fn transfer(transactor: &AccountId, dest: &AccountId, value: Balance) { - let from_key = transactor.to_keyed_vec(BALANCE_OF); - let from_balance = storage::get_or_default::(&from_key); - assert!(from_balance >= value); - let to_key = dest.to_keyed_vec(BALANCE_OF); - let to_balance: Balance = storage::get_or_default(&to_key); - assert!(bondage(transactor) <= bondage(dest)); - assert!(to_balance + value > to_balance); // no overflow - storage::put(&from_key, &(from_balance - value)); - storage::put(&to_key, &(to_balance + value)); - } - - /// 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())); - } - - /// Report misbehavior. Only validators may do this, signing under - /// the authority key of the session the report corresponds to. - /// - /// Reports older than one session in the past will be ignored. - pub fn report_misbehavior(transactor: &AccountId, report: &MisbehaviorReport) { - let (validators, authorities) = if report.parent_number < session::last_session_start().unwrap_or(0) { - panic!("report is too old"); - } else if report.parent_number < session::current_start_block() { - session::last_session_keys().into_iter().unzip() - } else { - (session::validators(), consensus::authorities()) - }; - - if report.parent_hash != system::block_hash(report.parent_number) { - // report out of chain. - panic!("report not from this blockchain"); - } - - let reporting_validator = match authorities.iter().position(|x| x == transactor) { - None => panic!("only validators may report"), - Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), - }; - - // any invalidity beyond this point is actually its own misbehavior. - let target = match authorities.iter().position(|x| x == &report.target) { - None => { - slash(reporting_validator, None); - return; - } - Some(pos) => validators.get(pos).expect("validators and authorities have same cardinality; qed"), - }; - - let misbehaved = ::misbehavior_check::evaluate_misbehavior(&report.target, report.parent_hash, &report.misbehavior); - if misbehaved { - slash(target, Some(reporting_validator)) - } else { - slash(reporting_validator, None); - } - } -} - -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 { - use super::*; - - /// Hook to be called after to transaction processing. - pub fn check_new_era() { - // check block number and call new_era if necessary. - if (system::block_number() - last_era_length_change()) % era_length() == 0 { - new_era(); - } - } -} - -/// Slash a validator, with an optional benefactor. -fn slash(who: &AccountId, benefactor: Option<&AccountId>) { - // the reciprocal of the proportion of the amount slashed to give - // to the benefactor. - const SLASH_REWARD_DENOMINATOR: Balance = 10; - - let slashed = balance(who); - set_balance(who, 0); - - if let Some(benefactor) = benefactor { - let reward = slashed / SLASH_REWARD_DENOMINATOR; - - let prior = balance(benefactor); - set_balance(benefactor, prior + reward); - } -} - -/// The era has changed - enact new staking set. -/// -/// NOTE: This always happens immediately before a session change to ensure that new validators -/// get a chance to set their session keys. -fn new_era() { - // Inform governance module that it's the end of an era - governance::internal::end_of_an_era(); - - // Increment current era. - storage::put(CURRENT_ERA, &(current_era() + 1)); - - // Enact era length change. - let next_spe: u64 = storage::get_or_default(NEXT_SESSIONS_PER_ERA); - if next_spe > 0 && next_spe != sessions_per_era() { - storage::put(SESSIONS_PER_ERA, &next_spe); - storage::put(LAST_ERA_LENGTH_CHANGE, &system::block_number()); - } - - // evaluate desired staking amounts and nominations and optimise to find the best - // combination of validators, then use session::internal::set_validators(). - // for now, this just orders would-be stakers by their balances and chooses the top-most - // validator_count() of them. - let mut intentions = IntentionStorageVec::items() - .into_iter() - .map(|v| (balance(&v), v)) - .collect::>(); - intentions.sort_unstable_by(|&(b1, _), &(b2, _)| b2.cmp(&b1)); - session::internal::set_validators( - &intentions.into_iter() - .map(|(_, v)| v) - .take(validator_count()) - .collect::>() - ); -} - -#[cfg(test)] -mod tests { - use super::*; - use super::internal::*; - use super::public::*; - use super::privileged::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{KeyedVec, Joiner}; - use keyring::Keyring; - use environment::with_env; - use polkadot_primitives::AccountId; - use runtime::{staking, session}; - - #[test] - fn staking_should_work() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - let four = [4u8; 32]; - - let mut t: TestExternalities = map![ - twox_128(b"ses:len").to_vec() => vec![].and(&1u64), - twox_128(b"ses:val:len").to_vec() => vec![].and(&2u32), - twox_128(&0u32.to_keyed_vec(b"ses:val:")).to_vec() => vec![10; 32], - twox_128(&1u32.to_keyed_vec(b"ses:val:")).to_vec() => vec![20; 32], - twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&2u64), - 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(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&10u64), - twox_128(&two.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&20u64), - twox_128(&three.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&30u64), - twox_128(&four.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&40u64) - ]; - - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(validator_count(), 2usize); - assert_eq!(bonding_duration(), 3u64); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); - - // Block 1: Add three validators. No obvious change. - system::testing::set_block_number(1); - stake(&one); - stake(&two); - stake(&four); - check_new_era(); - assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); - - // Block 2: New validator set now. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(session::validators(), vec![four.clone(), two.clone()]); - - // Block 3: Unstake highest, introduce another staker. No change yet. - system::testing::set_block_number(3); - stake(&three); - unstake(&four); - check_new_era(); - - // Block 4: New era - validators change. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(session::validators(), vec![three.clone(), two.clone()]); - - // Block 5: Transfer stake from highest to lowest. No change yet. - system::testing::set_block_number(5); - transfer(&four, &one, 40); - check_new_era(); - - // Block 6: Lowest now validator. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(session::validators(), vec![one.clone(), three.clone()]); - - // Block 7: Unstake three. No change yet. - system::testing::set_block_number(7); - unstake(&three); - check_new_era(); - assert_eq!(session::validators(), vec![one.clone(), three.clone()]); - - // Block 8: Back to one and two. - system::testing::set_block_number(8); - check_new_era(); - assert_eq!(session::validators(), vec![one.clone(), two.clone()]); - }); - } - - #[test] - fn staking_eras_work() { - let mut t: TestExternalities = map![ - twox_128(b"ses:len").to_vec() => vec![].and(&1u64), - twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&2u64) - ]; - with_externalities(&mut t, || { - assert_eq!(era_length(), 2u64); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 0u64); - - // Block 1: No change. - system::testing::set_block_number(1); - check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 0u64); - - // Block 2: Simple era change. - system::testing::set_block_number(2); - check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 1u64); - - // Block 3: Schedule an era length change; no visible changes. - system::testing::set_block_number(3); - set_sessions_per_era(3); - check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 1u64); - - // Block 4: Era change kicks in. - system::testing::set_block_number(4); - check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); - - // Block 5: No change. - system::testing::set_block_number(5); - check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); - - // Block 6: No change. - system::testing::set_block_number(6); - check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); - - // Block 7: Era increment. - system::testing::set_block_number(7); - check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 3u64); - }); - } - - #[test] - fn staking_balance_works() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&42u64) - ]; - - with_externalities(&mut t, || { - assert_eq!(balance(&one), 42); - assert_eq!(balance(&two), 0); - }); - } - - #[test] - fn staking_balance_transfer_works() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&111u64) - ]; - - with_externalities(&mut t, || { - transfer(&one, &two, 69); - assert_eq!(balance(&one), 42); - assert_eq!(balance(&two), 69); - }); - } - - #[test] - #[should_panic] - fn staking_balance_transfer_when_bonded_doesnt_work() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&111u64) - ]; - - with_externalities(&mut t, || { - stake(&one); - transfer(&one, &two, 69); - }); - } - - #[test] - #[should_panic] - fn misbehavior_report_by_non_validator_panics() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&111u64) - ]; - - with_externalities(&mut t, || { - // the misbehavior report here is invalid, but that - // actually doesn't panic; instead it would slash the bad - // reporter. - report_misbehavior(&one, &MisbehaviorReport { - parent_hash: [0; 32].into(), - parent_number: 0, - target: two, - misbehavior: MisbehaviorKind::BftDoubleCommit( - 2, - ([1; 32].into(), [2; 64].into()), - ([3; 32].into(), [4; 64].into()), - ), - }) - }); - } -} diff --git a/polkadot/runtime/src/runtime/system.rs b/polkadot/runtime/src/runtime/system.rs deleted file mode 100644 index 935f801924..0000000000 --- a/polkadot/runtime/src/runtime/system.rs +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! System manager: Handles all of the top-level stuff; executing block/transaction, setting code -//! and depositing logs. - -use rstd::mem; -use rstd::prelude::*; - -use codec::{KeyedVec, Slicable}; -use environment::with_env; -use polkadot_primitives::{ - AccountId, Hash, TxOrder, BlockNumber, Block, Header, - UncheckedTransaction, Function, InherentFunction, Log -}; - -use runtime_io::{print, storage_root, enumerated_trie_root}; -use runtime_support::{Hashable, storage}; -use runtime::{staking, session}; - -/// Prefixes account ID and stores u64 nonce. -pub const NONCE_OF: &[u8] = b"sys:non:"; -/// Prefixes block number and stores hash of that block. -pub const BLOCK_HASH_AT: &[u8] = b"sys:old:"; -/// Stores the temporary current transaction number. -pub const TEMP_TRANSACTION_NUMBER: &[u8] = b"temp:txcount"; - -/// The current block number being processed. Set by `execute_block`. -pub fn block_number() -> BlockNumber { - with_env(|e| e.block_number) -} - -/// Get the block hash of a given block (uses storage). -pub fn block_hash(number: BlockNumber) -> Hash { - storage::get_or_default(&number.to_keyed_vec(BLOCK_HASH_AT)) -} - -pub mod privileged { - use super::*; - - /// Set the new code. - pub fn set_code(new: &[u8]) { - storage::unhashed::put_raw(b":code", new); - } -} - -pub mod internal { - use super::*; - - /// Deposits a log and ensures it matches the blocks log data. - pub fn deposit_log(log: Log) { - with_env(|e| e.digest.logs.push(log)); - } - - /// Actually execute all transitioning for `block`. - pub fn execute_block(mut block: Block) { - // populate environment from header. - with_env(|e| { - e.block_number = block.header.number; - e.parent_hash = block.header.parent_hash; - }); - - // any initial checks - initial_checks(&block); - - // execute all transactions, inherent or otherwise. - for (tx_num, tx) in block.all_transactions().enumerate() { - super::execute_transaction(tx, tx_num as u64); - } - - // post-transactional book-keeping. - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - // any final checks - final_checks(&block); - - // any stuff that we do after taking the storage root. - post_finalise(&block.header); - } - - /// Execute a transaction outside of the block execution function. - /// This doesn't attempt to validate anything regarding the block. - /// Note that when building a block transaction by transaction, the - /// inherent methods must be called manually. - pub fn execute_transaction(utx: UncheckedTransaction, mut header: Header) -> Header { - // populate environment from header. - with_env(|e| { - e.block_number = header.number; - e.parent_hash = header.parent_hash; - mem::swap(&mut header.digest, &mut e.digest); - }); - - let tx_num: u64 = storage::get_or_default(TEMP_TRANSACTION_NUMBER); - - super::execute_transaction(utx, tx_num); - - with_env(|e| { - mem::swap(&mut header.digest, &mut e.digest); - }); - - storage::put(TEMP_TRANSACTION_NUMBER, &(tx_num + 1)); - - header - } - - /// Finalise the block - it is up the caller to ensure that all header fields are valid - /// except state-root. - pub fn finalise_block(mut header: Header) -> Header { - // populate environment from header. - with_env(|e| { - e.block_number = header.number; - e.parent_hash = header.parent_hash; - mem::swap(&mut header.digest, &mut e.digest); - }); - - let tx_count: u64 = storage::take_or_default(TEMP_TRANSACTION_NUMBER); - if tx_count < Function::inherent_functions() { - panic!("Not enough transactions provided to fulfill all inherent functions."); - } - - staking::internal::check_new_era(); - session::internal::check_rotate_session(); - - header.state_root = storage_root().into(); - with_env(|e| { - mem::swap(&mut header.digest, &mut e.digest); - }); - - post_finalise(&header); - - header - } -} - -/// Get an account's current nonce. -pub fn nonce(account: AccountId) -> TxOrder { - let nonce_key = account.to_keyed_vec(NONCE_OF); - storage::get_or(&nonce_key, 0) -} - -/// Dispatch a function. -fn dispatch_function(function: &Function, transactor: &AccountId) { - match *function { - Function::Inherent(InherentFunction::TimestampSet(t)) => { - ::runtime::timestamp::public::set(t); - } - Function::StakingStake => { - ::runtime::staking::public::stake(transactor); - } - Function::StakingUnstake => { - ::runtime::staking::public::unstake(transactor); - } - Function::StakingTransfer(dest, value) => { - ::runtime::staking::public::transfer(transactor, &dest, value); - } - Function::ReportMisbehavior(ref report) => { - ::runtime::staking::public::report_misbehavior(transactor, report) - } - Function::SessionSetKey(session) => { - ::runtime::session::public::set_key(transactor, &session); - } - Function::GovernancePropose(ref proposal) => { - ::runtime::governance::public::propose(transactor, proposal); - } - Function::GovernanceApprove(era_index) => { - ::runtime::governance::public::approve(transactor, era_index); - } - } -} - -fn execute_transaction(utx: UncheckedTransaction, tx_num: u64) { - use ::transaction; - - // Verify the transaction is authenticated at its position. - let tx = match transaction::check(utx, tx_num) { - Ok(tx) => tx, - Err(_) => panic!("Transaction at index {} not properly authenticated", tx_num), - }; - - // check nonce - let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); - let (expected_nonce, increment_nonce) = if !tx.function.is_inherent() { - (storage::get_or(&nonce_key, 0), true) - } else { - (0, false) - }; - - assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); - - // increment nonce in storage, unless it's the EVERYBODY account. - if increment_nonce { - storage::put(&nonce_key, &(expected_nonce + 1)); - } - - // decode parameters and dispatch - dispatch_function(&tx.function, &tx.signed); -} - -fn initial_checks(block: &Block) { - let ref header = block.header; - - // check parent_hash is correct. - assert!( - header.number > 0 && block_hash(header.number - 1) == header.parent_hash, - "Parent hash should be valid." - ); - - // check transaction trie root represents the transactions. - let txs = block.all_transactions().map(|tx| Slicable::encode(&tx)).collect::>(); - let txs = txs.iter().map(Vec::as_slice).collect::>(); - let txs_root = enumerated_trie_root(&txs).into(); - info_expect_equal_hash(&header.transaction_root, &txs_root); - assert!(header.transaction_root == txs_root, "Transaction trie root must be valid."); -} - -fn final_checks(block: &Block) { - let ref header = block.header; - - // check digest - with_env(|e| { - assert!(header.digest == e.digest); - }); - - // check storage root. - let storage_root = storage_root().into(); - info_expect_equal_hash(&header.state_root, &storage_root); - assert!(header.state_root == storage_root, "Storage root must match that calculated."); -} - -fn post_finalise(header: &Header) { - // store the header hash in storage; we can't do it before otherwise there would be a - // cyclic dependency. - storage::put(&header.number.to_keyed_vec(BLOCK_HASH_AT), &header.blake2_256()); -} - -#[cfg(feature = "std")] -fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - use primitives::hexdisplay::HexDisplay; - if given != expected { - println!("Hash: given={}, expected={}", HexDisplay::from(&given.0), HexDisplay::from(&expected.0)); - } -} - -#[cfg(not(feature = "std"))] -fn info_expect_equal_hash(given: &Hash, expected: &Hash) { - if given != expected { - print("Hash not equal"); - print(&given.0[..]); - print(&expected.0[..]); - } -} - -#[cfg(any(feature = "std", test))] -pub mod testing { - use super::*; - - pub fn set_block_number(n: BlockNumber) { - with_env(|e| e.block_number = n); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::internal::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use codec::{Joiner, KeyedVec, Slicable}; - use keyring::Keyring; - use environment::with_env; - use primitives::hexdisplay::HexDisplay; - use polkadot_primitives::{Header, Body, Digest, UncheckedTransaction, Transaction, Function, InherentFunction}; - use runtime::staking; - - fn set_timestamp() -> UncheckedTransaction { - UncheckedTransaction::inherent(InherentFunction::TimestampSet(100_000)) - } - - #[test] - #[should_panic] - fn fails_if_first_not_timestamp_set() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let tx = UncheckedTransaction { - transaction: Transaction { - signed: one.clone(), - nonce: 0, - function: Function::StakingTransfer(two, 69), - }, - signature: hex!("5f9832c5a4a39e2dd4a3a0c5b400e9836beb362cb8f7d845a8291a2ae6fe366612e080e4acd0b5a75c3d0b6ee69614a68fb63698c1e76bf1f2dcd8fa617ddf05").into(), - }; - - with_externalities(&mut t, || { - internal::execute_transaction(tx, Header::from_block_number(1)); - }); - } - - #[test] - fn staking_balance_transfer_dispatch_works() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t: TestExternalities = map![ - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ]; - - let tx = UncheckedTransaction { - transaction: Transaction { - signed: one.clone(), - nonce: 0, - function: Function::StakingTransfer(two, 69), - }, - signature: hex!("5f9832c5a4a39e2dd4a3a0c5b400e9836beb362cb8f7d845a8291a2ae6fe366612e080e4acd0b5a75c3d0b6ee69614a68fb63698c1e76bf1f2dcd8fa617ddf05").into(), - }; - - with_externalities(&mut t, || { - let header = Header::from_block_number(1); - let header = internal::execute_transaction(set_timestamp(), header); - internal::execute_transaction(tx, header); - assert_eq!(staking::balance(&one), 42); - assert_eq!(staking::balance(&two), 69); - }); - } - - fn new_test_ext() -> TestExternalities { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - let three = [3u8; 32]; - - map![ - twox_128(&0u64.to_keyed_vec(b"sys:old:")).to_vec() => [69u8; 32].encode(), - twox_128(b"gov:apr").to_vec() => vec![].and(&667u32), - twox_128(b"ses:len").to_vec() => vec![].and(&2u64), - twox_128(b"ses:val:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"ses:val:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"ses:val:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"ses:val:")).to_vec() => three.to_vec(), - twox_128(b"sta:wil:len").to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(b"sta:wil:")).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(b"sta:wil:")).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(b"sta:wil:")).to_vec() => three.to_vec(), - twox_128(b"sta:spe").to_vec() => vec![].and(&2u64), - twox_128(b"sta:vac").to_vec() => vec![].and(&3u64), - twox_128(b"sta:era").to_vec() => vec![].and(&0u64), - twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] - ] - } - - #[test] - fn block_import_works() { - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("aa4fbcdc09b21e4366aebccd9b9ec0831a8a2765c712d3397f121ff8e60e21e2").into(), - transaction_root: hex!("328ae80be3adf358d2a2e188cbe1bfd3f8cd5b15a2e7666e2b4eccf7450efc32").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - body: Body { - timestamp: 100_000, - transactions: vec![] - } - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_state_root_fails() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: [0u8; 32].into(), - transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - body: Body { - timestamp: 100_000, - transactions: vec![], - } - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } - - #[test] - #[should_panic] - fn block_import_of_bad_transaction_root_fails() { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); - - let mut t = new_test_ext(); - - let h = Header { - parent_hash: [69u8; 32].into(), - number: 1, - state_root: hex!("1ab2dbb7d4868a670b181327b0b6a58dc64b10cfb9876f737a5aa014b8da31e0").into(), - transaction_root: [0u8; 32].into(), - digest: Digest { logs: vec![], }, - }; - - let b = Block { - header: h, - body: Body { - timestamp: 100_000, - transactions: vec![], - } - }; - - with_externalities(&mut t, || { - execute_block(b); - }); - } -} diff --git a/polkadot/runtime/src/runtime/timestamp.rs b/polkadot/runtime/src/runtime/timestamp.rs deleted file mode 100644 index 8252f37225..0000000000 --- a/polkadot/runtime/src/runtime/timestamp.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2017 Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! Timestamp manager: just handles the current timestamp. - -use runtime_support::storage; -use polkadot_primitives::Timestamp; - -const CURRENT_TIMESTAMP: &[u8] = b"tim:val"; - -/// Get the current time. -pub fn get() -> Timestamp { - storage::get_or_default(CURRENT_TIMESTAMP) -} - -pub mod public { - use super::*; - - /// Set the current time. - pub fn set(now: Timestamp) { - if super::get() > now { - panic!("last timestamp less than now"); - } - - storage::put(CURRENT_TIMESTAMP, &now); - } -} - -#[cfg(test)] -mod tests { - use super::*; - use super::public::*; - - use runtime_io::{with_externalities, twox_128, TestExternalities}; - use runtime::timestamp; - use codec::{Joiner, KeyedVec}; - - #[test] - fn timestamp_works() { - let mut t: TestExternalities = map![ - twox_128(CURRENT_TIMESTAMP).to_vec() => vec![].and(&42u64) - ]; - - with_externalities(&mut t, || { - assert_eq!(get(), 42); - set(69); - assert_eq!(get(), 69); - }); - } -} diff --git a/polkadot/runtime/wasm/Cargo.lock b/polkadot/runtime/wasm/Cargo.lock index 7c2e7ef05b..efb0819310 100644 --- a/polkadot/runtime/wasm/Cargo.lock +++ b/polkadot/runtime/wasm/Cargo.lock @@ -220,6 +220,16 @@ dependencies = [ "proc-macro-hack 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "integer-sqrt" +version = "0.1.0" +source = "git+https://github.com/paritytech/integer-sqrt-rs.git#f4cf61482096dc98c1273f46a10849d182b4c23c" + +[[package]] +name = "integer-sqrt" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "isatty" version = "0.1.6" @@ -308,6 +318,11 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" @@ -383,6 +398,7 @@ dependencies = [ "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-codec 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-primitives 0.1.0", "substrate-runtime-std 0.1.0", ] @@ -390,13 +406,23 @@ dependencies = [ name = "polkadot-runtime" version = "0.1.0" dependencies = [ + "integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)", "polkadot-primitives 0.1.0", + "safe-mix 0.1.0", "substrate-codec 0.1.0", - "substrate-misbehavior-check 0.1.0", "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-council 0.1.0", + "substrate-runtime-democracy 0.1.0", + "substrate-runtime-executive 0.1.0", "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", "substrate-runtime-std 0.1.0", "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", + "substrate-runtime-timestamp 0.1.0", ] [[package]] @@ -541,6 +567,13 @@ dependencies = [ "semver 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "safe-mix" +version = "0.1.0" +dependencies = [ + "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "scopeguard" version = "0.3.3" @@ -601,12 +634,12 @@ dependencies = [ ] [[package]] -name = "substrate-misbehavior-check" +name = "substrate-keyring" version = "0.1.0" dependencies = [ - "substrate-codec 0.1.0", - "substrate-primitives 0.1.0", - "substrate-runtime-io 0.1.0", + "ed25519 0.1.0", + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -626,6 +659,76 @@ dependencies = [ "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", ] +[[package]] +name = "substrate-runtime-consensus" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + +[[package]] +name = "substrate-runtime-council" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-democracy 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + +[[package]] +name = "substrate-runtime-democracy" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-staking 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + +[[package]] +name = "substrate-runtime-executive" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-io" version = "0.1.0" @@ -640,6 +743,58 @@ dependencies = [ "triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-runtime-primitives" +version = "0.1.0" +dependencies = [ + "integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + +[[package]] +name = "substrate-runtime-session" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + +[[package]] +name = "substrate-runtime-staking" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-consensus 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-session 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-runtime-std" version = "0.1.0" @@ -663,6 +818,36 @@ dependencies = [ "substrate-runtime-std 0.1.0", ] +[[package]] +name = "substrate-runtime-system" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "safe-mix 0.1.0", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", +] + +[[package]] +name = "substrate-runtime-timestamp" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-runtime-io 0.1.0", + "substrate-runtime-primitives 0.1.0", + "substrate-runtime-std 0.1.0", + "substrate-runtime-support 0.1.0", + "substrate-runtime-system 0.1.0", +] + [[package]] name = "substrate-state-machine" version = "0.1.0" @@ -841,6 +1026,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd546ef520ab3745f1aae5f2cdc6de9e6498e94d1ab138b9eb3ddfbf335847fb" "checksum hex-literal-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2ea76da4c7f1a54d01d54985566d3fdd960b2bbd7b970da024821c883c2d9631" +"checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "" +"checksum integer-sqrt 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7536fe7f78abedb82f609d87f46f0e0ca0ad31e84597deb8dabd8ed9ad047257" "checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" "checksum keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f300c1f149cd9ca5214eed24f6e713a597517420fb8b15499824aa916259ec1" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" @@ -852,6 +1039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num-traits 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dee092fcdf725aee04dd7da1d21debff559237d49ef1cb3e69bcb8ece44c7364" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" diff --git a/polkadot/runtime/wasm/Cargo.toml b/polkadot/runtime/wasm/Cargo.toml index dac9694b8b..a75bd649ad 100644 --- a/polkadot/runtime/wasm/Cargo.toml +++ b/polkadot/runtime/wasm/Cargo.toml @@ -7,23 +7,42 @@ authors = ["Parity Technologies "] crate-type = ["cdylib"] [dependencies] +integer-sqrt = { git = "https://github.com/paritytech/integer-sqrt-rs.git", branch = "master" } +safe-mix = { path = "../../../safe-mix", default-features = false } substrate-codec = { path = "../../../substrate/codec", default-features = false } +substrate-primitives = { path = "../../../substrate/primitives", default-features = false } substrate-runtime-std = { path = "../../../substrate/runtime-std", default-features = false } substrate-runtime-io = { path = "../../../substrate/runtime-io", default-features = false } substrate-runtime-support = { path = "../../../substrate/runtime-support", default-features = false } -substrate-primitives = { path = "../../../substrate/primitives", default-features = false } -substrate-misbehavior-check = { path = "../../../substrate/misbehavior-check", default-features = false } +substrate-runtime-consensus = { path = "../../../substrate/runtime/consensus", default-features = false } +substrate-runtime-council = { path = "../../../substrate/runtime/council", default-features = false } +substrate-runtime-democracy = { path = "../../../substrate/runtime/democracy", default-features = false } +substrate-runtime-executive = { path = "../../../substrate/runtime/executive", default-features = false } +substrate-runtime-primitives = { path = "../../../substrate/runtime/primitives", default-features = false } +substrate-runtime-session = { path = "../../../substrate/runtime/session", default-features = false } +substrate-runtime-staking = { path = "../../../substrate/runtime/staking", default-features = false } +substrate-runtime-system = { path = "../../../substrate/runtime/system", default-features = false } +substrate-runtime-timestamp = { path = "../../../substrate/runtime/timestamp", default-features = false } polkadot-primitives = { path = "../../primitives", default-features = false } [features] default = [] std = [ + "safe-mix/std", "substrate-codec/std", - "substrate-runtime-io/std", - "substrate-runtime-std/std", - "substrate-runtime-support/std", "substrate-primitives/std", - "substrate-misbehavior-check/std", + "substrate-runtime-std/std", + "substrate-runtime-io/std", + "substrate-runtime-support/std", + "substrate-runtime-consensus/std", + "substrate-runtime-council/std", + "substrate-runtime-democracy/std", + "substrate-runtime-executive/std", + "substrate-runtime-primitives/std", + "substrate-runtime-session/std", + "substrate-runtime-staking/std", + "substrate-runtime-system/std", + "substrate-runtime-timestamp/std", "polkadot-primitives/std", ] diff --git a/polkadot/runtime/wasm/genesis.wasm b/polkadot/runtime/wasm/genesis.wasm index bc0cb89235c570beee9e2749b796933e05e9f774..14e9b61cdb68d9492e000caea44b782b5387d502 100644 GIT binary patch literal 134951 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 v{#l#0Scr@9Eji#Q8H;;^2)nTNJWBW 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 diff --git a/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm b/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.compact.wasm index 14e9b61cdb68d9492e000caea44b782b5387d502..42c255a920e10b5f0ef415398aeb66944861827e 100644 GIT binary patch literal 190956 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

SlE>g6sJk&^45^v$L-+Q8hZT@7<#G7 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

AyG_vqBaUke7d9)7BI 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 V$D^SnZf)Ll@VC"] futures = "0.1.17" parking_lot = "0.4" tokio-timer = "0.1.2" -ed25519 = { path = "../../substrate/ed25519" } +hex-literal = "0.1" error-chain = "0.11" log = "0.4" tokio-core = "0.1.12" +ed25519 = { path = "../../substrate/ed25519" } polkadot-primitives = { path = "../primitives" } polkadot-runtime = { path = "../runtime" } polkadot-consensus = { path = "../consensus" } @@ -18,9 +19,9 @@ polkadot-executor = { path = "../executor" } polkadot-api = { path = "../api" } polkadot-transaction-pool = { path = "../transaction-pool" } polkadot-keystore = { path = "../keystore" } +substrate-runtime-io = { path = "../../substrate/runtime-io" } substrate-primitives = { path = "../../substrate/primitives" } substrate-network = { path = "../../substrate/network" } substrate-client = { path = "../../substrate/client" } -substrate-keyring = { path = "../../substrate/keyring" } substrate-codec = { path = "../../substrate/codec" } substrate-executor = { path = "../../substrate/executor" } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index ea33bad5ec..27e73d92c0 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -28,15 +28,17 @@ extern crate polkadot_api; extern crate polkadot_consensus as consensus; extern crate polkadot_transaction_pool as transaction_pool; extern crate polkadot_keystore as keystore; +extern crate substrate_runtime_io as runtime_io; extern crate substrate_primitives as primitives; extern crate substrate_network as network; extern crate substrate_codec as codec; extern crate substrate_executor; extern crate tokio_core; -extern crate substrate_keyring; extern crate substrate_client as client; +#[macro_use] +extern crate hex_literal; #[macro_use] extern crate error_chain; #[macro_use] @@ -51,14 +53,15 @@ use futures::prelude::*; use parking_lot::Mutex; use tokio_core::reactor::Core; use codec::Slicable; +use runtime_io::with_externalities; use primitives::block::{Id as BlockId, TransactionHash}; use transaction_pool::TransactionPool; -use substrate_keyring::Keyring; use substrate_executor::NativeExecutor; use polkadot_executor::Executor as LocalDispatch; use keystore::Store as Keystore; use polkadot_api::PolkadotApi; -use polkadot_runtime::genesismap::{additional_storage_with_genesis, GenesisConfig}; +use polkadot_runtime::{GenesisConfig, ConsensusConfig, CouncilConfig, DemocracyConfig, + SessionConfig, StakingConfig, BuildExternalities}; use client::{genesis, BlockchainEvents}; use client::in_mem::Backend as InMemory; use network::ManageNetwork; @@ -137,26 +140,60 @@ impl Service { info!("Generated a new keypair: {:?}", key.public()); } + let god_keys = vec![ + hex!["f09c0d1467d6952c92c343672bfb06a24560f400af8cf98b93df7d40b4efe1b6"], + hex!["84718cd2894bcda83beeca3a7842caf269fe93cacde0bdee0e3cbce6de253f0e"] + ]; + let genesis_config = GenesisConfig { - validators: vec![Keyring::Alice.into(), Keyring::Bob.into(), Keyring::Charlie.into()], - authorities: vec![Keyring::Alice.into(), Keyring::Bob.into(), Keyring::Charlie.into()], - balances: vec![ - (Keyring::One.into(), 1u64 << 63), - (Keyring::Two.into(), 1u64 << 63), - (Keyring::Alice.into(), 1u64 << 63), - (Keyring::Bob.into(), 1u64 << 63), - (Keyring::Charlie.into(), 1u64 << 63), - ].into_iter().collect(), - block_time: 5, // 5 second block time. - session_length: 720, // that's 1 hour per session. - sessions_per_era: 24, // 24 hours per era. - bonding_duration: 90, // 90 days per bond. - approval_ratio: 667, // 66.7% approvals required for legislation. + consensus: Some(ConsensusConfig { + code: include_bytes!("../../runtime/wasm/genesis.wasm").to_vec(), + authorities: god_keys.clone(), + }), + system: None, + // block_time: 5, // 5 second block time. + session: Some(SessionConfig { + validators: god_keys.clone(), + session_length: 720, // that's 1 hour per session. + }), + staking: Some(StakingConfig { + current_era: 0, + intentions: vec![], + transaction_fee: 100, + balances: god_keys.iter().map(|&k|(k, 1u64 << 60)).collect(), + validator_count: 12, + sessions_per_era: 24, // 24 hours per era. + bonding_duration: 90, // 90 days per bond. + }), + democracy: Some(DemocracyConfig { + launch_period: 120 * 24 * 14, // 2 weeks per public referendum + voting_period: 120 * 24 * 28, // 4 weeks to discuss & vote on an active referendum + minimum_deposit: 1000, // 1000 as the minimum deposit for a referendum + }), + council: Some(CouncilConfig { + active_council: vec![], + candidacy_bond: 1000, // 1000 to become a council candidate + voter_bond: 100, // 100 down to vote for a candidate + present_slash_per_voter: 1, // slash by 1 per voter for an invalid presentation. + carry_count: 24, // carry over the 24 runners-up to the next council election + presentation_duration: 120 * 24, // one day for presenting winners. + approval_voting_period: 7 * 120 * 24, // one week period between possible council elections. + term_duration: 180 * 120 * 24, // 180 day term duration for the council. + desired_seats: 0, // start with no council: we'll raise this once the stake has been dispersed a bit. + inactive_grace_period: 1, // one addition vote should go by before an inactive voter can be reaped. + + cooloff_period: 90 * 120 * 24, // 90 day cooling off period if council member vetoes a proposal. + voting_period: 7 * 120 * 24, // 7 day voting period for council members. + }), + parachains: Some(Default::default()), }; let prepare_genesis = || { - storage = genesis_config.genesis_map(); + storage = genesis_config.build_externalities(); let block = genesis::construct_genesis_block(&storage); - storage.extend(additional_storage_with_genesis(&block)); + with_externalities(&mut storage, || + // TODO: use api.rs to dispatch instead + polkadot_runtime::System::initialise_genesis_state(&block.header) + ); (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) }; @@ -236,4 +273,3 @@ impl Drop for Service { } } } - diff --git a/polkadot/transaction-pool/Cargo.toml b/polkadot/transaction-pool/Cargo.toml index 51271feece..6efc3cc3fe 100644 --- a/polkadot/transaction-pool/Cargo.toml +++ b/polkadot/transaction-pool/Cargo.toml @@ -8,7 +8,9 @@ transaction-pool = "1.9.0" error-chain = "0.11" polkadot-api = { path = "../api" } polkadot-primitives = { path = "../primitives" } +polkadot-runtime = { path = "../runtime" } substrate-primitives = { path = "../../substrate/primitives" } +substrate-runtime-primitives = { path = "../../substrate/runtime/primitives" } substrate-codec = { path = "../../substrate/codec" } ed25519 = { path = "../../substrate/ed25519" } ethereum-types = "0.2" diff --git a/polkadot/transaction-pool/src/lib.rs b/polkadot/transaction-pool/src/lib.rs index 3864852f8c..40b793ceb7 100644 --- a/polkadot/transaction-pool/src/lib.rs +++ b/polkadot/transaction-pool/src/lib.rs @@ -14,13 +14,15 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -extern crate transaction_pool; -extern crate polkadot_api; -extern crate polkadot_primitives as primitives; -extern crate substrate_primitives as substrate_primitives; -extern crate substrate_codec as codec; extern crate ed25519; extern crate ethereum_types; +extern crate substrate_codec as codec; +extern crate substrate_primitives as substrate_primitives; +extern crate substrate_runtime_primitives as substrate_runtime_primitives; +extern crate polkadot_runtime as runtime; +extern crate polkadot_primitives as primitives; +extern crate polkadot_api; +extern crate transaction_pool; #[macro_use] extern crate error_chain; @@ -30,8 +32,9 @@ use std::cmp::Ordering; use std::sync::Arc; use polkadot_api::PolkadotApi; -use primitives::AccountId; -use primitives::transaction::UncheckedTransaction; +use primitives::{AccountId, Timestamp}; +use runtime::{Block, UncheckedExtrinsic, TimestampCall, Call}; +use substrate_runtime_primitives::traits::Checkable; use transaction_pool::{Pool, Readiness}; use transaction_pool::scoring::{Change, Choice}; @@ -44,6 +47,68 @@ pub fn truncate_id(id: &AccountId) -> TruncatedAccountId { TruncatedAccountId::from_slice(&id[..20]) } +/// Useful functions for working with Polkadot blocks. +pub struct PolkadotBlock { + block: Block, + location: Option<(&'static str, usize)>, +} + +impl PolkadotBlock { + /// Create a new block, checking high-level well-formedness. + pub fn from(unchecked: Block) -> ::std::result::Result { + if unchecked.extrinsics.len() < 1 { + return Err(unchecked); + } + if unchecked.extrinsics[0].is_signed() { + return Err(unchecked); + } + match unchecked.extrinsics[0].extrinsic.function { + Call::Timestamp(TimestampCall::set(_)) => return Err(unchecked), + _ => {} + } + + // any further checks... + Ok(PolkadotBlock { block: unchecked, location: None }) + } + + /// Create a new block, skipping any high-level well-formedness checks. WARNING: This could + /// result in internal functions panicking if the block is, in fact, not well-formed. + pub fn force_from(known_good: Block, file: &'static str, line: usize) -> Self { + PolkadotBlock { block: known_good, location: Some((file, line)) } + } + + /// Retrieve the timestamp of a Polkadot block. + pub fn timestamp(&self) -> Timestamp { + if let Call::Timestamp(TimestampCall::set(t)) = self.block.extrinsics[0].extrinsic.function { + t + } else { + if let Some((file, line)) = self.location { + panic!("Invalid block used in `PolkadotBlock::force_from` at {}:{}", file, line); + } else { + panic!("Invalid block made it through the PolkadotBlock verification!?"); + } + } + } +} + +#[macro_export] +macro_rules! assert_polkadot_block { + ($known_good:expr) => ( PolkadotBlock::force_from(known_good, file!(), line!()) ) +} + +impl ::std::ops::Deref for PolkadotBlock { + type Target = Block; + fn deref(&self) -> &Block { + &self.block + } +} + +impl From for Block { + fn from(pd: PolkadotBlock) -> Self { + pd.block + } +} + /// Iterator over pending transactions. pub type PendingIterator<'a, C> = transaction_pool::PendingIterator<'a, VerifiedTransaction, Ready<'a, C>, Scoring, NoopListener>; @@ -51,12 +116,12 @@ pub type PendingIterator<'a, C> = error_chain! { errors { /// Attempted to queue an inherent transaction. - IsInherent(tx: UncheckedTransaction) { + IsInherent(xt: UncheckedExtrinsic) { description("Inherent transactions cannot be queued."), display("Inehrent transactions cannot be queued."), } /// Attempted to queue a transaction with bad signature. - BadSignature(tx: UncheckedTransaction) { + BadSignature(xt: UncheckedExtrinsic) { description("Transaction had bad signature."), display("Transaction had bad signature."), } @@ -76,7 +141,7 @@ error_chain! { /// A verified transaction which should be includable and non-inherent. #[derive(Debug, Clone)] pub struct VerifiedTransaction { - inner: UncheckedTransaction, + inner: ::Checked, hash: TransactionHash, address: TruncatedAccountId, insertion_id: u64, @@ -85,35 +150,36 @@ pub struct VerifiedTransaction { impl VerifiedTransaction { /// Attempt to verify a transaction. - fn create(tx: UncheckedTransaction, insertion_id: u64) -> Result { - if tx.is_inherent() { - bail!(ErrorKind::IsInherent(tx)) + fn create(xt: UncheckedExtrinsic, insertion_id: u64) -> Result { + if !xt.is_signed() { + bail!(ErrorKind::IsInherent(xt)) } - let message = codec::Slicable::encode(&tx); - if ed25519::verify(&*tx.signature, &message, &tx.transaction.signed[..]) { - // TODO: make transaction-pool use generic types. - let hash = substrate_primitives::hashing::blake2_256(&message); - let address = truncate_id(&tx.transaction.signed); - Ok(VerifiedTransaction { - inner: tx, - hash: hash.into(), - encoded_size: message.len(), - address, - insertion_id, - }) - } else { - Err(ErrorKind::BadSignature(tx).into()) + let message = codec::Slicable::encode(&xt); + match xt.check() { + Ok(xt) => { + // TODO: make transaction-pool use generic types. + let hash = substrate_primitives::hashing::blake2_256(&message); + let address = truncate_id(&xt.signed); + Ok(VerifiedTransaction { + inner: xt, + hash: hash.into(), + encoded_size: message.len(), + address, + insertion_id, + }) + } + Err(xt) => Err(ErrorKind::BadSignature(xt).into()), } } /// Access the underlying transaction. - pub fn as_transaction(&self) -> &UncheckedTransaction { - self.as_ref() + pub fn as_transaction(&self) -> &UncheckedExtrinsic { + self.as_ref().as_unchecked() } /// Consume the verified transaciton, yielding the unchecked counterpart. - pub fn into_inner(self) -> UncheckedTransaction { + pub fn into_inner(self) -> ::Checked { self.inner } @@ -133,8 +199,8 @@ impl VerifiedTransaction { } } -impl AsRef for VerifiedTransaction { - fn as_ref(&self) -> &UncheckedTransaction { +impl AsRef< ::Checked > for VerifiedTransaction { + fn as_ref(&self) -> &::Checked { &self.inner } } @@ -164,7 +230,7 @@ impl transaction_pool::Scoring for Scoring { type Score = u64; fn compare(&self, old: &VerifiedTransaction, other: &VerifiedTransaction) -> Ordering { - old.inner.transaction.nonce.cmp(&other.inner.transaction.nonce) + old.inner.index.cmp(&other.inner.index) } fn choose(&self, _old: &VerifiedTransaction, _new: &VerifiedTransaction) -> Choice { @@ -173,11 +239,11 @@ impl transaction_pool::Scoring for Scoring { fn update_scores( &self, - txs: &[Arc], + xts: &[Arc], scores: &mut [Self::Score], _change: Change ) { - for i in 0..txs.len() { + for i in 0..xts.len() { // all the same score since there are no fees. // TODO: prioritize things like misbehavior or fishermen reports scores[i] = 1; @@ -192,7 +258,7 @@ impl transaction_pool::Scoring for Scoring { pub struct Ready<'a, T: 'a + PolkadotApi> { at_block: T::CheckedBlockId, api_handle: &'a T, - known_nonces: HashMap, + known_indices: HashMap, } impl<'a, T: 'a + PolkadotApi> Clone for Ready<'a, T> { @@ -200,7 +266,7 @@ impl<'a, T: 'a + PolkadotApi> Clone for Ready<'a, T> { Ready { at_block: self.at_block.clone(), api_handle: self.api_handle, - known_nonces: self.known_nonces.clone(), + known_indices: self.known_indices.clone(), } } } @@ -212,24 +278,24 @@ impl<'a, T: 'a + PolkadotApi> Ready<'a, T> { Ready { at_block: at, api_handle: client, - known_nonces: HashMap::new(), + known_indices: HashMap::new(), } } } impl<'a, T: 'a + PolkadotApi> transaction_pool::Ready for Ready<'a, T> { - fn is_ready(&mut self, tx: &VerifiedTransaction) -> Readiness { - let sender = tx.inner.transaction.signed; + fn is_ready(&mut self, xt: &VerifiedTransaction) -> Readiness { + let sender = xt.inner.signed; - // TODO: find a way to handle nonce error properly -- will need changes to + // TODO: find a way to handle index error properly -- will need changes to // transaction-pool trait. let (api_handle, at_block) = (&self.api_handle, &self.at_block); - let next_nonce = self.known_nonces.entry(sender) - .or_insert_with(|| api_handle.nonce(at_block, sender).ok().unwrap_or_else(u64::max_value)); + let next_index = self.known_indices.entry(sender) + .or_insert_with(|| api_handle.index(at_block, sender).ok().unwrap_or_else(u64::max_value)); - *next_nonce += 1; + *next_index += 1; - match tx.inner.transaction.nonce.cmp(&next_nonce) { + match xt.inner.index.cmp(&next_index) { Ordering::Greater => Readiness::Future, Ordering::Equal => Readiness::Ready, Ordering::Less => Readiness::Stalled, @@ -255,11 +321,11 @@ impl TransactionPool { } /// Verify and import a transaction into the pool. - pub fn import(&mut self, tx: UncheckedTransaction) -> Result> { + pub fn import(&mut self, xt: UncheckedExtrinsic) -> Result> { let insertion_index = self.insertion_index; self.insertion_index += 1; - let verified = VerifiedTransaction::create(tx, insertion_index)?; + let verified = VerifiedTransaction::create(xt, insertion_index)?; // TODO: just use a foreign link when the error type is made public. let hash = verified.hash.clone();