Skip to content
This repository has been archived by the owner on May 22, 2023. It is now read-only.

Commit

Permalink
Migrate pallet-randomness-collective-flip to pallet attribute macro (p…
Browse files Browse the repository at this point in the history
…aritytech#9061)

* migrate pallet-randomness-collective-flip to pallet attribute macro

Signed-off-by: koushiro <koushiro.cqx@gmail.com>

* fix some nits

Signed-off-by: koushiro <koushiro.cqx@gmail.com>

* remove some spacing things

Signed-off-by: koushiro <koushiro.cqx@gmail.com>

* remove space

Signed-off-by: koushiro <koushiro.cqx@gmail.com>

* use tabs

Signed-off-by: koushiro <koushiro.cqx@gmail.com>
  • Loading branch information
koushiro authored and Andrei Navoichyk committed Sep 9, 2022
1 parent c7b6524 commit 80238f4
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 35 deletions.
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@ impl frame_system::Config for Runtime {
type OnSetCode = ();
}

impl pallet_randomness_collective_flip::Config for Runtime {}

impl pallet_utility::Config for Runtime {
type Event = Event;
type Call = Call;
Expand Down
1 change: 1 addition & 0 deletions frame/contracts/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ impl frame_system::Config for Test {
type SS58Prefix = ();
type OnSetCode = ();
}
impl pallet_randomness_collective_flip::Config for Test {}
impl pallet_balances::Config for Test {
type MaxLocks = ();
type MaxReserves = ();
Expand Down
8 changes: 4 additions & 4 deletions frame/randomness-collective-flip/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,23 +16,23 @@ targets = ["x86_64-unknown-linux-gnu"]
safe-mix = { version = "1.0", default-features = false }
codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ["derive"] }
sp-runtime = { version = "3.0.0", default-features = false, path = "../../primitives/runtime" }
sp-std = { version = "3.0.0", default-features = false, path = "../../primitives/std" }

frame-support = { version = "3.0.0", default-features = false, path = "../support" }
frame-system = { version = "3.0.0", default-features = false, path = "../system" }
sp-std = { version = "3.0.0", default-features = false, path = "../../primitives/std" }

[dev-dependencies]
sp-core = { version = "3.0.0", path = "../../primitives/core" }
sp-io = { version = "3.0.0", path = "../../primitives/io" }
serde = { version = "1.0.101" }

[features]
default = ["std"]
std = [
"safe-mix/std",
"frame-system/std",
"codec/std",
"frame-support/std",
"sp-runtime/std",
"sp-std/std",
"frame-system/std",
"frame-support/std",
]
try-runtime = ["frame-support/try-runtime"]
86 changes: 56 additions & 30 deletions frame/randomness-collective-flip/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,41 @@
//! ### Example - Get random seed for the current block
//!
//! ```
//! use frame_support::{decl_module, dispatch, traits::Randomness};
//! use frame_support::traits::Randomness;
//!
//! pub trait Config: frame_system::Config {}
//! #[frame_support::pallet]
//! pub mod pallet {
//! use frame_support::pallet_prelude::*;
//! use frame_system::pallet_prelude::*;
//! use super::*;
//!
//! decl_module! {
//! pub struct Module<T: Config> for enum Call where origin: T::Origin {
//! #[weight = 0]
//! pub fn random_module_example(origin) -> dispatch::DispatchResult {
//! let _random_value = <pallet_randomness_collective_flip::Module<T>>::random(&b"my context"[..]);
//! Ok(())
//! }
//! }
//! #[pallet::pallet]
//! #[pallet::generate_store(pub(super) trait Store)]
//! pub struct Pallet<T>(_);
//!
//! #[pallet::config]
//! pub trait Config: frame_system::Config + pallet_randomness_collective_flip::Config {}
//!
//! #[pallet::call]
//! impl<T: Config> Pallet<T> {
//! #[pallet::weight(0)]
//! pub fn random_module_example(origin: OriginFor<T>) -> DispatchResult {
//! let _random_value = <pallet_randomness_collective_flip::Pallet<T>>::random(&b"my context"[..]);
//! Ok(())
//! }
//! }
//! }
//! # fn main() { }
//! ```
#![cfg_attr(not(feature = "std"), no_std)]

use sp_std::{prelude::*, convert::TryInto};
use sp_runtime::traits::{Hash, Saturating};
use frame_support::{
decl_module, decl_storage, traits::Randomness,
weights::Weight
};
use safe_mix::TripletMix;

use codec::Encode;
use frame_system::Config;
use sp_std::{prelude::*, convert::TryInto};
use sp_runtime::traits::{Hash, Saturating};
use frame_support::traits::Randomness;

const RANDOM_MATERIAL_LEN: u32 = 81;

Expand All @@ -73,8 +81,23 @@ fn block_number_to_index<T: Config>(block_number: T::BlockNumber) -> usize {
index.try_into().ok().expect("Something % 81 is always smaller than usize; qed")
}

decl_module! {
pub struct Module<T: Config> for enum Call where origin: T::Origin {
pub use pallet::*;

#[frame_support::pallet]
pub mod pallet {
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;
use super::*;

#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);

#[pallet::config]
pub trait Config: frame_system::Config {}

#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
fn on_initialize(block_number: T::BlockNumber) -> Weight {
let parent_hash = <frame_system::Pallet<T>>::parent_hash();

Expand All @@ -85,21 +108,20 @@ decl_module! {
values[index] = parent_hash;
});

0
T::DbWeight::get().reads_writes(1, 1)
}
}
}

decl_storage! {
trait Store for Module<T: Config> as RandomnessCollectiveFlip {
/// Series of block headers from the last 81 blocks that acts as random seed material. This
/// is arranged as a ring buffer with `block_number % 81` being the index into the `Vec` of
/// the oldest hash.
RandomMaterial get(fn random_material): Vec<T::Hash>;
}
/// Series of block headers from the last 81 blocks that acts as random seed material. This
/// is arranged as a ring buffer with `block_number % 81` being the index into the `Vec` of
/// the oldest hash.
#[pallet::storage]
#[pallet::getter(fn random_material)]
pub(super) type RandomMaterial<T: Config> =
StorageValue<_, Vec<T::Hash>, ValueQuery>;
}

impl<T: Config> Randomness<T::Hash, T::BlockNumber> for Module<T> {
impl<T: Config> Randomness<T::Hash, T::BlockNumber> for Pallet<T> {
/// This randomness uses a low-influence function, drawing upon the block hashes from the
/// previous 81 blocks. Its result for any given subject will be known far in advance by anyone
/// observing the chain. Any block producer has significant influence over their block hashes
Expand Down Expand Up @@ -140,13 +162,15 @@ impl<T: Config> Randomness<T::Hash, T::BlockNumber> for Module<T> {
mod tests {
use crate as pallet_randomness_collective_flip;
use super::*;

use sp_core::H256;
use sp_runtime::{
testing::Header,
traits::{BlakeTwo256, Header as _, IdentityLookup},
};
use frame_system::limits;

use frame_support::{parameter_types, traits::{Randomness, OnInitialize}};
use frame_system::limits;

type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
type Block = frame_system::mocking::MockBlock<Test>;
Expand Down Expand Up @@ -196,6 +220,8 @@ mod tests {
type OnSetCode = ();
}

impl pallet_randomness_collective_flip::Config for Test {}

fn new_test_ext() -> sp_io::TestExternalities {
let t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();
t.into()
Expand Down

0 comments on commit 80238f4

Please sign in to comment.