Support millisecond timestamp for instant seal engine (#9469)
* Support millisecond timestamp for instant seal engine * Forgot to checkin instant_seal mod * Fix instant seal config * Fix json crate compile * Fix private_spec.json * Option<bool> -> bool
This commit is contained in:
parent
39a12622ae
commit
5752869824
@ -1,7 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "DevelopmentChain",
|
"name": "DevelopmentChain",
|
||||||
"engine": {
|
"engine": {
|
||||||
"instantSeal": null
|
"instantSeal": {
|
||||||
|
"params": {}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
@ -17,17 +17,33 @@
|
|||||||
use engines::{Engine, Seal};
|
use engines::{Engine, Seal};
|
||||||
use parity_machine::{Machine, Transactions, TotalScoredHeader};
|
use parity_machine::{Machine, Transactions, TotalScoredHeader};
|
||||||
|
|
||||||
|
/// `InstantSeal` params.
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct InstantSealParams {
|
||||||
|
/// Whether to use millisecond timestamp
|
||||||
|
pub millisecond_timestamp: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<::ethjson::spec::InstantSealParams> for InstantSealParams {
|
||||||
|
fn from(p: ::ethjson::spec::InstantSealParams) -> Self {
|
||||||
|
InstantSealParams {
|
||||||
|
millisecond_timestamp: p.millisecond_timestamp,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An engine which does not provide any consensus mechanism, just seals blocks internally.
|
/// An engine which does not provide any consensus mechanism, just seals blocks internally.
|
||||||
/// Only seals blocks which have transactions.
|
/// Only seals blocks which have transactions.
|
||||||
pub struct InstantSeal<M> {
|
pub struct InstantSeal<M> {
|
||||||
|
params: InstantSealParams,
|
||||||
machine: M,
|
machine: M,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<M> InstantSeal<M> {
|
impl<M> InstantSeal<M> {
|
||||||
/// Returns new instance of InstantSeal over the given state machine.
|
/// Returns new instance of InstantSeal over the given state machine.
|
||||||
pub fn new(machine: M) -> Self {
|
pub fn new(params: InstantSealParams, machine: M) -> Self {
|
||||||
InstantSeal {
|
InstantSeal {
|
||||||
machine: machine,
|
params, machine,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,8 +72,12 @@ impl<M: Machine> Engine<M> for InstantSeal<M>
|
|||||||
fn open_block_header_timestamp(&self, parent_timestamp: u64) -> u64 {
|
fn open_block_header_timestamp(&self, parent_timestamp: u64) -> u64 {
|
||||||
use std::{time, cmp};
|
use std::{time, cmp};
|
||||||
|
|
||||||
let now = time::SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap_or_default();
|
let dur = time::SystemTime::now().duration_since(time::UNIX_EPOCH).unwrap_or_default();
|
||||||
cmp::max(now.as_secs(), parent_timestamp)
|
let mut now = dur.as_secs();
|
||||||
|
if self.params.millisecond_timestamp {
|
||||||
|
now = now * 1000 + dur.subsec_millis() as u64;
|
||||||
|
}
|
||||||
|
cmp::max(now, parent_timestamp)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_timestamp_valid(&self, header_timestamp: u64, parent_timestamp: u64) -> bool {
|
fn is_timestamp_valid(&self, header_timestamp: u64, parent_timestamp: u64) -> bool {
|
||||||
|
@ -589,7 +589,7 @@ impl Spec {
|
|||||||
match engine_spec {
|
match engine_spec {
|
||||||
ethjson::spec::Engine::Null(null) => Arc::new(NullEngine::new(null.params.into(), machine)),
|
ethjson::spec::Engine::Null(null) => Arc::new(NullEngine::new(null.params.into(), machine)),
|
||||||
ethjson::spec::Engine::Ethash(ethash) => Arc::new(::ethereum::Ethash::new(spec_params.cache_dir, ethash.params.into(), machine, spec_params.optimization_setting)),
|
ethjson::spec::Engine::Ethash(ethash) => Arc::new(::ethereum::Ethash::new(spec_params.cache_dir, ethash.params.into(), machine, spec_params.optimization_setting)),
|
||||||
ethjson::spec::Engine::InstantSeal => Arc::new(InstantSeal::new(machine)),
|
ethjson::spec::Engine::InstantSeal(instant_seal) => Arc::new(InstantSeal::new(instant_seal.params.into(), machine)),
|
||||||
ethjson::spec::Engine::BasicAuthority(basic_authority) => Arc::new(BasicAuthority::new(basic_authority.params.into(), machine)),
|
ethjson::spec::Engine::BasicAuthority(basic_authority) => Arc::new(BasicAuthority::new(basic_authority.params.into(), machine)),
|
||||||
ethjson::spec::Engine::AuthorityRound(authority_round) => AuthorityRound::new(authority_round.params.into(), machine)
|
ethjson::spec::Engine::AuthorityRound(authority_round) => AuthorityRound::new(authority_round.params.into(), machine)
|
||||||
.expect("Failed to start AuthorityRound consensus engine."),
|
.expect("Failed to start AuthorityRound consensus engine."),
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
{
|
{
|
||||||
"name": "PrivateTransactions",
|
"name": "PrivateTransactions",
|
||||||
"engine": {
|
"engine": {
|
||||||
"instantSeal": null
|
"instantSeal": {
|
||||||
|
"params": {}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
//! Engine deserialization.
|
//! Engine deserialization.
|
||||||
|
|
||||||
use super::{Ethash, BasicAuthority, AuthorityRound, Tendermint, NullEngine};
|
use super::{Ethash, BasicAuthority, AuthorityRound, Tendermint, NullEngine, InstantSeal};
|
||||||
|
|
||||||
/// Engine deserialization.
|
/// Engine deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
@ -26,7 +26,7 @@ pub enum Engine {
|
|||||||
Null(NullEngine),
|
Null(NullEngine),
|
||||||
/// Instantly sealing engine.
|
/// Instantly sealing engine.
|
||||||
#[serde(rename="instantSeal")]
|
#[serde(rename="instantSeal")]
|
||||||
InstantSeal,
|
InstantSeal(InstantSeal),
|
||||||
/// Ethash engine.
|
/// Ethash engine.
|
||||||
Ethash(Ethash),
|
Ethash(Ethash),
|
||||||
/// BasicAuthority engine.
|
/// BasicAuthority engine.
|
||||||
@ -62,12 +62,12 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"instantSeal": null
|
"instantSeal": {"params": {}}
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Engine = serde_json::from_str(s).unwrap();
|
let deserialized: Engine = serde_json::from_str(s).unwrap();
|
||||||
match deserialized {
|
match deserialized {
|
||||||
Engine::InstantSeal => {}, // instant seal is unit tested in its own file.
|
Engine::InstantSeal(_) => {}, // instant seal is unit tested in its own file.
|
||||||
_ => panic!(),
|
_ => panic!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
33
json/src/spec/instant_seal.rs
Normal file
33
json/src/spec/instant_seal.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2015-2018 Parity Technologies (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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! Instant seal engine params deserialization.
|
||||||
|
|
||||||
|
/// Instant seal engine params deserialization.
|
||||||
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
pub struct InstantSealParams {
|
||||||
|
/// Whether to enable millisecond timestamp.
|
||||||
|
#[serde(rename="millisecondTimestamp")]
|
||||||
|
#[serde(default)]
|
||||||
|
pub millisecond_timestamp: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Instant seal engine descriptor.
|
||||||
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
pub struct InstantSeal {
|
||||||
|
/// Instant seal parameters.
|
||||||
|
pub params: InstantSealParams,
|
||||||
|
}
|
@ -30,6 +30,7 @@ pub mod basic_authority;
|
|||||||
pub mod authority_round;
|
pub mod authority_round;
|
||||||
pub mod tendermint;
|
pub mod tendermint;
|
||||||
pub mod null_engine;
|
pub mod null_engine;
|
||||||
|
pub mod instant_seal;
|
||||||
pub mod hardcoded_sync;
|
pub mod hardcoded_sync;
|
||||||
|
|
||||||
pub use self::account::Account;
|
pub use self::account::Account;
|
||||||
@ -46,4 +47,5 @@ pub use self::basic_authority::{BasicAuthority, BasicAuthorityParams};
|
|||||||
pub use self::authority_round::{AuthorityRound, AuthorityRoundParams};
|
pub use self::authority_round::{AuthorityRound, AuthorityRoundParams};
|
||||||
pub use self::tendermint::{Tendermint, TendermintParams};
|
pub use self::tendermint::{Tendermint, TendermintParams};
|
||||||
pub use self::null_engine::{NullEngine, NullEngineParams};
|
pub use self::null_engine::{NullEngine, NullEngineParams};
|
||||||
|
pub use self::instant_seal::{InstantSeal, InstantSealParams};
|
||||||
pub use self::hardcoded_sync::HardcodedSync;
|
pub use self::hardcoded_sync::HardcodedSync;
|
||||||
|
Loading…
Reference in New Issue
Block a user