diff --git a/ethcore/res/wasm-tests b/ethcore/res/wasm-tests
index fcac936bf..c8129ce2f 160000
--- a/ethcore/res/wasm-tests
+++ b/ethcore/res/wasm-tests
@@ -1 +1 @@
-Subproject commit fcac936bf68cc271a6a6ac088efb458f3a08f38a
+Subproject commit c8129ce2f36c26ed634eda786960978a28e28d0e
diff --git a/ethcore/wasm/src/call_args.rs b/ethcore/wasm/src/call_args.rs
deleted file mode 100644
index 7fb50bff3..000000000
--- a/ethcore/wasm/src/call_args.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2015-2017 Parity Technologies (UK) Ltd.
-// This file is part of Parity.
-
-// Parity is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-
-// Parity is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License
-// along with Parity. If not, see .
-
-//! Wasm evm call arguments helper
-
-use bigint::prelude::U256;
-use bigint::hash::H160;
-
-/// Input part of the wasm call descriptor
-pub struct CallArgs {
- /// Receiver of the transaction
- pub address: [u8; 20],
-
- /// Sender of the transaction
- pub sender: [u8; 20],
-
- /// Original transaction initiator
- pub origin: [u8; 20],
-
- /// Transfer value
- pub value: [u8; 32],
-
- /// call/create params
- pub data: Vec,
-}
-
-impl CallArgs {
- /// New contract call payload with known parameters
- pub fn new(address: H160, sender: H160, origin: H160, value: U256, data: Vec) -> Self {
- let mut descriptor = CallArgs {
- address: [0u8; 20],
- sender: [0u8; 20],
- origin: [0u8; 20],
- value: [0u8; 32],
- data: data,
- };
-
- descriptor.address.copy_from_slice(&*address);
- descriptor.sender.copy_from_slice(&*sender);
- descriptor.origin.copy_from_slice(&*origin);
- value.to_big_endian(&mut descriptor.value);
-
- descriptor
- }
-
- /// Total call payload length in linear memory
- pub fn len(&self) -> u32 {
- self.data.len() as u32 + 92
- }
-}
diff --git a/ethcore/wasm/src/env.rs b/ethcore/wasm/src/env.rs
index c32e3ed84..8f4fa264f 100644
--- a/ethcore/wasm/src/env.rs
+++ b/ethcore/wasm/src/env.rs
@@ -102,6 +102,26 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[
&[I32],
None,
),
+ Static(
+ "_sender",
+ &[I32],
+ None,
+ ),
+ Static(
+ "_origin",
+ &[I32],
+ None,
+ ),
+ Static(
+ "_address",
+ &[I32],
+ None,
+ ),
+ Static(
+ "_value",
+ &[I32],
+ None,
+ ),
Static(
"_timestamp",
&[],
diff --git a/ethcore/wasm/src/lib.rs b/ethcore/wasm/src/lib.rs
index 8eb14a91a..a68d40d86 100644
--- a/ethcore/wasm/src/lib.rs
+++ b/ethcore/wasm/src/lib.rs
@@ -27,7 +27,6 @@ extern crate wasm_utils;
mod runtime;
mod ptr;
-mod call_args;
mod result;
#[cfg(test)]
mod tests;
@@ -107,7 +106,12 @@ impl vm::Vm for WasmInterpreter {
env_memory,
DEFAULT_STACK_SPACE,
params.gas.low_u64(),
- RuntimeContext::new(params.address, params.sender),
+ RuntimeContext {
+ address: params.address,
+ sender: params.sender,
+ origin: params.origin,
+ value: params.value.value(),
+ },
&self.program,
);
@@ -121,15 +125,8 @@ impl vm::Vm for WasmInterpreter {
})?
);
- let d_ptr = runtime.write_descriptor(
- call_args::CallArgs::new(
- params.address,
- params.sender,
- params.origin,
- params.value.value(),
- params.data.unwrap_or(Vec::with_capacity(0)),
- )
- ).map_err(|e| Error(e))?;
+ let d_ptr = runtime.write_descriptor(¶ms.data.unwrap_or_default())
+ .map_err(Error)?;
{
let execution_params = runtime.execution_params()
diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs
index 8376d0f39..5e18ce216 100644
--- a/ethcore/wasm/src/runtime.rs
+++ b/ethcore/wasm/src/runtime.rs
@@ -28,7 +28,6 @@ use util::Address;
use vm::CallType;
use super::ptr::{WasmPtr, Error as PtrError};
-use super::call_args::CallArgs;
/// User trap in native code
#[derive(Debug, Clone, PartialEq)]
@@ -97,17 +96,10 @@ impl From for UserTrap {
}
pub struct RuntimeContext {
- address: Address,
- sender: Address,
-}
-
-impl RuntimeContext {
- pub fn new(address: Address, sender: Address) -> Self {
- RuntimeContext {
- address: address,
- sender: sender,
- }
- }
+ pub address: Address,
+ pub sender: Address,
+ pub origin: Address,
+ pub value: U256,
}
/// Runtime enviroment data for wasm contract execution
@@ -442,10 +434,10 @@ impl<'a, 'b> Runtime<'a, 'b> {
}
/// Write call descriptor to wasm memory
- pub fn write_descriptor(&mut self, call_args: CallArgs) -> Result {
+ pub fn write_descriptor(&mut self, input: &[u8]) -> Result {
let d_ptr = self.alloc(16)?;
- let args_len = call_args.len();
+ let args_len = input.len() as u32;
let args_ptr = self.alloc(args_len)?;
// write call descriptor
@@ -457,11 +449,7 @@ impl<'a, 'b> Runtime<'a, 'b> {
self.memory.set(d_ptr, &d_buf)?;
// write call args to memory
- self.memory.set(args_ptr, &call_args.address)?;
- self.memory.set(args_ptr+20, &call_args.sender)?;
- self.memory.set(args_ptr+40, &call_args.origin)?;
- self.memory.set(args_ptr+60, &call_args.value)?;
- self.memory.set(args_ptr+92, &call_args.data)?;
+ self.memory.set(args_ptr, input)?;
Ok(d_ptr.into())
}
@@ -559,6 +547,39 @@ impl<'a, 'b> Runtime<'a, 'b> {
Ok(None)
}
+ fn sender(&mut self, context: InterpreterCallerContext)
+ -> Result