Initial checking.
This commit is contained in:
parent
4a92668c56
commit
4bb4ed9551
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -282,6 +282,7 @@ dependencies = [
|
|||||||
"clippy 0.0.96 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clippy 0.0.96 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"crossbeam 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"crossbeam 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"ethabi 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethash 1.4.0",
|
"ethash 1.4.0",
|
||||||
"ethcore-bloom-journal 0.1.0",
|
"ethcore-bloom-journal 0.1.0",
|
||||||
"ethcore-devtools 1.4.0",
|
"ethcore-devtools 1.4.0",
|
||||||
|
@ -41,6 +41,7 @@ ethcore-ipc-nano = { path = "../ipc/nano" }
|
|||||||
rlp = { path = "../util/rlp" }
|
rlp = { path = "../util/rlp" }
|
||||||
lru-cache = "0.1.0"
|
lru-cache = "0.1.0"
|
||||||
ethcore-bloom-journal = { path = "../util/bloom" }
|
ethcore-bloom-journal = { path = "../util/bloom" }
|
||||||
|
ethabi = "0.2.2"
|
||||||
|
|
||||||
[dependencies.hyper]
|
[dependencies.hyper]
|
||||||
git = "https://github.com/ethcore/hyper"
|
git = "https://github.com/ethcore/hyper"
|
||||||
|
@ -27,6 +27,7 @@ use util::{journaldb, TrieFactory, Trie};
|
|||||||
use util::trie::TrieSpec;
|
use util::trie::TrieSpec;
|
||||||
use util::{U256, H256, Address, H2048, Uint, FixedHash};
|
use util::{U256, H256, Address, H2048, Uint, FixedHash};
|
||||||
use util::kvdb::*;
|
use util::kvdb::*;
|
||||||
|
use util::misc::code_hash;
|
||||||
|
|
||||||
// other
|
// other
|
||||||
use io::*;
|
use io::*;
|
||||||
@ -42,7 +43,7 @@ use env_info::LastHashes;
|
|||||||
use verification;
|
use verification;
|
||||||
use verification::{PreverifiedBlock, Verifier};
|
use verification::{PreverifiedBlock, Verifier};
|
||||||
use block::*;
|
use block::*;
|
||||||
use transaction::{LocalizedTransaction, SignedTransaction, Action};
|
use transaction::{LocalizedTransaction, SignedTransaction, Transaction, Action};
|
||||||
use blockchain::extras::TransactionAddress;
|
use blockchain::extras::TransactionAddress;
|
||||||
use types::filter::Filter;
|
use types::filter::Filter;
|
||||||
use types::mode::Mode as IpcMode;
|
use types::mode::Mode as IpcMode;
|
||||||
@ -68,6 +69,7 @@ use factory::Factories;
|
|||||||
use rlp::{decode, View, UntrustedRlp};
|
use rlp::{decode, View, UntrustedRlp};
|
||||||
use state_db::StateDB;
|
use state_db::StateDB;
|
||||||
use rand::OsRng;
|
use rand::OsRng;
|
||||||
|
use ethabi::{Interface, Contract, Token};
|
||||||
|
|
||||||
// re-export
|
// re-export
|
||||||
pub use types::blockchain_info::BlockChainInfo;
|
pub use types::blockchain_info::BlockChainInfo;
|
||||||
@ -634,10 +636,18 @@ impl Client {
|
|||||||
/// Tick the client.
|
/// Tick the client.
|
||||||
// TODO: manage by real events.
|
// TODO: manage by real events.
|
||||||
pub fn tick(&self) {
|
pub fn tick(&self) {
|
||||||
|
self.check_garbage();
|
||||||
|
self.check_snooze();
|
||||||
|
self.check_updates();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_garbage(&self) {
|
||||||
self.chain.read().collect_garbage();
|
self.chain.read().collect_garbage();
|
||||||
self.block_queue.collect_garbage();
|
self.block_queue.collect_garbage();
|
||||||
self.tracedb.read().collect_garbage();
|
self.tracedb.read().collect_garbage();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_snooze(&self) {
|
||||||
let mode = self.mode.lock().clone();
|
let mode = self.mode.lock().clone();
|
||||||
match mode {
|
match mode {
|
||||||
Mode::Dark(timeout) => {
|
Mode::Dark(timeout) => {
|
||||||
@ -671,6 +681,56 @@ impl Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn call_contract(&self, address: Address, data: Bytes) -> Result<Bytes, String> {
|
||||||
|
let from = Address::default();
|
||||||
|
let transaction = Transaction {
|
||||||
|
nonce: self.latest_nonce(&from),
|
||||||
|
action: Action::Call(address),
|
||||||
|
gas: U256::from(50_000_000),
|
||||||
|
gas_price: U256::default(),
|
||||||
|
value: U256::default(),
|
||||||
|
data: data,
|
||||||
|
}.fake_sign(from);
|
||||||
|
|
||||||
|
self.call(&transaction, BlockID::Latest, Default::default())
|
||||||
|
.map_err(|e| format!("{:?}", e))
|
||||||
|
.map(|executed| {
|
||||||
|
executed.output
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_updates(&self) {
|
||||||
|
let operations_json = Interface::load(include_bytes!("../../res/Operations.json")).expect("Operations.json is valid ABI");
|
||||||
|
let operations = Contract::new(operations_json);
|
||||||
|
|
||||||
|
fn as_string<T: fmt::Debug>(e: T) -> String {
|
||||||
|
format!("{:?}", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
let res = || {
|
||||||
|
let is_latest = try!(operations.function("isLatest".into()).map_err(as_string));
|
||||||
|
let params = try!(is_latest.encode_call(
|
||||||
|
vec![Token::String("par".into()), Token::Address(code_hash().0)]
|
||||||
|
).map_err(as_string));
|
||||||
|
let output = try!(self.call_contract("0x4c1783B4FfB1A99eFC4cda632aA990F5138b26f1".into(), params));
|
||||||
|
let result = try!(is_latest.decode_output(output).map_err(as_string));
|
||||||
|
|
||||||
|
match result.get(0) {
|
||||||
|
Some(&Token::Bool(answer)) => Ok(answer),
|
||||||
|
e => Err(format!("Invalid result: {:?}", e)),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
match res() {
|
||||||
|
Ok(res) => {
|
||||||
|
info!("isLatest returned {}", res);
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
warn!(target: "dapps", "Error while calling Operations.isLatest: {:?}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Look up the block number for the given block ID.
|
/// Look up the block number for the given block ID.
|
||||||
pub fn block_number(&self, id: BlockID) -> Option<BlockNumber> {
|
pub fn block_number(&self, id: BlockID) -> Option<BlockNumber> {
|
||||||
match id {
|
match id {
|
||||||
|
@ -117,6 +117,7 @@ extern crate lru_cache;
|
|||||||
|
|
||||||
#[cfg(feature = "jit" )]
|
#[cfg(feature = "jit" )]
|
||||||
extern crate evmjit;
|
extern crate evmjit;
|
||||||
|
extern crate ethabi;
|
||||||
|
|
||||||
pub extern crate ethstore;
|
pub extern crate ethstore;
|
||||||
|
|
||||||
|
@ -32,6 +32,11 @@ pub enum Filth {
|
|||||||
Dirty,
|
Dirty,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the (SHA1?) 160-bit hash of this build's code base.
|
||||||
|
pub fn code_hash() -> H160 {
|
||||||
|
sha().into()
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the standard version string for this software.
|
/// Get the standard version string for this software.
|
||||||
pub fn version() -> String {
|
pub fn version() -> String {
|
||||||
let sha3 = short_sha();
|
let sha3 = short_sha();
|
||||||
|
Loading…
Reference in New Issue
Block a user