From 71fb5c467be0eeb2197556c4d0c9f278efd43236 Mon Sep 17 00:00:00 2001 From: keorn Date: Mon, 15 May 2017 22:34:01 +0200 Subject: [PATCH] add monotonic transition to kovan (#5587) --- ethcore/res/ethereum/kovan.json | 3 ++- ethcore/src/engines/authority_round.rs | 12 +++++++++--- json/src/spec/authority_round.rs | 6 +++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ethcore/res/ethereum/kovan.json b/ethcore/res/ethereum/kovan.json index 01ea9956a4a..1c6a029d148 100644 --- a/ethcore/res/ethereum/kovan.json +++ b/ethcore/res/ethereum/kovan.json @@ -25,7 +25,8 @@ ] }, "validateScoreTransition": 1000000, - "eip155Transition": 1000000 + "eip155Transition": 1000000, + "validateStepTransition": 1500000 } } }, diff --git a/ethcore/src/engines/authority_round.rs b/ethcore/src/engines/authority_round.rs index a8b29cf4178..22fb622bb16 100644 --- a/ethcore/src/engines/authority_round.rs +++ b/ethcore/src/engines/authority_round.rs @@ -58,6 +58,8 @@ pub struct AuthorityRoundParams { pub validate_score_transition: u64, /// Number of first block where EIP-155 rules are validated. pub eip155_transition: u64, + /// Monotonic step validation transition block. + pub validate_step_transition: u64, } impl From for AuthorityRoundParams { @@ -71,6 +73,7 @@ impl From for AuthorityRoundParams { start_step: p.start_step.map(Into::into), validate_score_transition: p.validate_score_transition.map_or(0, Into::into), eip155_transition: p.eip155_transition.map_or(0, Into::into), + validate_step_transition: p.validate_step_transition.map_or(0, Into::into), } } } @@ -94,6 +97,7 @@ pub struct AuthorityRound { calibrate_step: bool, validate_score_transition: u64, eip155_transition: u64, + validate_step_transition: u64, } fn header_step(header: &Header) -> Result { @@ -136,6 +140,7 @@ impl AuthorityRound { calibrate_step: our_params.start_step.is_none(), validate_score_transition: our_params.validate_score_transition, eip155_transition: our_params.eip155_transition, + validate_step_transition: our_params.validate_step_transition, }); // Do not initialize timeouts for tests. if should_timeout { @@ -343,9 +348,10 @@ impl Engine for AuthorityRound { // Check if parent is from a previous step. let parent_step = header_step(parent)?; - if step == parent_step { - trace!(target: "engine", "Multiple blocks proposed for step {}.", step); - self.validators.report_malicious(header.author()); + if step == parent_step + || (header.number() >= self.validate_step_transition && step <= parent_step) { + trace!(target: "engine", "Multiple blocks proposed for step {}.", parent_step); + self.validators.report_malicious(header.author(), header.number(), Default::default()); Err(EngineError::DoubleVote(header.author().clone()))?; } diff --git a/json/src/spec/authority_round.rs b/json/src/spec/authority_round.rs index b4c0090519d..99d138d00e1 100644 --- a/json/src/spec/authority_round.rs +++ b/json/src/spec/authority_round.rs @@ -46,6 +46,9 @@ pub struct AuthorityRoundParams { /// See main AuthorityRoundParams docs. #[serde(rename="eip155Transition")] pub eip155_transition: Option, + /// Block from which monotonic steps start. + #[serde(rename="validateStepTransition")] + pub validate_step_transition: Option, } /// Authority engine deserialization. @@ -71,7 +74,8 @@ mod tests { }, "blockReward": "0x50", "startStep" : 24, - "eip155Transition": "0x42" + "eip155Transition": "0x42", + "validateStepTransition": 150 } }"#;