Merge pull request #3857 from ethcore/tender-seal

Tendermint seal
This commit is contained in:
Gav Wood 2016-12-15 13:50:49 +01:00 committed by GitHub
commit 9440c2600f
4 changed files with 55 additions and 3 deletions

View File

@ -19,8 +19,12 @@
}, },
"genesis": { "genesis": {
"seal": { "seal": {
"generic": { "tendermint": {
"rlp": "f88980b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f843b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "round": "0x0",
"proposal": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"precommits": [
"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
]
} }
}, },
"difficulty": "0x20000", "difficulty": "0x20000",

View File

@ -44,6 +44,16 @@ pub struct AuthorityRound {
pub signature: H520, pub signature: H520,
} }
/// Tendermint seal.
pub struct Tendermint {
/// Seal round.
pub round: usize,
/// Proposal seal signature.
pub proposal: H520,
/// Precommit seal signatures.
pub precommits: Vec<H520>,
}
impl Into<Generic> for AuthorityRound { impl Into<Generic> for AuthorityRound {
fn into(self) -> Generic { fn into(self) -> Generic {
let mut s = RlpStream::new_list(2); let mut s = RlpStream::new_list(2);
@ -52,6 +62,14 @@ impl Into<Generic> for AuthorityRound {
} }
} }
impl Into<Generic> for Tendermint {
fn into(self) -> Generic {
let mut s = RlpStream::new_list(3);
s.append(&self.round).append(&self.proposal).append(&self.precommits);
Generic(s.out())
}
}
pub struct Generic(pub Vec<u8>); pub struct Generic(pub Vec<u8>);
/// Genesis seal type. /// Genesis seal type.
@ -60,6 +78,8 @@ pub enum Seal {
Ethereum(Ethereum), Ethereum(Ethereum),
/// AuthorityRound seal. /// AuthorityRound seal.
AuthorityRound(AuthorityRound), AuthorityRound(AuthorityRound),
/// Tendermint seal.
Tendermint(Tendermint),
/// Generic RLP seal. /// Generic RLP seal.
Generic(Generic), Generic(Generic),
} }
@ -75,6 +95,11 @@ impl From<ethjson::spec::Seal> for Seal {
step: ar.step.into(), step: ar.step.into(),
signature: ar.signature.into() signature: ar.signature.into()
}), }),
ethjson::spec::Seal::Tendermint(tender) => Seal::Tendermint(Tendermint {
round: tender.round.into(),
proposal: tender.proposal.into(),
precommits: tender.precommits.into_iter().map(Into::into).collect()
}),
ethjson::spec::Seal::Generic(g) => Seal::Generic(Generic(g.into())), ethjson::spec::Seal::Generic(g) => Seal::Generic(Generic(g.into())),
} }
} }
@ -86,6 +111,7 @@ impl Into<Generic> for Seal {
Seal::Generic(generic) => generic, Seal::Generic(generic) => generic,
Seal::Ethereum(eth) => eth.into(), Seal::Ethereum(eth) => eth.into(),
Seal::AuthorityRound(ar) => ar.into(), Seal::AuthorityRound(ar) => ar.into(),
Seal::Tendermint(tender) => tender.into(),
} }
} }
} }

View File

@ -34,7 +34,7 @@ pub use self::builtin::{Builtin, Pricing, Linear};
pub use self::genesis::Genesis; pub use self::genesis::Genesis;
pub use self::params::Params; pub use self::params::Params;
pub use self::spec::Spec; pub use self::spec::Spec;
pub use self::seal::{Seal, Ethereum, AuthorityRoundSeal}; pub use self::seal::{Seal, Ethereum, AuthorityRoundSeal, TendermintSeal};
pub use self::engine::Engine; pub use self::engine::Engine;
pub use self::state::State; pub use self::state::State;
pub use self::ethash::{Ethash, EthashParams}; pub use self::ethash::{Ethash, EthashParams};

View File

@ -39,6 +39,17 @@ pub struct AuthorityRoundSeal {
pub signature: H520, pub signature: H520,
} }
/// Tendermint seal.
#[derive(Debug, PartialEq, Deserialize)]
pub struct TendermintSeal {
/// Seal round.
pub round: Uint,
/// Proposal seal signature.
pub proposal: H520,
/// Proposal seal signature.
pub precommits: Vec<H520>,
}
/// Seal variants. /// Seal variants.
#[derive(Debug, PartialEq, Deserialize)] #[derive(Debug, PartialEq, Deserialize)]
pub enum Seal { pub enum Seal {
@ -48,6 +59,9 @@ pub enum Seal {
/// AuthorityRound seal. /// AuthorityRound seal.
#[serde(rename="authority_round")] #[serde(rename="authority_round")]
AuthorityRound(AuthorityRoundSeal), AuthorityRound(AuthorityRoundSeal),
/// Tendermint seal.
#[serde(rename="tendermint")]
Tendermint(TendermintSeal),
/// Generic seal. /// Generic seal.
#[serde(rename="generic")] #[serde(rename="generic")]
Generic(Bytes), Generic(Bytes),
@ -72,6 +86,14 @@ mod tests {
"step": "0x0", "step": "0x0",
"signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
} }
},{
"tendermint": {
"round": "0x0",
"proposal": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"precommits": [
"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
]
}
}]"#; }]"#;
let _deserialized: Vec<Seal> = serde_json::from_str(s).unwrap(); let _deserialized: Vec<Seal> = serde_json::from_str(s).unwrap();
// TODO: validate all fields // TODO: validate all fields