diff --git a/ethcore/src/engines/authority_round/mod.rs b/ethcore/src/engines/authority_round/mod.rs index 65395c43c11..93f0fe8cecc 100644 --- a/ethcore/src/engines/authority_round/mod.rs +++ b/ethcore/src/engines/authority_round/mod.rs @@ -111,8 +111,8 @@ pub struct AuthorityRoundParams { pub maximum_empty_steps: usize, /// Transition block to strict empty steps validation. pub strict_empty_steps_transition: u64, - /// If set, enables random number contract integration. - pub randomness_contract_address: Option
, + /// If set, enables random number contract integration. It maps the transition block to the contract address. + pub randomness_contract_address: BTreeMap, /// If set, this is the block number at which the consensus engine switches from AuRa to AuRa /// with POSDAO modifications. pub posdao_transition: Option, @@ -173,6 +173,11 @@ impl From for AuthorityRoundParams { .into_iter() .map(|(block_num, address)| (block_num.into(), address.into())) .collect(); + let randomness_contract_address = p.randomness_contract_address.map_or_else(BTreeMap::new, |transitions| { + transitions.into_iter().map(|(ethjson::uint::Uint(block), addr)| { + (block.as_u64(), addr.into()) + }).collect() + }); AuthorityRoundParams { step_durations, validators: new_validator_set_posdao(p.validators, p.posdao_transition.map(Into::into)), @@ -188,9 +193,9 @@ impl From for AuthorityRoundParams { maximum_empty_steps: p.maximum_empty_steps.map_or(0, Into::into), two_thirds_majority_transition: p.two_thirds_majority_transition.map_or_else(BlockNumber::max_value, Into::into), strict_empty_steps_transition: p.strict_empty_steps_transition.map_or(0, Into::into), - randomness_contract_address: p.randomness_contract_address.map(Into::into), posdao_transition: p.posdao_transition.map(Into::into), block_gas_limit_contract_transitions, + randomness_contract_address, } } } @@ -553,8 +558,6 @@ pub struct AuthorityRound { two_thirds_majority_transition: BlockNumber, maximum_empty_steps: usize, machine: EthereumMachine, - /// If set, enables random number contract integration. - randomness_contract_address: Option
, /// The block number at which the consensus engine switches from AuRa to AuRa with POSDAO /// modifications. posdao_transition: Option, @@ -562,6 +565,8 @@ pub struct AuthorityRound { block_gas_limit_contract_transitions: BTreeMap, /// History of step hashes recently received from peers. received_step_hashes: RwLock>, + /// If set, enables random number contract integration. It maps the transition block to the contract address. + randomness_contract_address: BTreeMap, } // header-chain validator. @@ -1479,7 +1484,7 @@ impl Engine for AuthorityRound { }; // Random number generation - if let Some(contract_addr) = self.randomness_contract_address { + if let Some((_, &contract_addr)) = self.randomness_contract_address.range(..=block.header.number()).last() { let contract = util::BoundContract::bind(&*client, BlockId::Latest, contract_addr); // TODO: How should these errors be handled? let phase = randomness::RandomnessPhase::load(&contract, our_addr) @@ -1917,7 +1922,7 @@ mod tests { block_reward_contract_transitions: Default::default(), strict_empty_steps_transition: 0, two_thirds_majority_transition: 0, - randomness_contract_address: None, + randomness_contract_address: BTreeMap::new(), posdao_transition: Some(0), block_gas_limit_contract_transitions: BTreeMap::new(), }; diff --git a/ethcore/src/engines/clique/mod.rs b/ethcore/src/engines/clique/mod.rs index 8bf45f1054c..11cd99d2d07 100644 --- a/ethcore/src/engines/clique/mod.rs +++ b/ethcore/src/engines/clique/mod.rs @@ -185,25 +185,8 @@ pub struct Clique { impl Clique { /// Initialize Clique engine from empty state. - pub fn new(our_params: CliqueParams, machine: EthereumMachine) -> Result, Error> { - let mut engine = Clique { - epoch_length: our_params.epoch, - period: our_params.period, - client: Default::default(), - block_state_by_hash: RwLock::new(LruCache::new(STATE_CACHE_NUM)), - proposals: Default::default(), - signer: Default::default(), - machine, - step_service: None, - }; - - let res = Arc::new(engine); - - if our_params.period > 0 { - engine.step_service = Some(StepService::start(Arc::downgrade(&res) as Weak>)); - } - - Ok(res) + pub fn new(_our_params: CliqueParams, _machine: EthereumMachine) -> Result, Error> { + unimplemented!() } #[cfg(test)] diff --git a/json/src/spec/authority_round.rs b/json/src/spec/authority_round.rs index 0061630077e..d2b31f36036 100644 --- a/json/src/spec/authority_round.rs +++ b/json/src/spec/authority_round.rs @@ -69,10 +69,8 @@ pub struct AuthorityRoundParams { pub strict_empty_steps_transition: Option, /// First block for which a 2/3 quorum (instead of 1/2) is required. pub two_thirds_majority_transition: Option, - /// If set, enables random number contract integration, and use Proof of - /// Stake (PoS) consensus. Otherwise, use Proof of Authority (PoA) - /// consensus. - pub randomness_contract_address: Option
, + /// A map of randomness contract transitions. + pub randomness_contract_address: Option>, /// The block number at which the consensus engine switches from AuRa to AuRa with POSDAO /// modifications. pub posdao_transition: Option, @@ -117,6 +115,10 @@ mod tests { "blockGasLimitContractTransitions": { "10": "0x1000000000000000000000000000000000000001", "20": "0x2000000000000000000000000000000000000002" + }, + "randomnessContractAddress": { + "10": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "20": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" } } }"#; @@ -133,5 +135,10 @@ mod tests { (Uint(20.into()), Address(H160::from_str("2000000000000000000000000000000000000002").unwrap()))]; assert_eq!(deserialized.params.block_gas_limit_contract_transitions, Some(expected_bglc.to_vec().into_iter().collect())); + assert_eq!(deserialized.params.randomness_contract_address.unwrap(), + vec![ + (Uint(10.into()), Address(H160::from_str("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap())), + (Uint(20.into()), Address(H160::from_str("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb").unwrap())), + ].into_iter().collect()); } }