Switch to parachain::ValidationParams

This commit is contained in:
Bastian Köcher
2019-06-21 13:17:37 +02:00
parent b59952178a
commit a36527e360
6 changed files with 145 additions and 1374 deletions
+10 -6
View File
@@ -28,7 +28,9 @@ use rstd::{slice, ptr, cmp, vec::Vec, boxed::Box, mem};
use hash_db::HashDB;
static mut STORAGE: Option<Box<Storage>> = None;
use parachain::ValidationParams;
static mut STORAGE: Option<Box<dyn Storage>> = None;
/// The message to use as expect message while accessing the `STORAGE`.
const STORAGE_SET_EXPECT: &str =
"`STORAGE` needs to be set before calling this function.";
@@ -53,18 +55,20 @@ trait Storage {
}
/// Validate a given parachain block on a validator.
#[cfg(not(feature = "std"))]
#[doc(hidden)]
pub fn validate_block<B: BlockT, E: ExecuteBlock<B>>(
mut arguments: &[u8],
params: ValidationParams,
) {
use codec::Decode;
let (parent_hash, block_data): (B::Hash, crate::ParachainBlockData::<B>) = Decode::decode(&mut arguments)
.expect("Could not decode parachain block.");
let block_data = crate::ParachainBlockData::<B>::decode(&mut &params.block_data[..])
.expect("Invalid parachain block data");
let parent_head = B::Header::decode(&mut &params.parent_head[..]).expect("Invalid parent head");
// TODO: Add `PolkadotInherent`.
let block = B::new(block_data.header, block_data.extrinsics);
assert!(parent_hash == *block.header().parent_hash(), "Invalid parent hash");
assert!(parent_head.hash() == *block.header().parent_hash(), "Invalid parent hash");
let storage = WitnessStorage::<B>::new(
block_data.witness_data,
+8 -4
View File
@@ -22,6 +22,10 @@ mod tests;
#[doc(hidden)]
pub mod implementation;
#[cfg(not(feature = "std"))]
#[doc(hidden)]
pub use parachain;
/// Register the `validate_block` function that is used by parachains to validate blocks on a validator.
///
/// Does *nothing* when `std` feature is enabled.
@@ -58,16 +62,16 @@ macro_rules! register_validate_block_impl {
#[no_mangle]
unsafe fn validate_block(
arguments: *const u8,
arguments_len: u64,
arguments_len: usize,
) {
let arguments = $crate::slice::from_raw_parts(
let params = $crate::validate_block::parachain::wasm_api::load_params(
arguments,
arguments_len as usize,
arguments_len,
);
$crate::validate_block::implementation::validate_block::<
$block, $block_executor
>(arguments);
>(params);
}
}
};
+21 -22
View File
@@ -19,16 +19,17 @@ use crate::{ParachainBlockData, WitnessData};
use rio::TestExternalities;
use keyring::AccountKeyring;
use runtime_primitives::{generic::BlockId, traits::{Block as BlockT, Header as HeaderT}};
use executor::{WasmExecutor, error::Result, wasmi::RuntimeValue::{I64, I32}};
use executor::{WasmExecutor, error::Result, wasmi::RuntimeValue::I32};
use test_client::{
TestClientBuilder, TestClientBuilderExt, DefaultTestClientBuilderExt, Client, LongestChain,
runtime::{Block, Transfer, Hash, WASM_BINARY}
runtime::{Block, Transfer, Hash, WASM_BINARY, Header}
};
use consensus_common::SelectChain;
use parachain::ValidationParams;
use codec::Encode;
fn call_validate_block(parent_hash: Hash, block_data: ParachainBlockData<Block>) -> Result<()> {
fn call_validate_block(parent_head: Header, block_data: ParachainBlockData<Block>) -> Result<()> {
let mut ext = TestExternalities::default();
WasmExecutor::new().call_with_custom_signature(
&mut ext,
@@ -36,13 +37,17 @@ fn call_validate_block(parent_hash: Hash, block_data: ParachainBlockData<Block>)
&WASM_BINARY,
"validate_block",
|alloc| {
let arguments = (parent_hash, block_data).encode();
let arguments_offset = alloc(&arguments)?;
let params = ValidationParams {
block_data: block_data.encode(),
parent_head: parent_head.encode(),
ingress: Vec::new(),
}.encode();
let params_offset = alloc(&params)?;
Ok(
vec![
I32(arguments_offset as i32),
I64(arguments.len() as i64),
I32(params_offset as i32),
I32(params.len() as i32),
]
)
},
@@ -111,10 +116,8 @@ fn build_block_with_proof(
#[test]
fn validate_block_with_no_extrinsics() {
let (client, longest_chain) = create_test_client();
let witness_data_storage_root = *longest_chain
.best_chain()
.expect("Best block exists")
.state_root();
let parent_head = longest_chain.best_chain().expect("Best block exists");
let witness_data_storage_root = *parent_head.state_root();
let (block, witness_data) = build_block_with_proof(&client, Vec::new());
let (header, extrinsics) = block.deconstruct();
@@ -124,16 +127,14 @@ fn validate_block_with_no_extrinsics() {
witness_data,
witness_data_storage_root
);
call_validate_block(client.info().chain.genesis_hash, block_data).expect("Calls `validate_block`");
call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
}
#[test]
fn validate_block_with_extrinsics() {
let (client, longest_chain) = create_test_client();
let witness_data_storage_root = *longest_chain
.best_chain()
.expect("Best block exists")
.state_root();
let parent_head = longest_chain.best_chain().expect("Best block exists");
let witness_data_storage_root = *parent_head.state_root();
let (block, witness_data) = build_block_with_proof(&client, create_extrinsics());
let (header, extrinsics) = block.deconstruct();
@@ -143,17 +144,15 @@ fn validate_block_with_extrinsics() {
witness_data,
witness_data_storage_root
);
call_validate_block(client.info().chain.genesis_hash, block_data).expect("Calls `validate_block`");
call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
}
#[test]
#[should_panic]
fn validate_block_invalid_parent_hash() {
let (client, longest_chain) = create_test_client();
let witness_data_storage_root = *longest_chain
.best_chain()
.expect("Best block exists")
.state_root();
let parent_head = longest_chain.best_chain().expect("Best block exists");
let witness_data_storage_root = *parent_head.state_root();
let (block, witness_data) = build_block_with_proof(&client, Vec::new());
let (mut header, extrinsics) = block.deconstruct();
header.set_parent_hash(Hash::from_low_u64_be(1));
@@ -164,5 +163,5 @@ fn validate_block_invalid_parent_hash() {
witness_data,
witness_data_storage_root
);
call_validate_block(client.info().chain.genesis_hash, block_data).expect("Calls `validate_block`");
call_validate_block(parent_head, block_data).expect("Calls `validate_block`");
}