From 98faf54ec4ae9e333961eade8674493637b8c460 Mon Sep 17 00:00:00 2001 From: Gav Date: Wed, 17 Jan 2018 11:45:36 +0100 Subject: [PATCH] Repot and introduce keccak-256 external. --- substrate/Cargo.lock | 3 + substrate/executor/Cargo.toml | 2 + substrate/executor/src/lib.rs | 2 + substrate/executor/src/wasm_executor.rs | 67 ++++++++---------- substrate/native-runtime/support/Cargo.toml | 1 + substrate/native-runtime/support/src/lib.rs | 4 ++ .../src/{support => codec}/endiansensitive.rs | 0 .../polkadot/src/{support => codec}/joiner.rs | 0 .../src/{support => codec}/keyedvec.rs | 0 .../wasm-runtime/polkadot/src/codec/mod.rs | 5 ++ .../src/{support => codec}/slicable.rs | 0 .../src/{support => codec}/streamreader.rs | 0 substrate/wasm-runtime/polkadot/src/lib.rs | 20 ++---- .../polkadot/src/{ => runtime}/consensus.rs | 0 .../wasm-runtime/polkadot/src/runtime/mod.rs | 8 +++ .../polkadot/src/{ => runtime}/staking.rs | 4 +- .../polkadot/src/{ => runtime}/system.rs | 5 +- .../polkadot/src/{ => runtime}/timestamp.rs | 0 .../polkadot/src/support/function.rs | 3 +- .../wasm-runtime/polkadot/src/support/mod.rs | 5 -- substrate/wasm-runtime/support/src/lib.rs | 11 +++ .../release/runtime_test.compact.wasm | Bin 3392 -> 843 bytes .../release/runtime_test.wasm | Bin 3480 -> 960 bytes substrate/wasm-runtime/test/src/lib.rs | 65 +++-------------- 24 files changed, 88 insertions(+), 117 deletions(-) rename substrate/wasm-runtime/polkadot/src/{support => codec}/endiansensitive.rs (100%) rename substrate/wasm-runtime/polkadot/src/{support => codec}/joiner.rs (100%) rename substrate/wasm-runtime/polkadot/src/{support => codec}/keyedvec.rs (100%) create mode 100644 substrate/wasm-runtime/polkadot/src/codec/mod.rs rename substrate/wasm-runtime/polkadot/src/{support => codec}/slicable.rs (100%) rename substrate/wasm-runtime/polkadot/src/{support => codec}/streamreader.rs (100%) rename substrate/wasm-runtime/polkadot/src/{ => runtime}/consensus.rs (100%) create mode 100644 substrate/wasm-runtime/polkadot/src/runtime/mod.rs rename substrate/wasm-runtime/polkadot/src/{ => runtime}/staking.rs (98%) rename substrate/wasm-runtime/polkadot/src/{ => runtime}/system.rs (98%) rename substrate/wasm-runtime/polkadot/src/{ => runtime}/timestamp.rs (100%) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index d0eee3e39a..2ac1c11912 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -687,8 +687,10 @@ dependencies = [ "polkadot-primitives 0.1.0", "polkadot-serializer 0.1.0", "polkadot-state-machine 0.1.0", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.19 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -841,6 +843,7 @@ dependencies = [ "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-state-machine 0.1.0", + "tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/substrate/executor/Cargo.toml b/substrate/executor/Cargo.toml index 8aa72f4327..2d124f60ac 100644 --- a/substrate/executor/Cargo.toml +++ b/substrate/executor/Cargo.toml @@ -12,6 +12,8 @@ serde = "1.0" serde_derive = "1.0" parity-wasm = "0.15.0" byteorder = "1.1" +tiny-keccak = "1.3" +rustc-hex = "1.0.0" [dev-dependencies] assert_matches = "1.1" diff --git a/substrate/executor/src/lib.rs b/substrate/executor/src/lib.rs index 8bf7f42b62..3c54d25efb 100644 --- a/substrate/executor/src/lib.rs +++ b/substrate/executor/src/lib.rs @@ -33,6 +33,8 @@ extern crate polkadot_state_machine as state_machine; extern crate serde; extern crate parity_wasm; extern crate byteorder; +extern crate tiny_keccak; +extern crate rustc_hex; #[macro_use] extern crate error_chain; diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index b12986e975..8597656c51 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -26,6 +26,7 @@ use state_machine::{Externalities, CodeExecutor}; use error::{Error, ErrorKind, Result}; use wasm_utils::{MemoryInstance, UserDefinedElements, AddModuleWithoutFullDependentInstance}; +use tiny_keccak; struct Heap { end: u32, @@ -138,6 +139,15 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, }, ext_chain_id() -> u64 => { this.ext.chain_id() + }, + ext_keccak256(data: *const u8, len: u32, out: *mut u8) => { + let result = + if let Ok(value) = this.memory.get(data, len as usize) { + tiny_keccak::keccak256(&value) + } else { + [0; 32] + }; + let _ = this.memory.set(out, &result); } => <'e, E: Externalities + 'e> ); @@ -193,6 +203,7 @@ impl CodeExecutor for WasmExecutor { mod tests { use super::*; + use rustc_hex::FromHex; #[derive(Debug, Default)] struct TestExternalities { @@ -213,50 +224,34 @@ mod tests { } #[test] - fn should_pass_externalities_at_call() { + fn storage_should_work() { let mut ext = TestExternalities::default(); - ext.set_storage(b"\0code".to_vec(), b"The code".to_vec()); + 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 program = ProgramInstance::new().unwrap(); - - let test_module = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let module = deserialize_buffer(test_module.to_vec()).expect("Failed to load module"); - let module = program.add_module_by_sigs("test", module, map!["env" => FunctionExecutor::::SIGNATURES]).expect("Failed to initialize module"); - - let output = { - let memory = module.memory(ItemIndex::Internal(0)).unwrap(); - let mut fec = FunctionExecutor::new(&memory, &mut ext); - - let data = b"Hello world"; - let size = data.len() as u32; - let offset = fec.heap.allocate(size); - memory.set(offset, data).unwrap(); - - let returned = program - .params_with_external("env", &mut fec) - .map(|p| p - .add_argument(I32(offset as i32)) - .add_argument(I32(size as i32))) - .and_then(|p| module.execute_export("test_data_in", p)) - .map_err(|_| -> Error { ErrorKind::Runtime.into() }).expect("function should be callable"); - - if let Some(I64(r)) = returned { - println!("returned {:?} ({:?}, {:?})", r, r as u32, (r >> 32) as u32 as usize); - memory.get(r as u32, (r >> 32) as u32 as usize).expect("memory address should be reasonable.") - } else { - panic!("bad return value, not u64"); - } - }; + let output = WasmExecutor.call(&mut ext, &test_code[..], "test_data_in", &CallData(b"Hello world".to_vec())).unwrap(); assert_eq!(output, b"all ok!".to_vec()); let expected: HashMap<_, _> = map![ - b"\0code".to_vec() => b"Hello world".to_vec(), b"input".to_vec() => b"Hello world".to_vec(), - b"code".to_vec() => b"The code".to_vec(), - b"\0authority_count".to_vec() => vec![1], - b"\0authority".to_vec() => b"Hello world".to_vec() + b"foo".to_vec() => b"bar".to_vec(), + b"baz".to_vec() => b"bar".to_vec() ]; assert_eq!(expected, ext.storage); } + + #[test] + fn keccak256_should_work() { + 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_keccak256", &CallData(b"".to_vec())).unwrap(), + FromHex::from_hex("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").unwrap() + ); + assert_eq!( + WasmExecutor.call(&mut ext, &test_code[..], "test_keccak256", &CallData(b"Hello world!".to_vec())).unwrap(), + FromHex::from_hex("ecd0e108a98e192af1d2c25055f4e3bed784b5c877204e73219a5203251feaab").unwrap() + ); + } } diff --git a/substrate/native-runtime/support/Cargo.toml b/substrate/native-runtime/support/Cargo.toml index 3f979bd4ff..185dea5f92 100644 --- a/substrate/native-runtime/support/Cargo.toml +++ b/substrate/native-runtime/support/Cargo.toml @@ -11,3 +11,4 @@ lazy_static = "1.0.0" parking_lot = "0.5" polkadot-state-machine = { path = "../../state_machine" , version = "0.1" } environmental = { path = "../../environmental", version = "0.1.0" } +tiny-keccak = "1.3" diff --git a/substrate/native-runtime/support/src/lib.rs b/substrate/native-runtime/support/src/lib.rs index 498081cd33..a2fe13eb10 100644 --- a/substrate/native-runtime/support/src/lib.rs +++ b/substrate/native-runtime/support/src/lib.rs @@ -1,6 +1,7 @@ #[macro_use] extern crate environmental; extern crate polkadot_state_machine; +extern crate tiny_keccak; pub use std::vec::Vec; pub use std::rc::Rc; @@ -75,6 +76,9 @@ pub fn chain_id() -> u64 { ).unwrap_or(0) } +/// Conduct a Keccak-256 hash of the given data. +pub use tiny_keccak::keccak256; + /// Execute the given closure with global function available whose functionality routes into the /// externalities `ext`. Forwards the value that the closure returns. pub fn with_externalities R>(ext: &mut Externalities, f: F) -> R { diff --git a/substrate/wasm-runtime/polkadot/src/support/endiansensitive.rs b/substrate/wasm-runtime/polkadot/src/codec/endiansensitive.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/support/endiansensitive.rs rename to substrate/wasm-runtime/polkadot/src/codec/endiansensitive.rs diff --git a/substrate/wasm-runtime/polkadot/src/support/joiner.rs b/substrate/wasm-runtime/polkadot/src/codec/joiner.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/support/joiner.rs rename to substrate/wasm-runtime/polkadot/src/codec/joiner.rs diff --git a/substrate/wasm-runtime/polkadot/src/support/keyedvec.rs b/substrate/wasm-runtime/polkadot/src/codec/keyedvec.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/support/keyedvec.rs rename to substrate/wasm-runtime/polkadot/src/codec/keyedvec.rs diff --git a/substrate/wasm-runtime/polkadot/src/codec/mod.rs b/substrate/wasm-runtime/polkadot/src/codec/mod.rs new file mode 100644 index 0000000000..5350dc05c1 --- /dev/null +++ b/substrate/wasm-runtime/polkadot/src/codec/mod.rs @@ -0,0 +1,5 @@ +pub mod endiansensitive; +pub mod streamreader; +pub mod joiner; +pub mod slicable; +pub mod keyedvec; diff --git a/substrate/wasm-runtime/polkadot/src/support/slicable.rs b/substrate/wasm-runtime/polkadot/src/codec/slicable.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/support/slicable.rs rename to substrate/wasm-runtime/polkadot/src/codec/slicable.rs diff --git a/substrate/wasm-runtime/polkadot/src/support/streamreader.rs b/substrate/wasm-runtime/polkadot/src/codec/streamreader.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/support/streamreader.rs rename to substrate/wasm-runtime/polkadot/src/codec/streamreader.rs diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs index 680116b3d9..52b29b05cf 100644 --- a/substrate/wasm-runtime/polkadot/src/lib.rs +++ b/substrate/wasm-runtime/polkadot/src/lib.rs @@ -4,20 +4,14 @@ #[macro_use] extern crate runtime_support; +mod codec; mod support; -pub use support::{endiansensitive, streamreader, joiner, slicable, primitives, keyedvec, function, - environment, storage}; +mod runtime; +pub use codec::{endiansensitive, streamreader, joiner, slicable, keyedvec}; +pub use support::{primitives, function, environment, storage}; #[cfg(test)] pub use support::testing; - -#[allow(unused)] -mod system; -#[allow(unused)] -mod consensus; -#[allow(unused)] -mod staking; -#[allow(unused)] -mod timestamp; +#[allow(unused_imports)] // TODO: remove in due course use runtime_support::Vec; use slicable::Slicable; @@ -29,11 +23,11 @@ use primitives::{Block, Transaction}; // - ECDSA-recover (or some better sig scheme) pub fn execute_block(input: Vec) -> Vec { - system::execute_block(Block::from_slice(&input).unwrap()) + runtime::system::execute_block(Block::from_slice(&input).unwrap()) } pub fn execute_transaction(input: Vec) -> Vec { - system::execute_transaction(&Transaction::from_slice(&input).unwrap()) + runtime::system::execute_transaction(&Transaction::from_slice(&input).unwrap()) } impl_stubs!(execute_block, execute_transaction); diff --git a/substrate/wasm-runtime/polkadot/src/consensus.rs b/substrate/wasm-runtime/polkadot/src/runtime/consensus.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/consensus.rs rename to substrate/wasm-runtime/polkadot/src/runtime/consensus.rs diff --git a/substrate/wasm-runtime/polkadot/src/runtime/mod.rs b/substrate/wasm-runtime/polkadot/src/runtime/mod.rs new file mode 100644 index 0000000000..c73e338a91 --- /dev/null +++ b/substrate/wasm-runtime/polkadot/src/runtime/mod.rs @@ -0,0 +1,8 @@ +#[allow(unused)] +pub mod system; +#[allow(unused)] +pub mod consensus; +#[allow(unused)] +pub mod staking; +#[allow(unused)] +pub mod timestamp; diff --git a/substrate/wasm-runtime/polkadot/src/staking.rs b/substrate/wasm-runtime/polkadot/src/runtime/staking.rs similarity index 98% rename from substrate/wasm-runtime/polkadot/src/staking.rs rename to substrate/wasm-runtime/polkadot/src/runtime/staking.rs index d8903504d2..ca37e7f6fe 100644 --- a/substrate/wasm-runtime/polkadot/src/staking.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/staking.rs @@ -1,7 +1,7 @@ use keyedvec::KeyedVec; use storage::{Storage, storage_into}; use primitives::{BlockNumber, Balance, AccountID}; -use consensus; +use runtime::consensus; /// The length of a staking era in blocks. pub fn era_length() -> BlockNumber { @@ -68,7 +68,7 @@ mod tests { use runtime_support::with_externalities; use testing::TestExternalities; use primitives::{AccountID}; - use staking; + use runtime::staking; macro_rules! map { ($( $name:expr => $value:expr ),*) => ( diff --git a/substrate/wasm-runtime/polkadot/src/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs similarity index 98% rename from substrate/wasm-runtime/polkadot/src/system.rs rename to substrate/wasm-runtime/polkadot/src/runtime/system.rs index de8b814bcf..27c5eb4fd9 100644 --- a/substrate/wasm-runtime/polkadot/src/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -1,8 +1,8 @@ use primitives::{Block, BlockNumber, Hash, Transaction}; use runtime_support::{Vec, swap}; use environment::with_env; -use staking; use runtime_support; +use runtime::staking; /// The current block number being processed. Set by `execute_block`. pub fn block_number() -> BlockNumber { @@ -79,8 +79,7 @@ mod tests { use std::collections::HashMap; use runtime_support::{NoError, with_externalities, Externalities}; use primitives::{AccountID, Transaction}; - use system; - use staking; + use runtime::{system, staking}; #[derive(Debug, Default)] struct TestExternalities { diff --git a/substrate/wasm-runtime/polkadot/src/timestamp.rs b/substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs similarity index 100% rename from substrate/wasm-runtime/polkadot/src/timestamp.rs rename to substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs diff --git a/substrate/wasm-runtime/polkadot/src/support/function.rs b/substrate/wasm-runtime/polkadot/src/support/function.rs index 3f6845bfe6..ff54938d47 100644 --- a/substrate/wasm-runtime/polkadot/src/support/function.rs +++ b/substrate/wasm-runtime/polkadot/src/support/function.rs @@ -1,5 +1,4 @@ -use staking; -use consensus; +use runtime::{staking, consensus}; use primitives::AccountID; use streamreader::StreamReader; diff --git a/substrate/wasm-runtime/polkadot/src/support/mod.rs b/substrate/wasm-runtime/polkadot/src/support/mod.rs index 47b29194dc..aa14ad2f5d 100644 --- a/substrate/wasm-runtime/polkadot/src/support/mod.rs +++ b/substrate/wasm-runtime/polkadot/src/support/mod.rs @@ -1,9 +1,4 @@ -pub mod endiansensitive; -pub mod streamreader; -pub mod joiner; -pub mod slicable; pub mod primitives; -pub mod keyedvec; pub mod function; pub mod environment; pub mod storage; diff --git a/substrate/wasm-runtime/support/src/lib.rs b/substrate/wasm-runtime/support/src/lib.rs index 308ab6dd9e..ae3feb14c9 100644 --- a/substrate/wasm-runtime/support/src/lib.rs +++ b/substrate/wasm-runtime/support/src/lib.rs @@ -29,6 +29,7 @@ extern "C" { fn ext_get_allocated_storage(key_data: *const u8, key_len: u32, written_out: *mut u32) -> *mut u8; fn ext_get_storage_into(key_data: *const u8, key_len: u32, value_data: *mut u8, value_len: u32) -> u32; fn ext_chain_id() -> u64; + fn ext_keccak256(data: *const u8, len: u32, out: *mut u8); } pub fn storage(key: &[u8]) -> Vec { @@ -78,6 +79,16 @@ pub fn chain_id() -> u64 { } } +/// Conduct a keccak256 hash. +pub fn keccak256(data: &[u8]) -> [u8; 32] { + unsafe { + let mut result: [u8; 32] = uninitialized(); + // guaranteed to write into result. + ext_keccak256(&data[0], data.len() as u32, &mut result[0]); + result + } +} + pub trait Printable { fn print(self); } diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index bac77de7ffc344d73e46f9c32657563efb790174..f4c438ec106e2dad2e662f47d1abbb293e62178c 100644 GIT binary patch literal 843 zcmY*XOKuZE5Pkib_SiiklbzYMy>cWYA|xCMvT#LWi&(RW^M3pN}E z&cGeGK#sr>s2+b3MjBPU_o`l3mm0}>ApnSeI2IMgs;Vkc)d5U!Dl4Wn(;PS#-^PIa zYE)X>hUuqrbh%1Xz{95=&eC#}TwN_ENtsSZ>vFkDW+{Z%54=84CzE9U;^hF+b1ly; z>INuJG(B;>%8C-&<3o?vY`U`wlnIP!C}=INfj|iyHQpMtNEgf1XNjmx*X3xMl*uS7 zV4l?Q;nc>_>W1};be0vPo8n_uOc9#x1WjGvrqvW^{ZYX$A!J1$^rWVE-c7nu;Tg_f z!2`|Uxfs5#0Uv!f;7rDF;9tZ%4j&QcJc|=Q&+qvAi|>aPus@^-_VeCj-Zj36o17t+ z$CATuR&l|$y)kY_oTTPwB+oZLfh z=3VR{x5*(N$qR7%1$Yvt^@ZEH(|Zu-F4%)G-g0$7|*Z~w-`}k#1+Xh*2eN%#*ZS39~^{l#FEx6WhGZifsKMopwNH Lw!yF0E$5woQ|P6l literal 3392 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 IqnC@pKX_xoTmS$7 literal 3480 zcmcgv&2k&Z5$>6t{hisxQldmrq{!K|6U$CyBPoS)B|e~CrsN!4KIcTyA}j+ENEHdv z(IJK^0>pc$I)yyQ!{k&rDvEhm_UQR`sOi_{+r68;qgT_{NwcC%hTbINQRp-d^(&S96o=3 z^5k$jJUTd=o}3;&9g>puLe?i?k@V|{;pEASmz{(S62r;lDz!^zoj+KJ>M^5S%K zJf%o<^kj_HR0on;sk;P7e=8$7I(| z&oTUB_;hr9aDM#t==g}7$ckZQicT=7k|{Bym(0DWP4Ip#S5*9Uqxh3DGd)=Rd15oZ ztEpA{C3!-x(O!AQYTBAdrSiIooVILg-A4PRX44p_tPf)^qDDTSZPjH1;hH=YY3s>H zdm0L%-5d0JmPr18r&K(Hl6YZ&9$aBU3lV*nu&U@)AGnLbe4zat#Z^sZiifL_7{PVq@+PZ(uzAJ)oR zHf|y=8pQ<{kIDdg(Zql%bw-e5jUEsnG|F$0|7rAOz>PLNL+$?7BK2DBzl%3OvRQJ8q>KRErAeZ z0E8$-YS}-p=@K`85z|Y0)|ODheYSPNA90KWRhz{$^WEr zt=im|clDr7eGbEafRT`w^-jqptgVy9W>G%hhub6j5V(Jl9J~_{%$9+KxCi`XN^X|%0lM7^# z^`+1EwChX}kNp^5*|;vC2iE%T;LIoC;F9}etO^2#gfHqItX9=zZ>g zYL>$Bok4JzpgS~5%Bj1Av<$?-6{k%owS?f=Ivv2n%T71bFJRJ^djX@Y#KM zg8T3Y$O}ldAoQWIr{ocQZE#~`Ca4z!67;}h22qn_7pjy@57ePE{x@+CDPqKmqSK&| zpAn*#?W<|Xo@g{iIpS)h}sw9HhUO|C-+ff;GEDG^cmq^K?FlN z)OgSj8qDDK=7NBvloR7J_+%wp3>*j-Vl`psc`|4-NxCd#Nddl?rzbQbJ>lF+dIrft z(i2C02J?g0; z3!j5MF50}@1({avH*ow)offy&7fYR9U~#`*>I|uaHxIA5=tRgb@DASwXIJi5&P$x=(UCtoU@AyAQ_X7|Xl341E9mKP8?}vA2+~6S((Q<4td(V1{$Er!C zAyD=_e|Fem^_N(cG=|0hE1Ty0gq)G2e>1zBoLxfCFRY}Lcerlh)!pS9v+rGvP~q;Z zqQ1iwWbZB!x*GKzUW3#-3xq=aK$=noq=Hbn>vqJ8qMP7rkp3Aa@aSAe_igK)TvQ28 z{HR>#bxgj6+GoGq<{RiE5hBRmL>K7&NSx!HO1olYi#IThorV)!xqI}T>SAZY1^iac z%agnMl|m&Ww)KUFI!==aZSgH=*hSnyV_*w_#haLc$sj5r7LmD)89*bn15>sz+73H} zT63P_B`I(5Hm0`%4EOiTO}>NS?at2~bT?5Ipm38SL4tKjV_{44_m5xU-+$=aP(GrR zsN7Ad1}b->yT0pE4OH%WxW(?8R0EY;vn-ib+kh6T2uY~Q@-CXvvPa`=h#n|Uf>_uP zcRZIpj4~UbMTIm}3s4|-Hl`;hM?>Ou>^VH2esyv>n!Y6VwthW4cye-%9~j)X zcJ-$Pe`Mp)@r!e;d{5SNdVV0AiBLDXB%3aN^q@|$c5%dLct&`YY)@q0nEa7!{^jU+ UboSNos3Cr(Y>MAV{^VKnUuVwX;Q#;t diff --git a/substrate/wasm-runtime/test/src/lib.rs b/substrate/wasm-runtime/test/src/lib.rs index e95844fdb0..a24de0219d 100644 --- a/substrate/wasm-runtime/test/src/lib.rs +++ b/substrate/wasm-runtime/test/src/lib.rs @@ -8,72 +8,25 @@ use alloc::vec::Vec; #[macro_use] extern crate runtime_support; -use runtime_support::{set_storage, storage, print}; +use runtime_support::{set_storage, storage, print, keccak256}; -pub fn code() -> Vec { - storage(b"\0code") +fn test_keccak256(input: Vec) -> Vec { + keccak256(&input).to_vec() } -pub fn set_code(new: &[u8]) { - set_storage(b"\0code", new) -} - -fn value_vec(mut value: usize, initial: Vec) -> Vec { - let mut acc = initial; - while value > 0 { - acc.push(value as u8); - value /= 256; - } - acc -} - -pub fn set_authority(index: usize, authority: &[u8]) { - set_storage(&value_vec(index, b"\0authority".to_vec()), authority); -} - -pub fn authority(index: usize) -> Vec { - storage(&value_vec(index, b"\0authority".to_vec())) -} - -pub fn set_authority_count(count: usize) { - (count..authority_count()).for_each(|i| set_authority(i, &[])); - set_storage(b"\0authority_count", &value_vec(count, Vec::new())); -} - -pub fn authority_count() -> usize { - storage(b"\0authority_count").into_iter().rev().fold(0, |acc, i| (acc << 8) + (i as usize)) -} - -pub fn authorities() -> Vec> { - (0..authority_count()).into_iter().map(authority).collect() -} - -pub fn set_authorities(authorities: &[&[u8]]) { - set_authority_count(authorities.len()); - authorities.iter().enumerate().for_each(|(v, i)| set_authority(v, i)); -} - -impl_stubs!(test_data_in); fn test_data_in(input: Vec) -> Vec { print(b"set_storage" as &[u8]); set_storage(b"input", &input); - print(b"code" as &[u8]); - set_storage(b"code", &code()); - - print(b"set_code" as &[u8]); - set_code(&input); - print(b"storage" as &[u8]); - let copy = storage(b"input"); + let foo = storage(b"foo"); - print(b"authorities" as &[u8]); - let mut v = authorities(); - v.push(copy); - - print(b"set_authorities" as &[u8]); - set_authorities(&v.iter().map(Vec::as_slice).collect::>()); + print(b"set_storage" as &[u8]); + set_storage(b"baz", &foo); print(b"finished!" as &[u8]); b"all ok!".to_vec() } + + +impl_stubs!(test_data_in, test_keccak256);