evm call and create in progress

This commit is contained in:
debris 2016-01-06 20:00:32 +01:00
parent a0bb1068af
commit 8c6d6950ca
3 changed files with 64 additions and 37 deletions

View File

@ -109,19 +109,19 @@ pub trait Env {
io_gas: *mut u64,
endowment: *const JitI256,
init_beg: *const u8,
init_size: *const u64,
address: *mut JitI256);
init_size: u64,
address: *mut JitH256);
fn call(&mut self,
io_gas: *mut u64,
call_gas: *const u64,
receive_address: *const JitI256,
call_gas: u64,
receive_address: *const JitH256,
value: *const JitI256,
in_beg: *const u8,
in_size: *const u64,
in_size: u64,
out_beg: *mut u8,
out_size: *mut u64,
code_address: JitI256) -> bool;
out_size: u64,
code_address: *const JitH256) -> bool;
fn log(&mut self,
beg: *const u8,
@ -321,8 +321,8 @@ pub mod ffi {
io_gas: *mut u64,
endowment: *const JitI256,
init_beg: *const u8,
init_size: *const u64,
address: *mut JitI256) {
init_size: u64,
address: *mut JitH256) {
let env = &mut *env;
env.create(io_gas, endowment, init_beg, init_size, address);
}
@ -330,20 +330,20 @@ pub mod ffi {
#[no_mangle]
pub unsafe extern "C" fn env_call(env: *mut EnvHandle,
io_gas: *mut u64,
call_gas: *const u64,
receive_address: *const JitI256,
call_gas: u64,
receive_address: *const JitH256,
value: *const JitI256,
in_beg: *const u8,
in_size: *const u64,
in_size: u64,
out_beg: *mut u8,
out_size: *mut u64,
code_address: JitI256) -> bool {
out_size: u64,
code_address: *const JitH256) -> bool {
let env = &mut *env;
env.call(io_gas, call_gas, receive_address, value, in_beg, in_size, out_beg, out_size, code_address)
}
#[no_mangle]
pub unsafe extern "C" fn env_sha3(begin: *const u8, size: u64, out_hash: *mut JitI256) {
pub unsafe extern "C" fn env_sha3(begin: *const u8, size: u64, out_hash: *mut JitH256) {
let out_hash = &mut *out_hash;
let input = slice::from_raw_parts(begin, size as usize);
let outlen = out_hash.words.len() * 8;

View File

@ -88,15 +88,15 @@ impl Env {
}
}
/// Creates new contract
/// Returns new contract address gas used
/// Creates new contract.
/// Returns new contract address and gas used.
pub fn create(&self, _gas: u64, _endowment: &U256, _code: &[u8]) -> (Address, u64) {
unimplemented!();
}
/// Calls existing contract
/// Returns call output and gas used
pub fn call(&self, _gas: u64, _call_gas: u64, _receive_address: &H256, _value: &U256, _data: &[u8], _code_address: &Address) -> Option<(Vec<u8>, u64)>{
/// Calls existing contract.
/// Returns call output and gas used.
pub fn call(&self, _gas: u64, _call_gas: u64, _receive_address: &Address, _value: &U256, _data: &[u8], _code_address: &Address) -> Option<(Vec<u8>, u64)>{
unimplemented!();
}

View File

@ -88,6 +88,12 @@ impl IntoJit<evmjit::I256> for Address {
}
}
impl IntoJit<evmjit::H256> for Address {
fn into_jit(self) -> evmjit::H256 {
H256::from(self).into_jit()
}
}
impl IntoJit<evmjit::RuntimeDataHandle> for evm::RuntimeData {
fn into_jit(self) -> evmjit::RuntimeDataHandle {
let mut data = evmjit::RuntimeDataHandle::new();
@ -157,25 +163,46 @@ impl<'a> evmjit::Env for EnvAdapter<'a> {
}
fn create(&mut self,
_io_gas: *mut u64,
_endowment: *const evmjit::I256,
_init_beg: *const u8,
_init_size: *const u64,
_address: *mut evmjit::I256) {
unimplemented!();
io_gas: *mut u64,
endowment: *const evmjit::I256,
init_beg: *const u8,
init_size: u64,
address: *mut evmjit::H256) {
unsafe {
let (addr, gas) = self.env.create(*io_gas, &U256::from_jit(&*endowment), slice::from_raw_parts(init_beg, init_size as usize));
*io_gas = gas;
*address = addr.into_jit();
}
}
fn call(&mut self,
_io_gas: *mut u64,
_call_gas: *const u64,
_receive_address: *const evmjit::I256,
_value: *const evmjit::I256,
_in_beg: *const u8,
_in_size: *const u64,
_out_beg: *mut u8,
_out_size: *mut u64,
_code_address: evmjit::I256) -> bool {
unimplemented!();
io_gas: *mut u64,
call_gas: u64,
receive_address: *const evmjit::H256,
value: *const evmjit::I256,
in_beg: *const u8,
in_size: u64,
mut out_beg: *mut u8,
out_size: u64,
code_address: *const evmjit::H256) -> bool {
unsafe {
let opt = self.env.call(*io_gas,
call_gas,
&Address::from_jit(&*receive_address),
&U256::from_jit(&*value),
slice::from_raw_parts(in_beg, in_size as usize),
&Address::from_jit(&*code_address));
if opt.is_none() {
return false;
}
let (mut output, gas) = opt.unwrap();
out_beg = output.as_mut_ptr();
mem::forget(output);
*io_gas = gas;
true
}
}
fn log(&mut self,
@ -281,7 +308,7 @@ mod tests {
use std::str::FromStr;
let a = Address::from_str("2adc25665018aa1fe0e6bc666dac8fc2697ff9ba").unwrap();
let j = a.clone().into_jit();
let j: ::evmjit::I256 = a.clone().into_jit();
let a2 = Address::from_jit(&j);
assert_eq!(a, a2);
}