From 944743c2c8d3f9dacb700badca6fdfb15a08bb34 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 23 Jan 2018 16:51:04 +0100 Subject: [PATCH 1/4] reorganize native-support exports --- native-runtime/support/src/lib.rs | 18 +++++++++++++----- wasm-runtime/polkadot/src/codec/joiner.rs | 2 +- wasm-runtime/polkadot/src/codec/keyedvec.rs | 2 +- wasm-runtime/polkadot/src/codec/slicable.rs | 17 ++++++++++------- .../polkadot/src/codec/streamreader.rs | 4 ++-- wasm-runtime/polkadot/src/lib.rs | 2 +- wasm-runtime/polkadot/src/runtime/consensus.rs | 2 +- wasm-runtime/polkadot/src/runtime/session.rs | 2 +- wasm-runtime/polkadot/src/runtime/staking.rs | 2 +- wasm-runtime/polkadot/src/runtime/system.rs | 5 +++-- .../polkadot/src/support/environment.rs | 9 ++++++--- .../polkadot/src/support/primitives.rs | 10 +++++----- wasm-runtime/polkadot/src/support/storable.rs | 3 ++- wasm-runtime/support/src/lib.rs | 12 ++++++------ 14 files changed, 53 insertions(+), 37 deletions(-) diff --git a/native-runtime/support/src/lib.rs b/native-runtime/support/src/lib.rs index 348c0b17a9ccb..91005a2f1d773 100644 --- a/native-runtime/support/src/lib.rs +++ b/native-runtime/support/src/lib.rs @@ -24,12 +24,20 @@ extern crate polkadot_primitives as primitives; use std::fmt; use primitives::ed25519; -pub use std::vec::Vec; -pub use std::rc::Rc; -pub use std::cell::RefCell; -pub use std::boxed::Box; +pub use std::vec; +pub use std::rc; +pub use std::cell; +pub use std::boxed; pub use std::slice; -pub use std::mem::{size_of, transmute, swap, uninitialized}; +pub use std::mem; + +/// Prelude of common useful imports. +/// +/// This should include only things which are in the normal std prelude. +pub mod prelude { + pub use std::vec::Vec; + pub use std::boxed::Box; +} pub use polkadot_state_machine::Externalities; diff --git a/wasm-runtime/polkadot/src/codec/joiner.rs b/wasm-runtime/polkadot/src/codec/joiner.rs index 92a5aa87fca97..db38cacbd95cc 100644 --- a/wasm-runtime/polkadot/src/codec/joiner.rs +++ b/wasm-runtime/polkadot/src/codec/joiner.rs @@ -16,7 +16,7 @@ //! Vec serialiser. -use runtime_support::Vec; +use runtime_support::vec::Vec; use slicable::Slicable; /// Trait to allow itself to be serialised into a `Vec` diff --git a/wasm-runtime/polkadot/src/codec/keyedvec.rs b/wasm-runtime/polkadot/src/codec/keyedvec.rs index 1f803b7c6206e..b1f903643c1d7 100644 --- a/wasm-runtime/polkadot/src/codec/keyedvec.rs +++ b/wasm-runtime/polkadot/src/codec/keyedvec.rs @@ -16,7 +16,7 @@ //! Serialiser and prepender. -use runtime_support::Vec; +use runtime_support::vec::Vec; use slicable::Slicable; /// Trait to allow itselg to be serialised and prepended by a given slice. diff --git a/wasm-runtime/polkadot/src/codec/slicable.rs b/wasm-runtime/polkadot/src/codec/slicable.rs index 5ec042ec9bf5a..a013abb9980e0 100644 --- a/wasm-runtime/polkadot/src/codec/slicable.rs +++ b/wasm-runtime/polkadot/src/codec/slicable.rs @@ -16,7 +16,8 @@ //! Serialisation. -use runtime_support::{Vec, size_of, transmute, uninitialized, slice}; +use runtime_support::vec::Vec; +use runtime_support::{mem, slice}; use joiner::Joiner; use endiansensitive::EndianSensitive; @@ -45,10 +46,11 @@ pub trait NonTrivialSlicable: Slicable {} impl Slicable for T { fn set_as_slice bool>(fill_slice: F) -> Option { - let size = size_of::(); - let mut result: T = unsafe { uninitialized() }; + let size = mem::size_of::(); + let mut result: T = unsafe { mem::uninitialized() }; let result_slice = unsafe { - slice::from_raw_parts_mut(transmute::<*mut T, *mut u8>(&mut result), size) + let ptr = &mut result as *mut _ as *mut u8; + slice::from_raw_parts_mut(ptr, size) }; if fill_slice(result_slice) { Some(result.from_le()) @@ -57,16 +59,17 @@ impl Slicable for T { } } fn as_slice_then R>(&self, f: F) -> R { - let size = size_of::(); + let size = mem::size_of::(); self.as_le_then(|le| { let value_slice = unsafe { - slice::from_raw_parts(transmute::<*const Self, *const u8>(le), size) + let ptr = le as *const _ as *const u8; + slice::from_raw_parts(ptr, size) }; f(value_slice) }) } fn size_of(_value: &[u8]) -> Option { - Some(size_of::()) + Some(mem::size_of::()) } } diff --git a/wasm-runtime/polkadot/src/codec/streamreader.rs b/wasm-runtime/polkadot/src/codec/streamreader.rs index 371ceed4eeac4..33056a5ac391c 100644 --- a/wasm-runtime/polkadot/src/codec/streamreader.rs +++ b/wasm-runtime/polkadot/src/codec/streamreader.rs @@ -20,13 +20,13 @@ use slicable::Slicable; /// Simple deserialiser. pub struct StreamReader<'a> { - data: &'a[u8], + data: &'a [u8], offset: usize, } impl<'a> StreamReader<'a> { /// Create a new deserialiser based on the `data`. - pub fn new(data: &'a[u8]) -> Self { + pub fn new(data: &'a [u8]) -> Self { StreamReader { data: data, offset: 0, diff --git a/wasm-runtime/polkadot/src/lib.rs b/wasm-runtime/polkadot/src/lib.rs index 7a96b6cee4437..a08cc046d36bd 100644 --- a/wasm-runtime/polkadot/src/lib.rs +++ b/wasm-runtime/polkadot/src/lib.rs @@ -34,7 +34,7 @@ pub use support::{primitives, function, environment, storable}; #[cfg(test)] pub use support::{testing, statichex}; -use runtime_support::Vec; +use runtime_support::prelude::*; use slicable::Slicable; use primitives::{Block, UncheckedTransaction}; diff --git a/wasm-runtime/polkadot/src/runtime/consensus.rs b/wasm-runtime/polkadot/src/runtime/consensus.rs index 1e12135806f22..1b897a86cab08 100644 --- a/wasm-runtime/polkadot/src/runtime/consensus.rs +++ b/wasm-runtime/polkadot/src/runtime/consensus.rs @@ -16,7 +16,7 @@ //! Conensus module for runtime; manages the authority set ready for the native code. -use runtime_support::Vec; +use runtime_support::vec::Vec; use storable::StorageVec; use primitives::SessionKey; diff --git a/wasm-runtime/polkadot/src/runtime/session.rs b/wasm-runtime/polkadot/src/runtime/session.rs index 907b3e16b162e..34c67c9811c75 100644 --- a/wasm-runtime/polkadot/src/runtime/session.rs +++ b/wasm-runtime/polkadot/src/runtime/session.rs @@ -17,7 +17,7 @@ //! Session manager: is told the validators and allows them to manage their session keys for the //! consensus module. -use runtime_support::Vec; +use runtime_support::vec::Vec; use keyedvec::KeyedVec; use storable::{kill, Storable, StorageVec}; use primitives::{AccountID, SessionKey, BlockNumber}; diff --git a/wasm-runtime/polkadot/src/runtime/staking.rs b/wasm-runtime/polkadot/src/runtime/staking.rs index fc7c12798e3ed..5f39ec14b2612 100644 --- a/wasm-runtime/polkadot/src/runtime/staking.rs +++ b/wasm-runtime/polkadot/src/runtime/staking.rs @@ -16,7 +16,7 @@ //! Staking manager: Handles balances and periodically determines the best set of validators. -use runtime_support::Vec; +use runtime_support::vec::Vec; use keyedvec::KeyedVec; use storable::{Storable, StorageVec}; use primitives::{BlockNumber, AccountID}; diff --git a/wasm-runtime/polkadot/src/runtime/system.rs b/wasm-runtime/polkadot/src/runtime/system.rs index 5ffa03ed818a7..f6243ff4f7c15 100644 --- a/wasm-runtime/polkadot/src/runtime/system.rs +++ b/wasm-runtime/polkadot/src/runtime/system.rs @@ -18,7 +18,8 @@ //! and depositing logs. use primitives::{Block, BlockNumber, Hash, UncheckedTransaction, TxOrder, Hashable}; -use runtime_support::{Vec, swap}; +use runtime_support::mem; +use runtime_support::vec::Vec; use storable::Storable; use keyedvec::KeyedVec; use environment::with_env; @@ -46,7 +47,7 @@ pub fn execute_block(mut block: Block) { // populate environment from header. with_env(|e| { e.block_number = block.header.number; - swap(&mut e.digest, &mut block.header.digest); + mem::swap(&mut e.digest, &mut block.header.digest); e.next_log_index = 0; }); diff --git a/wasm-runtime/polkadot/src/support/environment.rs b/wasm-runtime/polkadot/src/support/environment.rs index c01a1f4e92823..7d6acb62a8204 100644 --- a/wasm-runtime/polkadot/src/support/environment.rs +++ b/wasm-runtime/polkadot/src/support/environment.rs @@ -16,7 +16,10 @@ //! Environment API: Allows certain information to be accessed throughout the runtime. -use runtime_support::{Rc, RefCell, transmute, Box}; +use runtime_support::mem; +use runtime_support::cell::RefCell; +use runtime_support::rc::Rc; + use primitives::{BlockNumber, Digest}; #[derive(Default)] @@ -48,7 +51,7 @@ fn env() -> Rc> { let singleton: Rc> = Rc::new(RefCell::new(Default::default())); // Put it in the heap so it can outlive this call - SINGLETON = transmute(Box::new(singleton)); + SINGLETON = mem::transmute(Box::new(singleton)); } // Now we give out a copy of the data that is safe to use concurrently. @@ -69,7 +72,7 @@ fn env() -> Rc> { let singleton: Rc> = Rc::new(RefCell::new(Default::default())); // Put it in the heap so it can outlive this call - *s.borrow_mut() = transmute(Box::new(singleton)); + *s.borrow_mut() = mem::transmute(Box::new(singleton)); } // Now we give out a copy of the data that is safe to use concurrently. diff --git a/wasm-runtime/polkadot/src/support/primitives.rs b/wasm-runtime/polkadot/src/support/primitives.rs index 3ab385d488933..76859375f84b0 100644 --- a/wasm-runtime/polkadot/src/support/primitives.rs +++ b/wasm-runtime/polkadot/src/support/primitives.rs @@ -16,12 +16,12 @@ //! Primitive types. -use runtime_support::Vec; +use runtime_support::vec::Vec; use streamreader::StreamReader; use joiner::Joiner; use slicable::{Slicable, NonTrivialSlicable}; use function::Function; -use runtime_support::{size_of, blake2_256, twox_128, twox_256, ed25519_verify}; +use runtime_support::{mem, blake2_256, twox_128, twox_256, ed25519_verify}; #[cfg(test)] use std::fmt; @@ -90,7 +90,7 @@ impl Slicable for Header { } fn size_of(data: &[u8]) -> Option { - let first_part = size_of::() + size_of::() + size_of::() + size_of::(); + let first_part = mem::size_of::() + mem::size_of::() + mem::size_of::() + mem::size_of::(); let second_part = >>::size_of(&data[first_part..])?; Some(first_part + second_part) } @@ -135,7 +135,7 @@ impl Slicable for Transaction { } fn size_of(data: &[u8]) -> Option { - let first_part = size_of::() + size_of::() + size_of::(); + let first_part = mem::size_of::() + mem::size_of::() + mem::size_of::(); let second_part = >::size_of(&data[first_part..])?; Some(first_part + second_part) } @@ -211,7 +211,7 @@ impl Slicable for UncheckedTransaction { } fn size_of(data: &[u8]) -> Option { - let first_part = size_of::<[u8; 64]>(); + let first_part = mem::size_of::<[u8; 64]>(); let second_part = ::size_of(&data[first_part..])?; Some(first_part + second_part) } diff --git a/wasm-runtime/polkadot/src/support/storable.rs b/wasm-runtime/polkadot/src/support/storable.rs index 3caf3ed19bfae..90807168e183f 100644 --- a/wasm-runtime/polkadot/src/support/storable.rs +++ b/wasm-runtime/polkadot/src/support/storable.rs @@ -19,7 +19,8 @@ use slicable::Slicable; use endiansensitive::EndianSensitive; use keyedvec::KeyedVec; -use runtime_support::{self, twox_128, Vec}; +use runtime_support::vec::Vec; +use runtime_support::{self, twox_128}; /// Trait for a value which may be stored in the storage DB. pub trait Storable { diff --git a/wasm-runtime/support/src/lib.rs b/wasm-runtime/support/src/lib.rs index b65b574351554..4c34a9f668342 100644 --- a/wasm-runtime/support/src/lib.rs +++ b/wasm-runtime/support/src/lib.rs @@ -4,14 +4,14 @@ #![cfg_attr(feature = "strict", deny(warnings))] #![feature(alloc)] -//#[macro_use] extern crate alloc; -pub use alloc::vec::Vec; -pub use alloc::boxed::Box; + +pub use alloc::vec; +pub use alloc::boxed; pub use alloc::rc::Rc; -pub use core::mem::{transmute, size_of, uninitialized, swap}; +pub use core::mem; pub use core::slice; -pub use core::cell::{RefCell, Ref, RefMut}; +pub use core::cell; extern crate pwasm_libc; extern crate pwasm_alloc; @@ -109,7 +109,7 @@ pub trait Printable { impl<'a> Printable for &'a [u8] { fn print(self) { unsafe { - ext_print(&self[0] as *const u8, self.len() as u32); + ext_print(self.as_ptr(), self.len() as u32); } } } From aae8428e32db6e19c0f0aae3ee2fcbb1a73796e9 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 23 Jan 2018 17:05:35 +0100 Subject: [PATCH 2/4] update the WASM runtime imports --- .../polkadot/src/support/environment.rs | 1 + wasm-runtime/support/src/lib.rs | 18 +++++++++++++----- .../release/runtime_polkadot.compact.wasm | Bin 37802 -> 38326 bytes .../release/runtime_polkadot.wasm | Bin 37859 -> 38383 bytes .../release/runtime_test.compact.wasm | Bin 1460 -> 2197 bytes .../release/runtime_test.wasm | Bin 1576 -> 2284 bytes 6 files changed, 14 insertions(+), 5 deletions(-) diff --git a/wasm-runtime/polkadot/src/support/environment.rs b/wasm-runtime/polkadot/src/support/environment.rs index 7d6acb62a8204..901c5407fbe96 100644 --- a/wasm-runtime/polkadot/src/support/environment.rs +++ b/wasm-runtime/polkadot/src/support/environment.rs @@ -16,6 +16,7 @@ //! Environment API: Allows certain information to be accessed throughout the runtime. +use runtime_support::boxed::Box; use runtime_support::mem; use runtime_support::cell::RefCell; use runtime_support::rc::Rc; diff --git a/wasm-runtime/support/src/lib.rs b/wasm-runtime/support/src/lib.rs index 4c34a9f668342..90c59a6e747c5 100644 --- a/wasm-runtime/support/src/lib.rs +++ b/wasm-runtime/support/src/lib.rs @@ -8,11 +8,19 @@ extern crate alloc; pub use alloc::vec; pub use alloc::boxed; -pub use alloc::rc::Rc; +pub use alloc::rc; pub use core::mem; pub use core::slice; pub use core::cell; +/// Common re-exports that are useful to have in scope. +pub mod prelude { + pub use alloc::vec::Vec; + pub use alloc::boxed::Box; +} + +use alloc::vec::Vec; + extern crate pwasm_libc; extern crate pwasm_alloc; @@ -68,7 +76,7 @@ pub fn chain_id() -> u64 { /// Conduct a 256-bit Blake2 hash. pub fn blake2_256(data: &[u8]) -> [u8; 32] { unsafe { - let mut result: [u8; 32] = uninitialized(); + let mut result: [u8; 32] = Default::default(); // guaranteed to write into result. ext_blake2_256(&data[0], data.len() as u32, &mut result[0]); result @@ -78,7 +86,7 @@ pub fn blake2_256(data: &[u8]) -> [u8; 32] { /// 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(); + let mut result: [u8; 32] = Default::default(); // guaranteed to write into result. ext_twox_256(&data[0], data.len() as u32, &mut result[0]); result @@ -88,7 +96,7 @@ pub fn twox_256(data: &[u8]) -> [u8; 32] { /// 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(); + let mut result: [u8; 16] = Default::default(); // guaranteed to write into result. ext_twox_128(&data[0], data.len() as u32, &mut result[0]); result @@ -132,7 +140,7 @@ macro_rules! impl_stubs { #[no_mangle] pub fn $name(input_data: *mut u8, input_len: usize) -> u64 { let input = unsafe { - $crate::Vec::from_raw_parts(input_data, input_len, input_len) + $crate::vec::Vec::from_raw_parts(input_data, input_len, input_len) }; let output = super::$name(input); diff --git a/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm index ddd9dc70e64e3b02e101f88ad65bd0a5af897e86..c1051d34148a0d14ec41b246f1ad6cc2050a2af1 100644 GIT binary patch literal 38326 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 l%ICi)EdL}0AhR)4Uko=-o_{d)t diff --git a/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm b/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.wasm index 8d3d3fb1ee5ffba092f881fdbe5e5c3780f7d23b..231fa8af919d697e396eb2936091062c14ec7071 100644 GIT binary patch literal 38383 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 diff --git a/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index 5c717847a5a2dfb1d4b0e0db128b5a2cb9c57aaf..b1357890d880bd747b4901d98964714637744b95 100644 GIT binary patch literal 2197 zcmds2TW?!M5T3o9i@kQeX)P351apoeWFrKQiJdgz;zf<<3o6gNIBtCse3ICa z>~S`qOcxNbLxbgWig+C-W^IkNix;z(!_Dqapm?hatW7mhT0+WyT8lHFcmmdvUqmH7 zEly|iO9^Z9i*ri0IGRj{7tG*+y8TT_bLLauj{k4k(7}IEC7(OrU1!^2&RQ)O<{d+i?{e%K`1tx!kAh zwIfEF$V%qm!|++u$m0$N(HTYbu~7G9N+%;I8=(K_YkY7xK2Gwi}A0X_}T39uQU8{o45TLF3j`T@2B>;!li zU^l>CfX@Sb5#Y-JU-{0`4ok}!{Q;$0FLOHAHtcNslVX)Eb1H2cI=8B{%<071(DEu? z;WizRrtK)&5`w2KQQipD0qRV+D;hPSFnmAAi0{|G5p214gJSA5MBU45_&d(aHhJ3+c1 z;5~+2ct5}gzOfaxu1!gUB@ZCghV@)?YbqAQinW%tNHdRB)RXqQCn-Q*Zjga`lI%Qw zT0R^-EVZO+$qi~r0;HByJ=vl`$StXPY;a3z>gCmzRIcMYQv0#->zmULZ>9!KCdvT# zMq07I3k_l=Zl@X1X@+TLsUwKhIsx4_?HVQd(M;>fb)N4n*$ku2W|Elri$?rthX4Ou z!<8#zzE5e48~q(v09P{!eV}o6oPlc^v-<6IXrjsV>|z0~Ws>VJvg;UiIGcgnGV1B* RM{ql)ayXez&VMMz*}v-}TY>-p literal 1460 zcmd^9y>in)5Z?RIUrvcHAq8}2S5Cp;c=87fGd^b0Q`5)_mV@M2%Gk! zM%&$kdPnzEy~)7$=iAHbS>_lpf#rA7w~R=#`wH^%tPf`vAh zR*za@564Zbv}28R3>c2pfU*F*K3qCd!fcngt zv)Jz~j9M;DLQUgZlWD-=CuH_<)~Xq_wgC3|+@Z4;uco5>1BairMD6ew4&!ct+2=jv zQ4sgC#qXq0#xZ;WF&J|(hZx3txFjaPED}H@?Bj1T)G~4bbY`3d@UvPJr`>15wYRXG ziW~V)sqp`!RD5Baq5~FM4|fC9o0>H_>N3<7bTshH9MY+vf(v@0_D;SSr1&Pw?0^@)n!JF8QoK4zr zfo~8`frJp(yaPhwJ$latufRDoN$eo;0!@_t=KRd@cYgLbFgP0t01%tieKniSU|-X7 zCT9DB&aClAddM3i>;teUevto&n##u)ck)+d|M|(_IN#`Rbh-enyvxe`V58Gnf7HLo zr^CZb5Nt@;a5&9#kSxB#;!$4q2PY?!7lSfC=%1C7>EI{_#r7q(kGv7|T#=7noL&YG z<2~}xXmWAuPCh!z%ivOFm(%HRTtdV#8Z49b=A$aCt+BRzIeFDz-`EaW%vB+=dM#E; zX$cAcXe~~GA_`cJe-*XLC?8FxmlBqz=Vw%r{Af7tpO0S-#|PkzOt~JDm#2D%{h4B; za+ROezAnqPGN=0ogL2Rxj^SRziwgyA*1g74WnOPB$V~nIJ#YU{_1~@vSo*nMOF;E% zV8AQ^0t%Einjb6kV{9tqV08d#{uH7zlfC&bg40DyLZ<1I_>($D`K%78P!?H&+KDoY zF~RuR!!$y@R~HC$Bds7wPwEmYXbeFK{j7=Q6hznw? zuH|CO?15sqwo|CBN(E}BF0Z^dNzKKpx@}jriR{rGoyk4QUOQr>iL7J}J`6{zk;h#Q zqEm|KW1;TIgeoH_8=$}FEBp!N??0xI?4jaV(n{kvh%Go~~-Ady%ggpF50W$2u zYLGq%(uV;)V%UL?1AG#o9bi4cMu1NPYzF8A=myvdupQu0fSmxl0X_@xd4MkheCg*+ zJ1i_`^am7frO2qRYp}iLE5#~XWYpRAZh9oHdgS{} z-3vW>4R2JF%$wh&zlD?w3!#0SDSpiqz4~AocA*)h`$2jT;9Z6tcrU>Fey|mdu3aJx z7QBGe8mwfRM^mvFPOP=8McR3+qM5YUGf4rua+M4;lVs=h)AHfyVQC~)ORmyL5+IGF z>c|!?LLN!YYlBBp(=0EJq;hRPk=n0~Uv6(dyxAJGnJ5F`H`0o|9cU0MG2doHrx~`H zrHLR`D+KhmY1b&ok9Jx|uJC?u$!1t>HkHK0zi7mdcKHAAHC%XQ%(n@xaihNh3*c%d zrtf{69H-!##w>ncJ2cU7e0pAjYnk}^9|qSp>Togvw`tV#!S~>{P4#d%9-e)dAEf^R D@eXk) literal 1576 zcmd^9&2rN)5MD`+<3uh|e_-IIIR^D9+deadD0JdA{irH)iT@SxAHtRB!32`ER z_`(PzvkzSW{*#5mrWX(FRURFm^@g?`wfFV`2;3mh_S<`VJI|vFJBbI^z{n7gVKA{4 zIH^xaJ+*n%J3Grxdb#aK(>$B>PAv$sSIItdM(~z^9i5D?3lHf$>}Zr-+>5cJsm%+Q z3b~9YahgMkIBKM$b&<*^G$b^?%&wxH_F?fCOQ`s|>LzvrX9`$>9FN#wLYffFM&)S+pTqdG@u%c7u+NQJrQ9QLiIY-)Kdm5+Fd3qVA zeORZQREUi-3a$W~1ksOg`FB-&=(%b?sxYYjD9dk*@tFYwP3{>rY>0haw~SPQ(Waz9 zGgUE7Q&xc%2KISqT1KE4CQ8(~7EK=3*~p#!n19g^d?L ziigTGrd~P)Q-?Svnk%jWU#7SLOra9oi)LS6-{A8LKGr0F{KQ#lvEN%5HhgkIPVF0= zD8S`AB<69_C=isk0S@@wpppi6u1J5+5F`yz7=ndC``e%ocn5JL#Jz0uJ1V3pX}(Y~ z7;7*g{Z*Yb_jv9aPH>x(2%r{eJpDNe`dIhdv_&o5ikl46i$ WV0NWA?!5Kyzy2GM3oUE_ From 0562e5221d94c9f3e35c81173ea4a90924bd55f3 Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 23 Jan 2018 17:21:20 +0100 Subject: [PATCH 3/4] clean up some unsafety in `Slicable` --- primitives/src/hashing.rs | 12 ++++++------ wasm-runtime/polkadot/src/codec/slicable.rs | 11 ++++++----- wasm-runtime/polkadot/src/support/primitives.rs | 10 +++++----- wasm-runtime/polkadot/src/support/storable.rs | 2 +- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/primitives/src/hashing.rs b/primitives/src/hashing.rs index f82ec7ef8bf78..e1a4f84a99675 100644 --- a/primitives/src/hashing.rs +++ b/primitives/src/hashing.rs @@ -20,37 +20,37 @@ use blake2_rfc; use twox_hash; /// Do a Blake2 512-bit hash and place result in `dest`. -pub fn blake2_512_into(data: &[u8], dest: &mut[u8; 64]) { +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() }; + let mut r = [0; 64]; 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]) { +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() }; + let mut r = [0; 32]; 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]) { +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() }; + let mut r = [0; 16]; blake2_128_into(data, &mut r); r } diff --git a/wasm-runtime/polkadot/src/codec/slicable.rs b/wasm-runtime/polkadot/src/codec/slicable.rs index a013abb9980e0..2dfc2db49fd61 100644 --- a/wasm-runtime/polkadot/src/codec/slicable.rs +++ b/wasm-runtime/polkadot/src/codec/slicable.rs @@ -34,7 +34,7 @@ pub trait Slicable: Sized { fn to_vec(&self) -> Vec { self.as_slice_then(|s| s.to_vec()) } - fn set_as_slice bool>(set_slice: F) -> Option; + fn set_as_slice bool>(set_slice: F) -> Option; fn as_slice_then R>(&self, f: F) -> R { f(&self.to_vec()) } @@ -44,10 +44,11 @@ pub trait Slicable: Sized { /// Trait to mark that a type is not trivially (essentially "in place") serialisable. pub trait NonTrivialSlicable: Slicable {} -impl Slicable for T { - fn set_as_slice bool>(fill_slice: F) -> Option { +// note: the copy bound and static lifetimes are necessary for safety of `set_as_slice`. +impl Slicable for T { + fn set_as_slice bool>(fill_slice: F) -> Option { let size = mem::size_of::(); - let mut result: T = unsafe { mem::uninitialized() }; + let mut result: T = unsafe { mem::zeroed() }; let result_slice = unsafe { let ptr = &mut result as *mut _ as *mut u8; slice::from_raw_parts_mut(ptr, size) @@ -77,7 +78,7 @@ impl Slicable for Vec { fn from_slice(value: &[u8]) -> Option { Some(value[4..].to_vec()) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } fn to_vec(&self) -> Vec { diff --git a/wasm-runtime/polkadot/src/support/primitives.rs b/wasm-runtime/polkadot/src/support/primitives.rs index 76859375f84b0..ea94c03190519 100644 --- a/wasm-runtime/polkadot/src/support/primitives.rs +++ b/wasm-runtime/polkadot/src/support/primitives.rs @@ -76,7 +76,7 @@ impl Slicable for Header { }) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } @@ -122,7 +122,7 @@ impl Slicable for Transaction { }) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } @@ -200,7 +200,7 @@ impl Slicable for UncheckedTransaction { }) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } @@ -237,7 +237,7 @@ impl Slicable for Block { }) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } @@ -271,7 +271,7 @@ impl Slicable for Vec { Some(r) } - fn set_as_slice bool>(_fill_slice: F) -> Option { + fn set_as_slice bool>(_fill_slice: F) -> Option { unimplemented!(); } diff --git a/wasm-runtime/polkadot/src/support/storable.rs b/wasm-runtime/polkadot/src/support/storable.rs index 90807168e183f..835e70ff3d51f 100644 --- a/wasm-runtime/polkadot/src/support/storable.rs +++ b/wasm-runtime/polkadot/src/support/storable.rs @@ -37,7 +37,7 @@ pub trait Storable { /// Remove `key` from storage. pub fn kill(key: &[u8]) { runtime_support::set_storage(&twox_128(key)[..], b""); } -impl Storable for T { +impl Storable for T { fn lookup(key: &[u8]) -> Option { Slicable::set_as_slice(|out| runtime_support::read_storage(&twox_128(key)[..], out) == out.len()) } From 9386640c5f62f3528111b5edbddaf47e0caedf8b Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Tue, 23 Jan 2018 17:43:35 +0100 Subject: [PATCH 4/4] fix grumbles --- .../polkadot/src/codec/endiansensitive.rs | 20 ++++++++++++++++++- wasm-runtime/polkadot/src/codec/joiner.rs | 2 +- wasm-runtime/polkadot/src/codec/keyedvec.rs | 2 +- wasm-runtime/polkadot/src/codec/slicable.rs | 5 ++--- .../polkadot/src/runtime/consensus.rs | 2 +- wasm-runtime/polkadot/src/runtime/session.rs | 2 +- wasm-runtime/polkadot/src/runtime/staking.rs | 2 +- wasm-runtime/polkadot/src/runtime/system.rs | 2 +- .../polkadot/src/support/primitives.rs | 2 +- wasm-runtime/polkadot/src/support/storable.rs | 4 ++-- 10 files changed, 30 insertions(+), 13 deletions(-) diff --git a/wasm-runtime/polkadot/src/codec/endiansensitive.rs b/wasm-runtime/polkadot/src/codec/endiansensitive.rs index a1576284228e9..c4978d5ce4721 100644 --- a/wasm-runtime/polkadot/src/codec/endiansensitive.rs +++ b/wasm-runtime/polkadot/src/codec/endiansensitive.rs @@ -17,7 +17,8 @@ //! Endian manager. /// Trait to allow conversion to a know endian representation when sensitive. -pub trait EndianSensitive: Sized { +// note: the copy bound and static lifetimes are necessary for safety of `Slicable` blanket implementation. +pub trait EndianSensitive: Copy + 'static { fn to_le(self) -> Self { self } fn to_be(self) -> Self { self } fn from_le(self) -> Self { self } @@ -48,3 +49,20 @@ impl_endians!(u16, u32, u64, usize, i16, i32, i64, isize); impl_non_endians!(u8, i8, [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 tests { + use super::EndianSensitive; + + #[test] + fn endian_sensitive_is_copy() { + fn _takes_copy() { } + fn _takes_endian_sensitive() { _takes_copy::() } + } + + #[test] + fn endian_sensitive_outlives_static() { + fn _takes_static() { } + fn _takes_endian_sensitive() { _takes_static::() } + } +} diff --git a/wasm-runtime/polkadot/src/codec/joiner.rs b/wasm-runtime/polkadot/src/codec/joiner.rs index db38cacbd95cc..7fdb1e16456c6 100644 --- a/wasm-runtime/polkadot/src/codec/joiner.rs +++ b/wasm-runtime/polkadot/src/codec/joiner.rs @@ -16,7 +16,7 @@ //! Vec serialiser. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use slicable::Slicable; /// Trait to allow itself to be serialised into a `Vec` diff --git a/wasm-runtime/polkadot/src/codec/keyedvec.rs b/wasm-runtime/polkadot/src/codec/keyedvec.rs index b1f903643c1d7..210606ab7c923 100644 --- a/wasm-runtime/polkadot/src/codec/keyedvec.rs +++ b/wasm-runtime/polkadot/src/codec/keyedvec.rs @@ -16,7 +16,7 @@ //! Serialiser and prepender. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use slicable::Slicable; /// Trait to allow itselg to be serialised and prepended by a given slice. diff --git a/wasm-runtime/polkadot/src/codec/slicable.rs b/wasm-runtime/polkadot/src/codec/slicable.rs index 2dfc2db49fd61..40f8a532b7131 100644 --- a/wasm-runtime/polkadot/src/codec/slicable.rs +++ b/wasm-runtime/polkadot/src/codec/slicable.rs @@ -16,7 +16,7 @@ //! Serialisation. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use runtime_support::{mem, slice}; use joiner::Joiner; use endiansensitive::EndianSensitive; @@ -44,8 +44,7 @@ pub trait Slicable: Sized { /// Trait to mark that a type is not trivially (essentially "in place") serialisable. pub trait NonTrivialSlicable: Slicable {} -// note: the copy bound and static lifetimes are necessary for safety of `set_as_slice`. -impl Slicable for T { +impl Slicable for T { fn set_as_slice bool>(fill_slice: F) -> Option { let size = mem::size_of::(); let mut result: T = unsafe { mem::zeroed() }; diff --git a/wasm-runtime/polkadot/src/runtime/consensus.rs b/wasm-runtime/polkadot/src/runtime/consensus.rs index 1b897a86cab08..689fdca21e682 100644 --- a/wasm-runtime/polkadot/src/runtime/consensus.rs +++ b/wasm-runtime/polkadot/src/runtime/consensus.rs @@ -16,7 +16,7 @@ //! Conensus module for runtime; manages the authority set ready for the native code. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use storable::StorageVec; use primitives::SessionKey; diff --git a/wasm-runtime/polkadot/src/runtime/session.rs b/wasm-runtime/polkadot/src/runtime/session.rs index 34c67c9811c75..6914bdc655883 100644 --- a/wasm-runtime/polkadot/src/runtime/session.rs +++ b/wasm-runtime/polkadot/src/runtime/session.rs @@ -17,7 +17,7 @@ //! Session manager: is told the validators and allows them to manage their session keys for the //! consensus module. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use keyedvec::KeyedVec; use storable::{kill, Storable, StorageVec}; use primitives::{AccountID, SessionKey, BlockNumber}; diff --git a/wasm-runtime/polkadot/src/runtime/staking.rs b/wasm-runtime/polkadot/src/runtime/staking.rs index 5f39ec14b2612..9b0c659f5c9ab 100644 --- a/wasm-runtime/polkadot/src/runtime/staking.rs +++ b/wasm-runtime/polkadot/src/runtime/staking.rs @@ -16,7 +16,7 @@ //! Staking manager: Handles balances and periodically determines the best set of validators. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use keyedvec::KeyedVec; use storable::{Storable, StorageVec}; use primitives::{BlockNumber, AccountID}; diff --git a/wasm-runtime/polkadot/src/runtime/system.rs b/wasm-runtime/polkadot/src/runtime/system.rs index f6243ff4f7c15..072e17df010c9 100644 --- a/wasm-runtime/polkadot/src/runtime/system.rs +++ b/wasm-runtime/polkadot/src/runtime/system.rs @@ -19,7 +19,7 @@ use primitives::{Block, BlockNumber, Hash, UncheckedTransaction, TxOrder, Hashable}; use runtime_support::mem; -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use storable::Storable; use keyedvec::KeyedVec; use environment::with_env; diff --git a/wasm-runtime/polkadot/src/support/primitives.rs b/wasm-runtime/polkadot/src/support/primitives.rs index ea94c03190519..338be8071050e 100644 --- a/wasm-runtime/polkadot/src/support/primitives.rs +++ b/wasm-runtime/polkadot/src/support/primitives.rs @@ -16,7 +16,7 @@ //! Primitive types. -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use streamreader::StreamReader; use joiner::Joiner; use slicable::{Slicable, NonTrivialSlicable}; diff --git a/wasm-runtime/polkadot/src/support/storable.rs b/wasm-runtime/polkadot/src/support/storable.rs index 835e70ff3d51f..9a871a638be5c 100644 --- a/wasm-runtime/polkadot/src/support/storable.rs +++ b/wasm-runtime/polkadot/src/support/storable.rs @@ -19,7 +19,7 @@ use slicable::Slicable; use endiansensitive::EndianSensitive; use keyedvec::KeyedVec; -use runtime_support::vec::Vec; +use runtime_support::prelude::*; use runtime_support::{self, twox_128}; /// Trait for a value which may be stored in the storage DB. @@ -37,7 +37,7 @@ pub trait Storable { /// Remove `key` from storage. pub fn kill(key: &[u8]) { runtime_support::set_storage(&twox_128(key)[..], b""); } -impl Storable for T { +impl Storable for T { fn lookup(key: &[u8]) -> Option { Slicable::set_as_slice(|out| runtime_support::read_storage(&twox_128(key)[..], out) == out.len()) }