From c29313c6180e9f13b9d0b1f672fe26a383831c9f Mon Sep 17 00:00:00 2001 From: Gav Date: Fri, 19 Jan 2018 14:17:56 +0100 Subject: [PATCH] Introduce better hashing. - Blake2 for secure hashing - XX for fast hashing --- substrate/Cargo.lock | 41 +++++++- substrate/executor/Cargo.toml | 1 - substrate/executor/src/lib.rs | 1 - substrate/executor/src/wasm_executor.rs | 66 ++++++++++-- substrate/native-runtime/support/Cargo.toml | 1 - substrate/native-runtime/support/src/lib.rs | 3 +- substrate/primitives/Cargo.toml | 4 +- substrate/primitives/src/ed25519.rs | 79 ++++++++------- substrate/primitives/src/hash.rs | 4 +- substrate/primitives/src/lib.rs | 94 +++++++++++++++++- substrate/state_machine/Cargo.toml | 1 - substrate/state_machine/src/lib.rs | 1 - .../polkadot/src/runtime/session.rs | 16 +-- .../polkadot/src/runtime/staking.rs | 10 +- .../polkadot/src/runtime/system.rs | 6 +- .../polkadot/src/runtime/timestamp.rs | 4 +- .../polkadot/src/support/primitives.rs | 16 ++- .../polkadot/src/support/storable.rs | 10 +- substrate/wasm-runtime/support/src/lib.rs | 30 +++++- .../release/runtime_polkadot.compact.wasm | Bin 5276 -> 18522 bytes .../release/runtime_polkadot.wasm | Bin 5364 -> 18609 bytes .../release/runtime_test.compact.wasm | Bin 962 -> 1460 bytes .../release/runtime_test.wasm | Bin 1079 -> 1576 bytes substrate/wasm-runtime/test/src/lib.rs | 17 +++- 24 files changed, 307 insertions(+), 98 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 7d5f50ddc4..72a5687799 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -20,6 +20,14 @@ dependencies = [ "odds 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "arrayvec" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "assert_matches" version = "1.1.0" @@ -90,6 +98,15 @@ name = "bitflags" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "blake2-rfc" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "byteorder" version = "1.1.0" @@ -138,6 +155,11 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crunchy" version = "0.1.6" @@ -710,13 +732,14 @@ dependencies = [ "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]] name = "polkadot-primitives" version = "0.1.0" dependencies = [ + "blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.1.0 (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.0 (git+https://github.com/paritytech/primitives.git)", "polkadot-serializer 0.1.0", @@ -725,7 +748,7 @@ dependencies = [ "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)", + "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.1.0 (git+https://github.com/paritytech/primitives.git)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -767,7 +790,6 @@ version = "0.1.0" dependencies = [ "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashdb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "keccak-hash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "patricia-trie 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-primitives 0.1.0", @@ -898,7 +920,6 @@ dependencies = [ "parking_lot 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-primitives 0.1.0", "polkadot-state-machine 0.1.0", - "tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1151,6 +1172,14 @@ dependencies = [ "rlp 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "twox-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "uint" version = "0.1.0" @@ -1235,6 +1264,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" "checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6" "checksum arrayvec 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "e003cbf6e0e1c43a0fc8df2ea8ea24174514d35cbcf60c35ca6112e0139f65e2" +"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e772942dccdf11b368c31e044e4fca9189f80a773d2f0808379de65894cbf57" "checksum atty 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "21e50800ec991574876040fff8ee46b136a53e985286fbe6a3bdfe6421b78860" "checksum backtrace 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99f2ce94e22b8e664d95c57fff45b98a966c2252b60691d0b7aeeccd88d70983" @@ -1243,12 +1273,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bigint 4.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5442186ef6560f30f1ee4b9c1e4c87a35a6879d3644550cc248ec2b955eb5fcd" "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" +"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d" "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6" "checksum cc 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a9b13a57efd6b30ecd6598ebdb302cca617930b5470647570468a65d12ef9719" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" "checksum clap 2.27.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1b8c532887f1a292d17de05ae858a8fe50a301e196f9ef0ddb7ccd0d1d00f180" "checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum difference 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3304d19798a8e067e48d8e69b2c37f0b5e9b4e462504ad9e27e9f3fce02bba8" @@ -1351,6 +1383,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum triehash 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9291c7f0fae44858b5e087dd462afb382354120003778f1695b44aab98c7abd7" +"checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum uint 0.1.0 (git+https://github.com/paritytech/primitives.git)" = "" "checksum unicase 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e01da42520092d0cd2d6ac3ae69eb21a22ad43ff195676b86f8c37f487d6b80" "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" diff --git a/substrate/executor/Cargo.toml b/substrate/executor/Cargo.toml index 2d124f60ac..0401bd4c77 100644 --- a/substrate/executor/Cargo.toml +++ b/substrate/executor/Cargo.toml @@ -12,7 +12,6 @@ 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] diff --git a/substrate/executor/src/lib.rs b/substrate/executor/src/lib.rs index 3c54d25efb..f1da582538 100644 --- a/substrate/executor/src/lib.rs +++ b/substrate/executor/src/lib.rs @@ -33,7 +33,6 @@ 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] diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index 07056b1df7..c0c638fa3d 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -26,8 +26,7 @@ use state_machine::{Externalities, CodeExecutor}; use error::{Error, ErrorKind, Result}; use wasm_utils::{MemoryInstance, UserDefinedElements, AddModuleWithoutFullDependentInstance}; -use tiny_keccak; -use primitives::ed25519; +use primitives::{ed25519, blake2_256, twox_128, twox_256}; struct Heap { end: u32, @@ -141,10 +140,28 @@ 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) => { + ext_twox_128(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) + twox_128(&value) + } else { + [0; 16] + }; + let _ = this.memory.set(out, &result); + }, + ext_twox_256(data: *const u8, len: u32, out: *mut u8) => { + let result = + if let Ok(value) = this.memory.get(data, len as usize) { + twox_256(&value) + } else { + [0; 32] + }; + let _ = this.memory.set(out, &result); + }, + ext_blake2_256(data: *const u8, len: u32, out: *mut u8) => { + let result = + if let Ok(value) = this.memory.get(data, len as usize) { + blake2_256(&value) } else { [0; 32] }; @@ -223,6 +240,7 @@ mod tests { use super::*; use rustc_hex::FromHex; + use primitives::ed25519::hexdisplay::HexDisplay; #[derive(Debug, Default)] struct TestExternalities { @@ -261,16 +279,44 @@ mod tests { } #[test] - fn keccak256_should_work() { + fn blake2_256_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() + WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", &CallData(b"".to_vec())).unwrap(), + FromHex::from_hex("0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8").unwrap() ); assert_eq!( - WasmExecutor.call(&mut ext, &test_code[..], "test_keccak256", &CallData(b"Hello world!".to_vec())).unwrap(), - FromHex::from_hex("ecd0e108a98e192af1d2c25055f4e3bed784b5c877204e73219a5203251feaab").unwrap() + WasmExecutor.call(&mut ext, &test_code[..], "test_blake2_256", &CallData(b"Hello world!".to_vec())).unwrap(), + FromHex::from_hex("3fbc092db9350757e2ab4f7ee9792bfcd2f5220ada5a4bc684487f60c6034369").unwrap() + ); + } + + #[test] + fn twox_256_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_twox_256", &CallData(b"".to_vec())).unwrap(), + FromHex::from_hex("99e9d85137db46ef4bbea33613baafd56f963c64b1f3685a4eb4abd67ff6203a").unwrap() + ); + assert_eq!( + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_256", &CallData(b"Hello world!".to_vec())).unwrap(), + FromHex::from_hex("b27dfd7f223f177f2a13647b533599af0c07f68bda23d96d059da2b451a35a74").unwrap() + ); + } + + #[test] + fn twox_128_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_twox_128", &CallData(b"".to_vec())).unwrap(), + FromHex::from_hex("99e9d85137db46ef4bbea33613baafd5").unwrap() + ); + assert_eq!( + WasmExecutor.call(&mut ext, &test_code[..], "test_twox_128", &CallData(b"Hello world!".to_vec())).unwrap(), + FromHex::from_hex("b27dfd7f223f177f2a13647b533599af").unwrap() ); } @@ -278,7 +324,7 @@ mod tests { fn ed25519_verify_should_work() { let mut ext = TestExternalities::default(); let test_code = include_bytes!("../../wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm"); - let key = ed25519::Pair::from_seed(&tiny_keccak::keccak256(b"test")); + let key = ed25519::Pair::from_seed(&blake2_256(b"test")); let sig = key.sign(b"all ok!"); let mut calldata = vec![]; calldata.extend_from_slice(key.public().as_ref()); diff --git a/substrate/native-runtime/support/Cargo.toml b/substrate/native-runtime/support/Cargo.toml index f576037bd2..1c24c014e6 100644 --- a/substrate/native-runtime/support/Cargo.toml +++ b/substrate/native-runtime/support/Cargo.toml @@ -11,5 +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" polkadot-primitives = { path = "../../primitives", version = "0.1.0" } diff --git a/substrate/native-runtime/support/src/lib.rs b/substrate/native-runtime/support/src/lib.rs index aaa323f98d..caa7f3b272 100644 --- a/substrate/native-runtime/support/src/lib.rs +++ b/substrate/native-runtime/support/src/lib.rs @@ -1,7 +1,6 @@ #[macro_use] extern crate environmental; extern crate polkadot_state_machine; -extern crate tiny_keccak; extern crate polkadot_primitives as primitives; use std::fmt; @@ -76,7 +75,7 @@ pub fn chain_id() -> u64 { } /// Conduct a Keccak-256 hash of the given data. -pub use tiny_keccak::keccak256; +pub use primitives::{blake2_256, twox_128, twox_256}; /// Verify a ed25519 signature. pub fn ed25519_verify(sig: &[u8; 64], msg: &[u8], pubkey: &[u8; 32]) -> bool { diff --git a/substrate/primitives/Cargo.toml b/substrate/primitives/Cargo.toml index 045afba827..77eccdea88 100644 --- a/substrate/primitives/Cargo.toml +++ b/substrate/primitives/Cargo.toml @@ -9,10 +9,12 @@ fixed-hash = { git = "https://github.com/paritytech/primitives.git" } rustc-hex = "1.0" serde = "1.0" serde_derive = "1.0" -tiny-keccak = "1.3" uint = { git = "https://github.com/paritytech/primitives.git" } ring = "0.12" untrusted = "0.5" +twox-hash = "1.1.0" +byteorder = "1.1" +blake2-rfc = "0.2.18" [dev-dependencies] polkadot-serializer = { path = "../serializer", version = "0.1" } diff --git a/substrate/primitives/src/ed25519.rs b/substrate/primitives/src/ed25519.rs index 2630f858d2..e9ac7e473c 100644 --- a/substrate/primitives/src/ed25519.rs +++ b/substrate/primitives/src/ed25519.rs @@ -166,44 +166,53 @@ impl PartialEq for Signature { } } +pub mod hexdisplay { + + pub struct HexDisplay<'a>(&'a [u8]); + + impl<'a> HexDisplay<'a> { + pub fn from(d: &'a AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } + } + + impl<'a> ::std::fmt::Display for HexDisplay<'a> { + fn fmt(&self, fmtr: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> { + for byte in self.0 { + try!( fmtr.write_fmt(format_args!("{:02x}", byte))); + } + Ok(()) + } + } + + pub trait AsBytesRef { + fn as_bytes_ref(&self) -> &[u8]; + } + + impl AsBytesRef for [u8] { + fn as_bytes_ref(&self) -> &[u8] { &self } + } + + impl AsBytesRef for Vec { + fn as_bytes_ref(&self) -> &[u8] { &self } + } + + macro_rules! impl_non_endians { + ( $( $t:ty ),* ) => { $( + impl AsBytesRef for $t { + fn as_bytes_ref(&self) -> &[u8] { &self[..] } + } + )* } + } + + impl_non_endians!([u8; 1], [u8; 2], [u8; 3], [u8; 4], [u8; 5], [u8; 6], [u8; 7], [u8; 8], + [u8; 10], [u8; 12], [u8; 14], [u8; 16], [u8; 20], [u8; 24], [u8; 28], [u8; 32], [u8; 40], + [u8; 48], [u8; 56], [u8; 64], [u8; 80], [u8; 96], [u8; 112], [u8; 128]); + +} + #[cfg(test)] mod test { use super::*; - -pub struct HexDisplay<'a>(&'a [u8]); - -impl<'a> HexDisplay<'a> { - pub fn from(d: &'a AsBytesRef) -> Self { HexDisplay(d.as_bytes_ref()) } -} - -impl<'a> ::std::fmt::Display for HexDisplay<'a> { - fn fmt(&self, fmtr: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> { - for byte in self.0 { - try!( fmtr.write_fmt(format_args!("{:02x}", byte))); - } - Ok(()) - } -} - -pub trait AsBytesRef { - fn as_bytes_ref(&self) -> &[u8]; -} - -impl AsBytesRef for [u8] { - fn as_bytes_ref(&self) -> &[u8] { &self } -} - -macro_rules! impl_non_endians { - ( $( $t:ty ),* ) => { $( - impl AsBytesRef for $t { - fn as_bytes_ref(&self) -> &[u8] { &self[..] } - } - )* } -} - -impl_non_endians!([u8; 1], [u8; 2], [u8; 3], [u8; 4], [u8; 5], [u8; 6], [u8; 7], [u8; 8], - [u8; 10], [u8; 12], [u8; 14], [u8; 16], [u8; 20], [u8; 24], [u8; 28], [u8; 32], [u8; 40], - [u8; 48], [u8; 56], [u8; 64], [u8; 80], [u8; 96], [u8; 112], [u8; 128]); + use super::hexdisplay::HexDisplay; #[test] fn test_vector_should_work() { diff --git a/substrate/primitives/src/hash.rs b/substrate/primitives/src/hash.rs index cef573f6f2..0b56d5757f 100644 --- a/substrate/primitives/src/hash.rs +++ b/substrate/primitives/src/hash.rs @@ -41,8 +41,8 @@ impl_hash!(H160, 20); impl_serde!(H160, 20); impl_hash!(H256, 32); impl_serde!(H256, 32); -impl_hash!(H520, 65); -impl_serde!(H520, 65); +impl_hash!(H512, 64); +impl_serde!(H512, 64); #[cfg(test)] mod tests { diff --git a/substrate/primitives/src/lib.rs b/substrate/primitives/src/lib.rs index fc26658200..cb7606add2 100644 --- a/substrate/primitives/src/lib.rs +++ b/substrate/primitives/src/lib.rs @@ -20,9 +20,11 @@ extern crate rustc_hex; extern crate serde; -extern crate tiny_keccak; extern crate ring; extern crate untrusted; +extern crate twox_hash; +extern crate byteorder; +extern crate blake2_rfc; #[macro_use] extern crate crunchy; @@ -53,12 +55,98 @@ pub mod ed25519; /// Alias to 160-bit hash when used in the context of an account address. pub type Address = hash::H160; /// Alias to 520-bit hash when used in the context of a signature. -pub type Signature = hash::H520; +pub type Signature = hash::H512; pub use self::hash::{H160, H256}; pub use self::uint::{U256, U512}; /// A hash function. pub fn hash(data: &[u8]) -> hash::H256 { - tiny_keccak::keccak256(data).into() + blake2_256(data).into() +} + +/// Do a Blake2 512-bit hash and place result in `dest`. +pub fn blake2_512_into(data: &[u8], dest: &mut[u8; 64]) { + dest.copy_from_slice(blake2_rfc::blake2b::blake2b(64, &[], data).as_bytes()); +} + +/// Do a Blake2 512-bit hash and return result. +pub fn blake2_512(data: &[u8]) -> [u8; 64] { + let mut r: [u8; 64] = unsafe { std::mem::uninitialized() }; + blake2_512_into(data, &mut r); + r +} + +/// Do a Blake2 256-bit hash and place result in `dest`. +pub fn blake2_256_into(data: &[u8], dest: &mut[u8; 32]) { + dest.copy_from_slice(blake2_rfc::blake2b::blake2b(32, &[], data).as_bytes()); +} + +/// Do a Blake2 256-bit hash and return result. +pub fn blake2_256(data: &[u8]) -> [u8; 32] { + let mut r: [u8; 32] = unsafe { std::mem::uninitialized() }; + blake2_256_into(data, &mut r); + r +} + +/// Do a Blake2 128-bit hash and place result in `dest`. +pub fn blake2_128_into(data: &[u8], dest: &mut[u8; 16]) { + dest.copy_from_slice(blake2_rfc::blake2b::blake2b(16, &[], data).as_bytes()); +} + +/// Do a Blake2 128-bit hash and return result. +pub fn blake2_128(data: &[u8]) -> [u8; 16] { + let mut r: [u8; 16] = unsafe { std::mem::uninitialized() }; + blake2_128_into(data, &mut r); + r +} + +/// Do a XX 128-bit hash and place result in `dest`. +pub fn twox_128_into(data: &[u8], dest: &mut [u8; 16]) { + use ::std::hash::Hasher; + let mut h0 = twox_hash::XxHash::with_seed(0); + let mut h1 = twox_hash::XxHash::with_seed(1); + h0.write(data); + h1.write(data); + let r0 = h0.finish(); + let r1 = h1.finish(); + use byteorder::{ByteOrder, LittleEndian}; + LittleEndian::write_u64(&mut dest[0..8], r0); + LittleEndian::write_u64(&mut dest[8..16], r1); +} + +/// Do a XX 128-bit hash and return result. +pub fn twox_128(data: &[u8]) -> [u8; 16] { + let mut r: [u8; 16] = unsafe { std::mem::uninitialized() }; + twox_128_into(data, &mut r); + r +} + +/// Do a XX 256-bit hash and place result in `dest`. +pub fn twox_256_into(data: &[u8], dest: &mut [u8; 32]) { + use ::std::hash::Hasher; + use byteorder::{ByteOrder, LittleEndian}; + let mut h0 = twox_hash::XxHash::with_seed(0); + let mut h1 = twox_hash::XxHash::with_seed(1); + let mut h2 = twox_hash::XxHash::with_seed(2); + let mut h3 = twox_hash::XxHash::with_seed(3); + h0.write(data); + h1.write(data); + h2.write(data); + h3.write(data); + let r0 = h0.finish(); + let r1 = h1.finish(); + let r2 = h2.finish(); + let r3 = h3.finish(); + LittleEndian::write_u64(&mut dest[0..8], r0); + LittleEndian::write_u64(&mut dest[8..16], r1); + LittleEndian::write_u64(&mut dest[16..24], r2); + LittleEndian::write_u64(&mut dest[24..32], r3); +} + +/// Do a XX 256-bit hash and return result. +pub fn twox_256(data: &[u8]) -> [u8; 32] { + let mut r: [u8; 32] = unsafe { std::mem::uninitialized() }; + twox_256_into(data, &mut r); + r } diff --git a/substrate/state_machine/Cargo.toml b/substrate/state_machine/Cargo.toml index a0d25c821c..458bae8e1e 100644 --- a/substrate/state_machine/Cargo.toml +++ b/substrate/state_machine/Cargo.toml @@ -7,7 +7,6 @@ description = "Polkadot State Machine" [dependencies] polkadot-primitives = { path = "../primitives", version = "0.1.0" } hashdb = "0.1.1" -keccak-hash = "0.1.0" patricia-trie = "0.1.0" memorydb = "0.1.1" triehash = "0.1" diff --git a/substrate/state_machine/src/lib.rs b/substrate/state_machine/src/lib.rs index 91622c9bc4..cee96a36ad 100644 --- a/substrate/state_machine/src/lib.rs +++ b/substrate/state_machine/src/lib.rs @@ -22,7 +22,6 @@ extern crate polkadot_primitives as primitives; extern crate hashdb; extern crate memorydb; -extern crate keccak_hash; extern crate patricia_trie; extern crate triehash; diff --git a/substrate/wasm-runtime/polkadot/src/runtime/session.rs b/substrate/wasm-runtime/polkadot/src/runtime/session.rs index ee88937ead..412809d6b8 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/session.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/session.rs @@ -65,7 +65,7 @@ fn rotate_session() { #[cfg(test)] mod tests { - use runtime_support::with_externalities; + use runtime_support::{with_externalities, twox_128}; use keyedvec::KeyedVec; use joiner::Joiner; use testing::{one, two, TestExternalities}; @@ -76,15 +76,15 @@ mod tests { #[test] fn session_change_should_work() { let mut t = TestExternalities { storage: map![ - b"ses\0bps".to_vec() => vec![].join(&2u64), + twox_128(b"ses\0bps").to_vec() => vec![].join(&2u64), // the validators (10, 20, ...) - b"ses\0key\0len".to_vec() => vec![].join(&2u32), - 0u32.to_keyed_vec(b"ses\0key\0") => vec![10; 32], - 1u32.to_keyed_vec(b"ses\0key\0") => vec![20; 32], + twox_128(b"ses\0key\0len").to_vec() => vec![].join(&2u32), + twox_128(&0u32.to_keyed_vec(b"ses\0key\0")).to_vec() => vec![10; 32], + twox_128(&1u32.to_keyed_vec(b"ses\0key\0")).to_vec() => vec![20; 32], // initial session keys (11, 21, ...) - b"con\0aut\0len".to_vec() => vec![].join(&2u32), - 0u32.to_keyed_vec(b"con\0aut\0") => vec![11; 32], - 1u32.to_keyed_vec(b"con\0aut\0") => vec![21; 32] + twox_128(b"con\0aut\0len").to_vec() => vec![].join(&2u32), + twox_128(&0u32.to_keyed_vec(b"con\0aut\0")).to_vec() => vec![11; 32], + twox_128(&1u32.to_keyed_vec(b"con\0aut\0")).to_vec() => vec![21; 32] ], }; with_externalities(&mut t, || { assert_eq!(consensus::authorities(), vec![[11u8; 32], [21u8; 32]]); diff --git a/substrate/wasm-runtime/polkadot/src/runtime/staking.rs b/substrate/wasm-runtime/polkadot/src/runtime/staking.rs index 127b7041ad..f3bae42060 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/staking.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/staking.rs @@ -102,7 +102,7 @@ pub fn check_new_era() { #[cfg(test)] mod tests { - use runtime_support::with_externalities; + use runtime_support::{with_externalities, twox_128}; use keyedvec::KeyedVec; use joiner::Joiner; use testing::{one, two, TestExternalities}; @@ -113,8 +113,8 @@ mod tests { #[test] fn staking_eras_work() { let mut t = TestExternalities { storage: map![ - b"ses\0bps".to_vec() => vec![].join(&1u64), - b"sta\0spe".to_vec() => vec![].join(&2u64) + twox_128(b"ses\0bps").to_vec() => vec![].join(&1u64), + twox_128(b"sta\0spe").to_vec() => vec![].join(&2u64) ], }; with_externalities(&mut t, || { assert_eq!(staking::era_length(), 2u64); @@ -180,7 +180,7 @@ mod tests { let two = two(); let mut t = TestExternalities { storage: map![ - one.to_keyed_vec(b"sta\0bal\0") => vec![].join(&42u64) + twox_128(&one.to_keyed_vec(b"sta\0bal\0")).to_vec() => vec![].join(&42u64) ], }; with_externalities(&mut t, || { @@ -195,7 +195,7 @@ mod tests { let two = two(); let mut t = TestExternalities { storage: map![ - one.to_keyed_vec(b"sta\0bal\0") => vec![].join(&111u64) + twox_128(&one.to_keyed_vec(b"sta\0bal\0")).to_vec() => vec![].join(&111u64) ], }; with_externalities(&mut t, || { diff --git a/substrate/wasm-runtime/polkadot/src/runtime/system.rs b/substrate/wasm-runtime/polkadot/src/runtime/system.rs index 0b3b8a590b..0bf300d2b3 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/system.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/system.rs @@ -45,7 +45,7 @@ pub fn execute_block(mut block: Block) { // store the header hash in storage. let header_hash_key = header.number.to_keyed_vec(b"sys\0old\0"); - header.keccak256().store(&header_hash_key); + header.blake2_256().store(&header_hash_key); // execute transactions block.transactions.iter().for_each(execute_transaction); @@ -97,7 +97,7 @@ mod tests { use function::Function; use keyedvec::KeyedVec; use slicable::Slicable; - use runtime_support::with_externalities; + use runtime_support::{with_externalities, twox_128}; use primitives::{UncheckedTransaction, Transaction}; use statichex::StaticHexInto; use runtime::{system, staking}; @@ -109,7 +109,7 @@ mod tests { let two = two(); let mut t = TestExternalities { storage: map![ - one.to_keyed_vec(b"sta\0bal\0") => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&one.to_keyed_vec(b"sta\0bal\0")).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ], }; let tx = UncheckedTransaction { diff --git a/substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs b/substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs index 2232843b07..10708a5a3c 100644 --- a/substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs +++ b/substrate/wasm-runtime/polkadot/src/runtime/timestamp.rs @@ -13,14 +13,14 @@ pub fn set(now: Timestamp) { mod tests { use joiner::Joiner; use keyedvec::KeyedVec; - use runtime_support::with_externalities; + use runtime_support::{with_externalities, twox_128}; use runtime::timestamp; use testing::TestExternalities; #[test] fn timestamp_works() { let mut t = TestExternalities { storage: map![ - b"tim\0val".to_vec() => vec![].join(&42u64) + twox_128(b"tim\0val").to_vec() => vec![].join(&42u64) ], }; with_externalities(&mut t, || { diff --git a/substrate/wasm-runtime/polkadot/src/support/primitives.rs b/substrate/wasm-runtime/polkadot/src/support/primitives.rs index ecac3fbbd4..fb983bf84e 100644 --- a/substrate/wasm-runtime/polkadot/src/support/primitives.rs +++ b/substrate/wasm-runtime/polkadot/src/support/primitives.rs @@ -3,7 +3,7 @@ use streamreader::StreamReader; use joiner::Joiner; use slicable::{Slicable, NonTrivialSlicable}; use function::Function; -use runtime_support::{size_of, keccak256, ed25519_verify}; +use runtime_support::{size_of, blake2_256, twox_128, twox_256, ed25519_verify}; #[cfg(test)] use std::fmt; @@ -109,12 +109,20 @@ impl Slicable for Transaction { } pub trait Hashable: Sized { - fn keccak256(&self) -> [u8; 32]; + fn blake2_256(&self) -> [u8; 32]; + fn twox_128(&self) -> [u8; 16]; + fn twox_256(&self) -> [u8; 32]; } impl Hashable for T { - fn keccak256(&self) -> [u8; 32] { - keccak256(&self.to_vec()) + fn blake2_256(&self) -> [u8; 32] { + blake2_256(&self.to_vec()) + } + fn twox_128(&self) -> [u8; 16] { + twox_128(&self.to_vec()) + } + fn twox_256(&self) -> [u8; 32] { + twox_256(&self.to_vec()) } } diff --git a/substrate/wasm-runtime/polkadot/src/support/storable.rs b/substrate/wasm-runtime/polkadot/src/support/storable.rs index 7d45587338..177475b2d7 100644 --- a/substrate/wasm-runtime/polkadot/src/support/storable.rs +++ b/substrate/wasm-runtime/polkadot/src/support/storable.rs @@ -1,7 +1,7 @@ use slicable::Slicable; use endiansensitive::EndianSensitive; use keyedvec::KeyedVec; -use runtime_support; +use runtime_support::{self, twox_128, Vec}; pub trait Storable { fn lookup_default(key: &[u8]) -> Self where Self: Sized + Default { Self::lookup(key).unwrap_or_else(Default::default) } @@ -9,20 +9,20 @@ pub trait Storable { fn store(&self, key: &[u8]); } -pub fn kill(key: &[u8]) { runtime_support::set_storage(key, b""); } +pub fn kill(key: &[u8]) { runtime_support::set_storage(&twox_128(key)[..], b""); } impl Storable for T { fn lookup(key: &[u8]) -> Option { - Slicable::set_as_slice(|out| runtime_support::read_storage(key, out) == out.len()) + Slicable::set_as_slice(|out| runtime_support::read_storage(&twox_128(key)[..], out) == out.len()) } fn store(&self, key: &[u8]) { - self.as_slice_then(|slice| runtime_support::set_storage(key, slice)); + self.as_slice_then(|slice| runtime_support::set_storage(&twox_128(key)[..], slice)); } } impl Storable for [u8] { fn store(&self, key: &[u8]) { - runtime_support::set_storage(key, self) + runtime_support::set_storage(&twox_128(key)[..], self) } } diff --git a/substrate/wasm-runtime/support/src/lib.rs b/substrate/wasm-runtime/support/src/lib.rs index 57606a3f1b..bc987ff396 100644 --- a/substrate/wasm-runtime/support/src/lib.rs +++ b/substrate/wasm-runtime/support/src/lib.rs @@ -29,7 +29,9 @@ 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); + fn ext_blake2_256(data: *const u8, len: u32, out: *mut u8); + fn ext_twox_128(data: *const u8, len: u32, out: *mut u8); + fn ext_twox_256(data: *const u8, len: u32, out: *mut u8); fn ext_ed25519_verify(msg_data: *const u8, msg_len: u32, sig_data: *const u8, pubkey_data: *const u8) -> u32; } @@ -80,12 +82,32 @@ pub fn chain_id() -> u64 { } } -/// Conduct a keccak256 hash. -pub fn keccak256(data: &[u8]) -> [u8; 32] { +/// Conduct a 256-bit Blake2 hash. +pub fn blake2_256(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]); + ext_blake2_256(&data[0], data.len() as u32, &mut result[0]); + result + } +} + +/// Conduct four XX hashes to give a 256-bit result. +pub fn twox_256(data: &[u8]) -> [u8; 32] { + unsafe { + let mut result: [u8; 32] = uninitialized(); + // guaranteed to write into result. + ext_twox_256(&data[0], data.len() as u32, &mut result[0]); + result + } +} + +/// Conduct two XX hashes to give a 256-bit result. +pub fn twox_128(data: &[u8]) -> [u8; 16] { + unsafe { + let mut result: [u8; 16] = uninitialized(); + // guaranteed to write into result. + ext_twox_128(&data[0], data.len() as u32, &mut result[0]); result } } 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 658efc37386ac47900dea844825f63fd7c92c24f..dbc3273e1b506a06521aae4b775386774d7353a8 100644 GIT binary patch literal 18522 zcmd6vPmmndeaBz-^vurg%ybNo{<*|Cmpr;~qIL1&MRy|O@5SWeiG=$^H|nOb zes?0(9GCn+H~e)j{kLSkwR`3}OS>;#c=DU4PoCO+=*fp3*>X;uLv`*x{m>(iJowos zzq5Pp*>An%5)E`U@U3&ZyDrt^NRQv%z3}Au3un)r{PymX&z`w(Hq2bm&~qnGpFaDP zYiVxi*nRG)=U;M}I+iu#eEqU(tGBP-3*SBa;*$?P^k~4Q^BiwI_dIVcExI)AxVg03 zozGfnmL<zWeN%r`@nqB0S2B#_@dO7XJN5$>M(|N#|m^Q~&Q>kxe&J zH_5o`+Fk3EPrtV4e9NcPN!MpZa$z#(yMFF#cjRrKJ+_#5#~XRaXTJTF#ngB5xqho> z^Yd;PvyS#4o6IdH8nat(Z|JSB-Z5CsGv67cf|vHZ^K)CNGh}?5J9@yzchx!PTT`F- zbg+70x#wK(he^`DSY&zo22>=Efw*DU_DRt{J!#RbpPr;&0qb_2_0wMQY0%0RQy>A8 zTi+Jyx(uxpWK*9SS_!o0ZK0RVpl5je`EBFzfeVPdpUh(NPU~Yr<-h0C4YZ+f1+-_y zJMPqEbBi07ALiN+qkN)WPSs@WZZ+i7BALRa^l=!M_!fHOH+{O5?i5{+gP)1tEZB#P z?gSYo69m*{;c9zqyfiC%g@i;w@*L?3_Jo35W%h!ok~*r}y>hlPsIO(*k5oXZp6 zQ3ErIho_ST-KTy|O^dGkr<0!U5BRQ{yZq)6_eHVvi2Fj`SM&LNQO&V@NzHb?tmd;h zXdiJ$^A$B)`B2Rx`Kp@Fj2jsTnD-C!1Prbm_DL`>0=t0zD5Jn_tC)gbsCtyp9ZEMpn>Uk z(7^PAG|+G-4NSj_2BzO#`24UCIy@EgT_NRs$4xOkW^R8vOqVXE(Z>BeJ2e@|EDefx z6Z``v0|%j}bQ=0%&lUWK_18T%hyK{}GB5_km9*~Ro*w$+oB(-d&K}5bI)l@I9NwZo z!r6;YHv3Yt;hx1<7-d+ciG10wU1f7ZH|D8BH%7L!PoWzFHAnZgx?5&)=VN4pR2n3U=siUNyQ|H1IV1us$uH_NVfr3vj8$*!!;o3(e#Qa z6BhxpP_JQK0O|Q|4VPH}>HGPrOF*u)03uAZIRIJo3)Qf70c6SdX1V~f?E6)h0RfYj z6RgH!+1v9=`xRCA_g$j$h0IorbrbzR2?b={Z`m$TbJ z>~dy%_fZgg-*&mNJ?a<`l2xoJ)Pc+0vo-G%b8Wg4`HK16t>67lY&JHDj| zO>qyll@P2*6kiP#1pExSQ1EB+L45IZlM^&7DgFnoY7q_$HW;0B1p+zvSqnE9-oGNzMe1ilU_lD3NtF@5Z+pmxTHcrY6C^WJK!=i zf{4tOBeN7qcTHmgCg@n;RXS}T1wzM?_gWy4uuoah{<7FCdnzR(e2#0W%lI1UwplEH zoz1v{lA#cTLIO-SG3OQgR9s-OV+jHrx3Je>b-8!VWy?)#m@2XR-O8lM8n6Z^G}pMC z9ZS&jL2=DE8C5rQu$lGlY6hDb>8v*MnqGg?pj&7c@qalvmb{txEKhnt)(i3>hl6f! zyNB6NUMsmLA_D?@nOI>mGh)09BePq1tun(UxmqOP)};DPFf*#fGj^}P*I2h|Ld|}& z;^M3zN6t#r_U@jjH#wJ3vPQ2qhLtVv`&Oh%vsj}Q4K9k%u;rzMEY9xUyR2a*t}^HC zxJajlZGeKP&H2S9AGG@cNAuK3;TskvIHi^fiB^ub*f77amG)`ow^HJr;?r`++PQ;D zh(qRg|I}ykVM7!CFRe!pAvST;YxI8`qX)4Nadcgy@71F+YVVR3DVQQCdYJW(P9qo4 zzz3k<7$L1I9@VSbQ6qx5l*gZEijaD*r)i4}P-2+wC=2XQNMQ-jST}dFEgRTer*w|U z%4k3Sr{1dQo}S>)P{b8E zwlC2zwnO7KTd-WS1fqh@I>Z^`XbB!9q%#yKBKVyq_%BU5C3xDW19*`4?udI>Rw|IO zQX~dh5?Vp_0^9(5bF2>qupVGD9D+N8P%jGP8pi^gl)0CDQZa`J#hQ{m2+mE}!x-!_ zo|NS%^ZT&%OKkp1fogFN4~$KNd1jlKx3uw$9MUWa78|;eZh#{?lMIpr)kGyyX{c@3 ziz}*ah;ytA=SmVqOL4!|Hm=`zD+I-j2amWjCnntAlrqLD%1Vh6P3=Gq@?(1g0<27N zL$rp?C%T^urKBQWdlnx23L%yTY(ZLY9>^vQnEQq#hayK;4ryhxwR1fAUOvPQ98dBg ztO866Cr{O@S~3z^c1iF$*RPHTzuEc$!Fufu%(sGKo(8K_{iXk5#T~`mpG+`0iZWc$ z`m$Lj>U8X!D8->Tls?vE0%caJLhit;!4rIb%34*YPwmbJ(gbM^g$p56U@O5(H@c6C z(+E`+&mgIrsXuBGA-xC0d<=yHqX4lGgWWl^{o=yhQvl{w4V$fVnYPvD0A+l}4hmj{Jf>gO)P1Fr( z>BV@z#{7l|vj?8Ch>D0P+8hMjRMCEgpkOhO(+w;uis&fVSaTzbL7~_TDy>Wt^R&?z zhNxDDa+Z@3pfoMD>IOkTtwa*~v?|tgyfxw#n#8?n5^VriNRmqpLL0Hy`Kl_}tSISf z?G$e#!4a}#r_$7qq9g6atWN@TOOfv)-FrlylI<-;9`&ns*(?e2LJ@za3z?zpU3Kjh z`EIQb=KTOs%Sl7z(E5H$vECz4O>2HocN{yz&X2g5R`l_|1&0Gmc1lYf4$? zzV;#4$vR_uWt|v8vQ9XRtVekiC6zpqXPU8uMc4U^Aa|9`_5&(PoO{^0Onb4_&w9s^ z`koO+=qSffDlrsYM_8%EQ7o7&ZPt-NScUB(z-@R-?rTaR&9s_UTFqEVX^;_*eE{Ae z4xNnJL_woN94qftJ1vnt61|it8)S2DtI_&dSJ`xvRBz=YX{70^e)xUm2dS@3NF=c2 zwJdLKR7{WQ>E4!cffzsX!|!R01RGotQ<^E;weD?fUU$&JMId^BQ6MyDfwS)F>Tw}_ zUrS;+^~ZmljxT0)96WbwvZgrLZMbKsNURmtLgv`UIY%cPda(n9n6*g?y-b^wwAq-!ubeprpF2M~+V z&e$9v)Jd_Sag{q`w5 zs0;iD4Hl>i0Z$jnmQ*3gB_4EFBtYqA2Df)%Jebm%h0spKhi z0c0r(mTmKESbk z6jtIYAD?l$k+oRbD@_POT?Jl=2BHr53{MFH6pbTAqe#)}4JeX#P!*B_UF{pxfymUJ zK^=(99=|}9k^|qZ^bNoq&yKdPcKAePQ02U{t)JHkdbh~FYPs*bZko55y}*I*h<2Fn zkX|JDGESYX#0_l_(~RZR$D~usk1cjo{px8sPG$XA#mhCntg4>;j_(7Wsd#aHj=_9h z1P;9%n4ls3$+{gp^!@tl%FYQwnE8v2Y6U1oXF6E$tHf7)S3v*OPQK9Npln2aZaTpT zDohw_If3nK)l~*50glu)^xenp*t}Q13^{%z90UN6!+hM@p>JFl`Nk}!aAm9_-=81-ulK4hJbm@d4yyV29#R@{11NH&p(3%w6yyQTl^hh722s2SAl~h8s2zOY9~$ zACPg2lV!ZIs@tGg4a-3+f?C0M8{@Xh9Kw6(7s%Qew^iO13`}s044SYJ?o@I&siUJZ zCRr)RfL|r(;XQy>^2%-WklI}x_L=<)L03bV)iEQ?>Ofwiwb1KC9>f#vDB-o4Se$jd ziiVK-qNJi}j?AWeBSc42oUNvJrT?T#hsZL+=1t8yi%;dZ%Ko#j~ZMO_>!$qnc$V7|7M; zHz1d0*CfjEA+0=J= zGU2tScX%?NSG`4u-TJl3)7&&f*Ea7Jo-Ed~r%ODUAXjhU2U;KKEszN4{l*Sg){3{< z>OuKJ#{hfKwf!zgBj=1apkVXLDK`LeIhg^%=}hsSo01-24ebLP$%QN~yKuaV#pTpM zwsZD>Gcyy+t8A^|G?-E!vb#s7H#m^Oo^cl($^-THm4vPyo8R%mqz7L(3&icooK9iKCT*IQ}!Kg$zpMY8HB1* zagLw;`WF;`6tC!(fWn>>ja*8?2_(q2&>sa7)ROGeVg80FU~nr2T^9wwU;AuiK#agA zBRa_>py@l(%_z;iNI7(@2< zI90rnXeT4~L!Dj*>hTQPIL{=kkiwnOrdvnDMu9^kI}&EP)QU2LqA0y>qCeQ;tGG2u zA$jqtF-8z%x9PF9Ac#}bQE_M*g1eESrL)X2VBo{p;;8khnG#U;lcC&&MQg-(;_dK5 zqN|~zt6_PBD!jq5f}tSH*0l3e)+Ex?it0B!yT>n5uDY68O%OI(HDoLO74;eM@h#P9 z;LESoO2Q5?QPm{bqu^FI7z~kO5Zu7hk`Ws~&>#$Axeee>hFe5=JkkCH(buM3rj^hO zE~d~{*kClotCthJucR(aqU;|~L5asI4z8;zSiY(449{$W<4qn!gF3Hf!IPA8Q3j(T zemWfE3+=V&i{I&l5uyMK9T{mv0cCtqSFVHGCYHLU6j}5jH~l&$vo2tzF(M=OZiWu3 zk6FA|1|{7(udAXFzKyNkur7E`$*Ag*JyBtbTq%T8Ah6P?sD;>T(v5*$m<5o9m|7VX zN(_k|hcOOZjZo?+(Pk<{gWj6V52r2^4;r+o0~=mbrViWW5QGNCLKoTM$TAYhLpFJ& z<@=Z*tH}?`=f5c1A6dKY{<3WUs%$Tp?O&Je-<0i-%l0Q_`?qELcV+wcW&3K`{zKXR zW7+;w+5WU_|G8}crELEd^ex}%nHDM>fPjPOFkdEg4@gmnKyIm&gxV6tTPUU(C=}DO zx`twgXQ?8J$wNai$^1+)X-zR1y@6ty`6rDr{X`Wvn8dMnL`L6RnAK3sD2nETu>==1 zUhdi&h%^*cTNiu0rX-1CG zh^}JB6656v_P0T}#PV$p?E?c0OYEr(Rj?ScuI4MmK)gX@12|$5jSaNF#E59B8Iu^K zs;baM2o~@l@=Jy+z5;*On-=@@-43bubCU)7aISn{*;bs0C-CE`4(QFXa13H`_o_w6 zvhJ7wzI->ts(r+Hg`W|X!cyh}vXA;KBv?wcbQl>HrLEW42c)gB54eHGJ~X%5I49Tb zmj&IJgGWq!k3N1n5#)|=FThsKK_v^(3liXHlq(!t#r2~l6e*_okyK7HwGss74Y7(? zd07P-_+l=%3xJS@zz%aaIlrU;13(2M4)hr6TcQe+2Gtyt~z5+KHwYd9mrm_2Q zrm_3R8AdNBU`bU@TgRT+en}AwO;HYWV3%;k0WK4fhhX+qicXPb#!L%tS1mkHY{B8e zM~mAQ^lCR4E(PpE?GwoL)laZ%aqTZ#!E;}0Dep$lHug2u(-d|3+?6Kz;g!FDZ1 z8@C8DWTT7_wK#tcVS#KxHJhXaMzO9Kfi{ykNUXJ?(4!*o zyIXaCSarWl!RUsG4ZivFi$~?a|Sh4_ZMl*kFCU$zL`TpCG{o56~J=<;DG>4p1*AnAO zDc9Frmega7nn@piQMR@jUxr_X1~F2YAiIuNTQxr>ONrs(+&(;;(YL`{1b0lW;>*Gp z`Z)+7N&1Lv&Fyp4ig65Pu9@`Ro}})va~WSxW>%}>2qeqLRydO-UdG@R0T(mF1qZJZki5IR|L8BOBK_fcFlRR5r>m6~N5+(7}rAW@%j|cmHrS#b$ z=OK+8HT_;leDu9S)8~ckhcr#Swd&0 z8=RWQWOOxRx?I1k<#aw_I4gi=xhBr)0_P?#LYNJ&_uzc3k(f95QYYp$FRUCf16P=o z8TuG30(6J8uztYY9`M2jMGuC2c9h$`Vp7#Ay&_aorb>P)=^@1HNi_RN-oyemga^@F z<_J;hN~|ggRDdLfE2H(OzKwK-YT)(78mo!fmzXg~ABHb8t9*>XhRXKJM1{_R2XgiV3_7Z6Dy3A zJ}v1efNT{;qt)ujSpLU#rdeE6xsQ6IYJ`Fno@VQP5Jg^WIh#d-fLXWlvEuO$srA(- zsRkw1`i6)i)GBlxY7b`1eTvJOZ=aFzk0I#3${Nd9)V}=xt&q@h3oD0^*1%K?P)3$8 z1Y4@WS4javTSmRy-759i6A2sARH@@)e8^pr4Bf7$fBzwt@T6R2`K&(bk47Sl$xv1$ zvoa~4$ld5YRBPrV5}CSd4YR>l2=P_f2w))`GhKif#?N5Q)WyPHX)j&0bY*lVo7R9E z!ny|B(vX;jRv+Iq*03%xX~Kr6 zX~elIh9HBjYAVIRY!F097CxS6ftAE_D?i*SVi-1p+S|<7g7HztW~Nu60snwOZOUmnmX4babX{wwuZ0)%xopC}htlqKxE*AnNqfEjNS67L zMlZYM2F?}zUgq>)G3a%l;vb(m`N9Pr)_dLayXW1h-IsXqz1Hd7Gp;y9=S%0^+0#$c zd4G5~!z)Dmy}9!jPP+5Y?~*r#``vRV9cgQLIKBInBi#rOXU;S0SC032<(nr@^Zwfm cU3m66_Z^;aT4C`sFA9_Q^cJXm^ZE1t4}HQs5C8xG literal 5276 zcmb_gy>A@H6`z^iy$|l~-QL}vMaL@ME{Na=M34*nc(4S6LqJhn7;e(@DC#0S#V!ieD3cy)$3z9xo1$_U_Dg?;R`-mFB56o_e_V;KAX(GPPj-aR2i!l*fV|YaG{$ zmG5=JK&hb7Y_>e3d|!W#H&3g6^Oudr!}-I*qc4n#=8xz5j~4UYTQGfJtqsff#nIlu z@!tO8-r<1?`$vzC7rVFSckUhRK05f#y@T7T(&DV-*MCV_ zKOY;F`FLu{lXsuYXOSY0OrEvKw|bE^sYT7t-b(}WZ$z3DR-_H`DYzLKYNXAM7m9w` za&saGVv{u^&2#cdvVvEA`d%ERJ~d*+_Do2MniHc03i-jx?^`BXnlG)gIJ$3N>ib!5Vtne^mnygG zInD?#wJ}+(MSp(8mB_%DZW>|Hq#g<3@rYQ`u2!`Oob0Sy?s8Ncj zw`pcu=2XMRGiRegUO6iw*l4bpWi8lf)n?hosopZr*vN@9(yq4<5sa)+v$D%tFcMO$ z6tR(KFmfVDoM$@JE~o7?h+rh5wR0jE=~7sV*vJWtY*U*$g>a3c;whx=s^Ye6=2d(6 zmFeJ3i*Qiwm)ada`veMM2`Tklh@T(=JV8r!ZEVna73gpP#?ux9!^31k4=Y%9s1^D6XRI#=f#GXnPMH6{0!)-moY2+P1my{&hQjyo|4Ah18N{}!wKLFZSL`baUt-c@y~uc;5&*Usyq6>88q zm?Qj4)AW{J#VDs>l$aSMwq@Gsv1w(dW)+!%;~HexagJ(42)}__*>8oAj64ynRs2*Y zqZ3I0N&;~r@qWn~F~yq(={bXmf(`0|aUz(gE60goqAnLPF_Zd?rSd_OHGMb{Y}EAO zM6gj)hS+dq5Hroz%n@@A)vOV78TKl^kagS4#eT&cLB$+MvLeGo4;ePY9axfXeW(l1 zQXip4ej#AQfYQF%wk;GDZad_z#dUj|VloqPEYkFD5h6^*0SGT1o4XmNr8(dM2*+l| zq7&_2ZfEU@`HEjKZa8ZkX{4~WNp1;-ux2CmrMU4(87^NWGit7gQ;ZwvCL`MPPINjz zj_#;*5DL`xIjGoUhE;DsEd%ZlLkq?@btQ}3t3!_G8aa9pL5`7;W3E8%VqZaT*3c0I zhTgas`p`iihOjoE{_nPM9<&UP9+t2o;4pfgf;(~w4N;(JY_9e>MvuF*?*e4_F% zh3E;hru7{q|3l^A%aNV3`_h=TtxAU&jkgUVjsUOEy<&H)RF*K%1UVJmhyq3~(NQ#_ zWMZykh$dz#)~JhZpc>Fhb*B4w<|8nEQwpR#$JqMx^QV1aJ^~zE@b~vxWerQx^TSwTjdtZLuz6u zE|n2AuPSv-FR%+os{?t~w*Jp0Tu4%9q%`pa7cEQ-D6H0xuIj}#{RD~0(Zx?JD%Ekn zv3j2dtLjhmHGRhVXf|9}3xFNgrv9q#8FV}JZhDEjX-pAvx(!kR(1F9qxyOlD>>a

45kB57@SlpcDVEVlarH} z@Al!2+VVi}7T=ERZvL_x$PF9T$7%pFa6Z!z*c>F;32DgK4YL!H5^f_$gb`BV9kB^L zg&oFf9fdwb8?1PT%Xwy)L%_zg{uCXX)1h<#9e<*D-;JDsVl4*Mf;_QHYy(wfS`zV3 zxohy5#|+9GPo6LwX1tpH_{J9YOA!M~kez@H1nk*Zc;B(-I!jn_$fxp)%|OY_t&qcN zgfwI)DikJI7MX)YP2x7D5asJUfpIFkVM@5R%me1ZDzI=LZ$Co#B`_n7bw#CBU`8%5 zBNrH%zwFe=4OL)}DTMp84h(RpOs)+?>=OiTWS8tlzTFgHI;Z084X2LKe#qkDIO}o@ zzFXevUU4248|XL-*N&tb&bfBvTsvURfy?gZTVyv}-{+-Gb~Hd94p*U-M6b& zjwG+{vN>b}?!@xnAGN`6<*JT_e|Ldy(#Hn_k^tXTxR#84g}a9ZcFNa}vESl$5NRQB zB7Q;D$fRVCLEgeeytBdQigStk6%hk5ADZv<4t>p&-|9^N`77>&`0Y=kq@je8H1?%5 zSmcE*W{{k&I B=@I|{ 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 1d1c937b7001c2f142ec7f610157e0af3eb9b778..d04664b607955d53f806292a0250899ca082b507 100644 GIT binary patch literal 18609 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 F{{emLQm6m` literal 5364 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 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 69e547cd117a8e644a910fd360ae972b4a6efa6b..5c717847a5a2dfb1d4b0e0db128b5a2cb9c57aaf 100644 GIT binary patch delta 655 zcmZ{gzityj5XQfmU3_=39bZC6!(su#U1H$`Cql|1rJ|ytL+1z_(mKaHUmsF0( z#?JAfz4$r_7t@;&z+Wg5CO=*_r$w?iO%F^z=?^vlXRbQajQfMZ`Y<^*i^={O$R$FT z*k2d}zQ}H0d>EG2Y&o+ynV%->{YN$6w^cKvFmNZ7EG4}LZV19ka86NUW@hun8KYI0 z!y*}{MVd@({xm}{x+9pA<=o3(y=-M4kq7yL7Idu4HCxqIf-Bu|d=lSw|ta$}ZG zr}LNSNWV%P5tcp&VfCE0NmQ5gEMkS26~$crq#>cY&);u(t)UwF2eJ*8iatJh>yEtS zdlb5w^8YpOI!&PYo|x_bYiK-Rsn-s=!jYgz2_0u~U>}v~F!R#BJ)kQ$8CHi`msK4r z(L?NfrG&S5N5`@3PHDI8Sv|%kY~)CMC9XEI8wkDj*8*G*_n5fUEgjf#puZxE=?+^k ZS+HU)z)|YG{Si}T?POZY;zUFzJ!>62bpH)hfT#i!Hs}Ha@l3XRL zP4$v_Ds+3jlfJi7X*5{_RnVw{Nvag6$oIEc<#j4=s>b7B>h{ix_raw!rIZapLeL{% zaDpvEX~rs^r)!3GrWTnO23g=m3FJnN{|C^}KJ6S^cDgLL?$tw-c+2EDN1=*A)kU2>>P`keKN>nHYY{PB?QYHrwjIAH8*NL_KrM;$oa TVWR<1*LYcTjUys`Yux<;(KbtX diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.wasm index cbf1c77bdcb8bee40d72f5b5c37e3f2723db12a3..64fb6a48bfd6f1cd23a2e17c4cc720efd7e8ae65 100644 GIT binary patch delta 673 zcmZ9J&2G~`5Xa}kZJfkuofe7^5?!nc=!rHWg>tGZ<-(0C5^~&TTg8o?Dsj_>1IsH! z=2WQ%Zd~BXkq6)j;EKexufXn_mXAH`%>3r#zhi%PKX?k_af$$dkE>l)NtU zaWIk+XqK$bE`l{SxNdMN({wnIU`g#a8Ot1a_Tz!lRi0t_>F_MtY&|W7{-9FZt5?i% znb{%7!DE0qMrc;vqc^VwhNCHgm&BVJR z@ZW-db9ADs_T*tdi%zoBe%6Dg5#2wY!cygGy=8;US~up?crY05!%fG2k(DY!?OUb( z36WF?Av`1}^p67G(zf`5_mPXA_@YVzd=ltWu|wMk#cTRHSH{ozPVtgfvHmYRJVzq^ z*RE!6lrseg6dd}AU(-e;p_|xH+jW4zc|xFLHwj3TzTkE64HtqfqMgw9od7!xJF0lZ xE4S@SLesgC=!XmZxck-|Dk8ph7w?g7Lfyosi3N3@0oa9DFZ7N(NX2)4^$Uk8py&Vq delta 405 zcmZ9HJxjw-6o$_^_oivm50h396f{<$f{PX_)X5B;#KFZ)+M3=>~i+ff3rvCrnBSO_V5`q%t1sIK(;L zHUa1zO(ud_LEKClqFt$0_iK%r7AGfv> zoKe^pzCV}=NQn7E#$o~#ewJ5FL)Y~*5pm=khX5Kwu=P7Mqf=awW_}{Ze^x`Ln1FxA zvi4{iw_S>>ZqS$p*WI8Exm0}F8_prG|5{j5NS(G)eyiUfcwqD7lY)U@zH;LQk)#VQ z>=1XYUMb?VixlnAnSl;i=%9ts1J#g4A8et0>nFYzoon_wY!V&2Xz>!O=fGhO)sFy@ PF&2;AYjwnEp) -> Vec { - keccak256(&input).to_vec() +fn test_blake2_256(input: Vec) -> Vec { + blake2_256(&input).to_vec() +} + +fn test_twox_256(input: Vec) -> Vec { + twox_256(&input).to_vec() +} + +fn test_twox_128(input: Vec) -> Vec { + twox_128(&input).to_vec() } fn test_ed25519_verify(input: Vec) -> Vec { @@ -35,5 +43,4 @@ fn test_data_in(input: Vec) -> Vec { b"all ok!".to_vec() } - -impl_stubs!(test_data_in, test_keccak256, test_ed25519_verify); +impl_stubs!(test_data_in, test_blake2_256, test_twox_256, test_twox_128, test_ed25519_verify);