Add randomness contract support to AuthorityRound. (#10946)

* Add randomness contract support to Authority Round.

Changes have been cherry-picked from poanetwork's aura-pos branch.
Most of the work has been done by @mbr.

* Address review comments for randomness contract.

Co-Authored-By: David <dvdplm@gmail.com>

* Rename revealSecret to revealNumber

* Update Randomness contract bytecode

* Use H256, rename secret to random number.

* Use get_commit_and_cipher

* Clean up Miner::prepare_block.

* Remove is_reveal_phase call.

* Add more comments, require randomness contract map.

* Simplify run_randomness_phase

* Address review comments.

* Remove Client::transact_contract.
This commit is contained in:
Andreas Fackler
2019-12-17 11:34:14 +01:00
committed by David
parent f6909d8243
commit 2b1d148ceb
26 changed files with 1293 additions and 69 deletions

View File

@@ -33,7 +33,7 @@ use common_types::{
engines::machine::{Call, AuxiliaryData},
};
use client_traits::EngineClient;
use client_traits::{EngineClient, TransactionRequest};
use engine::SystemCall;
use crate::{
@@ -68,7 +68,7 @@ impl ValidatorContract {
match client.as_full_client() {
Some(c) => {
c.transact_contract(self.contract_address, data)
c.transact(TransactionRequest::call(self.contract_address, data))
.map_err(|e| format!("Transaction import error: {}", e))?;
Ok(())
},
@@ -149,7 +149,7 @@ mod tests {
use accounts::AccountProvider;
use call_contract::CallContract;
use common_types::{header::Header, ids::BlockId};
use client_traits::{BlockChainClient, ChainInfo, BlockInfo};
use client_traits::{BlockChainClient, ChainInfo, BlockInfo, TransactionRequest};
use ethcore::{
miner::{self, MinerService},
test_helpers::generate_dummy_client_with_spec,
@@ -225,7 +225,7 @@ mod tests {
assert_eq!(client.chain_info().best_block_number, 2);
// Check if misbehaving validator was removed.
client.transact_contract(Default::default(), Default::default()).unwrap();
client.transact(TransactionRequest::call(Default::default(), Default::default())).unwrap();
client.engine().step();
client.engine().step();
assert_eq!(client.chain_info().best_block_number, 2);

View File

@@ -161,11 +161,13 @@ mod tests {
ids::BlockId,
verification::Unverified,
};
use client_traits::{BlockChainClient, BlockInfo, ChainInfo, ImportBlock, EngineClient, ForceUpdateSealing};
use client_traits::{
BlockChainClient, BlockInfo, ChainInfo, ImportBlock, EngineClient, ForceUpdateSealing, TransactionRequest
};
use engine::EpochChange;
use ethcore::{
miner::{self, MinerService},
test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data},
test_helpers::generate_dummy_client_with_spec,
};
use ethereum_types::Address;
use parity_crypto::publickey::Secret;
@@ -190,7 +192,7 @@ mod tests {
// Wrong signer for the first block.
let signer = Box::new((tap.clone(), v1, "".into()));
client.miner().set_author(miner::Author::Sealer(signer));
client.transact_contract(Default::default(), Default::default()).unwrap();
client.transact(TransactionRequest::call(Default::default(), Default::default())).unwrap();
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 0);
// Right signer for the first block.
@@ -199,7 +201,7 @@ mod tests {
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 1);
// This time v0 is wrong.
client.transact_contract(Default::default(), Default::default()).unwrap();
client.transact(TransactionRequest::call(Default::default(), Default::default())).unwrap();
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 1);
let signer = Box::new((tap.clone(), v1, "".into()));
@@ -207,12 +209,12 @@ mod tests {
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 2);
// v1 is still good.
client.transact_contract(Default::default(), Default::default()).unwrap();
client.transact(TransactionRequest::call(Default::default(), Default::default())).unwrap();
EngineClient::update_sealing(&*client, ForceUpdateSealing::No);
assert_eq!(client.chain_info().best_block_number, 3);
// Check syncing.
let sync_client = generate_dummy_client_with_spec_and_data(spec::new_validator_multi, 0, 0, &[]);
let sync_client = generate_dummy_client_with_spec(spec::new_validator_multi);
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
for i in 1..4 {
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();

View File

@@ -468,7 +468,7 @@ mod tests {
use engine::{EpochChange, Proof};
use ethcore::{
miner::{self, MinerService},
test_helpers::{generate_dummy_client_with_spec, generate_dummy_client_with_spec_and_data}
test_helpers::generate_dummy_client_with_spec
};
use parity_crypto::publickey::Secret;
use ethereum_types::Address;
@@ -551,7 +551,7 @@ mod tests {
assert_eq!(client.chain_info().best_block_number, 3);
// Check syncing.
let sync_client = generate_dummy_client_with_spec_and_data(spec::new_validator_safe_contract, 0, 0, &[]);
let sync_client = generate_dummy_client_with_spec(spec::new_validator_safe_contract);
sync_client.engine().register_client(Arc::downgrade(&sync_client) as _);
for i in 1..4 {
sync_client.import_block(Unverified::from_rlp(client.block(BlockId::Number(i)).unwrap().into_inner()).unwrap()).unwrap();