mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-11-09 04:07:07 +00:00
Serialisable genesis config (#229)
* Genesis serialization * Custom type for AuthorityId * Merge w master * Fixed a few minor issues * Fixed unmerged file * Renamed tag * Deferred genesis loading * Upated wasm runtime * Minor issues
This commit is contained in:
1 parent
276c464b50
commit
9b885ba092
51 files changed
+557
-368
No files matched your search
@@ -82,7 +82,7 @@ impl<H> From<PrimitiveJustification<H>> for UncheckedJustification<H> {
|
||||
round_number: just.round_number as usize,
|
||||
digest: just.hash,
|
||||
signatures: just.signatures.into_iter().map(|(from, sig)| LocalizedSignature {
|
||||
signer: ed25519::Public(from),
|
||||
signer: from.into(),
|
||||
signature: sig,
|
||||
}).collect(),
|
||||
}
|
||||
@@ -183,7 +183,7 @@ impl<B: Block, P: Proposer<B>> generic::Context for BftInstance<B, P>
|
||||
type EvaluateProposal = <P::Evaluate as IntoFuture>::Future;
|
||||
|
||||
fn local_id(&self) -> AuthorityId {
|
||||
self.key.public().0
|
||||
self.key.public().into()
|
||||
}
|
||||
|
||||
fn proposal(&self) -> Self::CreateProposal {
|
||||
@@ -345,7 +345,7 @@ impl<B, P, I> BftService<B, P, I>
|
||||
/// Get the local Authority ID.
|
||||
pub fn local_id(&self) -> AuthorityId {
|
||||
// TODO: based on a header and some keystore.
|
||||
self.key.public().0
|
||||
self.key.public().into()
|
||||
}
|
||||
|
||||
/// Signal that a valid block with the given header has been imported.
|
||||
@@ -445,7 +445,7 @@ fn check_justification_signed_message<H>(authorities: &[AuthorityId], message: &
|
||||
{
|
||||
// TODO: return additional error information.
|
||||
just.check(authorities.len() - max_faulty_of(authorities.len()), |_, _, sig| {
|
||||
let auth_id = sig.signer.0;
|
||||
let auth_id = sig.signer.clone().into();
|
||||
if !authorities.contains(&auth_id) { return None }
|
||||
|
||||
if ed25519::verify_strong(&sig.signature, message, &sig.signer) {
|
||||
@@ -565,7 +565,7 @@ pub fn sign_message<B: Block + Clone>(message: Message<B>, key: &ed25519::Pair,
|
||||
round_number: r,
|
||||
proposal,
|
||||
digest: header_hash,
|
||||
sender: signer.0,
|
||||
sender: signer.clone().into(),
|
||||
digest_signature: sign_action(action_header),
|
||||
full_signature: sign_action(action_propose),
|
||||
})
|
||||
@@ -579,7 +579,7 @@ pub fn sign_message<B: Block + Clone>(message: Message<B>, key: &ed25519::Pair,
|
||||
|
||||
::generic::LocalizedMessage::Vote(::generic::LocalizedVote {
|
||||
vote: vote,
|
||||
sender: signer.0,
|
||||
sender: signer.clone().into(),
|
||||
signature: sign_action(action),
|
||||
})
|
||||
}
|
||||
@@ -705,10 +705,10 @@ mod tests {
|
||||
fn future_gets_preempted() {
|
||||
let client = FakeClient {
|
||||
authorities: vec![
|
||||
Keyring::One.to_raw_public(),
|
||||
Keyring::Two.to_raw_public(),
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Eve.to_raw_public(),
|
||||
Keyring::One.to_raw_public().into(),
|
||||
Keyring::Two.to_raw_public().into(),
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Eve.to_raw_public().into(),
|
||||
],
|
||||
imported_heights: Mutex::new(HashSet::new()),
|
||||
};
|
||||
@@ -755,10 +755,10 @@ mod tests {
|
||||
let hash = [0xff; 32].into();
|
||||
|
||||
let authorities = vec![
|
||||
Keyring::One.to_raw_public(),
|
||||
Keyring::Two.to_raw_public(),
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Eve.to_raw_public(),
|
||||
Keyring::One.to_raw_public().into(),
|
||||
Keyring::Two.to_raw_public().into(),
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Eve.to_raw_public().into(),
|
||||
];
|
||||
|
||||
let authorities_keys = vec![
|
||||
@@ -816,8 +816,8 @@ mod tests {
|
||||
let parent_hash = Default::default();
|
||||
|
||||
let authorities = vec![
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Eve.to_raw_public(),
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Eve.to_raw_public().into(),
|
||||
];
|
||||
|
||||
let block = TestBlock {
|
||||
@@ -853,8 +853,8 @@ mod tests {
|
||||
let hash: H256 = [0xff; 32].into();
|
||||
|
||||
let authorities = vec![
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Eve.to_raw_public(),
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Eve.to_raw_public().into(),
|
||||
];
|
||||
|
||||
let vote = sign_message::<TestBlock>(::generic::Message::Vote(::generic::Vote::Prepare(1, hash)), &Keyring::Alice.pair(), parent_hash);;
|
||||
|
||||
@@ -168,7 +168,7 @@ impl<B, E, Block> Client<B, E, Block> where
|
||||
build_genesis_storage: S,
|
||||
) -> error::Result<Self> {
|
||||
if backend.blockchain().header(BlockId::Number(Zero::zero()))?.is_none() {
|
||||
let genesis_storage = build_genesis_storage.build_storage();
|
||||
let genesis_storage = build_genesis_storage.build_storage()?;
|
||||
let genesis_block = genesis::construct_genesis_block::<Block>(&genesis_storage);
|
||||
info!("Initialising Genesis block/state (state: {}, header-hash: {})", genesis_block.header().state_root(), genesis_block.header().hash());
|
||||
let mut op = backend.begin_operation(BlockId::Hash(Default::default()))?;
|
||||
@@ -497,9 +497,9 @@ mod tests {
|
||||
|
||||
assert_eq!(client.info().unwrap().chain.best_number, 0);
|
||||
assert_eq!(client.authorities_at(&BlockId::Number(0)).unwrap(), vec![
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Bob.to_raw_public(),
|
||||
Keyring::Charlie.to_raw_public()
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Bob.to_raw_public().into(),
|
||||
Keyring::Charlie.to_raw_public().into()
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ mod tests {
|
||||
#[test]
|
||||
fn construct_genesis_should_work_with_native() {
|
||||
let mut storage = GenesisConfig::new_simple(
|
||||
vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000
|
||||
vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 1000
|
||||
).genesis_map();
|
||||
let block = construct_genesis_block::<Block>(&storage);
|
||||
let genesis_hash = block.header.hash();
|
||||
@@ -148,7 +148,7 @@ mod tests {
|
||||
#[test]
|
||||
fn construct_genesis_should_work_with_wasm() {
|
||||
let mut storage = GenesisConfig::new_simple(
|
||||
vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 1000
|
||||
vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 1000
|
||||
).genesis_map();
|
||||
let block = construct_genesis_block::<Block>(&storage);
|
||||
let genesis_hash = block.header.hash();
|
||||
@@ -171,7 +171,7 @@ mod tests {
|
||||
#[should_panic]
|
||||
fn construct_genesis_with_bad_transaction_should_panic() {
|
||||
let mut storage = GenesisConfig::new_simple(
|
||||
vec![Keyring::One.to_raw_public(), Keyring::Two.to_raw_public()], 68
|
||||
vec![Keyring::One.to_raw_public().into(), Keyring::Two.to_raw_public().into()], 68
|
||||
).genesis_map();
|
||||
let block = construct_genesis_block::<Block>(&storage);
|
||||
let genesis_hash = block.header.hash();
|
||||
|
||||
@@ -23,7 +23,7 @@ extern crate untrusted;
|
||||
extern crate blake2_rfc;
|
||||
|
||||
use ring::{rand, signature};
|
||||
use primitives::hash::H512;
|
||||
use primitives::{hash::H512, AuthorityId};
|
||||
use base58::{ToBase58, FromBase58};
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -166,6 +166,18 @@ impl AsRef<Pair> for Pair {
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<AuthorityId> for Public {
|
||||
fn into(self) -> AuthorityId {
|
||||
AuthorityId(self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<AuthorityId> for Public {
|
||||
fn from(id: AuthorityId) -> Self {
|
||||
Public(id.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl ::std::fmt::Display for Public {
|
||||
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||
write!(f, "{}", self.to_ss58check())
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -127,7 +127,7 @@ mod tests {
|
||||
let hash_2 = [1; 32].into();
|
||||
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&key.public().0,
|
||||
&key.public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoublePrepare(
|
||||
1,
|
||||
@@ -139,7 +139,7 @@ mod tests {
|
||||
// same signature twice is not misbehavior.
|
||||
let signed = sign_prepare(&key, 1, hash_1, parent_hash);
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&key.public().0,
|
||||
&key.public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoublePrepare(
|
||||
1,
|
||||
@@ -150,7 +150,7 @@ mod tests {
|
||||
|
||||
// misbehavior has wrong target.
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&Keyring::Two.to_raw_public(),
|
||||
&Keyring::Two.to_raw_public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoublePrepare(
|
||||
1,
|
||||
@@ -168,7 +168,7 @@ mod tests {
|
||||
let hash_2 = [1; 32].into();
|
||||
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&key.public().0,
|
||||
&key.public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoubleCommit(
|
||||
1,
|
||||
@@ -180,7 +180,7 @@ mod tests {
|
||||
// same signature twice is not misbehavior.
|
||||
let signed = sign_commit(&key, 1, hash_1, parent_hash);
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&key.public().0,
|
||||
&key.public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoubleCommit(
|
||||
1,
|
||||
@@ -191,7 +191,7 @@ mod tests {
|
||||
|
||||
// misbehavior has wrong target.
|
||||
assert!(evaluate_misbehavior::<Block, H256>(
|
||||
&Keyring::Two.to_raw_public(),
|
||||
&Keyring::Two.to_raw_public().into(),
|
||||
parent_hash,
|
||||
&MisbehaviorKind::BftDoubleCommit(
|
||||
1,
|
||||
|
||||
@@ -31,7 +31,7 @@ fn bft_messages_include_those_sent_before_asking_for_stream() {
|
||||
let mut io = TestIo::new(&peer.queue, None);
|
||||
let bft_message = generic::BftMessage::Consensus(generic::SignedConsensusMessage::Vote(generic::SignedConsensusVote {
|
||||
vote: generic::ConsensusVote::AdvanceRound(0),
|
||||
sender: [0; 32],
|
||||
sender: Default::default(),
|
||||
signature: Default::default(),
|
||||
}));
|
||||
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
// Copyright 2017 Parity Technologies (UK) Ltd.
|
||||
// This file is part of Polkadot.
|
||||
|
||||
// Polkadot is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Polkadot is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
use serde::{Serialize, Serializer, Deserialize, Deserializer};
|
||||
use codec::Slicable;
|
||||
use H256;
|
||||
|
||||
/// An identifier for an authority in the consensus algorithm. The same size as ed25519::Public.
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Default)]
|
||||
pub struct AuthorityId(pub [u8; 32]);
|
||||
|
||||
impl AuthorityId {
|
||||
/// Create an id from byte slice.
|
||||
pub fn from_slice(data: &[u8]) -> Self {
|
||||
let mut r = [0u8; 32];
|
||||
r.copy_from_slice(data);
|
||||
AuthorityId(r)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl ::std::fmt::Display for AuthorityId {
|
||||
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||
write!(f, "{}", ::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl ::std::fmt::Debug for AuthorityId {
|
||||
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
|
||||
write!(f, "{}", ::hexdisplay::HexDisplay::from(&self.0))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl ::std::hash::Hash for AuthorityId {
|
||||
fn hash<H: ::std::hash::Hasher>(&self, state: &mut H) {
|
||||
self.0.hash(state);
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<[u8; 32]> for AuthorityId {
|
||||
fn as_ref(&self) -> &[u8; 32] {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<[u8]> for AuthorityId {
|
||||
fn as_ref(&self) -> &[u8] {
|
||||
&self.0[..]
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<[u8; 32]> for AuthorityId {
|
||||
fn into(self) -> [u8; 32] {
|
||||
self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl From<[u8; 32]> for AuthorityId {
|
||||
fn from(a: [u8; 32]) -> Self {
|
||||
AuthorityId(a)
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<AuthorityId> for AuthorityId {
|
||||
fn as_ref(&self) -> &AuthorityId {
|
||||
&self
|
||||
}
|
||||
}
|
||||
|
||||
impl Into<H256> for AuthorityId {
|
||||
fn into(self) -> H256 {
|
||||
self.0.into()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl Serialize for AuthorityId {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
|
||||
::bytes::serialize(&self.0, serializer)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl<'de> Deserialize<'de> for AuthorityId {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de> {
|
||||
::bytes::deserialize_check_len(deserializer, ::bytes::ExpectedLen::Exact(32))
|
||||
.map(|x| AuthorityId::from_slice(&x))
|
||||
}
|
||||
}
|
||||
|
||||
impl Slicable for AuthorityId {
|
||||
fn decode<I: ::codec::Input>(input: &mut I) -> Option<Self> {
|
||||
<[u8; 32] as ::codec::Slicable>::decode(input).map(AuthorityId)
|
||||
}
|
||||
|
||||
fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
|
||||
self.0.using_encoded(f)
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Simply type for representing Vec<u8> with regards to serde.
|
||||
//! Simple type for representing Vec<u8> with regards to serde.
|
||||
|
||||
use core::fmt;
|
||||
|
||||
|
||||
@@ -77,15 +77,14 @@ pub mod hash;
|
||||
pub mod sandbox;
|
||||
pub mod storage;
|
||||
pub mod uint;
|
||||
mod authority_id;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
pub use self::hash::{H160, H256, H512};
|
||||
pub use self::uint::{U256, U512};
|
||||
|
||||
/// An identifier for an authority in the consensus algorithm. The same as ed25519::Public.
|
||||
pub type AuthorityId = [u8; 32];
|
||||
pub use authority_id::AuthorityId;
|
||||
|
||||
/// A 512-bit value interpreted as a signature.
|
||||
pub type Signature = hash::H512;
|
||||
|
||||
@@ -42,7 +42,7 @@ use rstd::prelude::*;
|
||||
use runtime_support::{storage, Parameter};
|
||||
use runtime_support::dispatch::Result;
|
||||
use runtime_support::storage::unhashed::StorageVec;
|
||||
use primitives::traits::{RefInto, MaybeEmpty};
|
||||
use primitives::traits::{RefInto, MaybeSerializeDebug, MaybeEmpty};
|
||||
use primitives::bft::MisbehaviorReport;
|
||||
|
||||
pub const AUTHORITY_AT: &'static [u8] = b":auth:";
|
||||
@@ -60,7 +60,7 @@ pub type KeyValue = (Vec<u8>, Vec<u8>);
|
||||
|
||||
pub trait Trait: system::Trait {
|
||||
type PublicAux: RefInto<Self::AccountId> + MaybeEmpty; // MaybeEmpty is for Timestamp's usage.
|
||||
type SessionKey: Parameter + Default;
|
||||
type SessionKey: Parameter + Default + MaybeSerializeDebug;
|
||||
}
|
||||
|
||||
decl_module! {
|
||||
@@ -118,8 +118,12 @@ impl<T: Trait> Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
pub authorities: Vec<T::SessionKey>,
|
||||
#[serde(with = "substrate_primitives::bytes")]
|
||||
pub code: Vec<u8>,
|
||||
}
|
||||
|
||||
@@ -136,7 +140,7 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> ::std::result::Result<runtime_io::TestExternalities, String> {
|
||||
use codec::{Slicable, KeyedVec};
|
||||
let auth_count = self.authorities.len() as u32;
|
||||
let mut r: runtime_io::TestExternalities = self.authorities.into_iter().enumerate().map(|(i, v)|
|
||||
@@ -144,6 +148,6 @@ impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
).collect();
|
||||
r.insert(AUTHORITY_COUNT.to_vec(), auth_count.encode());
|
||||
r.insert(CODE.to_vec(), self.code);
|
||||
r
|
||||
Ok(r)
|
||||
}
|
||||
}
|
||||
@@ -545,6 +545,9 @@ impl<T: Trait> Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
// for the voting onto the council
|
||||
pub candidacy_bond: T::Balance,
|
||||
@@ -587,11 +590,11 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> ::std::result::Result<runtime_io::TestExternalities, String> {
|
||||
use codec::Slicable;
|
||||
use runtime_io::twox_128;
|
||||
|
||||
map![
|
||||
Ok(map![
|
||||
twox_128(<CandidacyBond<T>>::key()).to_vec() => self.candidacy_bond.encode(),
|
||||
twox_128(<VotingBond<T>>::key()).to_vec() => self.voter_bond.encode(),
|
||||
twox_128(<PresentSlashPerVoter<T>>::key()).to_vec() => self.present_slash_per_voter.encode(),
|
||||
@@ -606,7 +609,7 @@ impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
twox_128(<voting::CooloffPeriod<T>>::key()).to_vec() => self.cooloff_period.encode(),
|
||||
twox_128(<voting::VotingPeriod<T>>::key()).to_vec() => self.voting_period.encode(),
|
||||
twox_128(<voting::Proposals<T>>::key()).to_vec() => vec![0u8; 0].encode()
|
||||
]
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -665,16 +668,16 @@ mod tests {
|
||||
impl Trait for Test {}
|
||||
|
||||
pub fn new_test_ext(with_council: bool) -> runtime_io::TestExternalities {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(consensus::GenesisConfig::<Test>{
|
||||
code: vec![],
|
||||
authorities: vec![],
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(session::GenesisConfig::<Test>{
|
||||
session_length: 1, //??? or 2?
|
||||
validators: vec![10, 20],
|
||||
broken_percent_late: 100,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(staking::GenesisConfig::<Test>{
|
||||
sessions_per_era: 1,
|
||||
current_era: 0,
|
||||
@@ -691,12 +694,12 @@ mod tests {
|
||||
reclaim_rebate: 0,
|
||||
early_era_slash: 0,
|
||||
session_reward: 0,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(democracy::GenesisConfig::<Test>{
|
||||
launch_period: 1,
|
||||
voting_period: 3,
|
||||
minimum_deposit: 1,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(GenesisConfig::<Test>{
|
||||
candidacy_bond: 9,
|
||||
voter_bond: 3,
|
||||
@@ -714,8 +717,8 @@ mod tests {
|
||||
term_duration: 5,
|
||||
cooloff_period: 2,
|
||||
voting_period: 1,
|
||||
}.build_storage());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t
|
||||
}
|
||||
|
||||
|
||||
@@ -296,6 +296,9 @@ impl<T: Trait> Executable for Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
pub launch_period: T::BlockNumber,
|
||||
pub voting_period: T::BlockNumber,
|
||||
@@ -335,18 +338,18 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> ::std::result::Result<runtime_io::TestExternalities, String> {
|
||||
use codec::Slicable;
|
||||
use runtime_io::twox_128;
|
||||
|
||||
map![
|
||||
Ok(map![
|
||||
twox_128(<LaunchPeriod<T>>::key()).to_vec() => self.launch_period.encode(),
|
||||
twox_128(<VotingPeriod<T>>::key()).to_vec() => self.voting_period.encode(),
|
||||
twox_128(<MinimumDeposit<T>>::key()).to_vec() => self.minimum_deposit.encode(),
|
||||
twox_128(<ReferendumCount<T>>::key()).to_vec() => (0 as ReferendumIndex).encode(),
|
||||
twox_128(<NextTally<T>>::key()).to_vec() => (0 as ReferendumIndex).encode(),
|
||||
twox_128(<PublicPropCount<T>>::key()).to_vec() => (0 as PropIndex).encode()
|
||||
]
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -406,16 +409,16 @@ mod tests {
|
||||
}
|
||||
|
||||
fn new_test_ext() -> runtime_io::TestExternalities {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(consensus::GenesisConfig::<Test>{
|
||||
code: vec![],
|
||||
authorities: vec![],
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(session::GenesisConfig::<Test>{
|
||||
session_length: 1, //??? or 2?
|
||||
validators: vec![10, 20],
|
||||
broken_percent_late: 100,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(staking::GenesisConfig::<Test>{
|
||||
sessions_per_era: 1,
|
||||
current_era: 0,
|
||||
@@ -432,13 +435,13 @@ mod tests {
|
||||
reclaim_rebate: 0,
|
||||
early_era_slash: 0,
|
||||
session_reward: 0,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(GenesisConfig::<Test>{
|
||||
launch_period: 1,
|
||||
voting_period: 1,
|
||||
minimum_deposit: 1,
|
||||
}.build_storage());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t
|
||||
}
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn staking_balance_transfer_dispatch_works() {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(staking::GenesisConfig::<Test> {
|
||||
sessions_per_era: 0,
|
||||
current_era: 0,
|
||||
@@ -286,7 +286,7 @@ mod tests {
|
||||
reclaim_rebate: 0,
|
||||
early_era_slash: 0,
|
||||
session_reward: 0,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
let xt = primitives::testing::TestXt((1, 0, Call::transfer(2.into(), 69)));
|
||||
with_externalities(&mut t, || {
|
||||
Executive::initialise_block(&Header::new(1, H256::default(), H256::default(), [69u8; 32].into(), Digest::default()));
|
||||
@@ -297,11 +297,11 @@ mod tests {
|
||||
}
|
||||
|
||||
fn new_test_ext() -> runtime_io::TestExternalities {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
t.extend(consensus::GenesisConfig::<Test>::default().build_storage());
|
||||
t.extend(session::GenesisConfig::<Test>::default().build_storage());
|
||||
t.extend(staking::GenesisConfig::<Test>::default().build_storage());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage());
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(consensus::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t.extend(session::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t.extend(staking::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t.extend(timestamp::GenesisConfig::<Test>::default().build_storage().unwrap());
|
||||
t
|
||||
}
|
||||
|
||||
|
||||
@@ -56,27 +56,16 @@ use traits::{Verify, Lazy};
|
||||
#[cfg(feature = "std")]
|
||||
pub type StorageMap = HashMap<Vec<u8>, Vec<u8>>;
|
||||
|
||||
/// A simple function allowing StorageMap to be created.
|
||||
#[cfg(feature = "std")]
|
||||
pub type MakeStorage = Box<FnMut() -> StorageMap>;
|
||||
|
||||
/// Complex storage builder stuff.
|
||||
#[cfg(feature = "std")]
|
||||
pub trait BuildStorage {
|
||||
fn build_storage(self) -> StorageMap;
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl BuildStorage for MakeStorage {
|
||||
fn build_storage(mut self) -> StorageMap {
|
||||
self()
|
||||
}
|
||||
fn build_storage(self) -> Result<StorageMap, String>;
|
||||
}
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
impl BuildStorage for StorageMap {
|
||||
fn build_storage(self) -> StorageMap {
|
||||
self
|
||||
fn build_storage(self) -> Result<StorageMap, String> {
|
||||
Ok(self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,6 +230,9 @@ macro_rules! impl_outer_config {
|
||||
( pub struct $main:ident for $concrete:ident { $( $config:ident => $snake:ident, )* } ) => {
|
||||
__impl_outer_config_types! { $concrete $( $config $snake )* }
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct $main {
|
||||
$(
|
||||
pub $snake: Option<$config>,
|
||||
@@ -248,14 +240,14 @@ macro_rules! impl_outer_config {
|
||||
}
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl $crate::BuildStorage for $main {
|
||||
fn build_storage(self) -> $crate::StorageMap {
|
||||
fn build_storage(self) -> ::std::result::Result<$crate::StorageMap, String> {
|
||||
let mut s = $crate::StorageMap::new();
|
||||
$(
|
||||
if let Some(extra) = self.$snake {
|
||||
s.extend(extra.build_storage());
|
||||
s.extend(extra.build_storage()?);
|
||||
}
|
||||
)*
|
||||
s
|
||||
Ok(s)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,6 +220,9 @@ impl<T: Trait> Executable for Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
pub session_length: T::BlockNumber,
|
||||
pub validators: Vec<T::AccountId>,
|
||||
@@ -241,17 +244,17 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> ::std::result::Result<runtime_io::TestExternalities, String> {
|
||||
use runtime_io::twox_128;
|
||||
use codec::Slicable;
|
||||
use primitives::traits::As;
|
||||
map![
|
||||
Ok(map![
|
||||
twox_128(<SessionLength<T>>::key()).to_vec() => self.session_length.encode(),
|
||||
twox_128(<CurrentIndex<T>>::key()).to_vec() => T::BlockNumber::sa(0).encode(),
|
||||
twox_128(<CurrentStart<T>>::key()).to_vec() => T::Moment::zero().encode(),
|
||||
twox_128(<Validators<T>>::key()).to_vec() => self.validators.encode(),
|
||||
twox_128(<BrokenPercentLate<T>>::key()).to_vec() => self.broken_percent_late.encode()
|
||||
]
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,19 +300,19 @@ mod tests {
|
||||
type Session = Module<Test>;
|
||||
|
||||
fn new_test_ext() -> runtime_io::TestExternalities {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(consensus::GenesisConfig::<Test>{
|
||||
code: vec![],
|
||||
authorities: vec![1, 2, 3],
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(timestamp::GenesisConfig::<Test>{
|
||||
period: 5,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(GenesisConfig::<Test>{
|
||||
session_length: 2,
|
||||
validators: vec![1, 2, 3],
|
||||
broken_percent_late: 30,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,9 @@ use super::{Trait, ENUM_SET_SIZE, EnumSet, NextEnumSet, Intentions, CurrentEra,
|
||||
ExistentialDeposit, TransactionByteFee, TransactionBaseFee, TotalStake,
|
||||
SessionsPerEra, ValidatorCount, FreeBalance, SessionReward, EarlyEraSlash};
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
pub sessions_per_era: T::BlockNumber,
|
||||
pub current_era: T::BlockNumber,
|
||||
@@ -120,7 +123,7 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
}
|
||||
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T> {
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> Result<runtime_io::TestExternalities, String> {
|
||||
let total_stake: T::Balance = self.balances.iter().fold(Zero::zero(), |acc, &(_, n)| acc + n);
|
||||
|
||||
let mut r: runtime_io::TestExternalities = map![
|
||||
@@ -150,6 +153,6 @@ impl<T: Trait> primitives::BuildStorage for GenesisConfig<T> {
|
||||
for (who, value) in self.balances.into_iter() {
|
||||
r.insert(twox_128(&<FreeBalance<T>>::key_for(who)).to_vec(), value.encode());
|
||||
}
|
||||
r
|
||||
Ok(r)
|
||||
}
|
||||
}
|
||||
@@ -60,7 +60,7 @@ impl Trait for Test {
|
||||
}
|
||||
|
||||
pub fn new_test_ext(ext_deposit: u64, session_length: u64, sessions_per_era: u64, current_era: u64, monied: bool, reward: u64) -> runtime_io::TestExternalities {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
let balance_factor = if ext_deposit > 0 {
|
||||
256
|
||||
} else {
|
||||
@@ -69,12 +69,12 @@ pub fn new_test_ext(ext_deposit: u64, session_length: u64, sessions_per_era: u64
|
||||
t.extend(consensus::GenesisConfig::<Test>{
|
||||
code: vec![],
|
||||
authorities: vec![],
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(session::GenesisConfig::<Test>{
|
||||
session_length,
|
||||
validators: vec![10, 20],
|
||||
broken_percent_late: 30,
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(GenesisConfig::<Test>{
|
||||
sessions_per_era,
|
||||
current_era,
|
||||
@@ -99,10 +99,10 @@ pub fn new_test_ext(ext_deposit: u64, session_length: u64, sessions_per_era: u64
|
||||
reclaim_rebate: 0,
|
||||
session_reward: reward,
|
||||
early_era_slash: if monied { 20 } else { 0 },
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t.extend(timestamp::GenesisConfig::<Test>{
|
||||
period: 5
|
||||
}.build_storage());
|
||||
}.build_storage().unwrap());
|
||||
t
|
||||
}
|
||||
|
||||
|
||||
@@ -193,6 +193,9 @@ impl<T: Trait> Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait>(PhantomData<T>);
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
@@ -205,16 +208,16 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_io::TestExternalities {
|
||||
fn build_storage(self) -> Result<runtime_io::TestExternalities, String> {
|
||||
use runtime_io::twox_128;
|
||||
use codec::Slicable;
|
||||
|
||||
map![
|
||||
Ok(map![
|
||||
twox_128(&<BlockHash<T>>::key_for(T::BlockNumber::zero())).to_vec() => [69u8; 32].encode(),
|
||||
twox_128(<Number<T>>::key()).to_vec() => 1u64.encode(),
|
||||
twox_128(<ParentHash<T>>::key()).to_vec() => [69u8; 32].encode(),
|
||||
twox_128(<RandomSeed<T>>::key()).to_vec() => [0u8; 32].encode(),
|
||||
twox_128(<ExtrinsicIndex<T>>::key()).to_vec() => [0u8; 4].encode()
|
||||
]
|
||||
])
|
||||
}
|
||||
}
|
||||
@@ -107,6 +107,9 @@ impl<T: Trait> Executable for Module<T> {
|
||||
}
|
||||
|
||||
#[cfg(any(feature = "std", test))]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[serde(deny_unknown_fields)]
|
||||
pub struct GenesisConfig<T: Trait> {
|
||||
pub period: T::Moment,
|
||||
}
|
||||
@@ -123,13 +126,13 @@ impl<T: Trait> Default for GenesisConfig<T> {
|
||||
#[cfg(any(feature = "std", test))]
|
||||
impl<T: Trait> runtime_primitives::BuildStorage for GenesisConfig<T>
|
||||
{
|
||||
fn build_storage(self) -> runtime_primitives::StorageMap {
|
||||
fn build_storage(self) -> ::std::result::Result<runtime_primitives::StorageMap, String> {
|
||||
use runtime_io::twox_128;
|
||||
use codec::Slicable;
|
||||
map![
|
||||
Ok(map![
|
||||
twox_128(<BlockPeriod<T>>::key()).to_vec() => self.period.encode(),
|
||||
twox_128(<Now<T>>::key()).to_vec() => T::Moment::sa(0).encode()
|
||||
]
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,8 +172,8 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn timestamp_works() {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
t.extend(GenesisConfig::<Test> { period: 0 }.build_storage());
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(GenesisConfig::<Test> { period: 0 }.build_storage().unwrap());
|
||||
|
||||
with_externalities(&mut t, || {
|
||||
Timestamp::set_timestamp(42);
|
||||
@@ -182,8 +185,8 @@ mod tests {
|
||||
#[test]
|
||||
#[should_panic(expected = "Timestamp must be updated only once in the block")]
|
||||
fn double_timestamp_should_fail() {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage());
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage().unwrap());
|
||||
|
||||
with_externalities(&mut t, || {
|
||||
Timestamp::set_timestamp(42);
|
||||
@@ -195,8 +198,8 @@ mod tests {
|
||||
#[test]
|
||||
#[should_panic(expected = "Timestamp but increment by at least <BlockPeriod> between sequential blocks")]
|
||||
fn block_period_is_enforced() {
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage();
|
||||
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage());
|
||||
let mut t = system::GenesisConfig::<Test>::default().build_storage().unwrap();
|
||||
t.extend(GenesisConfig::<Test> { period: 5 }.build_storage().unwrap());
|
||||
|
||||
with_externalities(&mut t, || {
|
||||
Timestamp::set_timestamp(42);
|
||||
|
||||
@@ -88,9 +88,9 @@ fn fake_justify(header: &runtime::Header) -> bft::UncheckedJustification<runtime
|
||||
|
||||
fn genesis_config() -> GenesisConfig {
|
||||
GenesisConfig::new_simple(vec![
|
||||
Keyring::Alice.to_raw_public(),
|
||||
Keyring::Bob.to_raw_public(),
|
||||
Keyring::Charlie.to_raw_public()
|
||||
Keyring::Alice.to_raw_public().into(),
|
||||
Keyring::Bob.to_raw_public().into(),
|
||||
Keyring::Charlie.to_raw_public().into(),
|
||||
], 1000)
|
||||
}
|
||||
|
||||
|
||||
-18
@@ -137,11 +137,6 @@ dependencies = [
|
||||
name = "environmental"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "error-chain"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "ethbloom"
|
||||
version = "0.5.0"
|
||||
@@ -294,16 +289,6 @@ dependencies = [
|
||||
"tiny-keccak 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kvdb"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/paritytech/parity.git#dec390a89fe038337399315daf15e628ffbb4d8e"
|
||||
dependencies = [
|
||||
"elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "0.2.11"
|
||||
@@ -753,7 +738,6 @@ dependencies = [
|
||||
"ethereum-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hashdb 0.1.1 (git+https://github.com/paritytech/parity.git)",
|
||||
"hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)",
|
||||
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"memorydb 0.1.1 (git+https://github.com/paritytech/parity.git)",
|
||||
"parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@@ -955,7 +939,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda"
|
||||
"checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb"
|
||||
"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"
|
||||
"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
|
||||
"checksum ethbloom 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a93a43ce2e9f09071449da36bfa7a1b20b950ee344b6904ff23de493b03b386"
|
||||
"checksum ethcore-bytes 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>"
|
||||
"checksum ethcore-logger 1.12.0 (git+https://github.com/paritytech/parity.git)" = "<none>"
|
||||
@@ -973,7 +956,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
"checksum integer-sqrt 0.1.0 (git+https://github.com/paritytech/integer-sqrt-rs.git)" = "<none>"
|
||||
"checksum keccak-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b7f51f30d7986536accaec4a6a288008dfb3dbffe8a2863a65292bc395a3ae7"
|
||||
"checksum keccak-hash 0.1.2 (git+https://github.com/paritytech/parity.git)" = "<none>"
|
||||
"checksum kvdb 0.1.0 (git+https://github.com/paritytech/parity.git)" = "<none>"
|
||||
"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
|
||||
"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739"
|
||||
"checksum libc 0.2.41 (registry+https://github.com/rust-lang/crates.io-index)" = "ac8ebf8343a981e2fa97042b14768f02ed3e1d602eac06cae6166df3c8ced206"
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Reference in new issue
Block a user