diff --git a/ethcore/src/spec/spec.rs b/ethcore/src/spec/spec.rs
index a0c32d51a..c3db5d4f1 100644
--- a/ethcore/src/spec/spec.rs
+++ b/ethcore/src/spec/spec.rs
@@ -17,7 +17,7 @@
//! Parameters for a block chain.
use common::*;
-use engines::{Engine, NullEngine, InstantSeal, BasicAuthority};
+use engines::{Engine, NullEngine, InstantSeal, BasicAuthority, BFT};
use pod_state::*;
use account_db::*;
use super::genesis::Genesis;
@@ -139,6 +139,7 @@ impl Spec {
ethjson::spec::Engine::InstantSeal => Arc::new(InstantSeal::new(params, builtins)),
ethjson::spec::Engine::Ethash(ethash) => Arc::new(ethereum::Ethash::new(params, From::from(ethash.params), builtins)),
ethjson::spec::Engine::BasicAuthority(basic_authority) => Arc::new(BasicAuthority::new(params, From::from(basic_authority.params), builtins)),
+ ethjson::spec::Engine::BFT(bft) => Arc::new(BFT::new(params, From::from(bft.params), builtins)),
}
}
diff --git a/json/src/spec/bft.rs b/json/src/spec/bft.rs
new file mode 100644
index 000000000..a5a34c550
--- /dev/null
+++ b/json/src/spec/bft.rs
@@ -0,0 +1,59 @@
+// Copyright 2015, 2016 Ethcore (UK) Ltd.
+// This file is part of Parity.
+
+// Parity 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.
+
+// Parity 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 Parity. If not, see .
+
+//! Authority params deserialization.
+
+use uint::Uint;
+use hash::Address;
+
+/// Authority params deserialization.
+#[derive(Debug, PartialEq, Deserialize)]
+pub struct BFTParams {
+ /// Gas limit divisor.
+ #[serde(rename="gasLimitBoundDivisor")]
+ pub gas_limit_bound_divisor: Uint,
+ /// Block duration.
+ #[serde(rename="durationLimit")]
+ pub duration_limit: Uint,
+ /// Valid authorities
+ pub validators: Vec
,
+}
+
+/// Authority engine deserialization.
+#[derive(Debug, PartialEq, Deserialize)]
+pub struct BFT {
+ /// Ethash params.
+ pub params: BFTParams,
+}
+
+#[cfg(test)]
+mod tests {
+ use serde_json;
+ use spec::bft::BFT;
+
+ #[test]
+ fn basic_authority_deserialization() {
+ let s = r#"{
+ "params": {
+ "gasLimitBoundDivisor": "0x0400",
+ "durationLimit": "0x0d",
+ "validators" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
+ }
+ }"#;
+
+ let _deserialized: BFT = serde_json::from_str(s).unwrap();
+ }
+}
diff --git a/json/src/spec/engine.rs b/json/src/spec/engine.rs
index 3813b1756..7b32efa51 100644
--- a/json/src/spec/engine.rs
+++ b/json/src/spec/engine.rs
@@ -18,6 +18,7 @@
use spec::Ethash;
use spec::BasicAuthority;
+use spec::BFT;
/// Engine deserialization.
#[derive(Debug, PartialEq, Deserialize)]
@@ -30,6 +31,8 @@ pub enum Engine {
Ethash(Ethash),
/// BasicAuthority engine.
BasicAuthority(BasicAuthority),
+ /// Byzantine Fault Tolerant engine.
+ BFT(BFT)
}
#[cfg(test)]
diff --git a/json/src/spec/mod.rs b/json/src/spec/mod.rs
index f6c856b13..c8a6f8bf5 100644
--- a/json/src/spec/mod.rs
+++ b/json/src/spec/mod.rs
@@ -26,6 +26,7 @@ pub mod engine;
pub mod state;
pub mod ethash;
pub mod basic_authority;
+pub mod bft;
pub use self::account::Account;
pub use self::builtin::{Builtin, Pricing, Linear};
@@ -37,3 +38,4 @@ pub use self::engine::Engine;
pub use self::state::State;
pub use self::ethash::{Ethash, EthashParams};
pub use self::basic_authority::{BasicAuthority, BasicAuthorityParams};
+pub use self::bft::{BFT, BFTParams};