Merge pull request #3843 from ethcore/auth-round-seal
AuthorityRound seal and simplify Generic seal Spec
This commit is contained in:
		
						commit
						a660024eac
					
				| @ -21,8 +21,9 @@ | ||||
| 	}, | ||||
| 	"genesis": { | ||||
| 		"seal": { | ||||
| 			"generic": { | ||||
| 				"rlp": "0xc28080" | ||||
| 			"authority_round": { | ||||
| 				"step": "0x0", | ||||
| 				"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" | ||||
| 			} | ||||
| 		}, | ||||
| 		"difficulty": "0x20000", | ||||
|  | ||||
| @ -17,10 +17,7 @@ | ||||
| 	}, | ||||
| 	"genesis": { | ||||
| 		"seal": { | ||||
| 			"generic": { | ||||
| 				"fields": 1, | ||||
| 				"rlp": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa" | ||||
| 			} | ||||
| 			"generic": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa" | ||||
| 		}, | ||||
| 		"difficulty": "0x20000", | ||||
| 		"author": "0x0000000000000000000000000000000000000000", | ||||
|  | ||||
| @ -11,9 +11,7 @@ | ||||
| 	}, | ||||
| 	"genesis": { | ||||
| 		"seal": { | ||||
| 			"generic": { | ||||
| 				"rlp": "0x0" | ||||
| 			} | ||||
| 			"generic": "0x0" | ||||
| 		}, | ||||
| 		"difficulty": "0x20000", | ||||
| 		"author": "0x0000000000000000000000000000000000000000", | ||||
|  | ||||
| @ -17,7 +17,7 @@ | ||||
| //! Spec seal.
 | ||||
| 
 | ||||
| use rlp::*; | ||||
| use util::hash::{H64, H256}; | ||||
| use util::hash::{H64, H256, H520}; | ||||
| use ethjson; | ||||
| 
 | ||||
| /// Classic ethereum seal.
 | ||||
| @ -32,23 +32,35 @@ impl Into<Generic> for Ethereum { | ||||
| 	fn into(self) -> Generic { | ||||
| 		let mut s = RlpStream::new_list(2); | ||||
| 		s.append(&self.mix_hash).append(&self.nonce); | ||||
| 		Generic { | ||||
| 			rlp: s.out() | ||||
| 		} | ||||
| 		Generic(s.out()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /// Generic seal.
 | ||||
| pub struct Generic { | ||||
| 	/// Seal rlp.
 | ||||
| 	pub rlp: Vec<u8>, | ||||
| /// AuthorityRound seal.
 | ||||
| pub struct AuthorityRound { | ||||
| 	/// Seal step.
 | ||||
| 	pub step: usize, | ||||
| 	/// Seal signature.
 | ||||
| 	pub signature: H520, | ||||
| } | ||||
| 
 | ||||
| impl Into<Generic> for AuthorityRound { | ||||
| 	fn into(self) -> Generic { | ||||
| 		let mut s = RlpStream::new_list(2); | ||||
| 		s.append(&self.step).append(&self.signature); | ||||
| 		Generic(s.out()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| pub struct Generic(pub Vec<u8>); | ||||
| 
 | ||||
| /// Genesis seal type.
 | ||||
| pub enum Seal { | ||||
| 	/// Classic ethereum seal.
 | ||||
| 	Ethereum(Ethereum), | ||||
| 	/// Generic seal.
 | ||||
| 	/// AuthorityRound seal.
 | ||||
| 	AuthorityRound(AuthorityRound), | ||||
| 	/// Generic RLP seal.
 | ||||
| 	Generic(Generic), | ||||
| } | ||||
| 
 | ||||
| @ -59,9 +71,11 @@ impl From<ethjson::spec::Seal> for Seal { | ||||
| 				nonce: eth.nonce.into(), | ||||
| 				mix_hash: eth.mix_hash.into() | ||||
| 			}), | ||||
| 			ethjson::spec::Seal::Generic(g) => Seal::Generic(Generic { | ||||
| 				rlp: g.rlp.into() | ||||
| 			}) | ||||
| 			ethjson::spec::Seal::AuthorityRound(ar) => Seal::AuthorityRound(AuthorityRound { | ||||
| 				step: ar.step.into(), | ||||
| 				signature: ar.signature.into() | ||||
| 			}), | ||||
| 			ethjson::spec::Seal::Generic(g) => Seal::Generic(Generic(g.into())), | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -70,7 +84,8 @@ impl Into<Generic> for Seal { | ||||
| 	fn into(self) -> Generic { | ||||
| 		match self { | ||||
| 			Seal::Generic(generic) => generic, | ||||
| 			Seal::Ethereum(eth) => eth.into() | ||||
| 			Seal::Ethereum(eth) => eth.into(), | ||||
| 			Seal::AuthorityRound(ar) => ar.into(), | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -107,7 +107,7 @@ impl From<ethjson::spec::Spec> for Spec { | ||||
| 	fn from(s: ethjson::spec::Spec) -> Self { | ||||
| 		let builtins = s.accounts.builtins().into_iter().map(|p| (p.0.into(), From::from(p.1))).collect(); | ||||
| 		let g = Genesis::from(s.genesis); | ||||
| 		let seal: GenericSeal = g.seal.into(); | ||||
| 		let GenericSeal(seal_rlp) = g.seal.into(); | ||||
| 		let params = CommonParams::from(s.params); | ||||
| 		Spec { | ||||
| 			name: s.name.into(), | ||||
| @ -124,7 +124,7 @@ impl From<ethjson::spec::Spec> for Spec { | ||||
| 			gas_used: g.gas_used, | ||||
| 			timestamp: g.timestamp, | ||||
| 			extra_data: g.extra_data, | ||||
| 			seal_rlp: seal.rlp, | ||||
| 			seal_rlp: seal_rlp, | ||||
| 			state_root_memo: RwLock::new(g.state_root), | ||||
| 			genesis_state: From::from(s.accounts), | ||||
| 		} | ||||
| @ -208,7 +208,7 @@ impl Spec { | ||||
| 
 | ||||
| 	/// Overwrite the genesis components.
 | ||||
| 	pub fn overwrite_genesis_params(&mut self, g: Genesis) { | ||||
| 		let seal: GenericSeal = g.seal.into(); | ||||
| 		let GenericSeal(seal_rlp) = g.seal.into(); | ||||
| 		self.parent_hash = g.parent_hash; | ||||
| 		self.transactions_root = g.transactions_root; | ||||
| 		self.receipts_root = g.receipts_root; | ||||
| @ -218,7 +218,7 @@ impl Spec { | ||||
| 		self.gas_used = g.gas_used; | ||||
| 		self.timestamp = g.timestamp; | ||||
| 		self.extra_data = g.extra_data; | ||||
| 		self.seal_rlp = seal.rlp; | ||||
| 		self.seal_rlp = seal_rlp; | ||||
| 		self.state_root_memo = RwLock::new(g.state_root); | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -20,7 +20,7 @@ use std::str::FromStr; | ||||
| use serde::{Deserialize, Deserializer, Serialize, Serializer, Error}; | ||||
| use serde::de::Visitor; | ||||
| use rustc_serialize::hex::ToHex; | ||||
| use util::hash::{H64 as Hash64, H160 as Hash160, H256 as Hash256, H2048 as Hash2048}; | ||||
| use util::hash::{H64 as Hash64, H160 as Hash160, H256 as Hash256, H520 as Hash520, H2048 as Hash2048}; | ||||
| 
 | ||||
| 
 | ||||
| macro_rules! impl_hash { | ||||
| @ -87,6 +87,7 @@ macro_rules! impl_hash { | ||||
| impl_hash!(H64, Hash64); | ||||
| impl_hash!(Address, Hash160); | ||||
| impl_hash!(H256, Hash256); | ||||
| impl_hash!(H520, Hash520); | ||||
| impl_hash!(Bloom, Hash2048); | ||||
| 
 | ||||
| #[cfg(test)] | ||||
|  | ||||
| @ -33,7 +33,7 @@ pub use self::builtin::{Builtin, Pricing, Linear}; | ||||
| pub use self::genesis::Genesis; | ||||
| pub use self::params::Params; | ||||
| pub use self::spec::Spec; | ||||
| pub use self::seal::{Seal, Ethereum, Generic}; | ||||
| pub use self::seal::{Seal, Ethereum, AuthorityRoundSeal}; | ||||
| pub use self::engine::Engine; | ||||
| pub use self::state::State; | ||||
| pub use self::ethash::{Ethash, EthashParams}; | ||||
|  | ||||
| @ -16,7 +16,8 @@ | ||||
| 
 | ||||
| //! Spec seal deserialization.
 | ||||
| 
 | ||||
| use hash::{H64, H256}; | ||||
| use hash::*; | ||||
| use uint::Uint; | ||||
| use bytes::Bytes; | ||||
| 
 | ||||
| /// Ethereum seal.
 | ||||
| @ -29,11 +30,13 @@ pub struct Ethereum { | ||||
| 	pub mix_hash: H256, | ||||
| } | ||||
| 
 | ||||
| /// Generic seal.
 | ||||
| /// AuthorityRound seal.
 | ||||
| #[derive(Debug, PartialEq, Deserialize)] | ||||
| pub struct Generic { | ||||
| 	/// Seal rlp.
 | ||||
| 	pub rlp: Bytes, | ||||
| pub struct AuthorityRoundSeal { | ||||
| 	/// Seal step.
 | ||||
| 	pub step: Uint, | ||||
| 	/// Seal signature.
 | ||||
| 	pub signature: H520, | ||||
| } | ||||
| 
 | ||||
| /// Seal variants.
 | ||||
| @ -42,9 +45,12 @@ pub enum Seal { | ||||
| 	/// Ethereum seal.
 | ||||
| 	#[serde(rename="ethereum")] | ||||
| 	Ethereum(Ethereum), | ||||
| 	/// AuthorityRound seal.
 | ||||
| 	#[serde(rename="authority_round")] | ||||
| 	AuthorityRound(AuthorityRoundSeal), | ||||
| 	/// Generic seal.
 | ||||
| 	#[serde(rename="generic")] | ||||
| 	Generic(Generic), | ||||
| 	Generic(Bytes), | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| @ -53,15 +59,18 @@ mod tests { | ||||
| 	use spec::Seal; | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn builtin_deserialization() { | ||||
| 	fn seal_deserialization() { | ||||
| 		let s = r#"[{
 | ||||
| 			"ethereum": { | ||||
| 				"nonce": "0x0000000000000042", | ||||
| 				"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" | ||||
| 			} | ||||
| 		},{ | ||||
| 			"generic": { | ||||
| 				"rlp": "0xe011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa" | ||||
| 			"generic": "0xe011bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa" | ||||
| 		},{ | ||||
| 			"authority_round": { | ||||
| 				"step": "0x0", | ||||
| 				"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" | ||||
| 			} | ||||
| 		}]"#;
 | ||||
| 		let _deserialized: Vec<Seal> = serde_json::from_str(s).unwrap(); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user