Merge branch 'master' into evm
This commit is contained in:
@@ -12,7 +12,8 @@ use env_info::*;
|
||||
use evm_schedule::*;
|
||||
use engine::*;
|
||||
use transaction::*;
|
||||
use evm::{VmFactory, Ext, LogEntry, EvmParams, EvmResult, EvmError};
|
||||
use log_entry::*;
|
||||
use evm::{VmFactory, Ext, EvmParams, EvmResult, EvmError};
|
||||
|
||||
/// Returns new address created from address and given nonce.
|
||||
pub fn contract_address(address: &Address, nonce: &U256) -> Address {
|
||||
@@ -167,8 +168,8 @@ impl<'a> Executive<'a> {
|
||||
self.state.inc_nonce(&sender);
|
||||
let mut substate = Substate::new();
|
||||
|
||||
let res = match t.kind() {
|
||||
TransactionKind::ContractCreation => {
|
||||
let res = match t.action() {
|
||||
&Action::Create => {
|
||||
let params = EvmParams {
|
||||
address: contract_address(&sender, &nonce),
|
||||
sender: sender.clone(),
|
||||
@@ -179,20 +180,20 @@ impl<'a> Executive<'a> {
|
||||
code: t.data.clone(),
|
||||
data: vec![],
|
||||
};
|
||||
self.call(¶ms, &mut substate, &mut [])
|
||||
self.create(¶ms, &mut substate)
|
||||
},
|
||||
TransactionKind::MessageCall => {
|
||||
&Action::Call(ref address) => {
|
||||
let params = EvmParams {
|
||||
address: t.to.clone().unwrap(),
|
||||
address: address.clone(),
|
||||
sender: sender.clone(),
|
||||
origin: sender.clone(),
|
||||
gas: t.gas,
|
||||
gas_price: t.gas_price,
|
||||
value: t.value,
|
||||
code: self.state.code(&t.to.clone().unwrap()).unwrap_or(vec![]),
|
||||
code: self.state.code(address).unwrap_or(vec![]),
|
||||
data: t.data.clone(),
|
||||
};
|
||||
self.create(¶ms, &mut substate)
|
||||
self.call(¶ms, &mut substate, &mut [])
|
||||
}
|
||||
};
|
||||
|
||||
@@ -337,10 +338,10 @@ impl<'a> Ext for Externalities<'a> {
|
||||
}
|
||||
|
||||
fn blockhash(&self, number: &U256) -> H256 {
|
||||
match *number < self.info.number {
|
||||
match *number < U256::from(self.info.number) {
|
||||
false => H256::from(&U256::zero()),
|
||||
true => {
|
||||
let index = self.info.number - *number - U256::one();
|
||||
let index = U256::from(self.info.number) - *number - U256::one();
|
||||
self.info.last_hashes[index.low_u32() as usize].clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -678,7 +678,7 @@ mod tests {
|
||||
|
||||
let mut state = State::new_temp();
|
||||
let mut info = EnvInfo::new();
|
||||
info.number = U256::one();
|
||||
info.number = 1;
|
||||
info.last_hashes.push(H256::from(address.clone()));
|
||||
let engine = TestEngine::new();
|
||||
let mut substate = Substate::new();
|
||||
@@ -704,7 +704,7 @@ mod tests {
|
||||
|
||||
let mut state = State::new_temp();
|
||||
let mut info = EnvInfo::new();
|
||||
info.number = U256::one();
|
||||
info.number = 1;
|
||||
info.last_hashes.push(H256::from(address.clone()));
|
||||
let engine = TestEngine::new();
|
||||
let mut substate = Substate::new();
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
//! Transaction log entry.
|
||||
use util::hash::*;
|
||||
use util::bytes::*;
|
||||
use util::sha3::*;
|
||||
|
||||
/// Data sturcture used to represent Evm log entry.
|
||||
pub struct LogEntry {
|
||||
address: Address,
|
||||
topics: Vec<H256>,
|
||||
data: Bytes
|
||||
}
|
||||
|
||||
impl LogEntry {
|
||||
/// This function should be called to create new log entry.
|
||||
pub fn new(address: Address, topics: Vec<H256>, data: Bytes) -> LogEntry {
|
||||
LogEntry {
|
||||
address: address,
|
||||
topics: topics,
|
||||
data: data
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns reference to address.
|
||||
pub fn address(&self) -> &Address {
|
||||
&self.address
|
||||
}
|
||||
|
||||
/// Returns reference to topics.
|
||||
pub fn topics(&self) -> &[H256] {
|
||||
&self.topics
|
||||
}
|
||||
|
||||
/// Returns reference to data.
|
||||
pub fn data(&self) -> &Bytes {
|
||||
&self.data
|
||||
}
|
||||
|
||||
/// Returns log bloom of given log entry.
|
||||
pub fn bloom(&self) -> H2048 {
|
||||
let mut bloom = H2048::new();
|
||||
bloom.shift_bloom(&self.address.sha3());
|
||||
for topic in self.topics.iter() {
|
||||
bloom.shift_bloom(&topic.sha3());
|
||||
}
|
||||
bloom
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::str::FromStr;
|
||||
use util::hash::*;
|
||||
use util::bytes::*;
|
||||
use evm::LogEntry;
|
||||
|
||||
#[test]
|
||||
fn test_empty_log_bloom() {
|
||||
let bloom = H2048::from_str("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap();
|
||||
let address = Address::from_str("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").unwrap();
|
||||
let log = LogEntry::new(address, vec![], vec![]);
|
||||
assert_eq!(log.bloom(), bloom);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
pub mod ext;
|
||||
pub mod evm;
|
||||
pub mod vmfactory;
|
||||
pub mod logentry;
|
||||
//pub mod logentry;
|
||||
pub mod executive;
|
||||
pub mod params;
|
||||
#[cfg(feature = "jit" )]
|
||||
@@ -11,7 +11,7 @@ mod jit;
|
||||
|
||||
pub use self::evm::{Evm, EvmError, EvmResult};
|
||||
pub use self::ext::{Ext};
|
||||
pub use self::logentry::LogEntry;
|
||||
//pub use self::logentry::LogEntry;
|
||||
pub use self::vmfactory::VmFactory;
|
||||
// TODO: reduce this to absolutely necessary things
|
||||
pub use self::executive::{Executive, ExecutionResult, Externalities, Substate, OutputPolicy};
|
||||
|
||||
Reference in New Issue
Block a user