mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 12:51:02 +00:00
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:
@@ -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();
|
||||||
|
|||||||
@@ -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]]);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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::*;
|
||||||
|
|||||||
BIN
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user