From 26b4b56402d2a1d56953419dea92d60bc15699b2 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 7 Feb 2018 13:02:57 +0100 Subject: [PATCH] Remove CallData/OutData. --- substrate/Cargo.lock | 19 ++++++ substrate/Cargo.toml | 1 + substrate/client/src/genesis.rs | 7 +-- substrate/client/src/lib.rs | 4 +- substrate/executor/src/native_executor.rs | 27 ++++----- substrate/executor/src/wasm_executor.rs | 35 ++++++----- substrate/polkadot-primitives/Cargo.toml | 35 +++++++++++ substrate/polkadot-primitives/src/lib.rs | 56 ++++++++++++++++++ substrate/primitives/src/contract.rs | 10 ---- substrate/rpc/src/state/mod.rs | 6 +- substrate/rpc/src/state/tests.rs | 2 +- substrate/runtime-std/src/lib.rs | 46 -------------- substrate/state-machine/src/lib.rs | 6 +- substrate/wasm-runtime/polkadot/src/lib.rs | 44 ++++++++++++++ .../polkadot/src/runtime/system.rs | 2 +- .../release/runtime_polkadot.compact.wasm | Bin 69581 -> 69574 bytes .../release/runtime_polkadot.wasm | Bin 69660 -> 69653 bytes .../release/runtime_test.compact.wasm | Bin 14104 -> 14104 bytes .../release/runtime_test.wasm | Bin 14229 -> 14229 bytes 19 files changed, 197 insertions(+), 103 deletions(-) create mode 100644 substrate/polkadot-primitives/Cargo.toml create mode 100644 substrate/polkadot-primitives/src/lib.rs diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 41c2d747f5..595ca2ff32 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1044,6 +1044,25 @@ dependencies = [ "substrate-state-machine 0.1.0", ] +[[package]] +name = "polkadot-primitives" +version = "0.1.0" +dependencies = [ + "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "fixed-hash 0.1.3 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", + "pretty_assertions 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 2.0.0 (git+https://github.com/rphmeier/rustc-hex.git)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-codec 0.1.0", + "substrate-primitives 0.1.0", + "substrate-serializer 0.1.0", + "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uint 0.1.2 (git+https://github.com/rphmeier/primitives.git?branch=compile-for-wasm)", +] + [[package]] name = "polkadot-rpc" version = "0.1.0" diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 04b654bfce..ce8281310a 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -21,6 +21,7 @@ members = [ "rpc-servers", "rpc", "codec", + "polkadot-primitives", "runtime-std", "serializer", "state-machine", diff --git a/substrate/client/src/genesis.rs b/substrate/client/src/genesis.rs index 1e2020b9a7..6815f6b2b5 100644 --- a/substrate/client/src/genesis.rs +++ b/substrate/client/src/genesis.rs @@ -48,7 +48,6 @@ mod tests { use substrate_executor::executor; use primitives::relay::{AccountId, Hash, BlockNumber, Header, Digest, UncheckedTransaction, Transaction, Function}; - use primitives::contract::CallData; use ed25519::Pair; fn secret_for(who: &AccountId) -> Option { @@ -88,7 +87,7 @@ mod tests { &mut overlay, &executor(), "execute_transaction", - &CallData(vec![].join(&header).join(tx)) + &vec![].join(&header).join(tx) ).unwrap(); header = Header::from_slice(&mut &ret_data[..]).unwrap(); } @@ -98,7 +97,7 @@ mod tests { &mut overlay, &executor(), "finalise_block", - &CallData(vec![].join(&header)) + &vec![].join(&header) ).unwrap(); header = Header::from_slice(&mut &ret_data[..]).unwrap(); @@ -137,7 +136,7 @@ mod tests { &mut overlay, &executor(), "execute_block", - &CallData(b1data) + &b1data ).unwrap(); } } diff --git a/substrate/client/src/lib.rs b/substrate/client/src/lib.rs index 44c2aaa2bf..edf4d22c3e 100644 --- a/substrate/client/src/lib.rs +++ b/substrate/client/src/lib.rs @@ -48,7 +48,7 @@ pub use blockchain::Info as ChainInfo; pub use blockchain::BlockId; use primitives::relay::block; -use primitives::contract::{CallData, StorageKey, StorageData}; +use primitives::contract::{StorageKey, StorageData}; use blockchain::Backend as BlockchainBackend; use backend::BlockImportOperation; @@ -156,7 +156,7 @@ impl Client where /// Execute a call to a contract on top of state in a block of given hash. /// /// No changes are made. - pub fn call(&self, hash: &block::HeaderHash, method: &str, call_data: &CallData) -> error::Result { + pub fn call(&self, hash: &block::HeaderHash, method: &str, call_data: &[u8]) -> error::Result { let state = self.state_at(hash)?; let mut changes = state_machine::OverlayedChanges::default(); diff --git a/substrate/executor/src/native_executor.rs b/substrate/executor/src/native_executor.rs index d52b0daed1..64aa7b4986 100644 --- a/substrate/executor/src/native_executor.rs +++ b/substrate/executor/src/native_executor.rs @@ -16,7 +16,6 @@ use error::{Error, ErrorKind, Result}; use native_runtime as runtime; -use primitives::contract::CallData; use runtime_std; use state_machine::{Externalities, CodeExecutor}; use wasm_executor::WasmExecutor; @@ -37,16 +36,16 @@ impl CodeExecutor for NativeExecutor { ext: &mut E, code: &[u8], method: &str, - data: &CallData, + data: &[u8], ) -> Result> { // WARNING!!! This assumes that the runtime was built *before* the main project. Until we // get a proper build script, this must be strictly adhered to or things will go wrong. let native_equivalent = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm"); if code == &native_equivalent[..] { runtime_std::with_externalities(ext, || match method { - "execute_block" => safe_call(|| runtime::execute_block(&data.0)), - "execute_transaction" => safe_call(|| runtime::execute_transaction(&data.0)), - "finalise_block" => safe_call(|| runtime::finalise_block(&data.0)), + "execute_block" => safe_call(|| runtime::execute_block(data)), + "execute_transaction" => safe_call(|| runtime::execute_transaction(data)), + "finalise_block" => safe_call(|| runtime::finalise_block(data)), _ => Err(ErrorKind::MethodNotFound(method.to_owned()).into()), }) } else { @@ -90,7 +89,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_err()); } @@ -101,7 +100,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_err()); } @@ -114,7 +113,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = NativeExecutor.call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { @@ -132,7 +131,7 @@ mod tests { twox_128(&one.to_keyed_vec(b"sta:bal:")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ], }; - let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = NativeExecutor.call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { @@ -234,7 +233,7 @@ mod tests { fn test_execution_works() { let mut t = new_test_ext(); println!("Testing Wasm..."); - let r = WasmExecutor.call(&mut t, COMPACT_CODE, "run_tests", &CallData(block2().0)); + let r = WasmExecutor.call(&mut t, COMPACT_CODE, "run_tests", &block2().0); assert!(r.is_ok()); } @@ -242,14 +241,14 @@ mod tests { fn full_native_block_import_works() { let mut t = new_test_ext(); - NativeExecutor.call(&mut t, COMPACT_CODE, "execute_block", &CallData(block1().0)).unwrap(); + NativeExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_std::with_externalities(&mut t, || { assert_eq!(balance(&one()), 42); assert_eq!(balance(&two()), 69); }); - NativeExecutor.call(&mut t, COMPACT_CODE, "execute_block", &CallData(block2().0)).unwrap(); + NativeExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_std::with_externalities(&mut t, || { assert_eq!(balance(&one()), 32); @@ -261,14 +260,14 @@ mod tests { fn full_wasm_block_import_works() { let mut t = new_test_ext(); - WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &CallData(block1().0)).unwrap(); + WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block1().0).unwrap(); runtime_std::with_externalities(&mut t, || { assert_eq!(balance(&one()), 42); assert_eq!(balance(&two()), 69); }); - WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &CallData(block2().0)).unwrap(); + WasmExecutor.call(&mut t, COMPACT_CODE, "execute_block", &block2().0).unwrap(); runtime_std::with_externalities(&mut t, || { assert_eq!(balance(&one()), 32); diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 00eb9e67d7..b8a3367f03 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -22,7 +22,6 @@ use std::collections::HashMap; use parity_wasm::{deserialize_buffer, ModuleInstanceInterface, ProgramInstance}; use parity_wasm::interpreter::{ItemIndex, DummyUserError}; use parity_wasm::RuntimeValue::{I32, I64}; -use primitives::contract::CallData; use state_machine::{Externalities, CodeExecutor}; use error::{Error, ErrorKind, Result}; use wasm_utils::{MemoryInstance, UserDefinedElements, @@ -250,7 +249,7 @@ impl CodeExecutor for WasmExecutor { ext: &mut E, code: &[u8], method: &str, - data: &CallData, + data: &[u8], ) -> Result> { // TODO: handle all expects as errors to be returned. @@ -262,9 +261,9 @@ impl CodeExecutor for WasmExecutor { let memory = module.memory(ItemIndex::Internal(0)).expect("all modules compiled with rustc include memory segments; qed"); let mut fec = FunctionExecutor::new(&memory, ext); - let size = data.0.len() as u32; + let size = data.len() as u32; let offset = fec.heap.allocate(size); - memory.set(offset, &data.0).expect("heap always gives a sensible offset to write"); + memory.set(offset, &data).expect("heap always gives a sensible offset to write"); let returned = program .params_with_external("env", &mut fec) @@ -323,7 +322,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor.call(&mut ext, &test_code[..], "test_empty_return", &CallData(vec![])).unwrap(); + let output = WasmExecutor.call(&mut ext, &test_code[..], "test_empty_return", &[]).unwrap(); assert_eq!(output, vec![0u8; 0]); } @@ -332,10 +331,10 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor.call(&mut ext, &test_code[..], "test_panic", &CallData(vec![])); + let output = WasmExecutor.call(&mut ext, &test_code[..], "test_panic", &[]); assert!(output.is_err()); - let output = WasmExecutor.call(&mut ext, &test_code[..], "test_conditional_panic", &CallData(vec![2])); + let output = WasmExecutor.call(&mut ext, &test_code[..], "test_conditional_panic", &[2]); assert!(output.is_err()); } @@ -345,7 +344,7 @@ mod tests { ext.set_storage(b"foo".to_vec(), b"bar".to_vec()); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let output = WasmExecutor.call(&mut ext, &test_code[..], "test_data_in", &CallData(b"Hello world".to_vec())).unwrap(); + let output = WasmExecutor.call(&mut ext, &test_code[..], "test_data_in", b"Hello world").unwrap(); assert_eq!(output, b"all ok!".to_vec()); @@ -362,11 +361,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", &CallData(b"".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", &[]).unwrap(), blake2_256(&b""[..]).to_vec() ); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", &CallData(b"Hello world!".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", b"Hello world!").unwrap(), blake2_256(&b"Hello world!"[..]).to_vec() ); } @@ -376,11 +375,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_twox_256", &CallData(b"".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_256", &[]).unwrap(), FromHex::from_hex("99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a").unwrap() ); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_twox_256", &CallData(b"Hello world!".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_256", b"Hello world!").unwrap(), FromHex::from_hex("b27dfd7f223f177f2a13647b533599af0c07f68bda23d96d059da2b451a35a74").unwrap() ); } @@ -390,11 +389,11 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_twox_128", &CallData(b"".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_128", &[]).unwrap(), FromHex::from_hex("99e9d85137db46ef4bbea33613baafd5").unwrap() ); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_twox_128", &CallData(b"Hello world!".to_vec())).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_128", b"Hello world!").unwrap(), FromHex::from_hex("b27dfd7f223f177f2a13647b533599af").unwrap() ); } @@ -409,7 +408,7 @@ mod tests { calldata.extend_from_slice(key.public().as_ref()); calldata.extend_from_slice(sig.as_ref()); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &CallData(calldata)).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_ed25519_verify", &calldata).unwrap(), vec![0] ); } @@ -419,7 +418,7 @@ mod tests { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_enumerated_trie_root", &CallData(vec![])).unwrap(), + WasmExecutor.call(&mut ext, &test_code[..], "test_enumerated_trie_root", &[]).unwrap(), ordered_trie_root(vec![b"zero".to_vec(), b"one".to_vec(), b"two".to_vec()]).0.to_vec() ); } @@ -432,7 +431,7 @@ mod tests { ], }; let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_err()); } @@ -446,7 +445,7 @@ mod tests { ], }; let foreign_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm"); - let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &CallData(vec![].join(&Header::from_block_number(1u64)).join(&tx()))); + let r = WasmExecutor.call(&mut t, &foreign_code[..], "execute_transaction", &vec![].join(&Header::from_block_number(1u64)).join(&tx())); assert!(r.is_ok()); runtime_std::with_externalities(&mut t, || { diff --git a/substrate/polkadot-primitives/Cargo.toml b/substrate/polkadot-primitives/Cargo.toml new file mode 100644 index 0000000000..c81bd3a1a6 --- /dev/null +++ b/substrate/polkadot-primitives/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "polkadot-primitives" +version = "0.1.0" +authors = ["Parity Technologies "] + +[dependencies] +crunchy = "0.1" +fixed-hash = { git = "https://github.com/rphmeier/primitives.git", branch = "compile-for-wasm", default_features = false } +rustc-hex = { git = "https://github.com/rphmeier/rustc-hex.git", version = "2.0", default_features = false } +serde = { version = "1.0", default_features = false } +serde_derive = { version = "1.0", optional = true } +uint = { git = "https://github.com/rphmeier/primitives.git", branch = "compile-for-wasm" } +twox-hash = { version = "1.1.0", optional = true } +byteorder = { version = "1.1", default_features = false } +blake2-rfc = { version = "0.2.18", optional = true } +substrate-codec = { path = "../codec", default_features = false } +substrate-primitives = { path = "../primitives", default_features = false } + +[dev-dependencies] +substrate-serializer = { path = "../serializer" } +pretty_assertions = "0.4" + +[features] +default = ["std"] +std = [ + "uint/std", + "fixed-hash/std", + "substrate-codec/std", + "serde/std", + "rustc-hex/std", + "twox-hash", + "blake2-rfc", + "serde_derive", + "byteorder/std" +] diff --git a/substrate/polkadot-primitives/src/lib.rs b/substrate/polkadot-primitives/src/lib.rs new file mode 100644 index 0000000000..196ef89fd3 --- /dev/null +++ b/substrate/polkadot-primitives/src/lib.rs @@ -0,0 +1,56 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot 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. + +// Polkadot 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 Polkadot. If not, see . + +//! Shareable Polkadot types. + +#![warn(missing_docs)] + +#![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(not(feature = "std"), feature(alloc))] + +extern crate rustc_hex; + +extern crate serde; +extern crate byteorder; + +#[cfg(feature = "std")] +extern crate twox_hash; +#[cfg(feature = "std")] +extern crate blake2_rfc; + +#[macro_use] +extern crate crunchy; +#[macro_use] +extern crate fixed_hash; +#[cfg(feature = "std")] +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate uint as uint_crate; + +#[cfg(feature = "std")] +extern crate core; +extern crate substrate_codec as codec; +extern crate substrate_primitives as primitives; +#[cfg(test)] +extern crate substrate_serializer; +#[cfg(test)] +#[macro_use] +extern crate pretty_assertions; + +#[cfg(not(feature = "std"))] +#[macro_use] +extern crate alloc; diff --git a/substrate/primitives/src/contract.rs b/substrate/primitives/src/contract.rs index 771381b85b..e8e22fc3f7 100644 --- a/substrate/primitives/src/contract.rs +++ b/substrate/primitives/src/contract.rs @@ -20,16 +20,6 @@ use bytes; use bytes::Vec; -/// Contract call data. -#[derive(Debug, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct CallData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - -/// Contract output data. -#[derive(Debug, PartialEq, Eq)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] -pub struct OutData(#[cfg_attr(feature = "std", serde(with="bytes"))] pub Vec); - /// Contract storage key. #[derive(Debug, PartialEq, Eq)] #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] diff --git a/substrate/rpc/src/state/mod.rs b/substrate/rpc/src/state/mod.rs index 07b78a97c8..dd5ba7d7cb 100644 --- a/substrate/rpc/src/state/mod.rs +++ b/substrate/rpc/src/state/mod.rs @@ -23,7 +23,7 @@ mod tests; use client::{self, Client}; use primitives::relay::block; -use primitives::contract::{CallData, StorageKey, StorageData}; +use primitives::contract::{StorageKey, StorageData}; use state_machine; use self::error::Result; @@ -37,7 +37,7 @@ build_rpc_trait! { /// Call a contract. #[rpc(name = "state_call")] - fn call(&self, String, CallData, block::HeaderHash) -> Result>; + fn call(&self, String, Vec, block::HeaderHash) -> Result>; } } @@ -50,7 +50,7 @@ impl StateApi for Client where Ok(self.storage(&block, &key)?) } - fn call(&self, method: String, data: CallData, block: block::HeaderHash) -> Result> { + fn call(&self, method: String, data: Vec, block: block::HeaderHash) -> Result> { Ok(self.call(&block, &method, &data)?.return_data) } } diff --git a/substrate/rpc/src/state/tests.rs b/substrate/rpc/src/state/tests.rs index 2360ce9e45..8bc0d6ec5f 100644 --- a/substrate/rpc/src/state/tests.rs +++ b/substrate/rpc/src/state/tests.rs @@ -39,7 +39,7 @@ fn should_call_contract() { let genesis_hash = "af65e54217fb213853703d57b80fc5b2bb834bf923046294d7a49bff62f0a8b2".into(); assert_matches!( - StateApi::call(&client, "balanceOf".into(), CallData(vec![1,2,3]), genesis_hash), + StateApi::call(&client, "balanceOf".into(), vec![1,2,3], genesis_hash), Err(Error(ErrorKind::Client(client::error::ErrorKind::Execution(_)), _)) ) } diff --git a/substrate/runtime-std/src/lib.rs b/substrate/runtime-std/src/lib.rs index 0c080a743b..357fa7313b 100644 --- a/substrate/runtime-std/src/lib.rs +++ b/substrate/runtime-std/src/lib.rs @@ -24,8 +24,6 @@ #![cfg_attr(feature = "std", doc = "Polkadot runtime standard library as compiled when linked with Rust's standard library.")] #![cfg_attr(not(feature = "std"), doc = "Polkadot's runtime standard library as compiled without Rust's standard library.")] -extern crate substrate_codec as codec; - #[cfg(feature = "std")] include!("../with_std.rs"); @@ -39,47 +37,3 @@ pub mod prelude { pub use ::vec::Vec; pub use ::boxed::Box; } - -/// Type definitions and helpers for transactions. -pub mod transaction { - pub use primitives::relay::{Transaction, UncheckedTransaction}; - use primitives::relay::Signature; - - #[cfg(feature = "std")] - use std::ops; - - #[cfg(not(feature = "std"))] - use core::ops; - - /// A type-safe indicator that a transaction has been checked. - #[derive(PartialEq, Eq, Clone)] - #[cfg_attr(feature = "std", derive(Debug))] - pub struct CheckedTransaction(UncheckedTransaction); - - impl CheckedTransaction { - /// Get a reference to the checked signature. - pub fn signature(&self) -> &Signature { - &self.0.signature - } - } - - impl ops::Deref for CheckedTransaction { - type Target = Transaction; - - fn deref(&self) -> &Transaction { - &self.0.transaction - } - } - - /// Check the signature on a transaction. - /// - /// On failure, return the transaction back. - pub fn check(tx: UncheckedTransaction) -> Result { - let msg = ::codec::Slicable::to_vec(&tx.transaction); - if ::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { - Ok(CheckedTransaction(tx)) - } else { - Err(tx) - } - } -} diff --git a/substrate/state-machine/src/lib.rs b/substrate/state-machine/src/lib.rs index 8a7af31a05..db1f0ef533 100644 --- a/substrate/state-machine/src/lib.rs +++ b/substrate/state-machine/src/lib.rs @@ -34,8 +34,6 @@ extern crate byteorder; use std::collections::HashMap; use std::fmt; -use primitives::contract::CallData; - pub mod backend; mod ext; mod testing; @@ -177,7 +175,7 @@ pub trait CodeExecutor: Sized + Send + Sync { ext: &mut E, code: &[u8], method: &str, - data: &CallData, + data: &[u8], ) -> Result, Self::Error>; } @@ -192,7 +190,7 @@ pub fn execute( overlay: &mut OverlayedChanges, exec: &Exec, method: &str, - call_data: &CallData, + call_data: &[u8], ) -> Result, Box> { let result = { diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs index 81b0e0c032..656a8a7b2f 100644 --- a/substrate/wasm-runtime/polkadot/src/lib.rs +++ b/substrate/wasm-runtime/polkadot/src/lib.rs @@ -42,6 +42,50 @@ use runtime_std::prelude::*; use codec::Slicable; use primitives::relay::{Header, Block, UncheckedTransaction}; +/// Type definitions and helpers for transactions. +pub mod transaction { + pub use primitives::relay::{Transaction, UncheckedTransaction}; + use primitives::relay::Signature; + + #[cfg(feature = "std")] + use std::ops; + + #[cfg(not(feature = "std"))] + use core::ops; + + /// A type-safe indicator that a transaction has been checked. + #[derive(PartialEq, Eq, Clone)] + #[cfg_attr(feature = "std", derive(Debug))] + pub struct CheckedTransaction(UncheckedTransaction); + + impl CheckedTransaction { + /// Get a reference to the checked signature. + pub fn signature(&self) -> &Signature { + &self.0.signature + } + } + + impl ops::Deref for CheckedTransaction { + type Target = Transaction; + + fn deref(&self) -> &Transaction { + &self.0.transaction + } + } + + /// Check the signature on a transaction. + /// + /// On failure, return the transaction back. + pub fn check(tx: UncheckedTransaction) -> Result { + let msg = ::codec::Slicable::to_vec(&tx.transaction); + if ::runtime_std::ed25519_verify(&tx.signature.0, &msg, &tx.transaction.signed) { + Ok(CheckedTransaction(tx)) + } else { + Err(tx) + } + } +} + /// Execute a block, with `input` being the canonical serialisation of the block. Returns the /// empty vector. pub fn execute_block(mut input: &[u8]) -> Vec { diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs index 9f8edbb92e..5f40feccf5 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -145,7 +145,7 @@ pub mod internal { } fn execute_transaction(utx: UncheckedTransaction) { - use runtime_std::transaction; + use ::transaction; // Verify the signature is good. let tx = match transaction::check(utx) { diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm index 8772bd974e05f427cdeea76cb9c54504ca9f8dfc..ce296a5814d474f42ad7dd50b99647b9088f7a7f 100644 GIT binary patch delta 8544 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 F`hV#R?acrH delta 8762 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 KSmYr$srY}Y<=JWg diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm index 07e49ec59d94f646bcb4f5b524e29490a96fe876..a6831997d4080456b4afa7bd7478586393e926bc 100644 GIT binary patch delta 8706 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 delta 8549 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 IvR+X!0E~k+UH||9 delta 166 zcmbP{HzRMuY8J)^lh?4c0!bs*e#Qrz53y=70jam_tHn7MNDD|Xa67h4ULdauRB%lG zH;_D}5CxQ%Rb0jh|k_dCewBb4zUCWnd6wU|_faq=kX> pDJBL6P9V+TxIvm*FgdXxF*&oOQX#)AwJ0qoznsDG!sL2$F#x6rEf4?z delta 148 zcmbQ5KQ(`Y1}o!($(pRKKyp26KjVYV_H0^AKq`x4wK&HDX#qI~ZpW6%vI?p|1)l