Merge branch 'master' into evm

This commit is contained in:
debris
2016-01-11 15:23:27 +01:00
33 changed files with 2875 additions and 367 deletions

View File

@@ -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(&params, &mut substate, &mut [])
self.create(&params, &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(&params, &mut substate)
self.call(&params, &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()
}
}

View File

@@ -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();

View File

@@ -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);
}
}

View File

@@ -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};