ValidatorSet reporting (#4208)
* remove register_account_provider * build rpc module * new dummy client * common EngineSigner struct * from -> into * initial report via call * separate safe from regular contract * transact_contract * fix build * return Signature, docs * add sign method to some engines * add safeContract spec * update specs to new contracts * use AuthorityRound for contract spec * add more reporting * add reporting test * use gas floor * shorter
This commit is contained in:
@@ -64,7 +64,7 @@ use trace::{TraceDB, ImportRequest as TraceImportRequest, LocalizedTrace, Databa
|
||||
use trace;
|
||||
use trace::FlatTransactionTraces;
|
||||
use evm::{Factory as EvmFactory, Schedule};
|
||||
use miner::{Miner, MinerService};
|
||||
use miner::{Miner, MinerService, TransactionImportResult};
|
||||
use snapshot::{self, io as snapshot_io};
|
||||
use factory::Factories;
|
||||
use rlp::{View, UntrustedRlp};
|
||||
@@ -1455,6 +1455,21 @@ impl BlockChainClient for Client {
|
||||
})
|
||||
}
|
||||
|
||||
fn transact_contract(&self, address: Address, data: Bytes) -> Result<TransactionImportResult, EthcoreError> {
|
||||
let transaction = Transaction {
|
||||
nonce: self.latest_nonce(&self.miner.author()),
|
||||
action: Action::Call(address),
|
||||
gas: self.miner.gas_floor_target(),
|
||||
gas_price: self.miner.sensible_gas_price(),
|
||||
value: U256::zero(),
|
||||
data: data,
|
||||
};
|
||||
let network_id = self.engine.signing_network_id(&self.latest_env_info());
|
||||
let signature = self.engine.sign(transaction.hash(network_id))?;
|
||||
let signed = SignedTransaction::new(transaction.with_signature(signature, network_id))?;
|
||||
self.miner.import_own_transaction(self, signed.into())
|
||||
}
|
||||
|
||||
fn registrar_address(&self) -> Option<Address> {
|
||||
self.registrar.lock().as_ref().map(|r| r.address.clone())
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ use filter::Filter;
|
||||
use log_entry::LocalizedLogEntry;
|
||||
use receipt::{Receipt, LocalizedReceipt};
|
||||
use blockchain::extras::BlockReceipts;
|
||||
use error::{ImportResult};
|
||||
use error::{ImportResult, Error as EthcoreError};
|
||||
use evm::{Factory as EvmFactory, VMType, Schedule};
|
||||
use miner::{Miner, MinerService, TransactionImportResult};
|
||||
use spec::Spec;
|
||||
@@ -730,6 +730,21 @@ impl BlockChainClient for TestBlockChainClient {
|
||||
|
||||
fn call_contract(&self, _address: Address, _data: Bytes) -> Result<Bytes, String> { Ok(vec![]) }
|
||||
|
||||
fn transact_contract(&self, address: Address, data: Bytes) -> Result<TransactionImportResult, EthcoreError> {
|
||||
let transaction = Transaction {
|
||||
nonce: self.latest_nonce(&self.miner.author()),
|
||||
action: Action::Call(address),
|
||||
gas: self.spec.gas_limit,
|
||||
gas_price: U256::zero(),
|
||||
value: U256::default(),
|
||||
data: data,
|
||||
};
|
||||
let network_id = Some(self.spec.params.network_id);
|
||||
let sig = self.spec.engine.sign(transaction.hash(network_id)).unwrap();
|
||||
let signed = SignedTransaction::new(transaction.with_signature(sig, network_id)).unwrap();
|
||||
self.miner.import_own_transaction(self, signed.into())
|
||||
}
|
||||
|
||||
fn registrar_address(&self) -> Option<Address> { None }
|
||||
|
||||
fn registry_address(&self, _name: String) -> Option<Address> { None }
|
||||
|
||||
@@ -22,9 +22,10 @@ use verification::queue::QueueInfo as BlockQueueInfo;
|
||||
use block::{OpenBlock, SealedBlock};
|
||||
use header::{BlockNumber};
|
||||
use transaction::{LocalizedTransaction, PendingTransaction, SignedTransaction};
|
||||
use transaction_import::TransactionImportResult;
|
||||
use log_entry::LocalizedLogEntry;
|
||||
use filter::Filter;
|
||||
use error::{ImportResult, CallError};
|
||||
use error::{ImportResult, CallError, Error as EthcoreError};
|
||||
use receipt::LocalizedReceipt;
|
||||
use trace::LocalizedTrace;
|
||||
use evm::{Factory as EvmFactory, Schedule};
|
||||
@@ -273,6 +274,9 @@ pub trait BlockChainClient : Sync + Send {
|
||||
/// Like `call`, but with various defaults. Designed to be used for calling contracts.
|
||||
fn call_contract(&self, address: Address, data: Bytes) -> Result<Bytes, String>;
|
||||
|
||||
/// Import a transaction: used for misbehaviour reporting.
|
||||
fn transact_contract(&self, address: Address, data: Bytes) -> Result<TransactionImportResult, EthcoreError>;
|
||||
|
||||
/// Get the address of the registry itself.
|
||||
fn registrar_address(&self) -> Option<Address>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user