From 2e6300cad70333e0c705ff9d014ad796e23e0de8 Mon Sep 17 00:00:00 2001 From: Gav <gavin@parity.io> Date: Mon, 15 Jan 2018 00:01:25 +0100 Subject: [PATCH] Add marshaller for xfer function --- substrate/wasm-runtime/polkadot/src/lib.rs | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/substrate/wasm-runtime/polkadot/src/lib.rs b/substrate/wasm-runtime/polkadot/src/lib.rs index b54eac0cdf0..639cdcdbc48 100644 --- a/substrate/wasm-runtime/polkadot/src/lib.rs +++ b/substrate/wasm-runtime/polkadot/src/lib.rs @@ -22,6 +22,7 @@ pub type TxOrder = u64; pub enum Function { StakingStake, StakingUnstake, + StakingTransferStake, ConsensusSetSessionKey, } @@ -35,6 +36,11 @@ impl Function { Function::StakingUnstake => { staking::unstake(transactor); } + Function::StakingTransferStake => { + let dest = FromSlice::from_slice(¶ms[0..size_of::<AccountID>()]).unwrap(); + let value = FromSlice::from_slice(¶ms[size_of::<AccountID>()..size_of::<AccountID>() + 4]).unwrap(); + staking::transfer_stake(transactor, &dest, value); + } Function::ConsensusSetSessionKey => { let mut session = AccountID::default(); session.copy_from_slice(¶ms[0..size_of::<AccountID>()]); @@ -140,8 +146,8 @@ macro_rules! impl_non_endians { )* } } -impl_endians!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); -impl_non_endians!([u8; 20], [u8; 32]); +impl_endians!(u16, u32, u64, usize, i16, i32, i64, isize); +impl_non_endians!(u8, i8, [u8; 20], [u8; 32]); trait Storage { fn storage_into(key: &[u8]) -> Self; @@ -150,7 +156,9 @@ trait Storage { impl<T: Default + EndianSensitive> Storage for T { fn storage_into(key: &[u8]) -> Self { - runtime_support::storage_into(key).map(EndianSensitive::from_le).unwrap_or_else(Default::default) + runtime_support::storage_into(key) + .map(EndianSensitive::from_le) + .unwrap_or_else(Default::default) } fn store(self, key: &[u8]) { @@ -167,6 +175,26 @@ fn storage_into<T: Storage>(key: &[u8]) -> T { T::storage_into(key) } +trait FromSlice: Sized { + fn from_slice(value: &[u8]) -> Option<Self>; +} + +impl<T: EndianSensitive> FromSlice for T { + fn from_slice(value: &[u8]) -> Option<Self> { + let size = size_of::<T>(); + if value.len() == size { + unsafe { + let mut result: T = std::mem::uninitialized(); + std::slice::from_raw_parts_mut(transmute::<*mut T, *mut u8>(&mut result), size) + .copy_from_slice(&value); + Some(result.from_le()) + } + } else { + None + } + } +} + trait KeyedVec { fn to_keyed_vec(&self, prepend_key: &[u8]) -> Vec<u8>; } @@ -196,7 +224,7 @@ macro_rules! impl_endians { )* } } -impl_endians!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize); +impl_endians!(u16, u32, u64, usize, i16, i32, i64, isize); // TODO: include RLP implementation // TODO: add keccak256 (or some better hashing scheme) & ECDSA-recover (or some better sig scheme) -- GitLab