From 9004fb3f9784e932c578c0c57c3d66e9709cc0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 25 Jun 2019 21:08:56 +0200 Subject: [PATCH] Make `polkadot-parachain` call `validate_block` instead of `validate` (#297) * Make `polkadot-parachain` call `validate_block` instead of `validate` Also switch to rust 2018 in the crate * Use `rstd` * Make `load_params` a pointer --- polkadot/Cargo.lock | 3 +- polkadot/parachain/Cargo.toml | 11 ++++--- polkadot/parachain/src/lib.rs | 30 +++--------------- polkadot/parachain/src/wasm_api.rs | 16 ++++------ polkadot/parachain/src/wasm_executor.rs | 19 ++++++----- polkadot/parachain/tests/adder.rs | 16 ++++------ polkadot/parachain/tests/res/adder.wasm | Bin 29340 -> 19426 bytes polkadot/runtime/wasm/Cargo.lock | 3 +- .../test-parachains/adder/wasm/Cargo.toml | 7 ++-- .../test-parachains/adder/wasm/src/lib.rs | 16 ++++------ polkadot/test-parachains/build.sh | 8 ++++- 11 files changed, 55 insertions(+), 74 deletions(-) diff --git a/polkadot/Cargo.lock b/polkadot/Cargo.lock index 600901d4ba..6c7d330107 100644 --- a/polkadot/Cargo.lock +++ b/polkadot/Cargo.lock @@ -2358,9 +2358,8 @@ version = "0.1.0" dependencies = [ "derive_more 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 3.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parity-codec-derive 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 2.0.0 (git+https://github.com/paritytech/substrate?branch=polkadot-master)", "tiny-keccak 1.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasmi 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index b849ba6724..3155e2b11a 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -3,14 +3,15 @@ name = "polkadot-parachain" version = "0.1.0" authors = ["Parity Technologies "] description = "Types and utilities for creating and working with parachains" +edition = "2018" [dependencies] -parity-codec = { version = "3.5", default-features = false } -parity-codec-derive = { version = "3.3", default-features = false } +codec = { package = "parity-codec", version = "3.5", default-features = false, features = [ "derive" ] } wasmi = { version = "0.4.3", optional = true } derive_more = { version = "0.14", optional = true } -serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } +serde = { version = "1.0", default-features = false, features = [ "derive" ] } + +rstd = { package = "sr-std", git = "https://github.com/paritytech/substrate", branch = "polkadot-master", default-features = false } [dev-dependencies] tiny-keccak = "1.4" @@ -18,4 +19,4 @@ tiny-keccak = "1.4" [features] default = ["std"] wasm-api = [] -std = ["parity-codec/std", "wasmi", "derive_more", "serde_derive", "serde/std"] +std = [ "codec/std", "wasmi", "derive_more", "serde/std", "rstd/std" ] diff --git a/polkadot/parachain/src/lib.rs b/polkadot/parachain/src/lib.rs index e42862c1d1..2662d5d309 100644 --- a/polkadot/parachain/src/lib.rs +++ b/polkadot/parachain/src/lib.rs @@ -43,29 +43,7 @@ #![cfg_attr(not(feature = "std"), no_std)] /// Re-export of parity-codec. -pub extern crate parity_codec as codec; - -#[macro_use] -extern crate parity_codec_derive; - -#[cfg(not(feature = "std"))] -extern crate alloc; - -#[cfg(feature = "std")] -extern crate core; - -#[cfg(feature = "std")] -extern crate wasmi; - -#[cfg(feature = "std")] -extern crate serde; - -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - -#[cfg(not(feature = "std"))] -use alloc::vec::Vec; +pub use codec; #[cfg(feature = "std")] pub mod wasm_executor; @@ -75,6 +53,8 @@ pub mod wasm_api; use codec::{Encode, Decode}; +use rstd::vec::Vec; + struct TrailingZeroInput<'a>(&'a [u8]); impl<'a> codec::Input for TrailingZeroInput<'a> { fn read(&mut self, into: &mut [u8]) -> usize { @@ -112,7 +92,7 @@ pub struct ValidationResult { /// Unique identifier of a parachain. #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Default, Clone, Copy, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize, Debug))] pub struct Id(u32); impl codec::CompactAs for Id { @@ -207,7 +187,7 @@ pub enum ParachainDispatchOrigin { Parachain, } -impl core::convert::TryFrom for ParachainDispatchOrigin { +impl rstd::convert::TryFrom for ParachainDispatchOrigin { type Error = (); fn try_from(x: u8) -> core::result::Result { const SIGNED: u8 = ParachainDispatchOrigin::Signed as u8; diff --git a/polkadot/parachain/src/wasm_api.rs b/polkadot/parachain/src/wasm_api.rs index ad7c14ecec..dec6b60b3d 100644 --- a/polkadot/parachain/src/wasm_api.rs +++ b/polkadot/parachain/src/wasm_api.rs @@ -17,9 +17,7 @@ //! Utilities for writing parachain WASM. use codec::{Encode, Decode}; -use super::{ - ValidationParams, ValidationResult, MessageRef, UpwardMessageRef, ParachainDispatchOrigin -}; +use super::{ValidationParams, ValidationResult, MessageRef, UpwardMessageRef}; mod ll { extern "C" { @@ -32,8 +30,8 @@ mod ll { /// /// Offset and length must have been provided by the validation /// function's entry point. -pub unsafe fn load_params(offset: usize, len: usize) -> ValidationParams { - let mut slice = ::core::slice::from_raw_parts(offset as *const u8, len); +pub unsafe fn load_params(params: *const u8, len: usize) -> ValidationParams { + let mut slice = rstd::slice::from_raw_parts(params, len); ValidationParams::decode(&mut slice).expect("Invalid input data") } @@ -53,7 +51,7 @@ pub fn write_result(result: ValidationResult) -> usize { let end_ptr = &encoded[len] as *const u8 as usize; // leak so it doesn't get zeroed. - ::core::mem::forget(encoded); + rstd::mem::forget(encoded); end_ptr } @@ -67,8 +65,8 @@ pub fn post_message(message: MessageRef) { /// Post a message to this parachain's relay chain. pub fn post_upward_message(message: UpwardMessageRef) { - let data_ptr = message.as_ptr(); - let data_len = message.len(); + let data_ptr = message.data.as_ptr(); + let data_len = message.data.len(); - unsafe { ll::ext_post_upward_message(message.origin as u8 as u32, data_ptr, data_len as u32) } + unsafe { ll::ext_post_upward_message(u32::from(message.origin as u8), data_ptr, data_len as u32) } } diff --git a/polkadot/parachain/src/wasm_executor.rs b/polkadot/parachain/src/wasm_executor.rs index 0e1277ba9b..cbdccabf8b 100644 --- a/polkadot/parachain/src/wasm_executor.rs +++ b/polkadot/parachain/src/wasm_executor.rs @@ -21,7 +21,7 @@ //! a WASM VM for re-execution of a parachain candidate. use std::{cell::RefCell, fmt, convert::TryInto}; -use codec::{Decode, Encode}; +use crate::codec::{Decode, Encode}; use wasmi::{ self, Module, ModuleInstance, Trap, MemoryInstance, MemoryDescriptor, MemoryRef, ModuleImportResolver, RuntimeValue, Externals, Error as WasmError, ValueType, @@ -306,16 +306,15 @@ pub fn validate_candidate( }; let output = module.invoke_export( - "validate", + "validate_block", &[RuntimeValue::I32(offset as i32), RuntimeValue::I32(len as i32)], &mut externals, - ) - .map_err(|e| -> Error { - e.as_host_error() - .and_then(|he| he.downcast_ref::()) - .map(|ee| Error::Externalities(ee.clone())) - .unwrap_or_else(move || e.into()) - })?; + ).map_err(|e| -> Error { + e.as_host_error() + .and_then(|he| he.downcast_ref::()) + .map(|ee| Error::Externalities(ee.clone())) + .unwrap_or_else(move || e.into()) + })?; match output { Some(RuntimeValue::I32(len_offset)) => { @@ -344,6 +343,6 @@ pub fn validate_candidate( .map_err(Into::into) }) } - _ => return Err(Error::BadReturn), + _ => Err(Error::BadReturn), } } diff --git a/polkadot/parachain/tests/adder.rs b/polkadot/parachain/tests/adder.rs index ac6005ffb3..6ef3510a88 100644 --- a/polkadot/parachain/tests/adder.rs +++ b/polkadot/parachain/tests/adder.rs @@ -16,14 +16,12 @@ //! Basic parachain that adds a number as part of its state. -#[macro_use] -extern crate parity_codec_derive; -extern crate parity_codec as codec; -extern crate polkadot_parachain as parachain; -extern crate tiny_keccak; +use polkadot_parachain as parachain; -use parachain::{MessageRef, UpwardMessageRef, IncomingMessage, ValidationParams}; -use parachain::wasm_executor::{Externalities, ExternalitiesError}; +use crate::parachain::{ + MessageRef, UpwardMessageRef, IncomingMessage, ValidationParams, + wasm_executor::{Externalities, ExternalitiesError}, +}; use codec::{Decode, Encode}; /// Head data for this parachain. @@ -65,11 +63,11 @@ impl Externalities for DummyExt { const TEST_CODE: &[u8] = include_bytes!("res/adder.wasm"); fn hash_state(state: u64) -> [u8; 32] { - ::tiny_keccak::keccak256(state.encode().as_slice()) + tiny_keccak::keccak256(state.encode().as_slice()) } fn hash_head(head: &HeadData) -> [u8; 32] { - ::tiny_keccak::keccak256(head.encode().as_slice()) + tiny_keccak::keccak256(head.encode().as_slice()) } #[test] diff --git a/polkadot/parachain/tests/res/adder.wasm b/polkadot/parachain/tests/res/adder.wasm index 0e1aee6a82d899f28618eb76ab6fe2d093764a0a..687dc0d7573a599705c98709692057f8b045c0c1 100644 GIT binary patch literal 19426 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 U06v_Ub2M2vJTrUv=*;y01ml>Jj{pDw literal 29340 zcmeI5e~et$b>H8Q+1=ThUG9*gY)Yh}HzQhFS|T~Wf2?U)Z}r1sWLd7^xGqw6IXg2; za+lmCcbAmpAL2Uk8e;6UDv-7U;vz<2!2Tmag&+<5hfy$q(Wk^x~BZ;Vaf@Qtwp@=KOH5esl8b z;OfTa%Yk<|eCFve?8*85?Qz1h8Tna6<_OwamW z?B}OG6xBPe)6Lvp{jUFXhUxS6;}3EZO#e!FD|p4f^^h086|9wllU@`=UgQ@_ltFxS zbw2P)VKewsU(fTwOexb0e$2z7*9u?vgD3Qdjz9KS`T4rP8fOa+$Jvk00_PMR3a5$_ z$%|vFB~PPxV;u{tC4c-myP7;X(0hPJ0F4Z2{A#coA6t#QQ(*#24TaUn-_wv?Els8f zt(KYkMtI>hE=jr*Tmq2pV42P)Q zKsloJv;%80Z4e!=2CeW}CzWh7_!{DofV>h9ke3LExd4@N!imNoie`GzE9QPm*R*ph zyv7XEt?&}i{?c2GGErE#Pg5Q%PMQuxPFbEt_FOd<_kn^=E>7@_y0V^Tx~PK^4uEz8KC_PI-yi zsNGl%EmZcj!)n(*J8Wle@1<5K)i)Kip%NEe#x>EVa$?-m9torq`>_2xCKDV{or@++iIMZE@Yz=Qno0juINu82psMx7Pq!!?JAaJCa)o;x3m5&rGplZ6 zoL&XF!jt#Yh+uvKm5aWkRwJZpKhOXN@dvE9Y~h2$XTU&09E~--L6dv7&R{bS)MkJT z1@OlJH-Nk?JXFj}?(;#W#9RY7h4)Sq9w*Wrw^tW8J6pS~?a@ z86;kq{v;}cVratn#0d7J#%{+Mrsc(3!77F@KbJS-93L;Vy?p$e*y;FwtNws$q3q?) z`++QH!3<{spawR(T9_$?g+r15f|f$$M_%D*5&NI#!7CJsR00@Qn58IaCO<##n+*n1 zc+xA-QSWEyeUGcoQmAYGwm+ORqn?`6{fRO*rZmCKfo4uBeuM>PtsX4}PtOK3VV-Bu zDjY5*4`HED3TFL$?9n3J^ct-FD17d?bb|hcd-4wcEQR45@9^{<;5LqI)HTOGAD& ze(Ac(^T$hJ9NsKt;s>vnCT^B|W`_$RC%&~6``4q)s(NhWx?r)?-bbRPDb=#rQu(xJ zShv)h!HhLT7<&(qBDyKS{KvOH|HABpHYsCYx?V)zk|i?0$jE`xM4Tzk#4ibmy(r6l56E56kD!syrgwhMMo{|v) zeF2)Cgw9_#2M;NQQr=c;G!;!Am%OBl$3Y=qL`=>V`v+d8@67EJsbA@QEDllsF#UVq(QvqG9wK|Pyroo=Z_5T+Bs z>!G-&@hr3#4C3qIsvIAn;@8qDeUhQn5GL#y$rCqa@NDIU@xR<*@n++~%_p>KZ#^^n zJ_Z-I#jp1{1iuk7VrSCF8Y#= zGXqkn5{Trbl{{n#fxMZcQb%EK%1IS^U@3!9Tf88~!YQFBaecBP$MGhmCBoDkD;`lX zBkh;5q0SVE#fiW>8y%UQo|#G2KRd4eBh8lpSPh_nM;nTQxQe|*!enRIP(LvOPRlZ4 z{NO6mfeA>-SLv0G#6Dg}DxEQlnFXg}#&kYDijkedV3a1+Gk-iaOV|S1iPG}N6<)x= zd@&QiMr2NJTj0#i%ua1(axo=9DTt%+GvgHE$n50Iw5UB2WuOmU6*GCMt60H0msvn~ zu3&RS0O5&UuZOVRs3ne&OA#&KMN8cZ%A?7W*>@3C9}ZOZufQdRWg z-=<&A@$TpStr9*t&gcS+TXXX*7^N?&#AS%zwh^m zBfYr2zw`I4`Hr{0`yW|5aqm7v{>0jUaG?K>to?@v`v0l5zjdJhpIbY@?LPQ_ZS6lf z(ErP*zo+fXzW!gc_8l$rJ#739Yk!sYy^Q?2wZC?t|2M6j@OxkX-?sK|9O(ah*8c4S z{l9DNZyf0VJ!}8Yf&SmO_B#jq|Bw={1&e?)lkJV1f1g zET%J>e2&5#PA1B&x@8Y5N)}Ma!^|nF#NoVT9#2afpI8Ed(8s}uW~^;?EfLJPLnI>I z&m$Qv{6PYrsAkG-juPVzhR?}dO*x;Ex&n0WIV?;ZOr1Xc@)V zynEZl%hYfH7KzCL_|EX-wRj=JpEbiTe^<=P@Z)@Mmc)KySoLu+tR{Onn!IZa>ucvD z$z;un`$cFb29OoUOUZn*=Wzu{Y7!I$dO|Woh|*r30DzyWih`o_kK>*>6<9$Z;p~Ak z6C#mPei&Ls?WFpVdA=Z+ViCoYKVVbpo8pU=2H4qh0Ps)#>LBoK!lo9wu zuLy?GnxbT%Msk`?&def(gwBNOQ2y=M0jfbMK?N^_?uIFI#44#W;+aBO#U07pOZ^&% zL70M=?}pTKt8B;!UBsd!e2Fs8KzkarK9xkn1d zxy6tHda7g8q%Ab95o#2}R3K@IV6<*Dk7hSy@yv!u#&JnncRlt$I*WE|QO%i72Kaw7 z8U#YxSPN0if}A=cV)vyDL3W1i%FwxL1)@xvN{a9NNSK-?U?}>u$jny1#cS_804XKW zQr- ztR{f%pU71-4~0Q&2|aELl1?ztgB(m8kTjnZfK}c!wamf$dHLi-VOCL11B;g zlZL6Clj5KV(HwfJbqExCv6r*GTOzfg5K?^t4>rt+%|Z#sY!(5V__W_|>E zCSTbtXKTmo*3`(5gtA*x&iZQSm)b4UW#{OGEmnm@05;#*Eg+_LOPi2=b_=1&ADZ3D zqFCCKz(ZDH#B{P-C`=X~VzeePH~VGTEwFVlx9n0vIcO#5usG2SjE3t&k@kswvs-b1 zaaU^Mz5R*&Llb_O2|Q_hWQHM{1hgb2)#dsou-&6v1VmgsB5ETL?x8w*?N%85D$uQ6flSF$xP;Rv$LXMhGgMA z>Vo$sVe76!s%^8aP?lrSmuHA=kBaD!eo0HqEWk6fTHzur zS(O$St>H@3ovgM^2wtnvN5S)ZRwFH1jr3;5G=d;tajTK_ao8*&Kb?0-%^|Lo5xjM_ z5FZbUlf@|(z7HSLjiyC;$<|T)!0dr)x^*a0RLa9|bgtK-C#Q>@myH6pF=frWAP2lmaLTR87+qs4|EJ zBX)>wjtjD;$$HZ3Xf7_CPuz=%O5Bu>IXtqg$c|p*RDfkRmRQv##8?-5gGGj!OFWFt zNV{0TIG0E`#5PBB2pQfxXKAsNvED;lFuqdge$DSAqTY}g+8WrAPUx*kc4U-gSn7%iT#9_%MC!v7>GB1^70m}dov^je`39lSe zMMB_GsS0`0Kai@WEGa1O;X=u|lmd?=$76?wVYL;?J8 z-aN_4I)$6c|Ld%uyM8%M!ziIlRQcfq3GCqdET&trXO3~~-7@ECpja!;L^(5X zlXQ3CC}*&cA*8}*2wB4@kc;DhM;bVztz=$X-b}m`oVRclh1pDMYw?$Mvgc=Kq!Qr9 zv6WV|4umwne|<9!5*0!Pft;+%>1bMJ*s)Wal%R0L65z_p3S(d?F?&}qq!2Yzm<~7R zWWllXOQ7$~I0LKnevtmmm&P8qKi zrV%{8D+*vdKFcD!fNnZPB+w!#EfldDG-*3&5qvI<;KL}l$L%oJ$nC%~CX?IAncK<9 z?M%z<7~P?BJ4P6@ncD%Lb2|Xyq*2%!#Vj}t!tEF}ydatt8OB=o&XH~hm7Y{Yf&BEy z-4MB>@|K&JV8KX3_NZ}wuar~i9_WX<2S9RW0yin`hesow=WXE#?zE^7H~+t8{K;F= zNwyGoGYP55#8~^+A(zB9w!wEc3e{OH2BTq#O~8^9Op39YB&139z@-VmxfO56f0NOK zl!gSiGoB97@On(hOjs`Nv5>fd!F?OS#zX6bO6VpUY~1(Qjbby8p$!x>nq{~<&!kf* zpRI!>8H^N|s2Sf=Zap)mc+rFl zqmT`&-Ua_oF{e_+oNxz6j&NQ! znWf={JQQ0}4blceRDmS6P2|XXCGYlZE&Xwg6ne&f5JCYk?#4Mh00!Gnq)nC0r%XPF z^QZ&x6~~f$NzD8NwV|0OJCsU<1(Vfzgyai={h~$4iP_PagmoNZjWY#vdE?NH01xgdq#lTd{-YI6rak^7Bi$Ar;qq8y9Jt8XsL-OGG;|0f%n+u5C|D#o2}2Yy zurQfW#U(G`ijo(hg~{Pqm~4@VjuSwWFd20wT1;+Qu%;uXx4_l;c$>q>C!QXL$;JUO z0)A+2?C-lEm;bFfe+rkQ;1Y&%eMM|gFjVqMV40l3MYcwPk@QNQ8aKvk-|^2n!9D^| z5GVMPO1o?py@z%OsT=USI~z-rjhqcQvzo>E5(>tQiA55QE?lDK?1}j6Oa+BZ1@jx0 zO7J8uP1fyzzk#4}f5WX*#p+{L!ES@;vMN*@vG^K=~f}Rx~9CYV#2%saZ)i=WigGskY$dY8c>xA zn-`LvBwk1Yb(;;`VWJImCD={nq_{vqyS$WhL3a_jMfK)_P;sxvVx z7f~Jh_?!;zs1t*`rK;Ri0+54$4MmyY2}r7!T`}@#diz29@f-=UJ4j9Y(HuKiW|ZF? z5h{0Sgi;w2s@iZdu#)6ADYO_y`TYHhVM2!t#ysU(MvH+-$FliJ=!Nd+P6y*dB8$U%xH z$su~@KFy%*ai9LseOk(Ccu55VE``DB!fUxtcR5As;@qd*vy(t@pXlGvefqf1@M0-5 z=02&*eP*2dWc``H^5s4;kur+tp4;bxptk!%_sJG0aPCu9!G);WL!|CA9JdY-i={T3 zpmPd`x6W2^1aA2ZlS>?kVGrCj8(pSx$EGN=)-qdXLqnca4qJGWmnX+WG~t{luv6zL zD>2Iar-A>_d1m-TV9a+jv79FoRzBS3vE6o-g_q`-(D5NR>^zvu{)U$jGPQCT!W+G? zJRZ`z6UMhJ0A}g3?!_56GFthVp1ZI7v2|~EWHAHUK6~+$Rw4-S?&*e-zMzVeG~om|e79qoQhcF3Lkzez zOVmT6%!+)vo6ns48eAnkYM}svlo``*)MY@FP?->TRDo8sO_wb>i$Mv7otPjQW$#fD zOZ-50NM?>iiByK*2T)0#4YZJgvJ^?qutW+eApj>MzfxGW1fK0)AUH)xbJ-@GK3oe; zcH#ticiD+&Y$uLia+~pg!Y4Vpy~}qj+{M1*t(7LYQXO)8o}~PQoJl#F&~5g4xG>oY z+ceIjC0t^%TkNplG3@XJ0L6~^QdUK|a35sYMRFn%yG3s5V%-AWmeM7WMV~C6HBH4) z;VGrPnK(-$m)!Mjh0R}Z^8+`UhRvBTe8G^h34xSiF*AmRazkKI;0ue~qW=ZEfN98( zPBUcCCTP*A3lWchimw_xG>rRN(F6$SD;r(^LJsZ|274Ll*?sC@&u~HU=x}gbT;U@B z@N)#QGie)sj=*K=v@QJ{VbLqv4LLpzA=J?rE~@|UYpX%K4i@wU&eWmG6 zh1V1_p9-H<*nBFCP*sZW_y~;hHC+X!yrg@8r@|-TCWR7c6mRH$1LdnexlzgsxqWFFl^TlH- zyyAWFomYzY69ycL=60jm-DqYv%I}trFZ#EmW6^!P(ffC!_w7da?v_sMmL7=i*)9G8 zIy@cacBAZWG_@N|?v@^mPS9OFijjh+-6-6Rg5Aj9EfodlIPjwB-Nn}JQYm^+E%!u6 zccUY_(c#^wuv?lIh`HUx$8VP&TD-OUtI-3rE(W(tCwJjzDJn+O27eAr7Ej$S6@Kd{s_cE4&_rdlkT0C?ck=g4UuMGxt%4^pLBv@{hS1R}Z6ttL{*J#8tU~869y|EXqBuhJ8HhYTQeVPP*!=RA*e3+nG_( zRk0+8Tn+0q=W1M9j83@fYgCWBDpxn7hh0^+#!QG=u3XYcS8TV3IeVSzgRaWO&M0(M zS)+`rMyt^S)bhU)`q^79>`{#Nre6xW$6W=JKquU?Y=6!d#xJ7BHayd}K4S6a; zkJ2>f5d`7t9tFi|O9ya_qC>%ejRc2Lc+NGlcL7&sEcY2rvMGt6&{}4#3Q=bEnPvoc>@c)ke9@qLJB&JW1 zJa~jxx4?T1aS$%pVGN=oWK6K+rilhmjt!nQs#<##h!59g6t0C?o&fhA<$aH0l`Oqv-c zhxwm;_YK$^C?B78p&;T|VNnUX1@8xn)?X#~|2`E4`-S(@z(rmA33V2o5Hx=yEP3(2 zb-Uepz9%SZp!#v=nOPH6{B~%%XhEiyg^nrrb&Gd=>toHZ-Mxm&!ZGRu%_p__djm~? zWVm-0y|^>}G~pE<^YXhQD|muFwzW`3ig*|$HiTiDCA73@57`5i#7DweE}i(X_iWP3 zQYGk;^?~$h#mnw~1HsS~dw7CUpX#GtUUR}9+YV?>ORMGcZ-)~BQQ|az?Mpi(Y#%#g zJOTItA#?DLWe6-X*Csvu9dzNutKU-QelhcvZ;@=c^)a#{I!s_yXF!B2YixGd^4Xr< z^4kQt5-+UENMC2|=Hv`3BFA}N;W!BM*M@^UoePS;irgUK%8yn!u~ih>>eV}NB>|z$ zFIPi!6wH$1vm`W$6-IlZI18__657pj9?T!UD=FoE2ZT$979+6FM2Eh`B}bSmdu2vK zaWXgI;OnGWI__|!)M$yYQ<#oswZGEQGuGB>u-0ziaIs7a*N$%{q8ZTTL=$=HhlAxLl`5)yJ7LFae4u^zrY6CZRLO zl}v#t9eu&+;F~Up7FhfHA^S78wBK3q`vfle+WuKGHRUVhln~dRha7j|VO>+xh49$j zlfb*EO-CtigwAseZAYjQMQSifJGIk{_H`?zPR5wgmm*55%vUfYTBQvef&lu2X5`9* zf@M_RwUL}dha4O5FJhFNQD~s94vnEICMuU8;?(K^=9B`t3+$e93Bjp=n_XJo+DS-o zo-#|ezqWlxQkzLG$D4rD{Jj&rotOp53K)rdFRI4e{WvDb=6~!585S*)bD!DLj?T>N zU950N32Y?&aGa6qL&;2G9w&({DSRMdGEZW1#w}Yr*2A{KV9;TM%=V1&5#vY8mqi78 zZ29{5E-~Et7{h^ph%kmDhL8FikM&BzrkmqO!kx_T;69?SM3Z0E%{ezkz5;(yhN6cg z{KDe`E<68(vQd;DNgHAunO@ZM|J`>k<1IG5<}xHDeU-#Ca0rrIM%B20_sqm^c}5If zl-O<3N3|JhPf-#}Az){=GTNE)U~dHbQ{6dk1NJ27~Cgf{y{>ht}{c zHM&1Wd)Nw&^7J)p*U73)(+t{H<#QtK&((TI)p@JVQ;TR~s=s7hq3Y%TSwd<#@ys&t z(CO4tN2M&iUw|BP5*C87TD1>0oh2?*53~^WIyFY2t;ua+try1Cn%qv;ngmq?-G-Q^ zkPWse!;imm$BU2XWAN|!L%ZVRweeb<9CM;Y(8?ZEW-L&lqo2ZR;UopI19+4D6)HZP z_s{}xgr(lB7~RJsAyzm6eb$C`h9lB7h9M)Yfq0YQ4u?@p7E(8GfW~XZQ6cTA!*$k$ zN7GW@)?yUmkA4UZusf9J{@sMV?gMl)Kz{rYrOZKyCgAC}dISY7iEjJn{o7b?$0Rw~vh4)lbvT^|VX zt7z}dB8!~^O^f>t@`wB!C}bAAoB_@OcvG+qXcV0FbA?CZzkZv;vEg9sJt(u{jtqquF=E}yoPb-jT9E$xmT-HBu+#1=p4ED{T80I;x75#8B{_?9yXb!K& zY);^K_DKu|z$}*HM+U`#!%;wt5LghYSA3#O3zNI}DGJtX(YR5T;?pH723qK!p(^u_rOuM0>>M>2 zIWh070Saxo@|(RiX#k&J4HB&&~)ot7AN%#$e|Tt;^IGnKW43D{H3GHCW<4N zGG#d7X)BDZJz5o2|F>NH=2zbv7k`g_n(r4O%tD7G+V@3@)-q8Hb#o7>zlkVv@=1t7 zHEwx5M1sb-H#X(KmYWC@U#i=m~uED|X&jL^ojfpwCBYixlZ;-2DcOzr?vb& zo+p$T*Y5x*&Nzq;0^r{AZKEXs$S47z-z`GoW4d@qmp&9?PwIC*IGZvHv_tu5Hp*M8 z?0zo(iGevJFhO)ksE5&^1X@mKK>{)(Al&Wa-K5}8T37{wT!a*Y0!X(b+qjXRc-J?h z+$I?A?0nCAM!(6yh7kDbrfPOg`5JNp+Gkiy!@4&UpzlD?RMr8E#fTpEWCjV3Imn4J z%xIi&Kt1E0WzqQ^M6i%f`ksr;s6;fi3d`dso|V)v)0!9EI1U_{Y$~)XW)y5BCCQ>2 zP(x=V$SzGBxWn(w*zupy?cdNbW|ZM^!qCuYdJUwL@5^wFV<1)i*}y94v!*l;zu-d~ z{4z!zd+?0?z7aeBF&7sA*?mw%=y8y381!k|a!QSCV;TE5m2pzRSF^X^mHYt&Yd^s5 zLtNLT=tO;)Rf#e?LyB?=M3l8+M{(F!2*Qp<2%Vr`Z^x#Im9qlO-N_8|a%~OZA@;&T{_E4+2FLp8=*X;Xd=m3u zo`JA8N`DKQ`4ITJ;I&~dU((xdN#Q^DsjT-R-y9R_=vW5Yu(oiVEx!T)zOz)3-1I2( zo(;i#st{5M84!2EBckyX^210r(GvN^X$}*0H8)~wPbd30Mj@ZHo`smDD^@1tV5^A2 zf_qW6q0D|6Zac=I=D3^F9$}K)ioWIqk^&Sxm_p*Fz&jYjZ3;2bs|3Sbq~ux1g!tI% z>Xgw|pF1kHXe}aZW&@ZWr*=}KWhzJo@GM>-93ou1u*y6BXEbV;fGY8Qg~k&#a`Bd$ zrrIWdm5hSB=_qZ4+3VzG`@Zw*cj!r!KtSteW@nm+&7yeA3LPLW`4v;|M4Z{|pAT{F zorak}K;v=rjly$~aKPHMLDoHI(k;A0cAkE28=+gxuE*Z0T_b2lb4Vk1=0WQH%3 zB=nXhTgEIonQG;viQGukU@VoJC0x)!BFZ?0@G;!7=C%~T)O5+gV)LQ7#*8=GjrGpQ z-6zPz z$B!hJ552|L{?Pjro{R>#8^+UUC&4{@L^k$zhnxqUUisp;_-^Y*-a4Pt`P=co`6`s2 z^}G*x>~G^&_=Sl`?ML2~wf!$M5(yS$@$EnO_1kjP4)nLRIn&G&ZU%eaivv)AGZ9b!;s^#OG{Bg^l43R8f)RBIZ1Qb;s6b7V z*f>tHSdAaykfU%8^j!ua%A~(NEsabQ8%n65Yhk|0MT=TaPv2RF5~4F=vY}~{Mdxxj z7<}tcXuy>KeODZx|HDa6VT>YuH5Wf>;g#u+zEkGzsE#H{e38HvU3N6ZSqn-^gnAl9 zw6T-?_AQH1WG&E7ML(9aBQH&;;)jZUe4NU7^us!n8yZDFtbvdNK7NasRNWWkclsj? zP!0vtX_Um7m_9M$x1e2TmD({GGq`Yv@00LE$4mSq+|id+M0dKyr$BC6NmmvUQV9zm zo}CeF4lr=1d!j}K48u-I@Nkz-!kmE|$doC{ZiAh|RwTmlo#BPDzz`hxJD`Td3^lQn zs{9vPqfko)%l2jwGkD8p8wFj+MnPBN%jsA0UC?F5FDK*T0;nYDk}YM3**5|yLw-o* z6mN*X`1l5&ned~ed{YupOzFEEugHEy!7No&(S^F2csk0zz%PGuAanNKMPM^o5O-9W zQthJ(>F=iscP^>|^hmTjnh=)|Gn(XhMuDWMkKL5pOW3;-gU-AwF@%!A-G~WA49PM@ zlz#q~u(nQV!8F-bFbb>Wg3X~yiT}gxpS{#JV))wjDN0=kvKd*eo&sOC-5fqe*W-zs z`G4fQB-f7bQV+oLiXr^<;1+g%HGW%X;qe^5ST8PbVwL__2jX$={BebN2+w)G3>W_i z!hO+Qx2O^uhrq78s@{ z8@;tizt}l_Gk9sxyP;nL9j$aPU%9b4*xKx!y>fZ^%;r|ZD|qYzyk{tLlpo{oEPvDg z&R*KMIyk$1>GH;vE0+hGgR^IP-OY;|XEz5IFK=yczI;}oE?(ZgbYuBUZ{zCe%AnV4 zRy&>ka%a$MS8HdtFR#CRdX3iZ+Ud%f`kAVYaFa8MpG@>CJFfC;uH5nT$Mbf+>Ymll zYF|p)r(OHbuhB{Wz3K{&_8nEB#Y)DzQjN6T-f?A^ltEIu!rRFum1O)*I^RyxFU2G4 z;O=y{wg#I+)(-j$QGaXu%$33V{Hf^NhaOwAx)Ups=xbRrcHLAW4eS!qnX<&Yl za)$CYWk}f{Y$5foaizQ7kG3{$Z1x7x)|Jb>!B%vsdvg%=FR!eiO=vKzy10F5>zj1I}LE=%c4^@%|X^pUyfusM>#LH*aih_s;g4)poBsXx6K}=1O~|-B_vC z`~610wNmf&2kp*sr?I@!Y!8+10Q^E&@SX+Ymk>Pvd*_pNc6t5Ujcr>@m)Exko9o>x z(O`3PV{;(_c_`>dH`X@?-QFere)Xug(I5O@OPZy9dHdzlg4H`+J5xSWwk2cFaKiIG z2d==yc1V;I#a=Bb7SIf0> zz1%1_%dK*|+^Li+l}fcztJEuvO0&|cv@4xzxmu}KtF>yq+Nd_Gt!lg4sg-M$TD4ZI z)oYDfv(~D$Yn^(zUa42>wR*kYs5k4adb{3flpB>swNY!-8;wS@(Q33Coo2aNX;z!H zX1&>HHk++xyV+@#Ta{L|RcqB-jaIYOYPDOPcDY??SKGCAz1?Ux+pTuH-RXd0hv_?j z?l7!F(@^J3Xe(E@lhx{ZuT450Jd0eUtLgKnc$UB6=FhL+;Sf~z;{X5m|2hZ$?19XB z_v*m^Zx1}}9hOC2S|&bNUt+bh@cgVbZERc}{UZ}0|MtY@#U-;2&nMw96OQuj0HwsoZGSde!A}vt6$AI_>4T#nHe~Z3IHbe4__FFu!+Y z(A@;aGWKJ+)2i0%y>`7(?G#$0k)zrOM#}a}$)4~$fE8Rh})jQlCbsyD60~2{N zWv`99Z&fPz^m28jJ2>+AsQ;)o8ri?Rb!}s7u++PBV||VBjc%>k?_vAeol3pmYTVNp zjT+TP<5xBZi1^ZAx!i6w8nu;v7gO3^KH3>|9@R#}_}5>I*&5nju2-tvX0_3)H@cnH zy~S=HZCO}wk-0%{SE}W1zlZ(q)#`)Z`yNr`yyPP1g#}llU6*R*@^Yh(vF=tIt$t_a z{b%-ce9l7cg@x|&*2d;C{c#qZLA~7S4%(RWa{rixq)Sd|(Ce=oht}ERRow_USc5TpVtTgYh?CF}q9v`yY=qy*8%}S@X((LzZ zgX7O8>o5se78X9)eeu(S-nmab7NhL;l7Ezjf6``Q;q#yGUD?=T|MJBzGI_n+t+WR# zjg?lfi69#%TJH*pUC&_irUUfsda{MiMYBEZF3aYi+woY{??8 zg@vSeYM_cOZdHKSVFh)T>)k=W-e|YVwO{z>{Jc!ud7&)bC<7PyYg<+TFi1c;QL{X<417OuAsPWLWg># z-F@&k-y44C*V)lsUcdPKU~8*;5la8&=kq=H*JgHK@0%jYfxM(kegv__>GQ70L73 zBEf46bRYDZ&Bk)C4T#!Gr_x=iKC*RJ?3^w+!Sy!Q*_yzhXOPrSA*RxN{Bc_aH>jZz zj9}7Ax7}~lyY*hb)oS(|o%x^dq;N2ql-g+0-b%OM!St>4D)^K7sh{tp&3Za1wc(`o zl}@wQ>6fMbl}fMt!Gp%@M*E%R{lblHCoR)VsbsU?95e@w<(h1HyZmS^v4u%-i5>iv zfs3`4+}3yD5)QQ1sWqDAcB9-Hw7QSg_nY2y)47yxI+<#@%))2TKqm6iI($9k{d zV4dJzQu{de>M7!*E8Umfs&Wc0qkE}FSXO5H*j(vXswha~p|L@!{PPtXRi^X?1N$(Ap`#tzuZ3KaB+zO1ya}S-@8KtNWu}B)K{u26Dk-#A}J>7_@lv;thqs zpROz{Y+c%Tap}g^Wea`!y=tXCDEE*|yVY$~7tW4RJmMfgmTolbnx@ys5HIUzf6(c5 zKJ?VNu@UJ!qy^HAg3X^Wd`MicGN|GFI$+%If$zD-7?8bUM%%Xs7dN$Gxy07L+vv1v zgKA^Y0qqYz`Cf)OmvoIi%H@{?1WRA3uJo6&)wOQB{CNBBK>BjQOJt8w=1T*OB*EM5 zxADb;0j{vy|H!+Jym9T?a3pz(PP2h#;|^Ea<>nK=I5wxTdE7e~%RZ)wpCuioq|N0q zC9N#O_)eRExV~InY4_rv4(peM%H3d39MTxrbknq24BpnrP#Wq(4u)!qjxXKKwe Z< ! { #[alloc_error_handler] #[no_mangle] -pub fn oom(_: ::core::alloc::Layout) -> ! { +pub fn oom(_: core::alloc::Layout) -> ! { unsafe { intrinsics::abort(); } } #[no_mangle] -pub extern fn validate(offset: usize, len: usize) -> usize { - let params = unsafe { ::parachain::wasm_api::load_params(offset, len) }; +pub extern fn validate_block(params: *const u8, len: usize) -> usize { + let params = unsafe { parachain::wasm_api::load_params(params, len) }; let parent_head = HeadData::decode(&mut ¶ms.parent_head[..]) .expect("invalid parent head format."); let block_data = BlockData::decode(&mut ¶ms.block_data[..]) .expect("invalid block data format."); - let parent_hash = ::tiny_keccak::keccak256(¶ms.parent_head[..]); + let parent_hash = tiny_keccak::keccak256(¶ms.parent_head[..]); // we also add based on incoming data from messages. ignoring unknown message // kinds. - let from_messages = ::adder::process_messages( + let from_messages = adder::process_messages( params.ingress.iter().map(|incoming| &incoming.data[..]) ); - match ::adder::execute(parent_hash, parent_head, &block_data, from_messages) { + match adder::execute(parent_hash, parent_head, &block_data, from_messages) { Ok(new_head) => parachain::wasm_api::write_result( ValidationResult { head_data: new_head.encode() } ), diff --git a/polkadot/test-parachains/build.sh b/polkadot/test-parachains/build.sh index 307b3e6748..f5961e7180 100755 --- a/polkadot/test-parachains/build.sh +++ b/polkadot/test-parachains/build.sh @@ -4,10 +4,16 @@ set -e # Make LLD produce a binary that imports memory from the outside environment. export RUSTFLAGS="-C link-arg=--import-memory -C link-arg=--export-table -C panic=abort" +if cargo --version | grep -q "nightly"; then + CARGO_CMD="cargo" +else + CARGO_CMD="cargo +nightly" +fi + for i in adder do cd $i/wasm - cargo +nightly build --target=wasm32-unknown-unknown --release --no-default-features --target-dir target "$@" + $CARGO_CMD build --target=wasm32-unknown-unknown --release --no-default-features --target-dir target "$@" wasm-gc target/wasm32-unknown-unknown/release/$i'_'wasm.wasm target/wasm32-unknown-unknown/release/$i.wasm cp target/wasm32-unknown-unknown/release/$i.wasm ../../../parachain/tests/res/ rm -rf target