2018-06-04 10:19:50 +02:00
|
|
|
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
|
2016-09-08 12:28:59 +02:00
|
|
|
// 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/>.
|
|
|
|
|
|
|
|
//! Authority params deserialization.
|
|
|
|
|
2018-04-20 12:32:00 +02:00
|
|
|
use ethereum_types::Address;
|
2016-09-08 12:28:59 +02:00
|
|
|
use uint::Uint;
|
2017-01-10 12:23:59 +01:00
|
|
|
use super::ValidatorSet;
|
2016-09-08 12:28:59 +02:00
|
|
|
|
|
|
|
/// Authority params deserialization.
|
|
|
|
#[derive(Debug, PartialEq, Deserialize)]
|
|
|
|
pub struct AuthorityRoundParams {
|
Problem: AuRa's unsafeties around step duration (#7282)
Firstly, `Step.duration_remaining` casts it to u32, unnecesarily
limiting it to 2^32. While theoretically this is "good enough" (at 3
seconds steps it provides room for a little over 400 years), it is
still a lossy way to calculate the remaining time until the next step.
Secondly, step duration might be zero, triggering division by zero
in `Step.calibrate`
Solution: rework the code around the fact that duration is
typically in single digits and never grows, hence, it can be represented
by a much narrower range (u16) and this highlights the fact that
multiplying u64 by u16 will only result in an overflow in even further
future, at which point we should panic informatively (if anybody's
still around)
Similarly, panic when it is detected that incrementing the step
counter wrapped around on the overflow of usize.
As for the division by zero, prevent it by making zero an invalid
value for step duration. This will make AuRa log the constraint
mismatch and panic (after all, what purpose would zero step duration
serve? it makes no sense within the definition of the protocol,
as finality can only be achieved as per the specification
if messages are received within the step duration, which would violate
the speed of light and other physical laws in this case).
2017-12-21 14:59:09 +01:00
|
|
|
/// Block duration, in seconds.
|
2016-09-08 12:28:59 +02:00
|
|
|
#[serde(rename="stepDuration")]
|
|
|
|
pub step_duration: Uint,
|
|
|
|
/// Valid authorities
|
2017-01-10 12:23:59 +01:00
|
|
|
pub validators: ValidatorSet,
|
2016-12-06 19:23:15 +01:00
|
|
|
/// Starting step. Determined automatically if not specified.
|
|
|
|
/// To be used for testing only.
|
|
|
|
#[serde(rename="startStep")]
|
|
|
|
pub start_step: Option<Uint>,
|
2017-03-28 10:46:52 +02:00
|
|
|
/// Block at which score validation should start.
|
|
|
|
#[serde(rename="validateScoreTransition")]
|
|
|
|
pub validate_score_transition: Option<Uint>,
|
2017-05-15 22:34:01 +02:00
|
|
|
/// Block from which monotonic steps start.
|
|
|
|
#[serde(rename="validateStepTransition")]
|
|
|
|
pub validate_step_transition: Option<Uint>,
|
2017-06-28 13:17:36 +02:00
|
|
|
/// Whether transitions should be immediate.
|
|
|
|
#[serde(rename="immediateTransitions")]
|
|
|
|
pub immediate_transitions: Option<bool>,
|
2017-09-26 14:19:08 +02:00
|
|
|
/// Reward per block in wei.
|
|
|
|
#[serde(rename="blockReward")]
|
|
|
|
pub block_reward: Option<Uint>,
|
2018-04-20 12:32:00 +02:00
|
|
|
/// Block at which the block reward contract should start being used.
|
|
|
|
#[serde(rename="blockRewardContractTransition")]
|
|
|
|
pub block_reward_contract_transition: Option<Uint>,
|
|
|
|
/// Block reward contract address (setting the block reward contract
|
|
|
|
/// overrides the static block reward definition).
|
|
|
|
#[serde(rename="blockRewardContractAddress")]
|
|
|
|
pub block_reward_contract_address: Option<Address>,
|
2017-12-05 15:57:45 +01:00
|
|
|
/// Block at which maximum uncle count should be considered.
|
|
|
|
#[serde(rename="maximumUncleCountTransition")]
|
|
|
|
pub maximum_uncle_count_transition: Option<Uint>,
|
|
|
|
/// Maximum number of accepted uncles.
|
2017-11-10 00:56:02 +01:00
|
|
|
#[serde(rename="maximumUncleCount")]
|
|
|
|
pub maximum_uncle_count: Option<Uint>,
|
2018-02-15 01:39:29 +01:00
|
|
|
/// Block at which empty step messages should start.
|
|
|
|
#[serde(rename="emptyStepsTransition")]
|
|
|
|
pub empty_steps_transition: Option<Uint>,
|
|
|
|
/// Maximum number of accepted empty steps.
|
|
|
|
#[serde(rename="maximumEmptySteps")]
|
|
|
|
pub maximum_empty_steps: Option<Uint>,
|
2016-09-08 12:28:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// Authority engine deserialization.
|
|
|
|
#[derive(Debug, PartialEq, Deserialize)]
|
|
|
|
pub struct AuthorityRound {
|
|
|
|
/// Ethash params.
|
|
|
|
pub params: AuthorityRoundParams,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
2018-01-10 13:35:18 +01:00
|
|
|
use ethereum_types::{U256, H160};
|
2017-05-11 08:05:56 +02:00
|
|
|
use uint::Uint;
|
2016-09-08 12:28:59 +02:00
|
|
|
use serde_json;
|
2017-05-12 17:51:02 +02:00
|
|
|
use hash::Address;
|
|
|
|
use spec::validator_set::ValidatorSet;
|
2016-09-08 16:27:54 +02:00
|
|
|
use spec::authority_round::AuthorityRound;
|
2016-09-08 12:28:59 +02:00
|
|
|
|
|
|
|
#[test]
|
2017-01-05 21:16:13 +01:00
|
|
|
fn authority_round_deserialization() {
|
2016-09-08 12:28:59 +02:00
|
|
|
let s = r#"{
|
|
|
|
"params": {
|
|
|
|
"stepDuration": "0x02",
|
2017-01-10 12:23:59 +01:00
|
|
|
"validators": {
|
|
|
|
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
|
|
|
},
|
2017-04-01 13:21:22 +02:00
|
|
|
"startStep" : 24,
|
2017-09-26 14:19:08 +02:00
|
|
|
"validateStepTransition": 150,
|
2017-12-05 15:57:45 +01:00
|
|
|
"blockReward": 5000000,
|
|
|
|
"maximumUncleCountTransition": 10000000,
|
|
|
|
"maximumUncleCount": 5
|
2016-09-08 12:28:59 +02:00
|
|
|
}
|
|
|
|
}"#;
|
|
|
|
|
2017-05-11 08:05:56 +02:00
|
|
|
let deserialized: AuthorityRound = serde_json::from_str(s).unwrap();
|
|
|
|
assert_eq!(deserialized.params.step_duration, Uint(U256::from(0x02)));
|
2017-05-12 17:51:02 +02:00
|
|
|
assert_eq!(deserialized.params.validators, ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]));
|
|
|
|
assert_eq!(deserialized.params.start_step, Some(Uint(U256::from(24))));
|
2017-06-28 13:17:36 +02:00
|
|
|
assert_eq!(deserialized.params.immediate_transitions, None);
|
2017-12-05 15:57:45 +01:00
|
|
|
assert_eq!(deserialized.params.maximum_uncle_count_transition, Some(Uint(10_000_000.into())));
|
|
|
|
assert_eq!(deserialized.params.maximum_uncle_count, Some(Uint(5.into())));
|
2017-09-26 14:19:08 +02:00
|
|
|
|
2016-09-08 12:28:59 +02:00
|
|
|
}
|
|
|
|
}
|