From bb19494b66ca911a2bb3b73dc1df8fc7e8329137 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Sat, 2 Mar 2019 14:31:48 +0100 Subject: [PATCH] Stash/controller model for staking (#1782) * First steps to stash/controller separation * More drafting * More drafting * Finish draft. * Optimisation * Remove accidental commit * Make it build. * Fix linked map for traits. * Fix Option<_> variant. * Improve naming a tad * Rebuild runtime * Builds! * First test. * Bump RT version * Minor fix * Update Mock * adds the correct reward testcase (+staking eras which was already ok) * fixes the basic staking testcase to work properly (along with a small fix in the module) * New logic to avoid controller transferring stash. * Fix some build issues. * adding some comments to tests * Fix impls. * adds a few more lines to explain the test case * More fixes. * gets the basic test up and running again * Fix rest of build * Rebuild wasm * Fix docs. * fix staking test with new chnages * updating some tests, pending questions * More working tests * adds double staking test * Docs * remove invalid slashing test * Payee stuff. * Fix build * Docs * Fix test * Fix a couple of tests * Layout plan for finishing tests before Pragmen * Add some working tests * re-build staking and reward tests * Add more tests * fix offline grace test * Nominator should have payee checked for cleanup * adds more nomination tets * adds validator prefs tests * Fix and clean up some TODOs * Fix a couple of issues * Fix tests * noting warnings from tests * final fix of local tests * Fix slot_stake bug * Half baked test * Add logic to limit `unstake_threshold` set in storage * Make sure to check before writing! Almost forgot this one * Move a couple of comments * fix last broken slot_stake test * Ignore broken test --- Cargo.lock | 1 + core/network-libp2p/tests/test.rs | 2 + core/sr-primitives/src/traits.rs | 61 +- .../substrate_test_runtime.compact.wasm | Bin 55938 -> 56839 bytes node-template/runtime/wasm/Cargo.lock | 1 + node/cli/src/chain_spec.rs | 108 +- node/executor/src/lib.rs | 85 +- node/runtime/src/lib.rs | 4 +- node/runtime/wasm/Cargo.lock | 1 + .../release/node_runtime.compact.wasm | Bin 822092 -> 865955 bytes srml/aura/Cargo.toml | 1 + srml/aura/src/lib.rs | 2 +- srml/balances/src/lib.rs | 63 +- srml/balances/src/tests.rs | 11 - srml/democracy/src/lib.rs | 21 +- srml/executive/src/lib.rs | 4 +- srml/fees/src/lib.rs | 12 +- srml/fees/src/mock.rs | 11 +- srml/session/src/lib.rs | 8 +- srml/staking/Staking.md | 62 + srml/staking/src/lib.rs | 816 +++++++---- srml/staking/src/mock.rs | 142 +- srml/staking/src/tests.rs | 1201 ++++++++++++----- srml/support/src/traits.rs | 126 +- 24 files changed, 1852 insertions(+), 891 deletions(-) create mode 100644 srml/staking/Staking.md diff --git a/Cargo.lock b/Cargo.lock index fd2f6d0fe972d..3b82569af5c68 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3062,6 +3062,7 @@ dependencies = [ "sr-primitives 0.1.0", "sr-std 0.1.0", "srml-consensus 0.1.0", + "srml-session 0.1.0", "srml-staking 0.1.0", "srml-support 0.1.0", "srml-system 0.1.0", diff --git a/core/network-libp2p/tests/test.rs b/core/network-libp2p/tests/test.rs index 40b9598f5441c..979cf9b044509 100644 --- a/core/network-libp2p/tests/test.rs +++ b/core/network-libp2p/tests/test.rs @@ -133,6 +133,8 @@ fn two_nodes_transfer_lots_of_packets() { } #[test] +#[ignore] +// TODO: remove ignore once this test it fixed. #1777 fn many_nodes_connectivity() { // Creates many nodes, then make sure that they are all connected to each other. // Note: if you increase this number, keep in mind that there's a limit to the number of diff --git a/core/sr-primitives/src/traits.rs b/core/sr-primitives/src/traits.rs index 5e12d571ae201..8050451b382cd 100644 --- a/core/sr-primitives/src/traits.rs +++ b/core/sr-primitives/src/traits.rs @@ -27,9 +27,9 @@ use substrate_primitives; use substrate_primitives::Blake2Hasher; use crate::codec::{Codec, Encode, HasCompact}; pub use integer_sqrt::IntegerSquareRoot; -pub use num_traits::{Zero, One, Bounded}; -pub use num_traits::ops::checked::{ - CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, CheckedShl, CheckedShr, +pub use num_traits::{ + Zero, One, Bounded, CheckedAdd, CheckedSub, CheckedMul, CheckedDiv, + CheckedShl, CheckedShr, Saturating }; use rstd::ops::{ Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, @@ -126,59 +126,6 @@ pub trait BlockNumberToHash { } } -/// Charge bytes fee trait -pub trait ChargeBytesFee { - /// Charge fees from `transactor` for an extrinsic (transaction) of encoded length - /// `encoded_len` bytes. Return Ok iff the payment was successful. - fn charge_base_bytes_fee(transactor: &AccountId, encoded_len: usize) -> Result<(), &'static str>; -} - -/// Charge fee trait -pub trait ChargeFee: ChargeBytesFee { - /// The type of fee amount. - type Amount; - - /// Charge `amount` of fees from `transactor`. Return Ok iff the payment was successful. - fn charge_fee(transactor: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; - - /// Refund `amount` of previous charged fees from `transactor`. Return Ok iff the refund was successful. - fn refund_fee(transactor: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; -} - -/// Transfer fungible asset trait -pub trait TransferAsset { - /// The type of asset amount. - type Amount; - - /// Transfer asset from `from` account to `to` account with `amount` of asset. - fn transfer(from: &AccountId, to: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; - - /// Remove asset from `who` account by deducing `amount` in the account balances. - fn remove_from(who: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; - - /// Add asset to `who` account by increasing `amount` in the account balances. - fn add_to(who: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; -} - -impl ChargeBytesFee for () { - fn charge_base_bytes_fee(_: &T, _: usize) -> Result<(), &'static str> { Ok(()) } -} - -impl ChargeFee for () { - type Amount = (); - - fn charge_fee(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } - fn refund_fee(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } -} - -impl TransferAsset for () { - type Amount = (); - - fn transfer(_: &T, _: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } - fn remove_from(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } - fn add_to(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } -} - /// Extensible conversion trait. Generic over both source and destination types. pub trait Convert { /// Make conversion. @@ -236,6 +183,7 @@ pub trait SimpleArithmetic: CheckedSub + CheckedMul + CheckedDiv + + Saturating + PartialOrd + Ord + HasCompact {} @@ -253,6 +201,7 @@ impl + Ord + HasCompact > SimpleArithmetic for T {} diff --git a/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index b3acd166f1dbb74c86c70bcb4feb3a2f8a23d41e..d35194b45d18cd750055b14deef6c5e7179cc61f 100644 GIT binary patch delta 8067 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°4ap`HNosJFVykO~0VC+hlEhw>StP>}21S zXMd8}wwJPO`pZG~)k`zj;+Lo7uYWl~S>G!w-Cy4hDtpCGMJB&GCg-OCq5@3^36M+C zZ>NNmp+AE8%o6w=1^8;L_XB0aWJAM3h=FfPs6?^(EHFIM9($x zB6=>^JLrd_{|wx7&3=lxgx*yaAVWZ(l;fBG03UJT_wV??H4t#xs{RCXu9;4-%@L@8 zpMzdUKMXxrJ@0YAu=brV5{qzg9>JVzj1%TR#eEfk2RK6V*#xmeUvJV+CM;(yhxS+c z&8vIbHgvD;=xOWNwBCb1Th+4(uPv=qV=*(9iHAe+w64eFY};!S0x?}z({UvpRuXzh zHDl~ouXO}6u~1xzrJ`X)QR0fBu$hM^4UMG}DI*mD7)g# za6r|QX>bw2f_N-sB-r=fhz86^$}p99Dium6!e%jVk49s9GO9+RZ26lrhN`-nQlqh0ED=)@Q0jz!9mfOVw5mt+gc(*tiC8)m zXY{Qlfsm=I$#6=ID6zDfiH2GFt;Rqq6p5P=K#h#5Mv?~0ztvb7G15vblFH~Hsskpx zePBr1P(ta5npBO1X+&bmxhgDLSJ%*BcBDHEv!P*4M2#i&WJ*aGFhNLHnea|_NIY)9 z6O32}YDyU}JRDExW-1X)hEj%-iL=jy(QMy)D+0+_ zA{kDq+=moB5muS|=s0%U(bg&eBZ*MPFrra2ku;PU?2DtL=}i8|RB_g0ju{q{FMcpA zzvBJ%^n5+S6_!ZqktpA#p8qX>ZEYM;{Bvpw8d_d1E)5MEbhiK47zrU9 zis+$K5?*2|dTc?n{W-I~r=bDKf&J;&IaOvd1z(LsLSWcT>gGZ=@wi+SiG`!OVwe#l zssI>W#4b4=tcu3sx{}cmyOB^Pn${PycaM*s5{m1X8{ud|)zgZhE^)3m*Kag?T6v$| laLv+k^y@n}o6DH=+lz-OskjbPs|gA0C8sIjX(46u{{kleQ+oga delta 7346 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 diff --git a/node-template/runtime/wasm/Cargo.lock b/node-template/runtime/wasm/Cargo.lock index 0867fe0532988..0354ebd8ce030 100644 --- a/node-template/runtime/wasm/Cargo.lock +++ b/node-template/runtime/wasm/Cargo.lock @@ -1282,6 +1282,7 @@ dependencies = [ "serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "sr-std 0.1.0", + "srml-session 0.1.0", "srml-staking 0.1.0", "srml-support 0.1.0", "srml-system 0.1.0", diff --git a/node/cli/src/chain_spec.rs b/node/cli/src/chain_spec.rs index 47e98c1b7c4e2..85d26702b873f 100644 --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -16,7 +16,7 @@ //! Substrate chain configurations. -use primitives::{Ed25519AuthorityId, ed25519}; +use primitives::{Ed25519AuthorityId as AuthorityId, ed25519}; use node_primitives::AccountId; use node_runtime::{ConsensusConfig, CouncilSeatsConfig, CouncilVotingConfig, DemocracyConfig, SessionConfig, StakingConfig, TimestampConfig, BalancesConfig, TreasuryConfig, @@ -39,14 +39,26 @@ pub fn dried_danta_config() -> Result { } fn staging_testnet_config_genesis() -> GenesisConfig { - let initial_authorities = vec![ + // stash, controller, session-key + let initial_authorities: Vec<(AccountId, AccountId, AuthorityId)> = vec![( + hex!["fbecf7767fc63a6f9fa8094bbc5751d7269cd8e619cfdd9edfbe1fbc716b173e"].into(), // 5Hm2GcbuUct7sWX8d56zRktxr9D9Lw5hTFjSUhUoVHwFNmYW TODO: change once we switch to sr25519 + hex!["6ed35e632190b9c795f019030e6c5cff1508655db28c83577e0a4366c9bd5773"].into(), // 5Ea1uyGz6H5WHZhWvPDxxLXWyiUkzWDwx54Hcn8LJ5dbFawH TODO: change once we switch to sr25519 hex!["82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5"].into(), + ),( + hex!["30b76ef977b84a575992ef52f561db315221123c68074269d3d51ce211c4a3dc"].into(), // 5DAaeTwVuyUmTyLBR5vKEDWeDJ75nhLutDuCJH58it7EHDM2 TODO: change once we switch to sr25519 + hex!["a270edf24cb2a472b0e913fc43bfd4da0ef337cc715eaf94073d5198f7659f0c"].into(), // 5FjhAKgzpuzt1dYWE7H7Jb1sEHSuG5hcyZdPtfX829gmFVXh TODO: change once we switch to sr25519 hex!["4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7"].into(), + ),( + hex!["7b9e79c1bfc71ad0c4389565c01e79269dc512cb9bd856489671662481355417"].into(), // 5ErnpkRUbmM3WdbQwnVwfZeYs3iKmggEQceyB9db9ft18dSn TODO: change once we switch to sr25519 + hex!["9ffec660c4d328306cf5e38faf4b132fb5c9f38287af95d9b25629fc29de3945"].into(), // 5FgV9vxNpdCXMUmHCLQcsN4mUUUG6ZpFuvAMrm5X4BUnFhie TODO: change once we switch to sr25519 hex!["063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5"].into(), + ),( + hex!["7e58b096b95c4b3b271f27fedd9f2c51edd48b9d37046240e601180c9dcc8c27"].into(), // 5EvNEhYYd4b9giczuCo2o8bfLZoKW9jnTeUukfL1NWsAAeEx TODO: change once we switch to sr25519 + hex!["36dfc933bb0848d8addf16a961369b2e122633a5819a19e43c8142381a1280e3"].into(), // 5DJevPKpz4EEvmSpK7W6KemS3i5JYPq5FEuEewgRY2cZCxNg TODO: change once we switch to sr25519 hex!["8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c"].into(), - ]; - let endowed_accounts = vec![ - hex!["f295940fa750df68a686fcf4abd4111c8a9c5a5a5a83c4c8639c451a94a7adfd"].into(), + )]; + let endowed_accounts: Vec = vec![ + hex!["f295940fa750df68a686fcf4abd4111c8a9c5a5a5a83c4c8639c451a94a7adfd"].into(), // 5HYmsxGRAmZMjyZYmf7uGPL2YDQGHEt6NjGrfUuxNEgeGBRN TODO: change once we switch to sr25519 ]; const MILLICENTS: u128 = 1_000_000_000; const CENTS: u128 = 1_000 * MILLICENTS; // assume this is worth about a cent. @@ -57,29 +69,37 @@ fn staging_testnet_config_genesis() -> GenesisConfig { const HOURS: u64 = MINUTES * 60; const DAYS: u64 = HOURS * 24; + const ENDOWMENT: u128 = 10_000_000 * DOLLARS; + const STASH: u128 = 100 * DOLLARS; + GenesisConfig { consensus: Some(ConsensusConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // FIXME change once we have #1252 - authorities: initial_authorities.clone(), + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), }), system: None, balances: Some(BalancesConfig { - balances: endowed_accounts.iter().map(|&k| (k, 10_000_000 * DOLLARS)).collect(), + balances: endowed_accounts.iter() + .map(|&k| (k, ENDOWMENT)) + .chain(initial_authorities.iter().map(|x| (x.0.clone(), STASH))) + .collect(), existential_deposit: 1 * DOLLARS, transfer_fee: 1 * CENTS, creation_fee: 1 * CENTS, vesting: vec![], }), indices: Some(IndicesConfig { - ids: endowed_accounts.clone(), + ids: endowed_accounts.iter().cloned() + .chain(initial_authorities.iter().map(|x| x.0.clone())) + .collect::>(), }), session: Some(SessionConfig { - validators: initial_authorities.iter().cloned().map(Into::into).collect(), + validators: initial_authorities.iter().map(|x| x.1.into()).collect(), session_length: 5 * MINUTES, + keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.iter().cloned().map(Into::into).collect(), offline_slash: Perbill::from_billionths(1_000_000), session_reward: Perbill::from_billionths(2_065), current_offline_slash: 0, @@ -89,7 +109,8 @@ fn staging_testnet_config_genesis() -> GenesisConfig { bonding_duration: 60 * MINUTES, offline_slash_grace: 4, minimum_validator_count: 4, - invulnerables: initial_authorities.iter().cloned().map(Into::into).collect(), + stakers: initial_authorities.iter().map(|x| (x.0.into(), x.1.into(), STASH)).collect(), + invulnerables: initial_authorities.iter().map(|x| x.1.into()).collect(), }), democracy: Some(DemocracyConfig { launch_period: 10 * MINUTES, // 1 day per public referendum @@ -137,7 +158,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { key: endowed_accounts[0].clone(), }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.clone().into_iter().map(|k| (k, 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), fees: Some(FeesConfig { transaction_base_fee: 1 * CENTS, @@ -162,52 +183,68 @@ pub fn staging_testnet_config() -> ChainSpec { } /// Helper function to generate AuthorityID from seed -pub fn get_authority_id_from_seed(seed: &str) -> Ed25519AuthorityId { +pub fn get_account_id_from_seed(seed: &str) -> AccountId { let padded_seed = pad_seed(seed); // NOTE from ed25519 impl: // prefer pkcs#8 unless security doesn't matter -- this is used primarily for tests. ed25519::Pair::from_seed(&padded_seed).public().0.into() } +/// Helper function to generate stash, controller and session key from seed +pub fn get_authority_keys_from_seed(seed: &str) -> (AccountId, AccountId, AuthorityId) { + let padded_seed = pad_seed(seed); + // NOTE from ed25519 impl: + // prefer pkcs#8 unless security doesn't matter -- this is used primarily for tests. + ( + get_account_id_from_seed(&format!("{}-stash", seed)), + get_account_id_from_seed(seed), + ed25519::Pair::from_seed(&padded_seed).public().0.into() + ) +} + /// Helper function to create GenesisConfig for testing pub fn testnet_genesis( - initial_authorities: Vec, + initial_authorities: Vec<(AccountId, AccountId, AuthorityId)>, root_key: AccountId, - endowed_accounts: Option>, + endowed_accounts: Option>, ) -> GenesisConfig { - let endowed_accounts = endowed_accounts.unwrap_or_else(|| { + let endowed_accounts: Vec = endowed_accounts.unwrap_or_else(|| { vec![ - get_authority_id_from_seed("Alice"), - get_authority_id_from_seed("Bob"), - get_authority_id_from_seed("Charlie"), - get_authority_id_from_seed("Dave"), - get_authority_id_from_seed("Eve"), - get_authority_id_from_seed("Ferdie"), + get_account_id_from_seed("Alice"), + get_account_id_from_seed("Bob"), + get_account_id_from_seed("Charlie"), + get_account_id_from_seed("Dave"), + get_account_id_from_seed("Eve"), + get_account_id_from_seed("Ferdie"), ] }); + + const STASH: u128 = 1 << 20; + const ENDOWMENT: u128 = 1 << 20; + GenesisConfig { consensus: Some(ConsensusConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), - authorities: initial_authorities.clone(), + authorities: initial_authorities.iter().map(|x| x.2.clone()).collect(), }), system: None, indices: Some(IndicesConfig { - ids: endowed_accounts.iter().map(|x| x.0.into()).collect(), + ids: endowed_accounts.clone(), }), balances: Some(BalancesConfig { existential_deposit: 500, transfer_fee: 0, creation_fee: 0, - balances: endowed_accounts.iter().map(|&k| (k.into(), (1 << 60))).collect(), + balances: endowed_accounts.iter().map(|&k| (k.into(), ENDOWMENT)).collect(), vesting: vec![], }), session: Some(SessionConfig { - validators: initial_authorities.iter().cloned().map(Into::into).collect(), + validators: initial_authorities.iter().map(|x| x.1.into()).collect(), session_length: 10, + keys: initial_authorities.iter().map(|x| (x.1.clone(), x.2.clone())).collect::>(), }), staking: Some(StakingConfig { current_era: 0, - intentions: initial_authorities.iter().cloned().map(Into::into).collect(), minimum_validator_count: 1, validator_count: 2, sessions_per_era: 5, @@ -217,7 +254,8 @@ pub fn testnet_genesis( current_offline_slash: 0, current_session_reward: 0, offline_slash_grace: 0, - invulnerables: initial_authorities.iter().cloned().map(Into::into).collect(), + stakers: initial_authorities.iter().map(|x| (x.0.into(), x.1.into(), STASH)).collect(), + invulnerables: initial_authorities.iter().map(|x| x.1.into()).collect(), }), democracy: Some(DemocracyConfig { launch_period: 9, @@ -228,7 +266,7 @@ pub fn testnet_genesis( }), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() - .filter(|a| initial_authorities.iter().find(|&b| a.0 == b.0).is_none()) + .filter(|&endowed| initial_authorities.iter().find(|&(_, controller, _)| controller == endowed).is_none()) .map(|a| (a.clone().into(), 1000000)).collect(), candidacy_bond: 10, voter_bond: 2, @@ -267,7 +305,7 @@ pub fn testnet_genesis( key: root_key, }), grandpa: Some(GrandpaConfig { - authorities: initial_authorities.clone().into_iter().map(|k| (k, 1)).collect(), + authorities: initial_authorities.iter().map(|x| (x.2.clone(), 1)).collect(), }), fees: Some(FeesConfig { transaction_base_fee: 1, @@ -279,9 +317,9 @@ pub fn testnet_genesis( fn development_config_genesis() -> GenesisConfig { testnet_genesis( vec![ - get_authority_id_from_seed("Alice"), + get_authority_keys_from_seed("Alice"), ], - get_authority_id_from_seed("Alice").into(), + get_account_id_from_seed("Alice").into(), None, ) } @@ -294,10 +332,10 @@ pub fn development_config() -> ChainSpec { fn local_testnet_genesis() -> GenesisConfig { testnet_genesis( vec![ - get_authority_id_from_seed("Alice"), - get_authority_id_from_seed("Bob"), + get_authority_keys_from_seed("Alice"), + get_authority_keys_from_seed("Bob"), ], - get_authority_id_from_seed("Alice").into(), + get_account_id_from_seed("Alice").into(), None, ) } diff --git a/node/executor/src/lib.rs b/node/executor/src/lib.rs index e198183624acf..5b100c3a93962 100644 --- a/node/executor/src/lib.rs +++ b/node/executor/src/lib.rs @@ -66,6 +66,18 @@ mod tests { AccountId::from(Keyring::Charlie.to_raw_public()) } + fn dave() -> AccountId { + AccountId::from(Keyring::Dave.to_raw_public()) + } + + fn eve() -> AccountId { + AccountId::from(Keyring::Eve.to_raw_public()) + } + + fn ferdie() -> AccountId { + AccountId::from(Keyring::Ferdie.to_raw_public()) + } + fn sign(xt: CheckedExtrinsic) -> UncheckedExtrinsic { match xt.signed { Some((signed, index)) => { @@ -258,12 +270,16 @@ mod tests { ..Default::default() }), indices: Some(IndicesConfig { - ids: vec![alice(), charlie()], + ids: vec![alice(), bob(), charlie(), dave(), eve(), ferdie()], }), balances: Some(BalancesConfig { balances: vec![ (alice(), 111), + (bob(), 100), (charlie(), 100_000_000), + (dave(), 100), + (eve(), 100), + (ferdie(), 100), ], existential_deposit: 0, transfer_fee: 0, @@ -273,11 +289,16 @@ mod tests { session: Some(SessionConfig { session_length: 2, validators: vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into(), three], + keys: vec![ + (alice(), keyring::ed25519::Keyring::Alice.to_raw_public().into()), + (bob(), keyring::ed25519::Keyring::Bob.to_raw_public().into()), + (charlie(), keyring::ed25519::Keyring::Charlie.to_raw_public().into()) + ] }), staking: Some(StakingConfig { sessions_per_era: 2, current_era: 0, - intentions: vec![alice(), bob(), Keyring::Charlie.to_raw_public().into()], + stakers: vec![(dave(), alice(), 111), (eve(), bob(), 100), (ferdie(), charlie(), 100)], validator_count: 3, minimum_validator_count: 0, bonding_duration: 0, @@ -286,7 +307,7 @@ mod tests { current_offline_slash: 0, current_session_reward: 0, offline_slash_grace: 0, - invulnerables: vec![alice(), bob(), Keyring::Charlie.to_raw_public().into()], + invulnerables: vec![alice(), bob(), charlie()], }), democracy: Some(Default::default()), council_seats: Some(Default::default()), @@ -297,9 +318,9 @@ mod tests { sudo: Some(Default::default()), grandpa: Some(GrandpaConfig { authorities: vec![ // set these so no GRANDPA events fire when session changes - (Keyring::Alice.to_raw_public().into(), 1), - (Keyring::Bob.to_raw_public().into(), 1), - (Keyring::Charlie.to_raw_public().into(), 1), + (keyring::ed25519::Keyring::Alice.to_raw_public().into(), 1), + (keyring::ed25519::Keyring::Bob.to_raw_public().into(), 1), + (keyring::ed25519::Keyring::Charlie.to_raw_public().into(), 1), ], }), fees: Some(FeesConfig { @@ -353,7 +374,7 @@ mod tests { ).0.unwrap(); } - let correct_header = match Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( + let header = match Executor::new(None).call::<_, NeverNativeValue, fn() -> _>( env, "BlockBuilder_finalise_block", &[0u8;0], @@ -364,9 +385,8 @@ mod tests { NativeOrEncoded::Encoded(h) => Header::decode(&mut &h[..]).unwrap(), }; - - let hash = correct_header.blake2_256(); - (Block { header: correct_header, extrinsics }.encode(), hash.into()) + let hash = header.blake2_256(); + (Block { header, extrinsics }.encode(), hash.into()) } fn changes_trie_block() -> (Vec, Hash) { @@ -471,24 +491,15 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 41); - assert_eq!(Balances::total_balance(&bob()), 69); + // block1 transfers from alice 69 to bob. + // -1 is the default fee + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1); + assert_eq!(Balances::total_balance(&bob()), 100 + 69); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), event: Event::system(system::Event::ExtrinsicSuccess) }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::indices(indices::RawEvent::NewAccountIndex(bob(), 2)) - }, - EventRecord { - phase: Phase::ApplyExtrinsic(1), - event: Event::balances(balances::RawEvent::NewAccount( - bob().into(), - 69 - )) - }, EventRecord { phase: Phase::ApplyExtrinsic(1), event: Event::balances(balances::RawEvent::Transfer( @@ -530,8 +541,11 @@ mod tests { ).0.unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 30); - assert_eq!(Balances::total_balance(&bob()), 78); + // bob sends 5, alice sends 15 | bob += 10, alice -= 10 + // 111 - 69 - 1 - 10 - 1 = 30 + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); + // 100 + 69 + 10 - 1 = 178 + assert_eq!(Balances::total_balance(&bob()), 100 + 69 + 10 - 1); assert_eq!(System::events(), vec![ EventRecord { phase: Phase::ApplyExtrinsic(0), @@ -571,10 +585,10 @@ mod tests { phase: Phase::Finalization, event: Event::session(session::RawEvent::NewSession(1)) }, - EventRecord { - phase: Phase::Finalization, - event: Event::staking(staking::RawEvent::Reward(0)) - }, + // EventRecord { + // phase: Phase::Finalization, + // event: Event::staking(staking::RawEvent::Reward(0)) + // }, EventRecord { phase: Phase::Finalization, event: Event::grandpa(::grandpa::RawEvent::NewAuthorities(vec![ @@ -616,15 +630,20 @@ mod tests { WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 41); - assert_eq!(Balances::total_balance(&bob()), 69); + // block1 transfers from alice 69 to bob. + // -1 is the default fee + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1); + assert_eq!(Balances::total_balance(&bob()), 100 + 69); }); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block2.0).unwrap(); runtime_io::with_externalities(&mut t, || { - assert_eq!(Balances::total_balance(&alice()), 30); - assert_eq!(Balances::total_balance(&bob()), 78); + // bob sends 5, alice sends 15 | bob += 10, alice -= 10 + // 111 - 69 - 1 - 10 - 1 = 30 + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); + // 100 + 69 + 10 - 1 = 178 + assert_eq!(Balances::total_balance(&bob()), 100 + 69 + 10 - 1); }); } diff --git a/node/runtime/src/lib.rs b/node/runtime/src/lib.rs index 12d412d201748..36058dee37a11 100644 --- a/node/runtime/src/lib.rs +++ b/node/runtime/src/lib.rs @@ -60,8 +60,8 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("node"), impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, - spec_version: 30, - impl_version: 34, + spec_version: 31, + impl_version: 31, apis: RUNTIME_API_VERSIONS, }; diff --git a/node/runtime/wasm/Cargo.lock b/node/runtime/wasm/Cargo.lock index 842a7a1479a44..316675d085ea7 100644 --- a/node/runtime/wasm/Cargo.lock +++ b/node/runtime/wasm/Cargo.lock @@ -1305,6 +1305,7 @@ dependencies = [ "serde 1.0.81 (registry+https://github.com/rust-lang/crates.io-index)", "sr-primitives 0.1.0", "sr-std 0.1.0", + "srml-session 0.1.0", "srml-staking 0.1.0", "srml-support 0.1.0", "srml-system 0.1.0", diff --git a/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 1c3fcc08bf8ef429d6ed31911d83a2e28ae7a94c..194ce2c0b8ccd4bc313f63cc7c9ea8d47b531f59 100644 GIT binary patch delta 290464 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 z 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%0AJ8eUJL%{$1!;CQ?{!oEX_04Ue9)mb4@4bP$GRu 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⩾SPTk#E-dL+1={1A6 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 TN;05!6%JX~dejd_O?vZ1w+IDj diff --git a/srml/aura/Cargo.toml b/srml/aura/Cargo.toml index 0d34b5479ff64..edf7743a4df3b 100644 --- a/srml/aura/Cargo.toml +++ b/srml/aura/Cargo.toml @@ -16,6 +16,7 @@ srml-support = { path = "../support", default-features = false } system = { package = "srml-system", path = "../system", default-features = false } timestamp = { package = "srml-timestamp", path = "../timestamp", default-features = false } staking = { package = "srml-staking", path = "../staking", default-features = false } +session = { package = "srml-session", path = "../session", default-features = false } [dev-dependencies] lazy_static = "1.0" diff --git a/srml/aura/src/lib.rs b/srml/aura/src/lib.rs index dfece22e7af0f..9c49dcb0b4171 100644 --- a/srml/aura/src/lib.rs +++ b/srml/aura/src/lib.rs @@ -209,7 +209,7 @@ pub struct StakingSlasher(::rstd::marker::PhantomData); impl HandleReport for StakingSlasher { fn handle_report(report: AuraReport) { - let validators = staking::Module::::validators(); + let validators = session::Module::::validators(); report.punish( validators.len(), diff --git a/srml/balances/src/lib.rs b/srml/balances/src/lib.rs index 60fb5f6c00736..9a593e7ee1d2a 100644 --- a/srml/balances/src/lib.rs +++ b/srml/balances/src/lib.rs @@ -29,10 +29,13 @@ use rstd::{cmp, result}; use parity_codec::Codec; use parity_codec_derive::{Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, decl_event, decl_storage, decl_module, ensure}; -use srml_support::traits::{UpdateBalanceOutcome, Currency, EnsureAccountLiquid, OnFreeBalanceZero, ArithmeticType}; +use srml_support::traits::{ + UpdateBalanceOutcome, Currency, EnsureAccountLiquid, OnFreeBalanceZero, TransferAsset, WithdrawReason, ArithmeticType +}; use srml_support::dispatch::Result; -use primitives::traits::{Zero, SimpleArithmetic, - As, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug, TransferAsset}; +use primitives::traits::{ + Zero, SimpleArithmetic, As, StaticLookup, Member, CheckedAdd, CheckedSub, MaybeSerializeDebug +}; use system::{IsDeadAccount, OnNewAccount, ensure_signed}; mod mock; @@ -52,7 +55,7 @@ pub trait Trait: system::Trait { type OnNewAccount: OnNewAccount; /// A function that returns true iff a given account can transfer its funds to another account. - type EnsureAccountLiquid: EnsureAccountLiquid; + type EnsureAccountLiquid: EnsureAccountLiquid; /// The overarching event type. type Event: From> + Into<::Event>; @@ -272,34 +275,6 @@ impl Module { } } - /// Adds up to `value` to the free balance of `who`. If `who` doesn't exist, it is created. - /// - /// This is a sensitive function since it circumvents any fees associated with account - /// setup. Ensure it is only called by trusted code. - /// - /// NOTE: This assumes that the total stake remains unchanged after this operation. If - /// you mean to actually mint value into existence, then use `reward` instead. - pub fn increase_free_balance_creating(who: &T::AccountId, value: T::Balance) -> UpdateBalanceOutcome { - Self::set_free_balance_creating(who, Self::free_balance(who) + value) - } - - /// Substrates `value` from the free balance of `who`. If the whole amount cannot be - /// deducted, an error is returned. - /// - /// NOTE: This assumes that the total stake remains unchanged after this operation. If - /// you mean to actually burn value out of existence, then use `slash` instead. - pub fn decrease_free_balance( - who: &T::AccountId, - value: T::Balance - ) -> result::Result { - T::EnsureAccountLiquid::ensure_account_liquid(who)?; - let b = Self::free_balance(who); - if b < value { - return Err("account has too few funds") - } - Ok(Self::set_free_balance(who, b - value)) - } - /// Transfer some liquid free balance to another staker. pub fn make_transfer(transactor: &T::AccountId, dest: &T::AccountId, value: T::Balance) -> Result { let from_balance = Self::free_balance(transactor); @@ -320,7 +295,7 @@ impl Module { if would_create && value < Self::existential_deposit() { return Err("value too low to create account"); } - T::EnsureAccountLiquid::ensure_account_liquid(transactor)?; + T::EnsureAccountLiquid::ensure_account_can_withdraw(transactor, value, WithdrawReason::Transfer)?; // NOTE: total stake being stored in the same type means that this could never overflow // but better to be safe than sorry. @@ -402,23 +377,27 @@ where } fn can_reserve(who: &T::AccountId, value: Self::Balance) -> bool { - if T::EnsureAccountLiquid::ensure_account_liquid(who).is_ok() { + if T::EnsureAccountLiquid::ensure_account_can_withdraw(who, value, WithdrawReason::Reserve).is_ok() { Self::free_balance(who) >= value } else { false } } - fn total_issuance() -> Self:: Balance { - Self::total_issuance() + fn total_issuance() -> Self::Balance { + >::get() + } + + fn minimum_balance() -> Self::Balance { + Self::existential_deposit() } fn free_balance(who: &T::AccountId) -> Self::Balance { - Self::free_balance(who) + >::get(who) } fn reserved_balance(who: &T::AccountId) -> Self::Balance { - Self::reserved_balance(who) + >::get(who) } fn slash(who: &T::AccountId, value: Self::Balance) -> Option { @@ -451,7 +430,7 @@ where if b < value { return Err("not enough free funds") } - T::EnsureAccountLiquid::ensure_account_liquid(who)?; + T::EnsureAccountLiquid::ensure_account_can_withdraw(who, value, WithdrawReason::Reserve)?; Self::set_reserved_balance(who, Self::reserved_balance(who) + value); Self::set_free_balance(who, b - value); Ok(()) @@ -508,8 +487,8 @@ impl TransferAsset for Module { Self::make_transfer(from, to, amount) } - fn remove_from(who: &T::AccountId, value: T::Balance) -> Result { - T::EnsureAccountLiquid::ensure_account_liquid(who)?; + fn withdraw(who: &T::AccountId, value: T::Balance, reason: WithdrawReason) -> Result { + T::EnsureAccountLiquid::ensure_account_can_withdraw(who, value, reason)?; let b = Self::free_balance(who); ensure!(b >= value, "account has too few funds"); Self::set_free_balance(who, b - value); @@ -517,7 +496,7 @@ impl TransferAsset for Module { Ok(()) } - fn add_to(who: &T::AccountId, value: T::Balance) -> Result { + fn deposit(who: &T::AccountId, value: T::Balance) -> Result { Self::set_free_balance_creating(who, Self::free_balance(who) + value); Self::increase_total_stake_by(value); Ok(()) diff --git a/srml/balances/src/tests.rs b/srml/balances/src/tests.rs index 8f6f87bcc5b91..272e4f5f10d36 100644 --- a/srml/balances/src/tests.rs +++ b/srml/balances/src/tests.rs @@ -154,17 +154,6 @@ fn balance_transfer_works() { }); } -#[test] -fn balance_reduction_works() { - with_externalities(&mut ExtBuilder::default().build(), || { - Balances::set_free_balance(&1, 111); - Balances::increase_total_stake_by(111); - assert_ok!(Balances::decrease_free_balance(&1, 69).map(|_| ())); - assert_eq!(Balances::total_balance(&1), 42); - assert_noop!(Balances::decrease_free_balance(&1, 69).map(|_| ()), "account has too few funds"); - }); -} - #[test] fn reserving_balance_should_work() { with_externalities(&mut ExtBuilder::default().build(), || { diff --git a/srml/democracy/src/lib.rs b/srml/democracy/src/lib.rs index 539aa4227b001..aa4b076a7ce32 100644 --- a/srml/democracy/src/lib.rs +++ b/srml/democracy/src/lib.rs @@ -24,7 +24,7 @@ use primitives::traits::{Zero, As}; use parity_codec_derive::{Encode, Decode}; use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use srml_support::{decl_module, decl_storage, decl_event, ensure}; -use srml_support::traits::{Currency, OnFreeBalanceZero, EnsureAccountLiquid, ArithmeticType}; +use srml_support::traits::{Currency, OnFreeBalanceZero, EnsureAccountLiquid, WithdrawReason, ArithmeticType}; use srml_support::dispatch::Result; use system::ensure_signed; @@ -415,12 +415,25 @@ impl OnFreeBalanceZero for Module { } } -impl EnsureAccountLiquid for Module { +impl EnsureAccountLiquid> for Module { fn ensure_account_liquid(who: &T::AccountId) -> Result { - if Self::bondage(who) <= >::block_number() { + if Self::bondage(who) > >::block_number() { + Err("stash accounts are not liquid") + } else { + Ok(()) + } + } + fn ensure_account_can_withdraw( + who: &T::AccountId, + _value: BalanceOf, + reason: WithdrawReason, + ) -> Result { + if reason == WithdrawReason::TransactionPayment + || Self::bondage(who) <= >::block_number() + { Ok(()) } else { - Err("cannot transfer illiquid funds") + Err("cannot transfer voting funds") } } } diff --git a/srml/executive/src/lib.rs b/srml/executive/src/lib.rs index 1638bc6e62528..c6817c25544f1 100644 --- a/srml/executive/src/lib.rs +++ b/srml/executive/src/lib.rs @@ -23,8 +23,8 @@ use rstd::prelude::*; use rstd::marker::PhantomData; use rstd::result; use primitives::traits::{self, Header, Zero, One, Checkable, Applyable, CheckEqual, OnFinalise, - OnInitialise, ChargeBytesFee, Hash, As, Digest}; -use srml_support::Dispatchable; + OnInitialise, Hash, As, Digest}; +use srml_support::{Dispatchable, traits::ChargeBytesFee}; use parity_codec::{Codec, Encode}; use system::extrinsics_root; use primitives::{ApplyOutcome, ApplyError}; diff --git a/srml/fees/src/lib.rs b/srml/fees/src/lib.rs index d6809bac30de4..09e32db9b0d4b 100644 --- a/srml/fees/src/lib.rs +++ b/srml/fees/src/lib.rs @@ -19,10 +19,12 @@ // Ensure we're `no_std` when compiling for Wasm. #![cfg_attr(not(feature = "std"), no_std)] -use srml_support::{dispatch::Result, traits::ArithmeticType, StorageMap, decl_event, decl_storage, decl_module}; +use srml_support::{ + dispatch::Result, StorageMap, decl_event, decl_storage, decl_module, + traits::{ArithmeticType, ChargeBytesFee, ChargeFee, TransferAsset, WithdrawReason} +}; use runtime_primitives::traits::{ - As, ChargeBytesFee, ChargeFee, - TransferAsset, CheckedAdd, CheckedSub, CheckedMul, Zero + As, CheckedAdd, CheckedSub, CheckedMul, Zero }; use system; @@ -96,7 +98,7 @@ impl ChargeFee for Module { let current_fee = Self::current_transaction_fee(extrinsic_index); let new_fee = current_fee.checked_add(&amount).ok_or_else(|| "fee got overflow after charge")?; - T::TransferAsset::remove_from(transactor, amount)?; + T::TransferAsset::withdraw(transactor, amount, WithdrawReason::TransactionPayment)?; >::insert(extrinsic_index, new_fee); Ok(()) @@ -107,7 +109,7 @@ impl ChargeFee for Module { let current_fee = Self::current_transaction_fee(extrinsic_index); let new_fee = current_fee.checked_sub(&amount).ok_or_else(|| "fee got underflow after refund")?; - T::TransferAsset::add_to(transactor, amount)?; + T::TransferAsset::deposit(transactor, amount)?; >::insert(extrinsic_index, new_fee); Ok(()) diff --git a/srml/fees/src/mock.rs b/srml/fees/src/mock.rs index dd93335eef064..7f6c715f4b8bb 100644 --- a/srml/fees/src/mock.rs +++ b/srml/fees/src/mock.rs @@ -20,12 +20,15 @@ use runtime_primitives::BuildStorage; use runtime_primitives::{ - traits::{IdentityLookup, BlakeTwo256, TransferAsset}, + traits::{IdentityLookup, BlakeTwo256}, testing::{Digest, DigestItem, Header}, }; use primitives::{H256, Blake2Hasher}; use runtime_io; -use srml_support::{impl_outer_origin, impl_outer_event, traits::ArithmeticType}; +use srml_support::{ + impl_outer_origin, impl_outer_event, + traits::{ArithmeticType, TransferAsset, WithdrawReason} +}; use crate::{GenesisConfig, Module, Trait, system}; impl_outer_origin!{ @@ -48,8 +51,8 @@ impl TransferAsset for TransferAssetMock { type Amount = u64; fn transfer(_: &AccountId, _: &AccountId, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } - fn remove_from(_: &AccountId, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } - fn add_to(_: &AccountId, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } + fn withdraw(_: &AccountId, _: Self::Amount, _: WithdrawReason) -> Result<(), &'static str> { Ok(()) } + fn deposit(_: &AccountId, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } } impl ArithmeticType for TransferAssetMock { diff --git a/srml/session/src/lib.rs b/srml/session/src/lib.rs index 7f74811bfc24f..1d1f9077b8a3e 100644 --- a/srml/session/src/lib.rs +++ b/srml/session/src/lib.rs @@ -110,10 +110,15 @@ decl_storage! { /// Block at which the session length last changed. LastLengthChange: Option; /// The next key for a given validator. - NextKeyFor: map T::AccountId => Option; + NextKeyFor build(|config: &GenesisConfig| { + config.keys.clone() + }): map T::AccountId => Option; /// The next session length. NextSessionLength: Option; } + add_extra_genesis { + config(keys): Vec<(T::AccountId, T::SessionKey)>; + } } impl Module { @@ -270,6 +275,7 @@ mod tests { t.extend(GenesisConfig::{ session_length: 2, validators: vec![1, 2, 3], + keys: vec![], }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } diff --git a/srml/staking/Staking.md b/srml/staking/Staking.md new file mode 100644 index 0000000000000..160349656bd9e --- /dev/null +++ b/srml/staking/Staking.md @@ -0,0 +1,62 @@ +# Module Summary, Description and Specification + +## Staking + +The staking module is the means by which a set of network maintainers (known as "authorities" in some contexts and "validators" in others) are chosen based upon those who voluntarily place funds under deposit. Under deposit, those funds are rewarded under normal operation but are held at pain of "slash" (expropriation) should they be found not to bee discharhing their duties properly. + +### Vocabulary + +- Staking: The process of locking up funds for some time, placing them at risk of slashing (loss) in order to become a rewarded maintainer of the network. +- Validating: The process of running a node to actively maintain the network, either by producing blocks or guaranteeing finality of the chain. +- Nominating: The process of placing staked funds behind one or more validators in order to share in any reward, and punishment, they take. +- Stash account: The account holding an owner's funds used for staking. +- Controller account: The account which controls am owner's funds for staking. +- Era: A (whole) number of sessions which is the period that the validator set (and each validator's active nominator set) is recalculated and where rewards are paid out. +- Slash: The punishment of a staker by reducing their funds. + +### Goals + +The staking system in Substrate NPoS is designed to achieve three goals: +- It should be possible to stake funds that are controlled by a cold wallet. +- It should be possible to withdraw some, or deposit more, funds without interrupting the role of t. +- It should be possible to switch between roles (nominator, validator, idle) with minimal overhead. + +### Stash account + +To achieve these goals, Substrate NPoS distinguishes the act of staking from the act of declaring the role (nominating or validating) desired. An owner of funds wanting to validate or nominate must first deposit some or all of an account's balance to be managed by the staking system. When they do this, we call it *staking* and we say the funds are *under management* and *bonded*. A transaction-dispatchable call `bond` is provided for this. Once an account has funds bonded, those funds may no longer be transfered out or deducted in any way, including for transaction fees payment. If all funds of the account are thus used, then the account is effectively locked since it is unable to pay for any transactions. + +Since the funds under management may be entirely frozen, and quite possibly controlled only by an offline cold wallet device, another account is used to control the staking activity of these funds. At the point of staking an account, this account is declared. Whereas the account holding the funds under management is known as the *stash*, the second account that controls the staking activity is called the *controller* account. Once staked, the stash account has no further transactional interaction with the staking module; all transactions regarding the staking activity of the stash are signed with the controller account. If there are unmanaged funds, then non-staking transactions may still be issued from the stash account, such as transfering funds out with the balances module. + +### Controller account + +Once the stash account's funds are committed under management of the staking system, then the controller account takes over. Three operations allow the owner to control their role in the staking system, switching between idle (no role at all) with the `chill` call; switching to a validator role with the `validate` call; and finally switching to the nominator role with `nominate`. In the case of the latter, the set of validators they are happy to entrust their stake to is also provided. The effect of these operations is felt at the next point that the nominator/validator set is recalculated, which will usually be at the end of the current era. + +Three further operations are provided for the fund management: two for withdrawing funds that are under management of the staking system `unbond` and `withdraw_unbonded`, and another for introducing additional funds under management, `bond_extra`. Regarding the withdrawal of funds, the funds become inactive in the staking system from the era following the `unbond` call, however they may not be transfered out of the account (by a normal transfer operation using the stash key) until the bonding period has ended. At that point, the `withdraw_unbonded` must be called before the funds are free to bee used. + +Funds deposited into the stash account will not automatically be introduced under management of the staking system: They may be retransfered out of the stash account normally until they enter under management. If there is a desire to bring such funds not yet under managment into the staking system, a separate transaction calling `bond_extra` must be issued to do this. + +### Validating + +A `validate` transaction takes a parameter of type `ValidatorPrefs`; this encodes a set of options available to validators. There are two options here: the `unstake_threshold` and `validator_payment`. The former allows a validator to control how long they acrue punishment for being offline before they are finally removed from the validator list and have the slash deducted. There is a tradeoff between being removed from the validator set early and thus missing out on an era's rewards and risking a much more substantial punishment as the slash amount increases exponentially with each offline infraction. + +The latter option, `validator_payment`, allows a validator to reserve some amount of funds for themselves before the rest is shared out, *pro rata* amongst itself and the nominators. By "default", this is zero which means the validator and nominators partake in the rewards equally. However, by raising this, the validator may reserve some of the funds for themselves, making them a less attractive financial proposal compared to other less "greedy" validators. This allows over-subscribed validators to monetise their reputation and provides a macroeconomic mechanism of redistributing nominations between different validators. + +### Nonminating + +A `nominate` transaction take a single parameter which is the set of validator identities the nominator approves of their stake backing. Nomination does not allow control of *how much* of the stake backs any individual validator. If a staker wishes to have such fine-grained control, they could split their funds between several accounts and stake each individually to effect such a arrangement. + +At the beginning of each era, each staker's funds is automatically allocated between some or all of each of their nominated validators, possibly with some (or, in extremis all) left unallocated. Only the portion of their stake that is allocated generates rewards and is at risk of slashing. + +When an era begins, a basic usage of the Phragmén method gives an initial allocation. Over some initial period (perhaps one session) in the era, third-parties may submit their own solutions (typically determined by running Phragmén more extensively) in order to further optimise the allocation between nominators and validators. At the end of the initial period, the allocation is fixed for the rest of the era. During the initial period, any slashing uses the initial, suboptimal allocations. + +### Rewards & Payouts + +At the end of each successful session, a reward is accrued according to the overall timeliness of blocks. If the session's aveerage block period was optimal, then the maximum reward is accrued; the fewer blocks producted, the lower the reward. At the end of each era, each validator is paid this overall reward into an account of their choosing. Nominator portions are distributed *pro rata* for the amount of stake backing that validator and according to the validator's preferences. + +There are three possible payment destinations or `Payee`s and this is set during the call to `bond` and may be updated by dispatching a `set_payee` transaction. The `Controller` payee places rewards into the controller account. The `Stash` and `Staked` targets both place rewards into the stash account, but the latter also places the rewards immediately under management. + +### Slashing + +Slashing happens when a validator has misbehaved in some way. Funds may be slashed up until the point they are withdrawn from management (using the `withdraw_unbonded` call). Digests of validator and nominator arrangements are recorded in order to ensure that historical misbehaviour can be properly attributed to stakes and punished. + +For a slash on some validator balance and associated nominator balances, the validator balance is reduced at preference. If the slash amount is greater than that which the validator has at stake, then the nominators balances are reduced pro rata for the remainder. \ No newline at end of file diff --git a/srml/staking/src/lib.rs b/srml/staking/src/lib.rs index 34fa4f036c838..180eb68fb3065 100644 --- a/srml/staking/src/lib.rs +++ b/srml/staking/src/lib.rs @@ -20,15 +20,17 @@ #![cfg_attr(not(feature = "std"), no_std)] -use rstd::{prelude::*, cmp}; +use rstd::{prelude::*, result}; use parity_codec::HasCompact; use parity_codec_derive::{Encode, Decode}; -use srml_support::{Parameter, StorageValue, StorageMap, dispatch::Result}; +use srml_support::{StorageValue, StorageMap, EnumerableStorageMap, dispatch::Result}; use srml_support::{decl_module, decl_event, decl_storage, ensure}; -use srml_support::traits::{Currency, OnDilution, EnsureAccountLiquid, OnFreeBalanceZero, ArithmeticType}; +use srml_support::traits::{ + Currency, OnDilution, EnsureAccountLiquid, OnFreeBalanceZero, WithdrawReason, ArithmeticType +}; use session::OnSessionChange; use primitives::Perbill; -use primitives::traits::{Zero, One, Bounded, As, StaticLookup}; +use primitives::traits::{Zero, One, As, StaticLookup, Saturating}; use system::ensure_signed; mod mock; @@ -37,13 +39,25 @@ mod tests; const RECENT_OFFLINE_COUNT: usize = 32; const DEFAULT_MINIMUM_VALIDATOR_COUNT: u32 = 4; +const MAX_NOMINATIONS: usize = 16; +const MAX_UNSTAKE_THRESHOLD: u32 = 10; -#[derive(PartialEq, Clone)] -#[cfg_attr(test, derive(Debug))] -pub enum LockStatus { - Liquid, - LockedUntil(BlockNumber), - Bonded, +/// A destination account for payment. +#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum RewardDestination { + /// Pay into the stash account, increasing the amount at stake accordingly. + Staked, + /// Pay into the stash account, not increasing the amount at stake. + Stash, + /// Pay into the controller account. + Controller, +} + +impl Default for RewardDestination { + fn default() -> Self { + RewardDestination::Staked + } } /// Preference of what happens on a slash event. @@ -53,7 +67,7 @@ pub struct ValidatorPrefs { /// Validator should ensure this many more slashes than is necessary before being unstaked. #[codec(compact)] pub unstake_threshold: u32, - // Reward that validator takes up-front; only the rest is split between themselves and nominators. + /// Reward that validator takes up-front; only the rest is split between themselves and nominators. #[codec(compact)] pub validator_payment: Balance, } @@ -67,6 +81,79 @@ impl Default for ValidatorPrefs { } } +/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct UnlockChunk { + /// Amount of funds to be unlocked. + #[codec(compact)] + value: Balance, + /// Era number at which point it'll be unlocked. + #[codec(compact)] + era: BlockNumber, +} + +/// The ledger of a (bonded) stash. +#[derive(PartialEq, Eq, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct StakingLedger { + /// The stash account whose balance is actually locked and at stake. + pub stash: AccountId, + /// The total amount of the stash's balance that we are currently accounting for. + /// It's just `active` plus all the `unlocking` balances. + #[codec(compact)] + pub total: Balance, + /// The total amount of the stash's balance that will be at stake in any forthcoming + /// rounds. + #[codec(compact)] + pub active: Balance, + /// Any balance that is becoming free, which may eventually be transferred out + /// of the stash (assuming it doesn't get slashed first). + pub unlocking: Vec>, +} + +impl StakingLedger { + /// Remove entries from `unlocking` that are sufficiently old and reduce the + /// total by the sum of their balances. + fn consolidate_unlocked(self, current_era: BlockNumber) -> Self { + let mut total = self.total; + let unlocking = self.unlocking.into_iter() + .filter(|chunk| if chunk.era > current_era { + true + } else { + total = total.saturating_sub(chunk.value); + false + }) + .collect(); + Self { total, active: self.active, stash: self.stash, unlocking } + } +} + +/// The amount of exposure (to slashing) than an individual nominator has. +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct IndividualExposure { + /// Which nominator. + who: AccountId, + /// Amount of funds exposed. + #[codec(compact)] + value: Balance, +} + +/// A snapshot of the stake backing a single validator in the system. +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Encode, Decode, Default)] +#[cfg_attr(feature = "std", derive(Debug))] +pub struct Exposure { + /// The total balance backing this validator. + #[codec(compact)] + pub total: Balance, + /// The validator's own stash that is exposed. + #[codec(compact)] + pub own: Balance, + /// The portions of nominators stashes that are exposed. + pub others: Vec>, +} + type BalanceOf = <::Currency as ArithmeticType>::Type; pub trait Trait: system::Trait + session::Trait { @@ -80,100 +167,268 @@ pub trait Trait: system::Trait + session::Trait { type Event: From> + Into<::Event>; } +decl_storage! { + trait Store for Module as Staking { + + /// The ideal number of staking participants. + pub ValidatorCount get(validator_count) config(): u32; + /// Minimum number of staking participants before emergency conditions are imposed. + pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; + /// The length of a staking era in sessions. + pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = T::BlockNumber::sa(1000); + /// Maximum reward, per validator, that is provided per acceptable session. + pub SessionReward get(session_reward) config(): Perbill = Perbill::from_billionths(60); + /// Slash, per validator that is taken for the first time they are found to be offline. + pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); // Perbill::from_fraction() is only for std, so use from_millionths(). + /// Number of instances of offline reports before slashing begins for validators. + pub OfflineSlashGrace get(offline_slash_grace) config(): u32; + /// The length of the bonding duration in blocks. + pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); + + // TODO: remove once Alex/CC updated #1785 + pub Invulerables get(invulerables): Vec; + + /// Any validators that may never be slashed or forcibly kicked. It's a Vec since they're easy to initialise + /// and the performance hit is minimal (we expect no more than four invulnerables) and restricted to testnets. + pub Invulnerables get(invulnerables) config(): Vec; + + /// Map from all locked "stash" accounts to the controller account. + pub Bonded get(bonded) build(|config: &GenesisConfig| { + config.stakers.iter().map(|(stash, controller, _)| (stash.clone(), controller.clone())).collect::>() + }): map T::AccountId => Option; + /// Map from all (unlocked) "controller" accounts to the info regarding the staking. + pub Ledger get(ledger) build(|config: &GenesisConfig| { + config.stakers.iter().map(|(stash, controller, value)| ( + controller.clone(), + StakingLedger { + stash: stash.clone(), + total: *value, + active: *value, + unlocking: Vec::, T::BlockNumber>>::new(), + }, + )).collect::>() + }): map T::AccountId => Option, T::BlockNumber>>; + + /// Where the reward payment should be made. + pub Payee get(payee): map T::AccountId => RewardDestination; + + /// The set of keys are all controllers that want to validate. + /// + /// The values are the preferences that a validator has. + pub Validators get(validators) build(|config: &GenesisConfig| { + config.stakers.iter().map(|(_stash, controller, _value)| ( + controller.clone(), + ValidatorPrefs::>::default(), + )).collect::>() + }): linked_map T::AccountId => ValidatorPrefs>; + + /// The set of keys are all controllers that want to nominate. + /// + /// The value are the nominations. + pub Nominators get(nominators): linked_map T::AccountId => Vec; + + /// Nominators for a particular account that is in action right now. You can't iterate through validators here, + /// but you can find them in the `sessions` module. + pub Stakers get(stakers) build(|config: &GenesisConfig| { + config.stakers.iter().map(|(_stash, controller, value)| ( + controller.clone(), + Exposure { + total: *value, + own: *value, + others: Vec::>::new(), + }, + )).collect::>() + }): map T::AccountId => Exposure>; + + // The historical validators and their nominations for a given era. Stored as a trie root of the mapping + // `T::AccountId` => `Exposure>`, which is just the contents of `Stakers`, + // under a key that is the `era`. + // + // Every era change, this will be appended with the trie root of the contents of `Stakers`, and the oldest + // entry removed down to a specific number of entries (probably around 90 for a 3 month history). +// pub HistoricalStakers get(historical_stakers): map T::BlockNumber => Option; + + /// The current era index. + pub CurrentEra get(current_era) config(): T::BlockNumber; + + /// Maximum reward, per validator, that is provided per acceptable session. + pub CurrentSessionReward get(current_session_reward) config(): BalanceOf; + /// Slash, per validator that is taken for the first time they are found to be offline. + pub CurrentOfflineSlash get(current_offline_slash) config(): BalanceOf; + + /// The accumulated reward for the current era. Reset to zero at the beginning of the era and + /// increased for every successfully finished session. + pub CurrentEraReward get(current_era_reward): BalanceOf; + + /// The next value of sessions per era. + pub NextSessionsPerEra get(next_sessions_per_era): Option; + /// The session index at which the era length last changed. + pub LastEraLengthChange get(last_era_length_change): T::BlockNumber; + + /// The amount of balance actively at stake for each validator slot, currently. + /// + /// This is used to derive rewards and punishments. + pub SlotStake get(slot_stake) build(|config: &GenesisConfig| { + config.stakers.iter().map(|&(_, _, value)| value).min().unwrap_or_default() + }): BalanceOf; + + /// The number of times a given validator has been reported offline. This gets decremented by one each era that passes. + pub SlashCount get(slash_count): map T::AccountId => u32; + + /// We are forcing a new era. + pub ForcingNewEra get(forcing_new_era): Option<()>; + + /// Most recent `RECENT_OFFLINE_COUNT` instances. (who it was, when it was reported, how many instances they were offline for). + pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; + } + add_extra_genesis { + config(stakers): Vec<(T::AccountId, T::AccountId, BalanceOf)>; + } +} + decl_module! { pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; - /// Declare the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - fn stake(origin) { - let who = ensure_signed(origin)?; - ensure!(Self::nominating(&who).is_none(), "Cannot stake if already nominating."); - let mut intentions = >::get(); - // can't be in the list twice. - ensure!(intentions.iter().find(|&t| t == &who).is_none(), "Cannot stake if already staked."); - - >::insert(&who, T::BlockNumber::max_value()); - intentions.push(who); - >::put(intentions); - } + /// Take the origin account as a stash and lock up `value` of its balance. `controller` will be the + /// account that controls it. + fn bond(origin, controller: ::Source, #[compact] value: BalanceOf, payee: RewardDestination) { + let stash = ensure_signed(origin)?; - /// Retract the desire to stake for the transactor. - /// - /// Effects will be felt at the beginning of the next era. - fn unstake(origin, #[compact] intentions_index: u32) -> Result { - let who = ensure_signed(origin)?; - // unstake fails in degenerate case of having too few existing staked parties - if Self::intentions().len() <= Self::minimum_validator_count() as usize { - return Err("cannot unstake when there are too few staked participants") + if >::exists(&stash) { + return Err("stash already bonded") } - Self::apply_unstake(&who, intentions_index as usize) - } - fn nominate(origin, target: ::Source) { - let who = ensure_signed(origin)?; - let target = T::Lookup::lookup(target)?; + let controller = T::Lookup::lookup(controller)?; - ensure!(Self::nominating(&who).is_none(), "Cannot nominate if already nominating."); - ensure!(Self::intentions().iter().find(|&t| t == &who).is_none(), "Cannot nominate if already staked."); + // You're auto-bonded forever, here. We might improve this by only bonding when + // you actually validate/nominate. + >::insert(&stash, controller.clone()); - // update nominators_for - let mut t = Self::nominators_for(&target); - t.push(who.clone()); - >::insert(&target, t); + let stash_balance = T::Currency::free_balance(&stash); + let value = value.min(stash_balance); - // update nominating - >::insert(&who, &target); - - // Update bondage - >::insert(&who, T::BlockNumber::max_value()); + >::insert(&controller, StakingLedger { stash, total: value, active: value, unlocking: vec![] }); + >::insert(&controller, payee); } - /// Will panic if called when source isn't currently nominating target. - /// Updates Nominating, NominatorsFor and NominationBalance. - fn unnominate(origin, #[compact] target_index: u32) { - let source = ensure_signed(origin)?; - let target_index = target_index as usize; + /// Add some extra amount that have appeared in the stash `free_balance` into the balance up for + /// staking. + /// + /// Use this if there are additional funds in your stash account that you wish to bond. + /// + /// NOTE: This call must be made by the controller, not the stash. + fn bond_extra(origin, max_additional: BalanceOf) { + let controller = ensure_signed(origin)?; + let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; + let stash_balance = T::Currency::free_balance(&ledger.stash); + + if stash_balance > ledger.total { + let extra = (stash_balance - ledger.total).min(max_additional); + ledger.total += extra; + ledger.active += extra; + >::insert(&controller, ledger); + } + } - let target = >::get(&source).ok_or("Account must be nominating")?; + /// Schedule a portion of the stash to be unlocked ready for transfer out after the bond + /// period ends. If this leaves an amount actively bonded less than + /// T::Currency::existential_deposit(), then it is increased to the full amount. + /// + /// Once the unlock period is done, you can call `withdraw_unbonded` to actually move + /// the funds out of management ready for transfer. + /// + /// NOTE: This call must be made by the controller, not the stash. + /// + /// See also `withdraw_unbonded`. + fn unbond(origin, #[compact] value: BalanceOf) { + let controller = ensure_signed(origin)?; + let mut ledger = Self::ledger(&controller).ok_or("not a controller")?; + + let mut value = value.min(ledger.active); + + if !value.is_zero() { + ledger.active -= value; + + // Avoid there being a dust balance left in the staking system. + let ed = T::Currency::minimum_balance(); + if ledger.active < ed { + value += ledger.active; + ledger.active = Zero::zero(); + } - let mut t = Self::nominators_for(&target); - if t.get(target_index) != Some(&source) { - return Err("Invalid target index") + let era = Self::current_era() + Self::bonding_duration(); + ledger.unlocking.push(UnlockChunk { value, era }); + >::insert(&controller, ledger); } + } - // Ok - all valid. - - // update nominators_for - t.swap_remove(target_index); - >::insert(&target, t); + /// Remove any unlocked chunks from the `unlocking` queue from our management. + /// + /// This essentially frees up that balance to be used by the stash account to do + /// whatever it wants. + /// + /// NOTE: This call must be made by the controller, not the stash. + /// + /// See also `unbond`. + fn withdraw_unbonded(origin) { + let controller = ensure_signed(origin)?; + let ledger = Self::ledger(&controller).ok_or("not a controller")?; + >::insert(&controller, ledger.consolidate_unlocked(Self::current_era())); + } - // update nominating - >::remove(&source); + /// Declare the desire to validate for the origin controller. + /// + /// Effects will be felt at the beginning of the next era. + /// + /// NOTE: This call must be made by the controller, not the stash. + fn validate(origin, prefs: ValidatorPrefs>) { + let controller = ensure_signed(origin)?; + let _ledger = Self::ledger(&controller).ok_or("not a controller")?; + ensure!(prefs.unstake_threshold <= MAX_UNSTAKE_THRESHOLD, "unstake threshold too large"); + >::remove(&controller); + >::insert(controller, prefs); + } - // update bondage - >::insert( - source, - >::block_number() + Self::bonding_duration() - ); + /// Declare the desire to nominate `targets` for the origin controller. + /// + /// Effects will be felt at the beginning of the next era. + /// + /// NOTE: This call must be made by the controller, not the stash. + fn nominate(origin, targets: Vec<::Source>) { + let controller = ensure_signed(origin)?; + let _ledger = Self::ledger(&controller).ok_or("not a controller")?; + ensure!(!targets.is_empty(), "targets cannot be empty"); + let targets = targets.into_iter() + .take(MAX_NOMINATIONS) + .map(T::Lookup::lookup) + .collect::, &'static str>>()?; + + >::remove(&controller); + >::insert(controller, targets); } - /// Set the given account's preference for slashing behaviour should they be a validator. + /// Declare no desire to either validate or nominate. /// - /// An error (no-op) if `Self::intentions()[intentions_index] != origin`. - fn register_preferences( - origin, - #[compact] intentions_index: u32, - prefs: ValidatorPrefs> - ) { - let who = ensure_signed(origin)?; - - if Self::intentions().get(intentions_index as usize) != Some(&who) { - return Err("Invalid index") - } + /// Effects will be felt at the beginning of the next era. + /// + /// NOTE: This call must be made by the controller, not the stash. + fn chill(origin) { + let controller = ensure_signed(origin)?; + let _ledger = Self::ledger(&controller).ok_or("not a controller")?; + >::remove(&controller); + >::remove(&controller); + } - >::insert(who, prefs); + /// (Re-)set the payment target for a controller. + /// + /// Effects will be felt at the beginning of the next era. + /// + /// NOTE: This call must be made by the controller, not the stash. + fn set_payee(origin, payee: RewardDestination) { + let controller = ensure_signed(origin)?; + let _ledger = Self::ledger(&controller).ok_or("not a controller")?; + >::insert(&controller, payee); } /// Set the number of sessions in an era. @@ -204,7 +459,7 @@ decl_module! { /// Set the validators who cannot be slashed (if any). fn set_invulnerables(validators: Vec) { - >::put(validators); + >::put(validators); } } } @@ -222,69 +477,6 @@ decl_event!( } ); -pub type PairOf = (T, T); - -decl_storage! { - trait Store for Module as Staking { - - /// The ideal number of staking participants. - pub ValidatorCount get(validator_count) config(): u32; - /// Minimum number of staking participants before emergency conditions are imposed. - pub MinimumValidatorCount get(minimum_validator_count) config(): u32 = DEFAULT_MINIMUM_VALIDATOR_COUNT; - /// The length of a staking era in sessions. - pub SessionsPerEra get(sessions_per_era) config(): T::BlockNumber = T::BlockNumber::sa(1000); - /// Maximum reward, per validator, that is provided per acceptable session. - pub SessionReward get(session_reward) config(): Perbill = Perbill::from_billionths(60); - /// Slash, per validator that is taken for the first time they are found to be offline. - pub OfflineSlash get(offline_slash) config(): Perbill = Perbill::from_millionths(1000); // Perbill::from_fraction() is only for std, so use from_millionths(). - /// Number of instances of offline reports before slashing begins for validators. - pub OfflineSlashGrace get(offline_slash_grace) config(): u32; - /// The length of the bonding duration in blocks. - pub BondingDuration get(bonding_duration) config(): T::BlockNumber = T::BlockNumber::sa(1000); - - /// Any validators that may never be slashed or forcible kicked. It's a Vec since they're easy to initialise - /// and the performance hit is minimal (we expect no more than four invulnerables) and restricted to testnets. - pub Invulerables get(invulnerables) config(): Vec; - - /// The current era index. - pub CurrentEra get(current_era) config(): T::BlockNumber; - /// Preferences that a validator has. - pub ValidatorPreferences get(validator_preferences): map T::AccountId => ValidatorPrefs>; - /// All the accounts with a desire to stake. - pub Intentions get(intentions) config(): Vec; - /// All nominator -> nominee relationships. - pub Nominating get(nominating): map T::AccountId => Option; - /// Nominators for a particular account. - pub NominatorsFor get(nominators_for): map T::AccountId => Vec; - /// Nominators for a particular account that is in action right now. - pub CurrentNominatorsFor get(current_nominators_for): map T::AccountId => Vec; - - /// Maximum reward, per validator, that is provided per acceptable session. - pub CurrentSessionReward get(current_session_reward) config(): BalanceOf; - /// Slash, per validator that is taken for the first time they are found to be offline. - pub CurrentOfflineSlash get(current_offline_slash) config(): BalanceOf; - - /// The next value of sessions per era. - pub NextSessionsPerEra get(next_sessions_per_era): Option; - /// The session index at which the era length last changed. - pub LastEraLengthChange get(last_era_length_change): T::BlockNumber; - - /// The highest and lowest staked validator slashable balances. - pub StakeRange get(stake_range): PairOf>; - - /// The block at which the `who`'s funds become entirely liquid. - pub Bondage get(bondage): map T::AccountId => T::BlockNumber; - /// The number of times a given validator has been reported offline. This gets decremented by one each era that passes. - pub SlashCount get(slash_count): map T::AccountId => u32; - - /// We are forcing a new era. - pub ForcingNewEra get(forcing_new_era): Option<()>; - - /// Most recent `RECENT_OFFLINE_COUNT` instances. (who it was, when it was reported, how many instances they were offline for). - pub RecentlyOffline get(recently_offline): Vec<(T::AccountId, T::BlockNumber, u32)>; - } -} - impl Module { // Just force_new_era without origin check. fn apply_force_new_era(apply_rewards: bool) -> Result { @@ -299,92 +491,83 @@ impl Module { Self::sessions_per_era() * >::length() } - /// Balance of a (potential) validator that includes all nominators. - pub fn nomination_balance(who: &T::AccountId) -> BalanceOf { - Self::nominators_for(who).iter() - .map(T::Currency::total_balance) - .fold(Zero::zero(), |acc, x| acc + x) + /// The stashed funds whose staking activities are controlled by `controller` and + /// which are actively in stake right now. + pub fn stash_balance(controller: &T::AccountId) -> BalanceOf { + Self::ledger(controller) + .map_or_else(Zero::zero, |l| l.active) } - /// The total balance that can be slashed from an account. + /// The total balance that can be slashed from a validator controller account as of + /// right now. pub fn slashable_balance(who: &T::AccountId) -> BalanceOf { - Self::nominators_for(who).iter() - .map(T::Currency::total_balance) - .fold(T::Currency::total_balance(who), |acc, x| acc + x) - } - - /// The block at which the `who`'s funds become entirely liquid. - pub fn unlock_block(who: &T::AccountId) -> LockStatus { - match Self::bondage(who) { - i if i == T::BlockNumber::max_value() => LockStatus::Bonded, - i if i <= >::block_number() => LockStatus::Liquid, - i => LockStatus::LockedUntil(i), - } - } - - /// Get the current validators. - pub fn validators() -> Vec { - session::Module::::validators() + Self::stakers(who).total } // PUBLIC MUTABLES (DANGEROUS) - + /// Slash a given validator by a specific amount. Removes the slash from their balance by preference, /// and reduces the nominators' balance if needed. fn slash_validator(v: &T::AccountId, slash: BalanceOf) { - // skip the slash in degenerate case of having only 4 staking participants despite having a larger - // desired number of validators (validator_count). - if Self::intentions().len() <= Self::minimum_validator_count() as usize { - return - } - - if let Some(rem) = T::Currency::slash(v, slash) { - let noms = Self::current_nominators_for(v); - let total = noms.iter().map(T::Currency::total_balance).fold(BalanceOf::::zero(), |acc, x| acc + x); + // The exposure (backing stake) information of the validator to be slashed. + let exposure = Self::stakers(v); + // The amount we are actually going to slash (can't be bigger than thair total exposure) + let slash = slash.min(exposure.total); + // The amount we'll slash from the validator's stash directly. + let own_slash = exposure.own.min(slash); + let own_slash = own_slash - T::Currency::slash(v, own_slash).unwrap_or_default(); + // The amount remaining that we can't slash from the validator, that must be taken from the nominators. + let rest_slash = slash - own_slash; + + if !rest_slash.is_zero() { + // The total to be slashed from the nominators. + let total = exposure.total - exposure.own; if !total.is_zero() { - let safe_mul_rational = |b| b * rem / total;// FIXME #1572 avoid overflow - for n in noms.iter() { - let _ = T::Currency::slash(n, safe_mul_rational(T::Currency::total_balance(n))); // best effort - not much that can be done on fail. + let safe_mul_rational = |b| b * rest_slash / total;// FIXME #1572 avoid overflow + for i in exposure.others.iter() { + let _ = T::Currency::slash(&i.who, safe_mul_rational(i.value)); // best effort - not much that can be done on fail. } } } } + /// Actually make a payment to a staker. This uses the currency's reward function + /// to pay the right payee for the given staker account. + fn make_payout(who: &T::AccountId, amount: BalanceOf) { + match Self::payee(who) { + RewardDestination::Controller => { + let _ = T::Currency::reward(&who, amount); + } + RewardDestination::Stash => { + let _ = Self::ledger(who).map(|l| T::Currency::reward(&l.stash, amount)); + } + RewardDestination::Staked => >::mutate(who, |ml| { + if let Some(l) = ml.as_mut() { + l.active += amount; + l.total += amount; + let _ = T::Currency::reward(&l.stash, amount); + } + }), + } + } + /// Reward a given validator by a specific amount. Add the reward to their, and their nominators' - /// balance, pro-rata. + /// balance, pro-rata based on their exposure, after having removed the validator's pre-payout cut. fn reward_validator(who: &T::AccountId, reward: BalanceOf) { - let off_the_table = reward.min(Self::validator_preferences(who).validator_payment); + let off_the_table = reward.min(Self::validators(who).validator_payment); let reward = reward - off_the_table; let validator_cut = if reward.is_zero() { Zero::zero() } else { - let noms = Self::current_nominators_for(who); - let total = noms.iter() - .map(T::Currency::total_balance) - .fold(T::Currency::total_balance(who), |acc, x| acc + x) - .max(One::one()); + let exposure = Self::stakers(who); + let total = exposure.total.max(One::one()); let safe_mul_rational = |b| b * reward / total;// FIXME #1572: avoid overflow - for n in noms.iter() { - let _ = T::Currency::reward(n, safe_mul_rational(T::Currency::total_balance(n))); + for i in &exposure.others { + Self::make_payout(&i.who, safe_mul_rational(i.value)); } - safe_mul_rational(T::Currency::total_balance(who)) + safe_mul_rational(exposure.own) }; - let _ = T::Currency::reward(who, validator_cut + off_the_table); - } - - /// Actually carry out the unstake operation. - /// Assumes `intentions()[intentions_index] == who`. - fn apply_unstake(who: &T::AccountId, intentions_index: usize) -> Result { - let mut intentions = Self::intentions(); - if intentions.get(intentions_index) != Some(who) { - return Err("Invalid index"); - } - intentions.swap_remove(intentions_index); - >::put(intentions); - >::remove(who); - >::remove(who); - >::insert(who, >::block_number() + Self::bonding_duration()); - Ok(()) + Self::make_payout(who, validator_cut + off_the_table); } /// Get the reward for the session, assuming it ends with this block. @@ -394,23 +577,16 @@ impl Module { return Self::current_session_reward(); } let per65536: u64 = (T::Moment::sa(65536u64) * ideal_elapsed.clone() / actual_elapsed.max(ideal_elapsed)).as_(); - Self::current_session_reward() * BalanceOf::::sa(per65536) / BalanceOf::::sa(65536u64) + Self::current_session_reward() * >::sa(per65536) / >::sa(65536u64) } /// Session has just changed. We need to determine whether we pay a reward, slash and/or /// move to a new era. fn new_session(actual_elapsed: T::Moment, should_reward: bool) { if should_reward { - // apply good session reward + // accumulate good session reward let reward = Self::this_session_reward(actual_elapsed); - let validators = >::validators(); - for v in validators.iter() { - Self::reward_validator(v, reward); - } - Self::deposit_event(RawEvent::Reward(reward)); - let total_minted = reward * as As>::sa(validators.len()); - let total_rewarded_stake = Self::stake_range().1 * as As>::sa(validators.len()); - T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); + >::mutate(|r| *r += reward); } let session_index = >::current_index(); @@ -426,6 +602,19 @@ impl Module { /// 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() { + // Payout + let reward = >::take(); + if !reward.is_zero() { + let validators = >::validators(); + for v in validators.iter() { + Self::reward_validator(v, reward); + } + Self::deposit_event(RawEvent::Reward(reward)); + let total_minted = reward * as As>::sa(validators.len()); + let total_rewarded_stake = Self::slot_stake() * as As>::sa(validators.len()); + T::OnRewardMinted::on_dilution(total_minted, total_rewarded_stake); + } + // Increment current era. >::put(&(>::get() + One::one())); @@ -437,63 +626,99 @@ impl Module { } } - // evaluate desired staking amounts and nominations and optimise to find the best - // combination of validators, then use session::internal::set_validators(). - // for now, this just orders would-be stakers by their balances and chooses the top-most - // >::get() of them. - // FIXME #1571 this is not sound. this should be moved to an off-chain solution mechanism. - let mut intentions = Self::intentions() - .into_iter() - .map(|v| (Self::slashable_balance(&v), v)) - .collect::>(); - - // Avoid reevaluate validator set if it would leave us with fewer than the minimum - // needed validators - if intentions.len() < Self::minimum_validator_count() as usize { - return + // Reassign all Stakers. + + // Map of (would-be) validator account to amount of stake backing it. + + // First, we pull all validators, together with their stash balance into a Vec (cpu=O(V), mem=O(V)) + let mut candidates = >::enumerate() + .map(|(who, _)| { + let stash_balance = Self::stash_balance(&who); + (who, Exposure { total: stash_balance, own: stash_balance, others: vec![] }) + }) + .collect::>)>>(); + // Second, we sort by accountid (cpu=O(V.log(V))) + candidates.sort_unstable_by_key(|i| i.0.clone()); + // Third, iterate through nominators and add their balance to the first validator in their approval + // list. cpu=O(N.log(V)) + for (who, nominees) in >::enumerate() { + // For this trivial nominator mapping, we just assume that nominators always + // have themselves assigned to the first validator in their list. + if nominees.is_empty() { + // Not possible, but we protect against it anyway. + continue; + } + if let Ok(index) = candidates.binary_search_by(|i| i.0.cmp(&nominees[0])) { + let stash_balance = Self::stash_balance(&who); + candidates[index].1.total += stash_balance; + candidates[index].1.others.push(IndividualExposure { who, value: stash_balance }); + } } - intentions.sort_unstable_by(|&(ref b1, _), &(ref b2, _)| b2.cmp(&b1)); - - let desired_validator_count = >::get() as usize; - let stake_range = if !intentions.is_empty() { - let n = cmp::min(desired_validator_count, intentions.len()); - (intentions[0].0, intentions[n - 1].0) + // Get the new staker set by sorting by total backing stake and truncating. + // cpu=O(V.log(s)) average, O(V.s) worst. + let count = Self::validator_count() as usize; + let candidates = if candidates.len() <= count { + candidates } else { - (Zero::zero(), Zero::zero()) + candidates.into_iter().fold(vec![], |mut winners: Vec<(T::AccountId, Exposure>)>, entry| { + if let Err(insert_point) = winners.binary_search_by_key(&entry.1.total, |i| i.1.total) { + if winners.len() < count { + winners.insert(insert_point, entry) + } else { + if insert_point > 0 { + // Big enough to be considered: insert at beginning and swap up to relevant point. + winners[0] = entry; + for i in 0..(insert_point - 1) { + winners.swap(i, i + 1) + } + } + } + } + winners + }) }; - >::put(&stake_range); - let vals = &intentions.into_iter() - .map(|(_, v)| v) - .take(desired_validator_count) - .collect::>(); + // Clear Stakers and reduce their slash_count. for v in >::validators().iter() { - >::remove(v); + >::remove(v); let slash_count = >::take(v); if slash_count > 1 { >::insert(v, slash_count - 1); } } - for v in vals.iter() { - >::insert(v, Self::nominators_for(v)); + + // Figure out the minimum stake behind a slot. + let slot_stake = candidates.last().map(|i| i.1.total).unwrap_or_default(); + >::put(&slot_stake); + + // Populate Stakers. + for (who, exposure) in &candidates { + >::insert(who, exposure); } - >::set_validators(vals); + // Set the new validator set. + >::set_validators( + &candidates.into_iter().map(|i| i.0).collect::>() + ); // Update the balances for slashing/rewarding according to the stakes. - >::put(Self::offline_slash() * stake_range.1); - >::put(Self::session_reward() * stake_range.1); + >::put(Self::offline_slash() * slot_stake); + >::put(Self::session_reward() * slot_stake); } /// Call when a validator is determined to be offline. `count` is the /// number of offences the validator has committed. pub fn on_offline_validator(v: T::AccountId, count: usize) { - use primitives::traits::{CheckedAdd, CheckedShl}; + use primitives::traits::CheckedShl; // Early exit if validator is invulnerable. if Self::invulnerables().contains(&v) { return } + // TODO: remove once Alex/CC updated #1785 + if Self::invulerables().contains(&v) { + return + } let slash_count = Self::slash_count(&v); let new_slash_count = slash_count + count as u32; @@ -514,50 +739,22 @@ impl Module { }); } - let event = if new_slash_count > grace { - let slash = { - let base_slash = Self::current_offline_slash(); - let instances = slash_count - grace; - - let mut total_slash = BalanceOf::::default(); - for i in instances..(instances + count as u32) { - if let Some(total) = base_slash.checked_shl(i) - .and_then(|slash| total_slash.checked_add(&slash)) { - total_slash = total; - } else { - // reset slash count only up to the current - // instance. the total slash overflows the unit for - // balance in the system therefore we can slash all - // the slashable balance for the account - >::insert(v.clone(), slash_count + i); - total_slash = Self::slashable_balance(&v); - break; - } - } - - total_slash - }; - + let prefs = Self::validators(&v); + let unstake_threshold = prefs.unstake_threshold.min(MAX_UNSTAKE_THRESHOLD); + let max_slashes = grace + unstake_threshold; + + let event = if new_slash_count > max_slashes { + let slot_stake = Self::slot_stake(); + // They're bailing. + let slash = Self::current_offline_slash() + // Multiply current_offline_slash by 2^(unstake_threshold with upper bound) + .checked_shl(unstake_threshold) + .map(|x| x.min(slot_stake)) + .unwrap_or(slot_stake); let _ = Self::slash_validator(&v, slash); - - let next_slash = match slash.checked_shl(1) { - Some(slash) => slash, - None => Self::slashable_balance(&v), - }; - - let instances = new_slash_count - grace; - if instances > Self::validator_preferences(&v).unstake_threshold - || Self::slashable_balance(&v) < next_slash - || next_slash <= slash - { - if let Some(pos) = Self::intentions().into_iter().position(|x| &x == &v) { - Self::apply_unstake(&v, pos) - .expect("pos derived correctly from Self::intentions(); \ - apply_unstake can only fail if pos wrong; \ - Self::intentions() doesn't change; qed"); - } - let _ = Self::apply_force_new_era(false); - } + >::remove(&v); + let _ = Self::apply_force_new_era(false); + RawEvent::OfflineSlash(v.clone(), slash) } else { RawEvent::OfflineWarning(v.clone(), slash_count) @@ -573,19 +770,38 @@ impl OnSessionChange for Module { } } -impl EnsureAccountLiquid for Module { +impl EnsureAccountLiquid> for Module { fn ensure_account_liquid(who: &T::AccountId) -> Result { - if Self::bondage(who) <= >::block_number() { - Ok(()) + if >::exists(who) { + Err("stash accounts are not liquid") } else { - Err("cannot transfer illiquid funds") + Ok(()) } } + fn ensure_account_can_withdraw( + who: &T::AccountId, + amount: BalanceOf, + _reason: WithdrawReason, + ) -> Result { + if let Some(controller) = Self::bonded(who) { + let ledger = Self::ledger(&controller).ok_or("stash without controller")?; + let free_balance = T::Currency::free_balance(&who); + ensure!(free_balance.saturating_sub(ledger.total) > amount, + "stash with too much under management"); + } + Ok(()) + } } impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { - >::remove(who); + if let Some(controller) = >::take(who) { + >::remove(&controller); + >::remove(&controller); + >::remove(&controller); + >::remove(&controller); + >::remove(&controller); + } } } diff --git a/srml/staking/src/mock.rs b/srml/staking/src/mock.rs index a76c0fed85aad..244c3c18c22ce 100644 --- a/srml/staking/src/mock.rs +++ b/srml/staking/src/mock.rs @@ -72,61 +72,103 @@ impl Trait for Test { type Event = (); } -pub fn new_test_ext( - ext_deposit: u64, +pub struct ExtBuilder { + existential_deposit: u64, session_length: u64, sessions_per_era: u64, current_era: u64, monied: bool, - reward: u64 -) -> runtime_io::TestExternalities { - let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - let balance_factor = if ext_deposit > 0 { - 256 - } else { - 1 - }; - t.extend(consensus::GenesisConfig::{ - code: vec![], - authorities: vec![], - }.build_storage().unwrap().0); - t.extend(session::GenesisConfig::{ - session_length, - validators: vec![10, 20], - }.build_storage().unwrap().0); - t.extend(balances::GenesisConfig::{ - balances: if monied { - if reward > 0 { - vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 30 * balance_factor), (4, 40 * balance_factor), (10, balance_factor), (20, balance_factor)] - } else { - vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 30 * balance_factor), (4, 40 * balance_factor)] - } + reward: u64, +} + +impl Default for ExtBuilder { + fn default() -> Self { + Self { + existential_deposit: 0, + session_length: 3, + sessions_per_era: 3, + current_era: 0, + monied: true, + reward: 10, + } + } +} + +impl ExtBuilder { + pub fn existential_deposit(mut self, existential_deposit: u64) -> Self { + self.existential_deposit = existential_deposit; + self + } + pub fn session_length(mut self, session_length: u64) -> Self { + self.session_length = session_length; + self + } + pub fn sessions_per_era(mut self, sessions_per_era: u64) -> Self { + self.sessions_per_era = sessions_per_era; + self + } + pub fn _current_era(mut self, current_era: u64) -> Self { + self.current_era = current_era; + self + } + pub fn _monied(mut self, monied: bool) -> Self { + self.monied = monied; + self + } + pub fn reward(mut self, reward: u64) -> Self { + self.reward = reward; + self + } + pub fn build(self) -> runtime_io::TestExternalities { + let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; + let balance_factor = if self.existential_deposit > 0 { + 256 } else { - vec![(10, balance_factor), (20, balance_factor)] - }, - existential_deposit: ext_deposit, - transfer_fee: 0, - creation_fee: 0, - vesting: vec![], - }.build_storage().unwrap().0); - t.extend(GenesisConfig::{ - sessions_per_era, - current_era, - intentions: vec![10, 20], - validator_count: 2, - minimum_validator_count: 0, - bonding_duration: sessions_per_era * session_length * 3, - session_reward: Perbill::from_millionths((1000000 * reward / balance_factor) as u32), - offline_slash: if monied { Perbill::from_percent(40) } else { Perbill::zero() }, - current_session_reward: reward, - current_offline_slash: 20, - offline_slash_grace: 0, - invulnerables: vec![], - }.build_storage().unwrap().0); - t.extend(timestamp::GenesisConfig::{ - period: 5, - }.build_storage().unwrap().0); - runtime_io::TestExternalities::new(t) + 1 + }; + t.extend(consensus::GenesisConfig::{ + code: vec![], + authorities: vec![], + }.build_storage().unwrap().0); + t.extend(session::GenesisConfig::{ + session_length: self.session_length, + validators: vec![10, 20], + keys: vec![], + }.build_storage().unwrap().0); + t.extend(balances::GenesisConfig::{ + balances: if self.monied { + if self.reward > 0 { + vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 300 * balance_factor), (4, 400 * balance_factor), (10, balance_factor), (11, balance_factor * 1000), (20, balance_factor), (21, balance_factor * 2000)] + } else { + vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 300 * balance_factor), (4, 400 * balance_factor)] + } + } else { + vec![(10, balance_factor), (11, balance_factor * 1000), (20, balance_factor), (21, balance_factor * 2000)] + }, + existential_deposit: self.existential_deposit, + transfer_fee: 0, + creation_fee: 0, + vesting: vec![], + }.build_storage().unwrap().0); + t.extend(GenesisConfig::{ + sessions_per_era: self.sessions_per_era, + current_era: self.current_era, + stakers: vec![(11, 10, balance_factor * 1000), (21, 20, balance_factor * 2000)], + validator_count: 2, + minimum_validator_count: 0, + bonding_duration: self.sessions_per_era * self.session_length * 3, + session_reward: Perbill::from_millionths((1000000 * self.reward / balance_factor) as u32), + offline_slash: if self.monied { Perbill::from_percent(40) } else { Perbill::zero() }, + current_session_reward: self.reward, + current_offline_slash: 20, + offline_slash_grace: 0, + invulnerables: vec![], + }.build_storage().unwrap().0); + t.extend(timestamp::GenesisConfig::{ + period: 5, + }.build_storage().unwrap().0); + t.into() + } } pub type System = system::Module; diff --git a/srml/staking/src/tests.rs b/srml/staking/src/tests.rs index ecc506ba3d0a1..5ca7a46801e9a 100644 --- a/srml/staking/src/tests.rs +++ b/srml/staking/src/tests.rs @@ -20,423 +20,538 @@ use super::*; use runtime_io::with_externalities; -use srml_support::{assert_ok, assert_noop}; -use mock::{Balances, Session, Staking, System, Timestamp, Test, new_test_ext, Origin}; +use srml_support::{assert_ok, assert_noop, EnumerableStorageMap}; +use mock::{Balances, Session, Staking, System, Timestamp, Test, ExtBuilder, Origin}; use srml_support::traits::Currency; #[test] -fn note_null_offline_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { +fn basic_setup_works() { + // Verifies initial conditions of mock + // TODO: Verify this check is comprehensive + // - Session Per Era, Session Reward + with_externalities(&mut ExtBuilder::default().build(), + || { + assert_eq!(Staking::bonded(&11), Some(10)); // Account 11 is stashed and locked, and account 10 is the controller + assert_eq!(Staking::bonded(&21), Some(20)); // Account 21 is stashed and locked, and account 20 is the controller + assert_eq!(Staking::bonded(&1), None); // Account 1 is not a stashed + + // Account 10 controls the stash from account 11, which is 100 * balance_factor units + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] })); + // Account 20 controls the stash from account 21, which is 200 * balance_factor units + assert_eq!(Staking::ledger(&20), Some(StakingLedger { stash: 21, total: 2000, active: 2000, unlocking: vec![] })); + // Account 1 does not control any stash + assert_eq!(Staking::ledger(&1), None); + + // ValidatorPrefs are default, thus unstake_threshold is 3, other values are default for their type + assert_eq!(>::enumerate().collect::>(), vec![ + (20, ValidatorPrefs { unstake_threshold: 3, validator_payment: 0 }), + (10, ValidatorPrefs { unstake_threshold: 3, validator_payment: 0 }) + ]); + + // Account 10 is exposed by 100 * balance_factor from their own stash in account 11 + assert_eq!(Staking::stakers(10), Exposure { total: 1000, own: 1000, others: vec![] }); + assert_eq!(Staking::stakers(20), Exposure { total: 2000, own: 2000, others: vec![] }); + }); +} + + +#[test] +fn no_offline_should_work() { + // Test the staking module works when no validators are offline + with_externalities(&mut ExtBuilder::default().build(), + || { + // Slashing begins for validators immediately if found offline assert_eq!(Staking::offline_slash_grace(), 0); + // Account 10 has not been reported offline assert_eq!(Staking::slash_count(&10), 0); + // Account 10 has `balance_factor` free balance assert_eq!(Balances::free_balance(&10), 1); - System::set_extrinsic_index(1); + // Nothing happens to Account 10, as expected assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 1); + // New era is not being forced assert!(Staking::forcing_new_era().is_none()); }); } #[test] fn invulnerability_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { + // Test that users can be invulnerable from slashing and being kicked + with_externalities(&mut ExtBuilder::default().build(), + || { + // Make account 10 invulnerable assert_ok!(Staking::set_invulnerables(vec![10])); + // Give account 10 some funds Balances::set_free_balance(&10, 70); + // There is no slash grade period assert_eq!(Staking::offline_slash_grace(), 0); + // Account 10 has not been slashed assert_eq!(Staking::slash_count(&10), 0); + // Account 10 has the 70 funds we gave it above assert_eq!(Balances::free_balance(&10), 70); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::slash_count(&10), 0); - assert_eq!(Balances::free_balance(&10), 70); - assert!(Staking::forcing_new_era().is_none()); - }); -} + // Account 10 should be a validator + assert!(>::exists(&10)); -#[test] -fn note_offline_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - Balances::set_free_balance(&10, 70); - assert_eq!(Staking::offline_slash_grace(), 0); + // Set account 10 as an offline validator with a large number of reports + // Should exit early if invulnerable + Staking::on_offline_validator(10, 100); + + // Show that account 10 has not been touched assert_eq!(Staking::slash_count(&10), 0); assert_eq!(Balances::free_balance(&10), 70); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::slash_count(&10), 1); - assert_eq!(Balances::free_balance(&10), 50); + assert!(>::exists(&10)); + // New era not being forced assert!(Staking::forcing_new_era().is_none()); }); } #[test] -fn note_offline_exponent_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - Balances::set_free_balance(&10, 150); +fn offline_should_slash_and_kick() { + // Test that an offline validator gets slashed and kicked + with_externalities(&mut ExtBuilder::default().build(), || { + // Give account 10 some balance + Balances::set_free_balance(&10, 1000); + // Confirm account 10 is a validator + assert!(>::exists(&10)); + // Validators get slashed immediately assert_eq!(Staking::offline_slash_grace(), 0); + // Unstake threshold is 3 + assert_eq!(Staking::validators(&10).unstake_threshold, 3); + // Account 10 has not been slashed before assert_eq!(Staking::slash_count(&10), 0); - assert_eq!(Balances::free_balance(&10), 150); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::slash_count(&10), 1); - assert_eq!(Balances::free_balance(&10), 130); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::slash_count(&10), 2); - assert_eq!(Balances::free_balance(&10), 90); - assert!(Staking::forcing_new_era().is_none()); + // Account 10 has the funds we just gave it + assert_eq!(Balances::free_balance(&10), 1000); + // Report account 10 as offline, one greater than unstake threshold + Staking::on_offline_validator(10, 4); + // Confirm user has been reported + assert_eq!(Staking::slash_count(&10), 4); + // Confirm `slot_stake` is greater than exponential punishment, else math below will be different + assert!(Staking::slot_stake() > 2_u64.pow(3) * 20); + // Confirm balance has been reduced by 2^unstake_threshold * current_offline_slash() + assert_eq!(Balances::free_balance(&10), 1000 - 2_u64.pow(3) * 20); + // Confirm account 10 has been removed as a validator + assert!(!>::exists(&10)); + // A new era is forced due to slashing + assert!(Staking::forcing_new_era().is_some()); }); } #[test] -fn note_offline_grace_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { +fn offline_grace_should_delay_slashing() { + // Tests that with grace, slashing is delayed + with_externalities(&mut ExtBuilder::default().build(), || { + // Initialize account 10 with balance Balances::set_free_balance(&10, 70); - Balances::set_free_balance(&20, 70); - assert_ok!(Staking::set_offline_slash_grace(1)); - assert_eq!(Staking::offline_slash_grace(), 1); - - assert_eq!(Staking::slash_count(&10), 0); + // Verify account 10 has balance assert_eq!(Balances::free_balance(&10), 70); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::slash_count(&10), 1); - assert_eq!(Balances::free_balance(&10), 70); - assert_eq!(Staking::slash_count(&20), 0); - assert_eq!(Balances::free_balance(&20), 70); - - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - Staking::on_offline_validator(20, 1); - assert_eq!(Staking::slash_count(&10), 2); - assert_eq!(Balances::free_balance(&10), 50); - assert_eq!(Staking::slash_count(&20), 1); - assert_eq!(Balances::free_balance(&20), 70); - assert!(Staking::forcing_new_era().is_none()); - }); -} + // Set offline slash grace + let offline_slash_grace = 1; + assert_ok!(Staking::set_offline_slash_grace(offline_slash_grace)); + assert_eq!(Staking::offline_slash_grace(), 1); -#[test] -fn note_offline_force_unstake_session_change_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - Balances::set_free_balance(&10, 70); - Balances::set_free_balance(&20, 70); - assert_ok!(Staking::stake(Origin::signed(1))); + // Check unstaked_threshold is 3 (default) + let default_unstake_threshold = 3; + assert_eq!(Staking::validators(&10), ValidatorPrefs { unstake_threshold: default_unstake_threshold, validator_payment: 0 }); + // Check slash count is zero assert_eq!(Staking::slash_count(&10), 0); - assert_eq!(Balances::free_balance(&10), 70); - assert_eq!(Staking::intentions(), vec![10, 20, 1]); - assert_eq!(Session::validators(), vec![10, 20]); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Balances::free_balance(&10), 50); - assert_eq!(Staking::slash_count(&10), 1); - assert_eq!(Staking::intentions(), vec![10, 20, 1]); + // Report account 10 up to the threshold + Staking::on_offline_validator(10, default_unstake_threshold as usize + offline_slash_grace as usize); + // Confirm slash count + assert_eq!(Staking::slash_count(&10), 4); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - assert_eq!(Staking::intentions(), vec![1, 20]); - assert_eq!(Balances::free_balance(&10), 10); - assert!(Staking::forcing_new_era().is_some()); - }); -} - -#[test] -fn note_offline_auto_unstake_session_change_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - Balances::set_free_balance(&10, 7000); - Balances::set_free_balance(&20, 7000); - assert_ok!(Staking::register_preferences(Origin::signed(10), 0, ValidatorPrefs { unstake_threshold: 1, validator_payment: 0 })); - - assert_eq!(Staking::intentions(), vec![10, 20]); - - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - Staking::on_offline_validator(20, 1); - assert_eq!(Balances::free_balance(&10), 6980); - assert_eq!(Balances::free_balance(&20), 6980); - assert_eq!(Staking::intentions(), vec![10, 20]); - assert!(Staking::forcing_new_era().is_none()); + // Nothing should happen + assert_eq!(Balances::free_balance(&10), 70); - System::set_extrinsic_index(1); + // Report account 10 one more time Staking::on_offline_validator(10, 1); - Staking::on_offline_validator(20, 1); - assert_eq!(Balances::free_balance(&10), 6940); - assert_eq!(Balances::free_balance(&20), 6940); - assert_eq!(Staking::intentions(), vec![20]); + assert_eq!(Staking::slash_count(&10), 5); + // User gets slashed + assert_eq!(Balances::free_balance(&10), 0); + // New era is forced assert!(Staking::forcing_new_era().is_some()); - - System::set_extrinsic_index(1); - Staking::on_offline_validator(20, 1); - assert_eq!(Balances::free_balance(&10), 6940); - assert_eq!(Balances::free_balance(&20), 6860); - assert_eq!(Staking::intentions(), vec![20]); - - System::set_extrinsic_index(1); - Staking::on_offline_validator(20, 1); - assert_eq!(Balances::free_balance(&10), 6940); - assert_eq!(Balances::free_balance(&20), 6700); - assert_eq!(Staking::intentions(), vec![0u64; 0]); }); } #[test] fn rewards_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { + // should check that: + // 1) rewards get recorded per session + // 2) rewards get paid per Era + // 3) (bonus) Check that nominators are also rewarded + with_externalities(&mut ExtBuilder::default().build(), + || { + let delay = 2; + // this test is only in the scope of one era. Since this variable changes + // at the last block/new era, we'll save it. + let session_reward = 10; + + // Set payee to controller + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); + + // Initial config should be correct assert_eq!(Staking::era_length(), 9); assert_eq!(Staking::sessions_per_era(), 3); assert_eq!(Staking::last_era_length_change(), 0); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Balances::total_balance(&10), 1); - System::set_block_number(3); - Timestamp::set_timestamp(15); // on time. - Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_session_reward(), 10); + + // check the balance of a validator accounts. + assert_eq!(Balances::total_balance(&10), 1); + // and the nominator (to-be) + assert_eq!(Balances::total_balance(&2), 20); + + // add a dummy nominator. + // NOTE: this nominator is being added 'manually'. a Further test (nomination_and_reward..) will add it via '.nominate()' + >::insert(&10, Exposure { + own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. + total: 1000, + others: vec![IndividualExposure {who: 2, value: 500 }] + }); + >::insert(&2, RewardDestination::Controller); + + + let mut block = 3; + // Block 3 => Session 1 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // on time. + Session::check_rotate_session(System::block_number()); // QUESTIONS: why this matters ? assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - assert_eq!(Balances::total_balance(&10), 11); - System::set_block_number(6); - Timestamp::set_timestamp(31); // a little late + + // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. + assert_eq!(Staking::current_session_reward(), session_reward); + assert_eq!(Staking::current_era_reward(), session_reward); + + block = 6; // Block 6 => Session 2 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5 + delay); // a little late. Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 2); - assert_eq!(Balances::total_balance(&10), 20); // less reward - System::set_block_number(9); - Timestamp::set_timestamp(50); // very late + + // session reward is the same, + assert_eq!(Staking::current_session_reward(), session_reward); + // though 2 will be deducted while stashed in the era reward due to delay + assert_eq!(Staking::current_era_reward(), 2*session_reward - delay); + + block = 9; // Block 9 => Session 3 => Era 1 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // back to being punktlisch. no delayss Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 1); assert_eq!(Session::current_index(), 3); - assert_eq!(Balances::total_balance(&10), 27); // much less reward + + assert_eq!(Balances::total_balance(&10), 1 + (3*session_reward - delay)/2); + assert_eq!(Balances::total_balance(&2), 20 + (3*session_reward - delay)/2); }); } #[test] -fn slashing_should_work() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - assert_eq!(Staking::era_length(), 9); - assert_eq!(Staking::sessions_per_era(), 3); - assert_eq!(Staking::last_era_length_change(), 0); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 0); +fn multi_era_reward_should_work() { + // should check that: + // The value of current_session_reward is set at the end of each era, based on + // slot_stake and session_reward. Check and verify this. + with_externalities(&mut ExtBuilder::default().build(), + || { + let delay = 0; + let session_reward = 10; + + // This is set by the test config builder. + assert_eq!(Staking::current_session_reward(), session_reward); + + // check the balance of a validator accounts. assert_eq!(Balances::total_balance(&10), 1); - System::set_block_number(3); - Session::check_rotate_session(System::block_number()); + // Set payee to controller + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); + + let mut block = 3; + // Block 3 => Session 1 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // on time. + Session::check_rotate_session(System::block_number()); // QUESTIONS: why this matters ? assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 1); - assert_eq!(Balances::total_balance(&10), 11); - System::set_block_number(6); + // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. + assert_eq!(Staking::current_session_reward(), session_reward); + assert_eq!(Staking::current_era_reward(), session_reward); + + block = 6; // Block 6 => Session 2 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5 + delay); // a little late. Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 2); - assert_eq!(Balances::total_balance(&10), 21); - System::set_block_number(7); - System::set_extrinsic_index(1); - Staking::on_offline_validator(10, 1); - Staking::on_offline_validator(20, 1); - assert_eq!(Balances::total_balance(&10), 1); - }); -} + assert_eq!(Staking::current_session_reward(), session_reward); + assert_eq!(Staking::current_era_reward(), 2*session_reward - delay); + block = 9; // Block 9 => Session 3 => Era 1 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // back to being punktlisch. no delayss + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 1); + assert_eq!(Session::current_index(), 3); + // 1 + sum of of the session rewards accumulated + let recorded_balance = 1 + 3*session_reward - delay; + assert_eq!(Balances::total_balance(&10), recorded_balance); + + // the reward for next era will be: session_reward * slot_stake + let new_session_reward = Staking::session_reward() * Staking::slot_stake(); + assert_eq!(Staking::current_session_reward(), new_session_reward); + + // fast forward to next era: + block=12;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + block=15;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + + // intermediate test. + assert_eq!(Staking::current_era_reward(), 2*new_session_reward); + + block=18;System::set_block_number(block);Timestamp::set_timestamp(block*5);Session::check_rotate_session(System::block_number()); + + // pay time + assert_eq!(Balances::total_balance(&10), 3*new_session_reward + recorded_balance); + }); +} #[test] fn staking_should_work() { - with_externalities(&mut new_test_ext(0, 1, 2, 0, true, 0), || { - - assert_eq!(Staking::era_length(), 2); + // should test: + // * new validators can be added to the default set + // * new ones will be chosen per era (+ based on phragmen) + // * either one can unlock the stash and back-down from being a validator. + with_externalities(&mut ExtBuilder::default().session_length(1).build(), || { + assert_eq!(Staking::era_length(), 3); assert_eq!(Staking::validator_count(), 2); + // remember + compare this along with the test. assert_eq!(Session::validators(), vec![10, 20]); - assert_ok!(Staking::set_bonding_duration(2)); assert_eq!(Staking::bonding_duration(), 2); - // Block 1: Add three validators. No obvious change. + // --- Block 1: System::set_block_number(1); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_ok!(Staking::stake(Origin::signed(2))); - assert_ok!(Staking::stake(Origin::signed(4))); + // give the man some coins + Balances::set_free_balance(&3, 3000); + // initial stakers: vec![(11, 10, balance_factor * 100), (21, 20, balance_factor * 200)], + // account 3 controlled by 4. + assert_ok!(Staking::bond(Origin::signed(3), 4, 1500, RewardDestination::Controller)); // balance of 3 = 3000, stashed = 1500 + Session::check_rotate_session(System::block_number()); assert_eq!(Staking::current_era(), 0); + // No effects will be seen so far.s assert_eq!(Session::validators(), vec![10, 20]); + - // Block 2: New validator set now. + // --- Block 2: System::set_block_number(2); + // Explicitly state the desire to validate for all of them. + // note that the controller account will state interest as representative of the stash-controller pair. + assert_ok!(Staking::validate(Origin::signed(4), ValidatorPrefs { unstake_threshold: 3, validator_payment: 0 })); + Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 1); - assert_eq!(Session::validators(), vec![4, 2]); + assert_eq!(Staking::current_era(), 0); + // No effects will be seen so far. Era has not been yet triggered. + assert_eq!(Session::validators(), vec![10, 20]); + - // Block 3: Unstake highest, introduce another staker. No change yet. + // --- Block 3: the validators will now change. System::set_block_number(3); - assert_ok!(Staking::stake(Origin::signed(3))); - assert_ok!(Staking::unstake(Origin::signed(4), (Staking::intentions().iter().position(|&x| x == 4).unwrap() as u32).into())); - assert_eq!(Staking::current_era(), 1); Session::check_rotate_session(System::block_number()); - // Block 4: New era - validators change. + // TODO: the assertion in the section should be changed to something in sync with how phragmen works. + // for now just check that some arbitrary "two validators" have been chosen. + assert_eq!(Session::validators().len(), 2); + assert_eq!(Session::validators(), vec![4, 20]); + assert_eq!(Staking::current_era(), 1); + + + // --- Block 4: Unstake 4 as a validator, freeing up the balance stashed in 3 System::set_block_number(4); - Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 2); - assert_eq!(Session::validators(), vec![3, 2]); - // Block 5: Transfer stake from highest to lowest. No change yet. - System::set_block_number(5); - assert_ok!(Balances::transfer(Origin::signed(4), 1, 40)); + // unlock the entire stashed value. + Staking::unbond(Origin::signed(4), Staking::ledger(&4).unwrap().active).unwrap(); + Session::check_rotate_session(System::block_number()); - - // Block 6: Lowest now validator. - System::set_block_number(6); + // nothing should be changed so far. + assert_eq!(Session::validators(), vec![4, 20]); + assert_eq!(Staking::current_era(), 1); + + + // --- Block 5: nothing. 4 is still there. + System::set_block_number(5); Session::check_rotate_session(System::block_number()); - assert_eq!(Session::validators(), vec![1, 3]); + assert_eq!(Session::validators(), vec![4, 20]); + assert_eq!(Staking::current_era(), 1); - // Block 7: Unstake three. No change yet. - System::set_block_number(7); - assert_ok!(Staking::unstake(Origin::signed(3), (Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32).into())); - Session::check_rotate_session(System::block_number()); - assert_eq!(Session::validators(), vec![1, 3]); - // Block 8: Back to one and two. - System::set_block_number(8); + // --- Block 6: 4 will be not be a validator as it has nothing in stash. + System::set_block_number(6); Session::check_rotate_session(System::block_number()); - assert_eq!(Session::validators(), vec![1, 2]); + assert_eq!(Session::validators().contains(&4), false); }); } + #[test] fn nominating_and_rewards_should_work() { - with_externalities(&mut new_test_ext(0, 1, 1, 0, true, 10), || { + // TODO: This should be rewritten and tested with the Phragmen algorithm + // For now it tests a functionality which somehow overlaps with other tests: + // the fact that the nominator is rewarded properly. + with_externalities(&mut ExtBuilder::default() + .session_length(1).sessions_per_era(1).build(), + || { + let session_reward = 10; + let initial_balance = 1000; assert_eq!(Staking::era_length(), 1); assert_eq!(Staking::validator_count(), 2); assert_eq!(Staking::bonding_duration(), 3); assert_eq!(Session::validators(), vec![10, 20]); - System::set_block_number(1); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_ok!(Staking::stake(Origin::signed(2))); - assert_ok!(Staking::stake(Origin::signed(3))); - assert_ok!(Staking::nominate(Origin::signed(4), 1)); - Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 1); - assert_eq!(Session::validators(), vec![1, 3]); // 4 + 1, 3 - assert_eq!(Balances::total_balance(&1), 10); - assert_eq!(Balances::total_balance(&2), 20); - assert_eq!(Balances::total_balance(&3), 30); - assert_eq!(Balances::total_balance(&4), 40); + // Set payee to controller + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); + assert_ok!(Staking::set_payee(Origin::signed(20), RewardDestination::Controller)); - System::set_block_number(2); - assert_ok!(Staking::unnominate(Origin::signed(4), 0)); - Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 2); - assert_eq!(Session::validators(), vec![3, 2]); - assert_eq!(Balances::total_balance(&1), 16); - assert_eq!(Balances::total_balance(&2), 20); - assert_eq!(Balances::total_balance(&3), 60); - assert_eq!(Balances::total_balance(&4), 64); + // default reward for the first session. + assert_eq!(Staking::current_session_reward(), session_reward); - System::set_block_number(3); - assert_ok!(Staking::stake(Origin::signed(4))); - assert_ok!(Staking::unstake(Origin::signed(3), (Staking::intentions().iter().position(|&x| x == 3).unwrap() as u32).into())); - assert_ok!(Staking::nominate(Origin::signed(3), 1)); - Session::check_rotate_session(System::block_number()); - assert_eq!(Session::validators(), vec![1, 4]); - assert_eq!(Balances::total_balance(&1), 16); - assert_eq!(Balances::total_balance(&2), 40); - assert_eq!(Balances::total_balance(&3), 80); - assert_eq!(Balances::total_balance(&4), 64); + // give the man some money + for i in 1..5 { Balances::set_free_balance(&i, initial_balance); } + Balances::set_free_balance(&10, initial_balance); + Balances::set_free_balance(&20, initial_balance); - System::set_block_number(4); - Session::check_rotate_session(System::block_number()); - assert_eq!(Balances::total_balance(&1), 26); - assert_eq!(Balances::total_balance(&2), 40); - assert_eq!(Balances::total_balance(&3), 133); - assert_eq!(Balances::total_balance(&4), 128); - }); -} -#[test] -fn rewards_with_off_the_table_should_work() { - with_externalities(&mut new_test_ext(0, 1, 1, 0, true, 10), || { System::set_block_number(1); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_ok!(Staking::nominate(Origin::signed(2), 1)); - assert_ok!(Staking::stake(Origin::signed(3))); + // record their balances. + for i in 1..5 { assert_eq!(Balances::total_balance(&i), initial_balance); } + + + // bond two account pairs and state interest in nomination. + // NOTE: in the current naive version only the first vote matters and will be chosen anyhow. + + // 2 will nominate for 10, 10 has 1000 in stash, 500 will be 1/3 of the total 1500 + assert_ok!(Staking::bond(Origin::signed(1), 2, 500, RewardDestination::Controller)); + assert_ok!(Staking::nominate(Origin::signed(2), vec![10, 20])); + // 4 will nominate for 20, 20 has 2000 in stash, 500 will be 1/5 of the total 2500 + assert_ok!(Staking::bond(Origin::signed(3), 4, 500, RewardDestination::Stash)); + assert_ok!(Staking::nominate(Origin::signed(4), vec![20, 10])); + + Session::check_rotate_session(System::block_number()); - assert_eq!(Session::validators(), vec![1, 3]); // 1 + 2, 3 - assert_eq!(Balances::total_balance(&1), 10); - assert_eq!(Balances::total_balance(&2), 20); - assert_eq!(Balances::total_balance(&3), 30); + assert_eq!(Staking::current_era(), 1); + // validators will not change, since selection currently is actually not dependent on nomination and votes, only stake. + assert_eq!(Session::validators(), vec![10, 20]); + // avalidators must have already received some rewards. + assert_eq!(Balances::total_balance(&10), initial_balance + session_reward); + assert_eq!(Balances::total_balance(&20), initial_balance + session_reward); + System::set_block_number(2); - assert_ok!(Staking::register_preferences( - Origin::signed(1), - (Staking::intentions().into_iter().position(|i| i == 1).unwrap() as u32).into(), - ValidatorPrefs { unstake_threshold: 3, validator_payment: 4 } - )); + // next session reward. + let new_session_reward = Staking::session_reward() * Staking::slot_stake(); + // nothing else will happen, era ends and rewards are paid again, + // it is expected that nominators will also be paid. Session::check_rotate_session(System::block_number()); - assert_eq!(Balances::total_balance(&1), 22); - assert_eq!(Balances::total_balance(&2), 37); - assert_eq!(Balances::total_balance(&3), 60); + + + // Nominator 2: staked 1/3 of the total, gets 1/3 of the reward, chose controller as destination + assert_eq!(Balances::total_balance(&2), initial_balance + new_session_reward/3); + // The Associated validator will get the other 2/3 + assert_eq!(Balances::total_balance(&10), initial_balance + session_reward + 2*new_session_reward/3); + + // Nominator 4: staked 1/5 of the total, gets 1/5 of the reward, chose stash as destination + // This means that the reward will go to 3, which is bonded as the stash of 4. + assert_eq!(Balances::total_balance(&3), initial_balance + new_session_reward/5); + // The Associated validator will get the other 4/5 + assert_eq!(Balances::total_balance(&20), initial_balance + session_reward + 4*new_session_reward/5); }); } #[test] -fn nominating_slashes_should_work() { - with_externalities(&mut new_test_ext(0, 2, 2, 0, true, 10), || { - assert_eq!(Staking::era_length(), 4); +fn nominators_also_get_slashed() { + // A nominator should be slashed if the validator they nominated is slashed + with_externalities(&mut ExtBuilder::default() + .session_length(1).sessions_per_era(1).build(), + || { + assert_eq!(Staking::era_length(), 1); assert_eq!(Staking::validator_count(), 2); - assert_eq!(Staking::bonding_duration(), 12); + // slash happens immediately. + assert_eq!(Staking::offline_slash_grace(), 0); + // Account 10 has not been reported offline + assert_eq!(Staking::slash_count(&10), 0); + // initial validators assert_eq!(Session::validators(), vec![10, 20]); - System::set_block_number(2); - Session::check_rotate_session(System::block_number()); + // Set payee to controller + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Controller)); - Timestamp::set_timestamp(15); - System::set_block_number(4); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_ok!(Staking::stake(Origin::signed(3))); - assert_ok!(Staking::nominate(Origin::signed(2), 3)); - assert_ok!(Staking::nominate(Origin::signed(4), 1)); - Session::check_rotate_session(System::block_number()); + // give the man some money. + let initial_balance = 1000; + for i in 1..3 { Balances::set_free_balance(&i, initial_balance); } + Balances::set_free_balance(&10, initial_balance); - assert_eq!(Staking::current_era(), 1); - assert_eq!(Session::validators(), vec![1, 3]); // 1 + 4, 3 + 2 - assert_eq!(Balances::total_balance(&1), 10); - assert_eq!(Balances::total_balance(&2), 20); - assert_eq!(Balances::total_balance(&3), 30); - assert_eq!(Balances::total_balance(&4), 40); + // 2 will nominate for 10 + let nominator_stake = 500; + assert_ok!(Staking::bond(Origin::signed(1), 2, nominator_stake, RewardDestination::default())); + assert_ok!(Staking::nominate(Origin::signed(2), vec![10, 20])); - System::set_block_number(5); - System::set_extrinsic_index(1); - Staking::on_offline_validator(1, 1); - Staking::on_offline_validator(3, 1); - assert_eq!(Balances::total_balance(&1), 0); //slashed - assert_eq!(Balances::total_balance(&2), 20); //not slashed - assert_eq!(Balances::total_balance(&3), 10); //slashed - assert_eq!(Balances::total_balance(&4), 30); //slashed + // new era, pay rewards, + System::set_block_number(2); + Session::check_rotate_session(System::block_number()); + + // 10 goes offline + Staking::on_offline_validator(10, 4); + let slash_value = Staking::current_offline_slash()*8; + let expo = Staking::stakers(10); + let actual_slash = expo.own.min(slash_value); + let nominator_actual_slash = nominator_stake.min(expo.total - actual_slash); + // initial + first era reward + slash + assert_eq!(Balances::total_balance(&10), initial_balance + 10 - actual_slash); + assert_eq!(Balances::total_balance(&2), initial_balance - nominator_actual_slash); + assert!(Staking::forcing_new_era().is_some()); }); } #[test] fn double_staking_should_fail() { - with_externalities(&mut new_test_ext(0, 1, 2, 0, true, 0), || { + // should test (in the same order): + // * an account already bonded as controller CAN be reused as the controller of another account. + // * an account already bonded as stash cannot be the controller of another account. + // * an account already bonded as stash cannot nominate. + // * an account already bonded as controller can nominate. + with_externalities(&mut ExtBuilder::default() + .session_length(1).sessions_per_era(2).build(), + || { + let arbitrary_value = 5; System::set_block_number(1); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_noop!(Staking::stake(Origin::signed(1)), "Cannot stake if already staked."); - assert_noop!(Staking::nominate(Origin::signed(1), 1), "Cannot nominate if already staked."); - assert_ok!(Staking::nominate(Origin::signed(2), 1)); - assert_noop!(Staking::stake(Origin::signed(2)), "Cannot stake if already nominating."); - assert_noop!(Staking::nominate(Origin::signed(2), 1), "Cannot nominate if already nominating."); + // 2 = controller, 1 stashed => ok + assert_ok!(Staking::bond(Origin::signed(1), 2, arbitrary_value, RewardDestination::default())); + // 2 = controller, 3 stashed (Note that 2 is reused.) => ok + assert_ok!(Staking::bond(Origin::signed(3), 2, arbitrary_value, RewardDestination::default())); + // 4 = not used so far, 1 stashed => not allowed. + assert_noop!(Staking::bond(Origin::signed(1), 4, arbitrary_value, RewardDestination::default()), "stash already bonded"); + // 1 = stashed => attempting to nominate should fail. + assert_noop!(Staking::nominate(Origin::signed(1), vec![1]), "not a controller"); + // 2 = controller => nominating should work. + assert_ok!(Staking::nominate(Origin::signed(2), vec![1])); }); } #[test] -fn staking_eras_work() { - with_externalities(&mut new_test_ext(0, 1, 2, 0, true, 0), || { +fn session_and_eras_work() { + with_externalities(&mut ExtBuilder::default() + .session_length(1) + .sessions_per_era(2) + .reward(10) + .build(), + || { assert_eq!(Staking::era_length(), 2); assert_eq!(Staking::sessions_per_era(), 2); assert_eq!(Staking::last_era_length_change(), 0); @@ -503,97 +618,513 @@ fn staking_eras_work() { } #[test] -fn staking_balance_transfer_when_bonded_should_not_work() { - with_externalities(&mut new_test_ext(0, 1, 3, 1, false, 0), || { - Balances::set_free_balance(&1, 111); - assert_ok!(Staking::stake(Origin::signed(1))); - assert_noop!(Balances::transfer(Origin::signed(1), 2, 69), "cannot transfer illiquid funds"); +fn cannot_transfer_staked_balance() { + // Tests that a stash account cannot transfer funds + with_externalities(&mut ExtBuilder::default().build(), || { + // Confirm account 11 is stashed + assert_eq!(Staking::bonded(&11), Some(10)); + // Confirm account 11 has some free balance + assert_eq!(Balances::free_balance(&11), 1000); + // Confirm account 11 (via controller 10) is totally staked + assert_eq!(Staking::stakers(&10).total, 1000); + // Confirm account 11 cannot transfer as a result + assert_noop!(Balances::transfer(Origin::signed(11), 20, 1), "stash with too much under management"); + + // Give account 11 extra free balance + Balances::set_free_balance(&11, 10000); + // Confirm that account 11 can now transfer some balance + assert_ok!(Balances::transfer(Origin::signed(11), 20, 1)); }); } + + #[test] -fn deducting_balance_when_bonded_should_not_work() { - with_externalities(&mut new_test_ext(0, 1, 3, 1, false, 0), || { - Balances::set_free_balance(&1, 111); - >::insert(1, 2); - System::set_block_number(1); - assert_eq!(Staking::unlock_block(&1), LockStatus::LockedUntil(2)); - assert_noop!(Balances::reserve(&1, 69), "cannot transfer illiquid funds"); +fn cannot_reserve_staked_balance() { + // Checks that a bonded account cannot reserve balance from free balance + with_externalities(&mut ExtBuilder::default().build(), || { + // Confirm account 11 is stashed + assert_eq!(Staking::bonded(&11), Some(10)); + // Confirm account 11 has some free balance + assert_eq!(Balances::free_balance(&11), 1000); + // Confirm account 11 (via controller 10) is totally staked + assert_eq!(Staking::stakers(&10).total, 1000); + // Confirm account 11 cannot transfer as a result + assert_noop!(Balances::reserve(&11, 1), "stash with too much under management"); + + // Give account 11 extra free balance + Balances::set_free_balance(&11, 10000); + // Confirm account 11 can now reserve balance + assert_ok!(Balances::reserve(&11, 1)); }); } #[test] -fn slash_value_calculation_does_not_overflow() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { - assert_eq!(Staking::era_length(), 9); - assert_eq!(Staking::sessions_per_era(), 3); - assert_eq!(Staking::last_era_length_change(), 0); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 0); - assert_eq!(Balances::total_balance(&10), 1); - assert_eq!(Staking::intentions(), vec![10, 20]); +fn max_unstake_threshold_works() { + // Tests that max_unstake_threshold gets used when prefs.unstake_threshold is large + with_externalities(&mut ExtBuilder::default().build(), || { + const MAX_UNSTAKE_THRESHOLD: u32 = 10; + // Two users with maximum possible balance + Balances::set_free_balance(&10, u64::max_value()); + Balances::set_free_balance(&20, u64::max_value()); + + // Give them full exposer as a staker + >::insert(&10, Exposure { total: u64::max_value(), own: u64::max_value(), others: vec![]}); + >::insert(&20, Exposure { total: u64::max_value(), own: u64::max_value(), others: vec![]}); + + // Check things are initialized correctly + assert_eq!(Balances::free_balance(&10), u64::max_value()); + assert_eq!(Balances::free_balance(&20), u64::max_value()); + assert_eq!(Balances::free_balance(&10), Balances::free_balance(&20)); assert_eq!(Staking::offline_slash_grace(), 0); + assert_eq!(Staking::current_offline_slash(), 20); + // Account 10 will have max unstake_threshold + assert_ok!(Staking::validate(Origin::signed(10), ValidatorPrefs { + unstake_threshold: MAX_UNSTAKE_THRESHOLD, + validator_payment: 0, + })); + // Account 20 could not set their unstake_threshold past 10 + assert_noop!(Staking::validate(Origin::signed(20), ValidatorPrefs { + unstake_threshold: 11, + validator_payment: 0}), + "unstake threshold too large" + ); + // Give Account 20 unstake_threshold 11 anyway, should still be limited to 10 + >::insert(20, ValidatorPrefs { + unstake_threshold: 11, + validator_payment: 0, + }); - // set validator preferences so the validator doesn't back down after - // slashing. - >::insert(10, ValidatorPrefs { - unstake_threshold: u32::max_value(), + // Make slot_stake really large, as to not affect punishment curve + >::put(u64::max_value()); + // Confirm `slot_stake` is greater than exponential punishment, else math below will be different + assert!(Staking::slot_stake() > 2_u64.pow(MAX_UNSTAKE_THRESHOLD) * 20); + + // Report each user 1 more than the max_unstake_threshold + Staking::on_offline_validator(10, MAX_UNSTAKE_THRESHOLD as usize + 1); + Staking::on_offline_validator(20, MAX_UNSTAKE_THRESHOLD as usize + 1); + + // Show that each balance only gets reduced by 2^max_unstake_threshold + assert_eq!(Balances::free_balance(&10), u64::max_value() - 2_u64.pow(MAX_UNSTAKE_THRESHOLD) * 20); + assert_eq!(Balances::free_balance(&20), u64::max_value() - 2_u64.pow(MAX_UNSTAKE_THRESHOLD) * 20); + }); +} + +#[test] +fn slashing_does_not_cause_underflow() { + // Tests that slashing more than a user has does not underflow + with_externalities(&mut ExtBuilder::default().build(), || { + // One user with less than `max_value` will test underflow does not occur + Balances::set_free_balance(&10, 1); + + // Verify initial conditions + assert_eq!(Balances::free_balance(&10), 1); + assert_eq!(Staking::offline_slash_grace(), 0); + + // Set validator preference so that 2^unstake_threshold would cause overflow (greater than 64) + >::insert(10, ValidatorPrefs { + unstake_threshold: 10, validator_payment: 0, }); + // Should not panic + Staking::on_offline_validator(10, 100); + // Confirm that underflow has not occurred, and account balance is set to zero + assert_eq!(Balances::free_balance(&10), 0); + }); +} + + +#[test] +fn reward_destination_works() { + // Rewards go to the correct destination as determined in Payee + with_externalities(&mut ExtBuilder::default() + .sessions_per_era(1) + .session_length(1) + .build(), + || { + // Check that account 10 is a validator + assert!(>::exists(10)); + // Check the balance of the validator account + assert_eq!(Balances::free_balance(&10), 1); + // Check the balance of the stash account + assert_eq!(Balances::free_balance(&11), 1000); + // Check these two accounts are bonded + assert_eq!(Staking::bonded(&11), Some(10)); + // Check how much is at stake + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] })); + // Track current session reward + let mut current_session_reward = Staking::current_session_reward(); + + // Move forward the system for payment + System::set_block_number(1); + Timestamp::set_timestamp(5); + Session::check_rotate_session(System::block_number()); + + // Check that RewardDestination is Staked (default) + assert_eq!(Staking::payee(&10), RewardDestination::Staked); + // Check current session reward is 10 + assert_eq!(current_session_reward, 10); + // Check that reward went to the stash account + assert_eq!(Balances::free_balance(&11), 1000 + 10); + // Check that amount at stake increased accordingly + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 10, active: 1000 + 10, unlocking: vec![] })); + // Update current session reward + current_session_reward = Staking::current_session_reward(); + + //Change RewardDestination to Stash + >::insert(&10, RewardDestination::Stash); + + // Move forward the system for payment + System::set_block_number(2); + Timestamp::set_timestamp(10); + Session::check_rotate_session(System::block_number()); + + // Check that RewardDestination is Stash + assert_eq!(Staking::payee(&10), RewardDestination::Stash); + // Check that reward went to the stash account + assert_eq!(Balances::free_balance(&11), 1010 + current_session_reward); + // Check that amount at stake is not increased + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1010, active: 1010, unlocking: vec![] })); + // Update current session reward + current_session_reward = Staking::current_session_reward(); + + //Change RewardDestination to Controller + >::insert(&10, RewardDestination::Controller); + + // Move forward the system for payment System::set_block_number(3); + Timestamp::set_timestamp(15); Session::check_rotate_session(System::block_number()); - assert_eq!(Staking::current_era(), 0); - assert_eq!(Session::current_index(), 1); - assert_eq!(Balances::total_balance(&10), 11); - // the balance type is u64, so after slashing 64 times, - // the slash value should have overflowed. add a couple extra for - // good measure with the slash grace. - trait TypeEq {} - impl TypeEq for (A, A) {} - fn assert_type_eq() {} - assert_type_eq::<(u64, ::Balance)>(); + // Check that RewardDestination is Controller + assert_eq!(Staking::payee(&10), RewardDestination::Controller); + // Check that reward went to the controller account + assert_eq!(Balances::free_balance(&10), 1 + current_session_reward); + // Check that amount at stake is not increased + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1010, active: 1010, unlocking: vec![] })); - Staking::on_offline_validator(10, 100); }); + } #[test] -fn next_slash_value_calculation_does_not_overflow() { - with_externalities(&mut new_test_ext(0, 3, 3, 0, true, 10), || { +fn validator_payment_prefs_work() { + // Test that validator preferences are correctly honored + // Note: unstake threshold is being directly tested in slashing tests. + // This test will focus on validator payment. + with_externalities(&mut ExtBuilder::default().build(), + || { + let session_reward = 10; + let validator_cut = 5; + let validator_initial_balance = Balances::total_balance(&11); + // Initial config should be correct assert_eq!(Staking::era_length(), 9); assert_eq!(Staking::sessions_per_era(), 3); assert_eq!(Staking::last_era_length_change(), 0); assert_eq!(Staking::current_era(), 0); assert_eq!(Session::current_index(), 0); - assert_eq!(Balances::total_balance(&10), 1); - assert_eq!(Staking::intentions(), vec![10, 20]); - assert_eq!(Staking::offline_slash_grace(), 0); - // set validator preferences so the validator doesn't back down after - // slashing. - >::insert(10, ValidatorPrefs { - unstake_threshold: u32::max_value(), - validator_payment: 0, + assert_eq!(Staking::current_session_reward(), session_reward); + + // check the balance of a validator accounts. + assert_eq!(Balances::total_balance(&10), 1); + // check the balance of a validator's stash accounts. + assert_eq!(Balances::total_balance(&11), validator_initial_balance); + // and the nominator (to-be) + assert_eq!(Balances::total_balance(&2), 20); + + // add a dummy nominator. + // NOTE: this nominator is being added 'manually', use '.nominate()' to do it realistically. + >::insert(&10, Exposure { + own: 500, // equal division indicates that the reward will be equally divided among validator and nominator. + total: 1000, + others: vec![IndividualExposure {who: 2, value: 500 }] + }); + >::insert(&2, RewardDestination::Controller); + >::insert(&10, ValidatorPrefs { + unstake_threshold: 3, + validator_payment: validator_cut }); - // we have enough balance to cover the last slash before overflow - Balances::set_free_balance(&10, u64::max_value()); - assert_eq!(Balances::total_balance(&10), u64::max_value()); - - // the balance type is u64, so after slashing 64 times, - // the slash value should have overflowed. add a couple extra for - // good measure with the slash grace. - trait TypeEq {} - impl TypeEq for (A, A) {} - fn assert_type_eq() {} - assert_type_eq::<(u64, ::Balance)>(); - - // the total slash value should overflow the balance type - // therefore the total validator balance should be slashed - Staking::on_offline_validator(10, 100); + // ------------ Fast forward + let mut block = 3; + // Block 3 => Session 1 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // on time. + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 0); + assert_eq!(Session::current_index(), 1); + + // session triggered: the reward value stashed should be 10 -- defined in ExtBuilder genesis. + assert_eq!(Staking::current_session_reward(), session_reward); + assert_eq!(Staking::current_era_reward(), session_reward); + + block = 6; // Block 6 => Session 2 => Era 0 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); // a little late. + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 0); + assert_eq!(Session::current_index(), 2); + + assert_eq!(Staking::current_session_reward(), session_reward); + assert_eq!(Staking::current_era_reward(), 2*session_reward); + + block = 9; // Block 9 => Session 3 => Era 1 + System::set_block_number(block); + Timestamp::set_timestamp(block*5); + Session::check_rotate_session(System::block_number()); + assert_eq!(Staking::current_era(), 1); + assert_eq!(Session::current_index(), 3); + + // whats left to be shared is the sum of 3 rounds minus the validator's cut. + let shared_cut = 3 * session_reward - validator_cut; + // Validator's payee is Staked account, 11, reward will be paid here. + assert_eq!(Balances::total_balance(&11), validator_initial_balance + shared_cut/2 + validator_cut); + // Controller account will not get any reward. + assert_eq!(Balances::total_balance(&10), 1); + // Rest of the reward will be shared and paid to the nominator in stake. + assert_eq!(Balances::total_balance(&2), 20 + shared_cut/2); + }); +} + +#[test] +fn staking_ledger_grows_and_shrinks() { + // TODO: Show that staking ledger grows with new events + // TODO: Show that staking ledger shrinks when user is removed +} + +#[test] +fn consolidate_unlocked_works() { + // TODO: Figure out what it does and then test it +} - assert_eq!(Balances::total_balance(&10), 0); +#[test] +fn bond_extra_works() { + // Tests that extra `free_balance` in the stash can be added to stake + with_externalities(&mut ExtBuilder::default().build(), + || { + // Check that account 10 is a validator + assert!(>::exists(10)); + // Check that account 10 is bonded to account 11 + assert_eq!(Staking::bonded(&11), Some(10)); + // Check how much is at stake + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000, active: 1000, unlocking: vec![] })); + + // Give account 11 some large free balance greater than total + Balances::set_free_balance(&11, 1000000); + // Check the balance of the stash account + assert_eq!(Balances::free_balance(&11), 1000000); + + // Call the bond_extra function from controller, add only 100 + assert_ok!(Staking::bond_extra(Origin::signed(10), 100)); + // There should be 100 more `total` and `active` in the ledger + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000 + 100, active: 1000 + 100, unlocking: vec![] })); + + // Call the bond_extra function with a large number, should handle it + assert_ok!(Staking::bond_extra(Origin::signed(10), u64::max_value())); + // The full amount of the funds should now be in the total and active + assert_eq!(Staking::ledger(&10), Some(StakingLedger { stash: 11, total: 1000000, active: 1000000, unlocking: vec![] })); + + }); +} + +#[test] +fn withdraw_unbonded_works() { + // TODO: Learn what it is and test it +} + +#[test] +fn reporting_misbehaviors_work() { + // TODO: Does this code exist? +} + +#[test] +fn correct_number_of_validators_are_chosen() { + // TODO: Check that number is at least minimum, and at most what is set + // TODO: Test emergency conditions? +} + + +#[test] +fn slot_stake_is_least_staked_validator_and_limits_maximum_punishment() { + // TODO: Complete this test! + // Test that slot_stake is determined by the least staked validator + // Test that slot_stake is the maximum punishment that can happen to a validator + // Note that rewardDestination is the stash account by default + // Note that unlike reward slash will affect free_balance, not the stash account. + with_externalities(&mut ExtBuilder::default() + .session_length(1) + .sessions_per_era(1) + .build(), + || { + // Confirm validator count is 2 + assert_eq!(Staking::validator_count(), 2); + // Confirm account 10 and 20 are validators + assert!(>::exists(&10) && >::exists(&20)); + // Confirm 10 has less stake than 20 + assert!(Staking::stakers(&10).total < Staking::stakers(&20).total); + assert_eq!(Staking::stakers(&10).total, 1000); + assert_eq!(Staking::stakers(&20).total, 2000); + + // Give the man some money. + Balances::set_free_balance(&10, 1000); + Balances::set_free_balance(&20, 1000); + + // Confirm initial free balance. + assert_eq!(Balances::free_balance(&10), 1000); + assert_eq!(Balances::free_balance(&20), 1000); + + // We confirm initialized slot_stake is this value + assert_eq!(Staking::slot_stake(), Staking::stakers(&10).total); + + // Now lets lower account 20 stake + >::insert(&20, Exposure { total: 69, own: 69, others: vec![] }); + assert_eq!(Staking::stakers(&20).total, 69); + >::insert(&20, StakingLedger { stash: 22, total: 69, active: 69, unlocking: vec![] }); + + // New era --> rewards are paid --> stakes are changed + System::set_block_number(1); + Timestamp::set_timestamp(5); + Session::check_rotate_session(System::block_number()); + + assert_eq!(Staking::current_era(), 1); + // -- new balances + reward + assert_eq!(Staking::stakers(&10).total, 1000 + 10); + assert_eq!(Staking::stakers(&20).total, 69 + 10); + + // -- Note that rewards are going drectly to stash, not as free balance. + assert_eq!(Balances::free_balance(&10), 1000); + assert_eq!(Balances::free_balance(&20), 1000); + + // -- slot stake should also be updated. + assert_eq!(Staking::slot_stake(), 79); + + // // If 10 gets slashed now, despite having +1000 in stash, it will be slashed byt 79, which is the slot stake + Staking::on_offline_validator(10, 4); + // // Confirm user has been reported + assert_eq!(Staking::slash_count(&10), 4); + // // check the balance of 10 (slash will be deducted from free balance.) + assert_eq!(Balances::free_balance(&10), 1000 - 79); + }); } + + +#[test] +fn on_free_balance_zero_stash_removes_validator() { + // Tests that validator storage items are cleaned up when stash is empty + // Tests that storage items are untouched when controller is empty + with_externalities(&mut ExtBuilder::default() + .existential_deposit(10) + .build(), + || { + // Check that account 10 is a validator + assert!(>::exists(10)); + // Check the balance of the validator account + assert_eq!(Balances::free_balance(&10), 256); + // Check the balance of the stash account + assert_eq!(Balances::free_balance(&11), 256000); + // Check these two accounts are bonded + assert_eq!(Staking::bonded(&11), Some(10)); + + // Set some storage items which we expect to be cleaned up + // Initiate slash count storage item + Staking::on_offline_validator(10, 1); + // Set payee information + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash)); + + // Check storage items that should be cleaned up + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + + // Reduce free_balance of controller to 0 + Balances::set_free_balance(&10, 0); + // Check total balance of account 10 + assert_eq!(Balances::total_balance(&10), 0); + + // Check the balance of the stash account has not been touched + assert_eq!(Balances::free_balance(&11), 256000); + // Check these two accounts are still bonded + assert_eq!(Staking::bonded(&11), Some(10)); + + // Check storage items have not changed + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + + // Reduce free_balance of stash to 0 + Balances::set_free_balance(&11, 0); + // Check total balance of stash + assert_eq!(Balances::total_balance(&11), 0); + + // Check storage items do not exist + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&11)); + }); +} + +#[test] +fn on_free_balance_zero_stash_removes_nominator() { + // Tests that nominator storage items are cleaned up when stash is empty + // Tests that storage items are untouched when controller is empty + with_externalities(&mut ExtBuilder::default() + .existential_deposit(10) + .build(), + || { + // Make 10 a nominator + assert_ok!(Staking::nominate(Origin::signed(10), vec![20])); + // Check that account 10 is a nominator + assert!(>::exists(10)); + // Check the balance of the nominator account + assert_eq!(Balances::free_balance(&10), 256); + // Check the balance of the stash account + assert_eq!(Balances::free_balance(&11), 256000); + // Check these two accounts are bonded + assert_eq!(Staking::bonded(&11), Some(10)); + + // Set payee information + assert_ok!(Staking::set_payee(Origin::signed(10), RewardDestination::Stash)); + + + // Check storage items that should be cleaned up + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + + // Reduce free_balance of controller to 0 + Balances::set_free_balance(&10, 0); + // Check total balance of account 10 + assert_eq!(Balances::total_balance(&10), 0); + + // Check the balance of the stash account has not been touched + assert_eq!(Balances::free_balance(&11), 256000); + // Check these two accounts are still bonded + assert_eq!(Staking::bonded(&11), Some(10)); + + // Check storage items have not changed + assert!(>::exists(&10)); + assert!(>::exists(&10)); + assert!(>::exists(&10)); + + // Reduce free_balance of stash to 0 + Balances::set_free_balance(&11, 0); + // Check total balance of stash + assert_eq!(Balances::total_balance(&11), 0); + + // Check storage items do not exist + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&10)); + assert!(!>::exists(&11)); + }); +} \ No newline at end of file diff --git a/srml/support/src/traits.rs b/srml/support/src/traits.rs index 873f61e9611b7..81d0239e5cdc0 100644 --- a/srml/support/src/traits.rs +++ b/srml/support/src/traits.rs @@ -18,7 +18,9 @@ use crate::rstd::result; use crate::codec::Codec; -use crate::runtime_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, As}; +use crate::runtime_primitives::traits::{ + MaybeSerializeDebug, SimpleArithmetic, As +}; /// The account with the given id was killed. pub trait OnFreeBalanceZero { @@ -51,23 +53,58 @@ impl OnDilution for () { fn on_dilution(_minted: Balance, _portion: Balance) {} } -/// Determinator for whether a given account is able to transfer balance. -pub trait EnsureAccountLiquid { - /// Returns `Ok` iff the account is able to transfer funds normally. `Err(...)` - /// with the reason why not otherwise. +/// Determinator for whether a given account is able to use its **free** balance. +/// +/// By convention, `ensure_account_liquid` overrules `ensure_account_can_withdraw`. If a +/// caller gets `Ok` from the former, then they do not need to call the latter. +/// +/// This implies that if you define the latter away from its default of replicating the +/// former, then ensure you also redefine the former to return an `Err` in corresponding +/// situations, otherwise you'll end up giving inconsistent information. +// TODO: Remove in favour of explicit functionality in balances module: #1896 +pub trait EnsureAccountLiquid { + /// Ensures that the account is completely unencumbered. If this is `Ok` then there's no need to + /// check any other items. If it's an `Err`, then you must use one pair of the other items. fn ensure_account_liquid(who: &AccountId) -> result::Result<(), &'static str>; + + /// Returns `Ok` iff the account is able to make a withdrawal of the given amount + /// for the given reason. + /// + /// `Err(...)` with the reason why not otherwise. + /// + /// By default this just reflects the results of `ensure_account_liquid`. + /// + /// @warning If you redefine this away from the default, ensure that you define + /// `ensure_account_liquid` in accordance. + fn ensure_account_can_withdraw( + who: &AccountId, + _amount: Balance, + _reason: WithdrawReason + ) -> result::Result<(), &'static str> { + Self::ensure_account_liquid(who) + } } impl< AccountId, - X: EnsureAccountLiquid, - Y: EnsureAccountLiquid, -> EnsureAccountLiquid for (X, Y) { + Balance: Copy, + X: EnsureAccountLiquid, + Y: EnsureAccountLiquid, +> EnsureAccountLiquid for (X, Y) { fn ensure_account_liquid(who: &AccountId) -> result::Result<(), &'static str> { X::ensure_account_liquid(who)?; Y::ensure_account_liquid(who) } + + fn ensure_account_can_withdraw( + who: &AccountId, + amount: Balance, + reason: WithdrawReason + ) -> result::Result<(), &'static str> { + X::ensure_account_can_withdraw(who, amount, reason)?; + Y::ensure_account_can_withdraw(who, amount, reason) + } } -impl EnsureAccountLiquid for () { +impl EnsureAccountLiquid for () { fn ensure_account_liquid(_who: &AccountId) -> result::Result<(), &'static str> { Ok(()) } } @@ -102,7 +139,11 @@ pub trait Currency { fn can_reserve(who: &AccountId, value: Self::Balance) -> bool; /// The total amount of stake on the system. - fn total_issuance() -> Self:: Balance; + fn total_issuance() -> Self::Balance; + + /// The minimum balance any single account may have. This is equivalent to Balances module's + /// Existential Deposit. + fn minimum_balance() -> Self::Balance; /// The 'free' balance of a given account. /// @@ -185,3 +226,68 @@ pub trait Currency { value: Self::Balance ) -> result::Result, &'static str>; } + +/// Charge bytes fee trait +pub trait ChargeBytesFee { + /// Charge fees from `transactor` for an extrinsic (transaction) of encoded length + /// `encoded_len` bytes. Return Ok iff the payment was successful. + fn charge_base_bytes_fee(transactor: &AccountId, encoded_len: usize) -> Result<(), &'static str>; +} + +/// Charge fee trait +pub trait ChargeFee: ChargeBytesFee { + /// The type of fee amount. + type Amount; + + /// Charge `amount` of fees from `transactor`. Return Ok iff the payment was successful. + fn charge_fee(transactor: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; + + /// Refund `amount` of previous charged fees from `transactor`. Return Ok iff the refund was successful. + fn refund_fee(transactor: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; +} + +/// Reason for moving funds out of an account. +#[derive(Copy, Clone, Eq, PartialEq)] +#[cfg_attr(feature = "std", derive(Debug))] +pub enum WithdrawReason { + /// In order to pay for (system) transaction costs. + TransactionPayment, + /// In order to transfer ownership. + Transfer, + /// In order to reserve some funds for a later return or repatriation + Reserve, +} + +/// Transfer fungible asset trait +pub trait TransferAsset { + /// The type of asset amount. + type Amount; + + /// Transfer asset from `from` account to `to` account with `amount` of asset. + fn transfer(from: &AccountId, to: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; + + /// Remove asset from `who` account by deducting `amount` in the account balances. + fn withdraw(who: &AccountId, amount: Self::Amount, reason: WithdrawReason) -> Result<(), &'static str>; + + /// Add asset to `who` account by increasing `amount` in the account balances. + fn deposit(who: &AccountId, amount: Self::Amount) -> Result<(), &'static str>; +} + +impl ChargeBytesFee for () { + fn charge_base_bytes_fee(_: &T, _: usize) -> Result<(), &'static str> { Ok(()) } +} + +impl ChargeFee for () { + type Amount = (); + + fn charge_fee(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } + fn refund_fee(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } +} + +impl TransferAsset for () { + type Amount = (); + + fn transfer(_: &T, _: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } + fn withdraw(_: &T, _: Self::Amount, _: WithdrawReason) -> Result<(), &'static str> { Ok(()) } + fn deposit(_: &T, _: Self::Amount) -> Result<(), &'static str> { Ok(()) } +}