A random beacon (#96)

* Completely rework dispatch mechanism into something modular.

Not yet complete but 75% there.

* Council vote tests.

* Fix tests.

* whitespace.

* Fix demo runtime tests.

* Fix up tests.

* Remove dead code.

* Initial util code for random beacon

* Timestamp uses new storage API.

* Move over system module to new API.

* Much nicer storage API, moved over staking module.

* More refactoring.

* Democracy uses new storage API.

* Council uses new RPC.

* Fix more tests.

* Use match for Id

* Generic mix.

* Integrate random beacon

* Update binaries.

* Fixes relating to with_ext removal.

* Remove dead code.

* Rework mixer into an iterator adaptor.

* Link to paper.

* Algorithm cleanups

* Merge and fix test.

* Docs.

* Fix typo.

* rename

* Fix tests.
This commit is contained in:
Gav Wood
2018-03-20 10:48:11 +08:00
committed by GitHub
parent eff4a092dd
commit 5a30f38992
6 changed files with 44 additions and 35 deletions
+9 -9
View File
@@ -189,7 +189,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Approve it. Era length changes. // Block 1: Make proposal. Approve it. Era length changes.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::approve(&two, 1); public::approve(&two, 1);
staking::internal::check_new_era(); staking::internal::check_new_era();
@@ -212,13 +212,13 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Fail it. // Block 1: Make proposal. Fail it.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
staking::internal::check_new_era(); staking::internal::check_new_era();
assert_eq!(staking::era_length(), 1); assert_eq!(staking::era_length(), 1);
// Block 2: Make proposal. Approve it. It should change era length. // Block 2: Make proposal. Approve it. It should change era length.
with_env(|e| e.block_number = 2); system::testing::set_block_number(2);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::approve(&two, 2); public::approve(&two, 2);
staking::internal::check_new_era(); staking::internal::check_new_era();
@@ -241,7 +241,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
staking::internal::check_new_era(); staking::internal::check_new_era();
assert_eq!(staking::era_length(), 1); assert_eq!(staking::era_length(), 1);
@@ -264,7 +264,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::approve(&two, 0); public::approve(&two, 0);
staking::internal::check_new_era(); staking::internal::check_new_era();
@@ -288,7 +288,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::approve(&two, 1); public::approve(&two, 1);
public::approve(&two, 1); public::approve(&two, 1);
@@ -313,7 +313,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::propose(&two, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&two, &Proposal::StakingSetSessionsPerEra(2));
staking::internal::check_new_era(); staking::internal::check_new_era();
@@ -337,7 +337,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::approve(&two, 1); public::approve(&two, 1);
staking::internal::check_new_era(); staking::internal::check_new_era();
assert_eq!(staking::era_length(), 1); assert_eq!(staking::era_length(), 1);
@@ -361,7 +361,7 @@ mod tests {
assert!(!session::validators().into_iter().position(|v| &v == &one).is_none()); assert!(!session::validators().into_iter().position(|v| &v == &one).is_none());
// Block 1: Make proposal. Will have only 1 vote. No change. // Block 1: Make proposal. Will have only 1 vote. No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
public::propose(&one, &Proposal::StakingSetSessionsPerEra(2)); public::propose(&one, &Proposal::StakingSetSessionsPerEra(2));
public::approve(&four, 1); public::approve(&four, 1);
staking::internal::check_new_era(); staking::internal::check_new_era();
+11 -11
View File
@@ -217,46 +217,46 @@ mod tests {
let mut t = simple_setup(); let mut t = simple_setup();
with_externalities(&mut t, || { with_externalities(&mut t, || {
// Block 1: Change to length 3; no visible change. // Block 1: Change to length 3; no visible change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
set_length(3); set_length(3);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 2); assert_eq!(length(), 2);
assert_eq!(current_index(), 0); assert_eq!(current_index(), 0);
// Block 2: Length now changed to 3. Index incremented. // Block 2: Length now changed to 3. Index incremented.
with_env(|e| e.block_number = 2); system::testing::set_block_number(2);
set_length(3); set_length(3);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 3); assert_eq!(length(), 3);
assert_eq!(current_index(), 1); assert_eq!(current_index(), 1);
// Block 3: Length now changed to 3. Index incremented. // Block 3: Length now changed to 3. Index incremented.
with_env(|e| e.block_number = 3); system::testing::set_block_number(3);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 3); assert_eq!(length(), 3);
assert_eq!(current_index(), 1); assert_eq!(current_index(), 1);
// Block 4: Change to length 2; no visible change. // Block 4: Change to length 2; no visible change.
with_env(|e| e.block_number = 4); system::testing::set_block_number(4);
set_length(2); set_length(2);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 3); assert_eq!(length(), 3);
assert_eq!(current_index(), 1); assert_eq!(current_index(), 1);
// Block 5: Length now changed to 2. Index incremented. // Block 5: Length now changed to 2. Index incremented.
with_env(|e| e.block_number = 5); system::testing::set_block_number(5);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 2); assert_eq!(length(), 2);
assert_eq!(current_index(), 2); assert_eq!(current_index(), 2);
// Block 6: No change. // Block 6: No change.
with_env(|e| e.block_number = 6); system::testing::set_block_number(6);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 2); assert_eq!(length(), 2);
assert_eq!(current_index(), 2); assert_eq!(current_index(), 2);
// Block 7: Next index. // Block 7: Next index.
with_env(|e| e.block_number = 7); system::testing::set_block_number(7);
check_rotate_session(); check_rotate_session();
assert_eq!(length(), 2); assert_eq!(length(), 2);
assert_eq!(current_index(), 3); assert_eq!(current_index(), 3);
@@ -268,17 +268,17 @@ mod tests {
let mut t = simple_setup(); let mut t = simple_setup();
with_externalities(&mut t, || { with_externalities(&mut t, || {
// Block 1: No change // Block 1: No change
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
check_rotate_session(); check_rotate_session();
assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]);
// Block 2: Session rollover, but no change. // Block 2: Session rollover, but no change.
with_env(|e| e.block_number = 2); system::testing::set_block_number(2);
check_rotate_session(); check_rotate_session();
assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]);
// Block 3: Set new key for validator 2; no visible change. // Block 3: Set new key for validator 2; no visible change.
with_env(|e| e.block_number = 3); system::testing::set_block_number(3);
set_key(&[20; 32], &[22; 32]); set_key(&[20; 32], &[22; 32]);
assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]);
@@ -286,7 +286,7 @@ mod tests {
assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]);
// Block 4: Session rollover, authority 2 changes. // Block 4: Session rollover, authority 2 changes.
with_env(|e| e.block_number = 4); system::testing::set_block_number(4);
check_rotate_session(); check_rotate_session();
assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]); assert_eq!(consensus::authorities(), vec![[11u8; 32], [22u8; 32]]);
}); });
+15 -15
View File
@@ -310,7 +310,7 @@ mod tests {
assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]);
// Block 1: Add three validators. No obvious change. // Block 1: Add three validators. No obvious change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
stake(&one); stake(&one);
stake(&two); stake(&two);
stake(&four); stake(&four);
@@ -318,39 +318,39 @@ mod tests {
assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]);
// Block 2: New validator set now. // Block 2: New validator set now.
with_env(|e| e.block_number = 2); system::testing::set_block_number(2);
check_new_era(); check_new_era();
assert_eq!(session::validators(), vec![four.clone(), two.clone()]); assert_eq!(session::validators(), vec![four.clone(), two.clone()]);
// Block 3: Unstake highest, introduce another staker. No change yet. // Block 3: Unstake highest, introduce another staker. No change yet.
with_env(|e| e.block_number = 3); system::testing::set_block_number(3);
stake(&three); stake(&three);
unstake(&four); unstake(&four);
check_new_era(); check_new_era();
// Block 4: New era - validators change. // Block 4: New era - validators change.
with_env(|e| e.block_number = 4); system::testing::set_block_number(4);
check_new_era(); check_new_era();
assert_eq!(session::validators(), vec![three.clone(), two.clone()]); assert_eq!(session::validators(), vec![three.clone(), two.clone()]);
// Block 5: Transfer stake from highest to lowest. No change yet. // Block 5: Transfer stake from highest to lowest. No change yet.
with_env(|e| e.block_number = 5); system::testing::set_block_number(5);
transfer(&four, &one, 40); transfer(&four, &one, 40);
check_new_era(); check_new_era();
// Block 6: Lowest now validator. // Block 6: Lowest now validator.
with_env(|e| e.block_number = 6); system::testing::set_block_number(6);
check_new_era(); check_new_era();
assert_eq!(session::validators(), vec![one.clone(), three.clone()]); assert_eq!(session::validators(), vec![one.clone(), three.clone()]);
// Block 7: Unstake three. No change yet. // Block 7: Unstake three. No change yet.
with_env(|e| e.block_number = 7); system::testing::set_block_number(7);
unstake(&three); unstake(&three);
check_new_era(); check_new_era();
assert_eq!(session::validators(), vec![one.clone(), three.clone()]); assert_eq!(session::validators(), vec![one.clone(), three.clone()]);
// Block 8: Back to one and two. // Block 8: Back to one and two.
with_env(|e| e.block_number = 8); system::testing::set_block_number(8);
check_new_era(); check_new_era();
assert_eq!(session::validators(), vec![one.clone(), two.clone()]); assert_eq!(session::validators(), vec![one.clone(), two.clone()]);
}); });
@@ -369,21 +369,21 @@ mod tests {
assert_eq!(current_era(), 0u64); assert_eq!(current_era(), 0u64);
// Block 1: No change. // Block 1: No change.
with_env(|e| e.block_number = 1); system::testing::set_block_number(1);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 2u64); assert_eq!(sessions_per_era(), 2u64);
assert_eq!(last_era_length_change(), 0u64); assert_eq!(last_era_length_change(), 0u64);
assert_eq!(current_era(), 0u64); assert_eq!(current_era(), 0u64);
// Block 2: Simple era change. // Block 2: Simple era change.
with_env(|e| e.block_number = 2); system::testing::set_block_number(2);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 2u64); assert_eq!(sessions_per_era(), 2u64);
assert_eq!(last_era_length_change(), 0u64); assert_eq!(last_era_length_change(), 0u64);
assert_eq!(current_era(), 1u64); assert_eq!(current_era(), 1u64);
// Block 3: Schedule an era length change; no visible changes. // Block 3: Schedule an era length change; no visible changes.
with_env(|e| e.block_number = 3); system::testing::set_block_number(3);
set_sessions_per_era(3); set_sessions_per_era(3);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 2u64); assert_eq!(sessions_per_era(), 2u64);
@@ -391,28 +391,28 @@ mod tests {
assert_eq!(current_era(), 1u64); assert_eq!(current_era(), 1u64);
// Block 4: Era change kicks in. // Block 4: Era change kicks in.
with_env(|e| e.block_number = 4); system::testing::set_block_number(4);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 3u64); assert_eq!(sessions_per_era(), 3u64);
assert_eq!(last_era_length_change(), 4u64); assert_eq!(last_era_length_change(), 4u64);
assert_eq!(current_era(), 2u64); assert_eq!(current_era(), 2u64);
// Block 5: No change. // Block 5: No change.
with_env(|e| e.block_number = 5); system::testing::set_block_number(5);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 3u64); assert_eq!(sessions_per_era(), 3u64);
assert_eq!(last_era_length_change(), 4u64); assert_eq!(last_era_length_change(), 4u64);
assert_eq!(current_era(), 2u64); assert_eq!(current_era(), 2u64);
// Block 6: No change. // Block 6: No change.
with_env(|e| e.block_number = 6); system::testing::set_block_number(6);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 3u64); assert_eq!(sessions_per_era(), 3u64);
assert_eq!(last_era_length_change(), 4u64); assert_eq!(last_era_length_change(), 4u64);
assert_eq!(current_era(), 2u64); assert_eq!(current_era(), 2u64);
// Block 7: Era increment. // Block 7: Era increment.
with_env(|e| e.block_number = 7); system::testing::set_block_number(7);
check_new_era(); check_new_era();
assert_eq!(sessions_per_era(), 3u64); assert_eq!(sessions_per_era(), 3u64);
assert_eq!(last_era_length_change(), 4u64); assert_eq!(last_era_length_change(), 4u64);
+9
View File
@@ -264,6 +264,15 @@ fn info_expect_equal_hash(given: &Hash, expected: &Hash) {
} }
} }
#[cfg(any(feature = "std", test))]
pub mod testing {
use super::*;
pub fn set_block_number(n: BlockNumber) {
with_env(|e| e.block_number = n);
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;