Initial validator trait. (#14)

* Initial validator trait.

* Add missing docs warning.

* Fix formatting.

* Fix validator output and serialization.

* Get rid of redundant ValidationCode type.
This commit is contained in:
Tomasz Drwięga
2017-11-12 16:48:35 +01:00
committed by Robert Habermeier
parent 9d083be47a
commit e9177294f6
12 changed files with 520 additions and 52 deletions
+79
View File
@@ -0,0 +1,79 @@
// 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/>.
use std::fmt;
use primitives::{validator, parachain};
use serde::de::DeserializeOwned;
use serializer;
use error::{Error, ErrorKind, Result};
use parachains::{ParachainCode, ParaChain1};
/// A dummy validator implementation.
#[derive(Debug)]
pub struct Validator {
codes: Vec<Box<Code>>,
}
impl Validator {
/// Create a new validator.
pub fn new() -> Self {
Validator {
codes: vec![
Box::new(ParaChain1) as Box<Code>
],
}
}
}
impl validator::Validator for Validator {
type Error = Error;
fn validate(
&self,
messages: &validator::IngressPosts,
proof: &parachain::Proof,
code: &[u8],
) -> Result<validator::ProofValidity> {
ensure!(code.len() == 1, ErrorKind::InvalidCode(format!("The code should be a single byte.")));
match self.codes.get(code[0] as usize) {
Some(code) => code.check(messages, proof),
None => bail!(ErrorKind::InvalidCode(format!("Unknown parachain code."))),
}
}
}
/// Simplified parachain code verification
trait Code: fmt::Debug {
/// Given bytes of messages and proof determine if the proof is valid and return egress posts.
fn check(&self, messages: &validator::IngressPosts, proof: &parachain::Proof) -> Result<validator::ProofValidity>;
}
impl<M, P, T> Code for T where
M: DeserializeOwned,
P: DeserializeOwned,
T: ParachainCode<Messages=M, Proof=P>,
{
fn check(&self, messages: &validator::IngressPosts, proof: &parachain::Proof) -> Result<validator::ProofValidity> {
let messages = serializer::from_slice(&messages.0)?;
let proof = serializer::from_slice(&proof.raw().0)?;
Ok(self.check(messages, proof).into())
}
}