Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Testing CI test failure #971

Closed
wants to merge 34 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
58941e2
upgrade primitives to allow changing validation function
rphmeier Mar 15, 2020
753ea08
set up storage schema for old parachains code
rphmeier Mar 15, 2020
ddfa72f
fix compilation errors
rphmeier Mar 16, 2020
d66a544
fix test compilation
rphmeier Mar 16, 2020
ba6b392
add some tests for past code meta
rphmeier Mar 16, 2020
d87c034
most of the runtime logic for code upgrades
rphmeier Mar 16, 2020
fd07208
implement old-code pruning
rphmeier Mar 18, 2020
dcd2a22
add a couple tests
rphmeier Mar 19, 2020
f26c6d5
clean up remaining TODOs
rphmeier Mar 19, 2020
85adf9f
add a whole bunch of tests for runtime functionality
rphmeier Mar 20, 2020
a7cc5a8
remove unused function
rphmeier Mar 20, 2020
847bbbb
fix runtime compilation
rphmeier Mar 20, 2020
b265719
extract some primitives to parachain crate
rphmeier Mar 20, 2020
7008912
add validation-code upgrades to validation params and result
rphmeier Mar 20, 2020
b331fd1
extend validation params with code upgrade fields
rphmeier Mar 20, 2020
554ed89
provide maximums to validation params
rphmeier Mar 20, 2020
c9b324b
port test-parachains
rphmeier Mar 20, 2020
38d724c
add a code-upgrader test-parachain and tests
rphmeier Mar 20, 2020
43888e3
fix collator tests
rphmeier Mar 22, 2020
71d23d3
Merge branch 'master' into rh-upgradeable-validation-function
rphmeier Mar 22, 2020
e638aa5
move test-parachains to own folder to work around compilation errors
rphmeier Mar 22, 2020
87e0dcc
Merge branch 'master' into rh-upgradeable-validation-function
rphmeier Mar 22, 2020
87de26e
Merge branch 'master' into rh-upgradeable-validation-function
rphmeier Mar 22, 2020
a4b5b09
fix test compilation
rphmeier Mar 22, 2020
1442886
Merge branch 'master' into rh-upgradeable-validation-function
rphmeier Mar 30, 2020
8026746
Merge branch 'master' into rh-upgradeable-validation-function
rphmeier Apr 1, 2020
052de96
update the Cargo.lock
rphmeier Apr 1, 2020
fa80d0a
fix parachains tests
rphmeier Apr 2, 2020
ff534ce
remove dbg! invocation
rphmeier Apr 2, 2020
52f8307
CI testing
arkpar Apr 3, 2020
01adcda
CI testing
arkpar Apr 3, 2020
065425c
CI testing
arkpar Apr 3, 2020
1193f8e
CI testing
arkpar Apr 3, 2020
f587156
CI testing
arkpar Apr 3, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
port test-parachains
  • Loading branch information
rphmeier committed Mar 20, 2020
commit c9b324b7edb3c6fe9064545525d9fa1dddd53a98
9 changes: 7 additions & 2 deletions collator/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ use polkadot_primitives::{
BlockId, Hash, Block,
parachain::{
self, BlockData, DutyRoster, HeadData, Id as ParaId,
PoVBlock, ValidatorId, CollatorPair, LocalValidationData
PoVBlock, ValidatorId, CollatorPair, LocalValidationData, GlobalValidationSchedule,
}
};
use polkadot_cli::{
Expand Down Expand Up @@ -154,14 +154,16 @@ pub trait ParachainContext: Clone {
fn produce_candidate(
&mut self,
relay_parent: Hash,
status: LocalValidationData,
global_validation: GlobalValidationSchedule,
local_validation: LocalValidationData,
) -> Self::ProduceCandidate;
}

/// Produce a candidate for the parachain, with given contexts, parent head, and signing key.
pub async fn collate<P>(
relay_parent: Hash,
local_id: ParaId,
global_validation: GlobalValidationSchedule,
local_validation_data: LocalValidationData,
mut para_context: P,
key: Arc<CollatorPair>,
Expand All @@ -173,6 +175,7 @@ pub async fn collate<P>(
{
let (block_data, head_data) = para_context.produce_candidate(
relay_parent,
global_validation,
local_validation_data,
).map_err(Error::Collator).await?;

Expand Down Expand Up @@ -281,6 +284,7 @@ fn build_collator_service<S, P, Extrinsic>(

let work = future::lazy(move |_| {
let api = client.runtime_api();
let global_validation = try_fr!(api.global_validation_schedule(&id));
let local_validation = match try_fr!(api.local_validation_data(&id, para_id)) {
Some(local_validation) => local_validation,
None => return future::Either::Left(future::ok(())),
Expand All @@ -297,6 +301,7 @@ fn build_collator_service<S, P, Extrinsic>(
let collation_work = collate(
relay_parent,
para_id,
global_validation,
local_validation,
parachain_context,
key,
Expand Down
4 changes: 2 additions & 2 deletions parachain/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ edition = "2018"
codec = { package = "parity-scale-codec", version = "1.1.0", default-features = false, features = [ "derive" ] }
rstd = { package = "sp-std", git = "https://github.com/paritytech/substrate", branch = "polkadot-master", default-features = false }
sp-core = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", default-features = false }
sp-runtime-interface = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", default-features = false }
sp-wasm-interface = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", default-features = false }

# all optional crates.
derive_more = { version = "0.99.2", optional = true }
serde = { version = "1.0.102", default-features = false, features = [ "derive" ], optional = true }
sp-runtime-interface = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", optional = true, default-features = false }
sp-externalities = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", optional = true }
sc-executor = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", optional = true }
sp-io = { git = "https://github.com/paritytech/substrate", branch = "polkadot-master", optional = true }
Expand All @@ -35,7 +35,7 @@ halt = { path = "../test-parachains/halt" }

[features]
default = ["std"]
wasm-api = []
wasm-api = ["sp-runtime-interface"]
std = [
"codec/std",
"derive_more",
Expand Down
3 changes: 2 additions & 1 deletion parachain/src/primitives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ impl rstd::convert::TryFrom<u8> for ParachainDispatchOrigin {
}

/// A message from a parachain to its Relay Chain.
#[derive(Clone, PartialEq, Eq, Encode, Decode, sp_runtime_interface::pass_by::PassByCodec)]
#[derive(Clone, PartialEq, Eq, Encode, Decode)]
#[cfg_attr(feature = "wasm-api", derive(sp_runtime_interface::pass_by::PassByCodec))]
#[cfg_attr(feature = "std", derive(Debug))]
pub struct UpwardMessage {
/// The origin for the message to be sent from.
Expand Down
8 changes: 6 additions & 2 deletions parachain/src/wasm_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@

//! Utilities for writing parachain WASM.

#[cfg(any(feature = "std", all(not(feature = "std"), feature = "wasm-api")))]
use crate::primitives::UpwardMessage;
#[cfg(any(feature = "std", all(not(feature = "std"), feature = "wasm-api")))]
use sp_runtime_interface::runtime_interface;
#[cfg(feature = "std")]
use sp_externalities::ExternalitiesExt;
Expand All @@ -41,7 +43,9 @@ pub trait Parachain {
/// Offset and length must have been provided by the validation
/// function's entry point.
#[cfg(not(feature = "std"))]
pub unsafe fn load_params(params: *const u8, len: usize) -> crate::ValidationParams {
pub unsafe fn load_params(params: *const u8, len: usize)
-> crate::primitives::ValidationParams
{
let mut slice = rstd::slice::from_raw_parts(params, len);

codec::Decode::decode(&mut slice).expect("Invalid input data")
Expand All @@ -52,6 +56,6 @@ pub unsafe fn load_params(params: *const u8, len: usize) -> crate::ValidationPar
/// As described in the crate docs, this is a pointer to the appended length
/// of the vector.
#[cfg(not(feature = "std"))]
pub fn write_result(result: &crate::ValidationResult) -> u64 {
pub fn write_result(result: &crate::primitives::ValidationResult) -> u64 {
sp_core::to_substrate_wasm_fn_return_value(&result)
}
44 changes: 29 additions & 15 deletions parachain/tests/adder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,15 @@

use polkadot_parachain as parachain;

use crate::{DummyExt, parachain::ValidationParams};
use crate::{
DummyExt,
parachain::primitives::{
RelayChainBlockNumber,
BlockData as GenericBlockData,
HeadData as GenericHeadData,
ValidationParams,
},
};
use codec::{Decode, Encode};

/// Head data for this parachain.
Expand All @@ -41,12 +49,6 @@ struct BlockData {
add: u64,
}

#[derive(Encode, Decode)]
struct AddMessage {
/// amount to add.
amount: u64,
}

const TEST_CODE: &[u8] = adder::WASM_BINARY;

fn hash_state(state: u64) -> [u8; 32] {
Expand All @@ -73,14 +75,18 @@ pub fn execute_good_on_parent() {
let ret = parachain::wasm_executor::validate_candidate(
TEST_CODE,
ValidationParams {
parent_head: parent_head.encode(),
block_data: block_data.encode(),
parent_head: GenericHeadData(parent_head.encode()),
block_data: GenericBlockData(block_data.encode()),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
).unwrap();

let new_head = HeadData::decode(&mut &ret.head_data[..]).unwrap();
let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap();

assert_eq!(new_head.number, 1);
assert_eq!(new_head.parent_hash, hash_head(&parent_head));
Expand Down Expand Up @@ -108,14 +114,18 @@ fn execute_good_chain_on_parent() {
let ret = parachain::wasm_executor::validate_candidate(
TEST_CODE,
ValidationParams {
parent_head: parent_head.encode(),
block_data: block_data.encode(),
parent_head: GenericHeadData(parent_head.encode()),
block_data: GenericBlockData(block_data.encode()),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: number as RelayChainBlockNumber + 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
).unwrap();

let new_head = HeadData::decode(&mut &ret.head_data[..]).unwrap();
let new_head = HeadData::decode(&mut &ret.head_data.0[..]).unwrap();

assert_eq!(new_head.number, number + 1);
assert_eq!(new_head.parent_hash, hash_head(&parent_head));
Expand Down Expand Up @@ -143,8 +153,12 @@ fn execute_bad_on_parent() {
let _ret = parachain::wasm_executor::validate_candidate(
TEST_CODE,
ValidationParams {
parent_head: parent_head.encode(),
block_data: block_data.encode(),
parent_head: GenericHeadData(parent_head.encode()),
block_data: GenericBlockData(block_data.encode()),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
Expand Down
2 changes: 1 addition & 1 deletion parachain/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ mod wasm_executor;

use polkadot_parachain as parachain;
use crate::parachain::{
UpwardMessage, wasm_executor::{Externalities, run_worker},
primitives::UpwardMessage, wasm_executor::{Externalities, run_worker},
};

struct DummyExt;
Expand Down
23 changes: 19 additions & 4 deletions parachain/tests/wasm_executor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@

use polkadot_parachain as parachain;
use crate::{adder, DummyExt};
use crate::parachain::{ValidationParams, wasm_executor::EXECUTION_TIMEOUT_SEC};
use crate::parachain::{
primitives::{BlockData, ValidationParams},
wasm_executor::EXECUTION_TIMEOUT_SEC,
};

// Code that exposes `validate_block` and loops infinitely
const INFINITE_LOOP_CODE: &[u8] = halt::WASM_BINARY;
Expand All @@ -28,8 +31,12 @@ fn terminates_on_timeout() {
let result = parachain::wasm_executor::validate_candidate(
INFINITE_LOOP_CODE,
ValidationParams {
block_data: BlockData(Vec::new()),
parent_head: Default::default(),
block_data: Vec::new(),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
Expand All @@ -50,17 +57,25 @@ fn parallel_execution() {
parachain::wasm_executor::validate_candidate(
INFINITE_LOOP_CODE,
ValidationParams {
block_data: BlockData(Vec::new()),
parent_head: Default::default(),
block_data: Vec::new(),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
).ok());
let _ = parachain::wasm_executor::validate_candidate(
INFINITE_LOOP_CODE,
ValidationParams {
block_data: BlockData(Vec::new()),
parent_head: Default::default(),
block_data: Vec::new(),
max_code_size: 1024,
max_head_data_size: 1024,
relay_chain_height: 1,
code_upgrade_allowed: None,
},
DummyExt,
parachain::wasm_executor::ExecutionMode::RemoteTest,
Expand Down
5 changes: 3 additions & 2 deletions test-parachains/adder/collator/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use sp_core::Pair;
use codec::{Encode, Decode};
use primitives::{
Hash,
parachain::{HeadData, BlockData, Id as ParaId, LocalValidationData},
parachain::{HeadData, BlockData, Id as ParaId, LocalValidationData, GlobalValidationSchedule},
};
use collator::{
InvalidHead, ParachainContext, Network, BuildParachainContext, load_spec, Configuration,
Expand Down Expand Up @@ -60,6 +60,7 @@ impl ParachainContext for AdderContext {
fn produce_candidate(
&mut self,
_relay_parent: Hash,
_global_validation: GlobalValidationSchedule,
local_validation: LocalValidationData,
) -> Self::ProduceCandidate
{
Expand All @@ -83,7 +84,7 @@ impl ParachainContext for AdderContext {
add: adder_head.number % 100,
};

let next_head = ::adder::execute(adder_head.hash(), adder_head, &next_body)
let next_head = adder::execute(adder_head.hash(), adder_head, &next_body)
.expect("good execution params; qed");

let encoded_head = HeadData(next_head.encode());
Expand Down
17 changes: 0 additions & 17 deletions test-parachains/adder/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,27 +63,10 @@ pub fn hash_state(state: u64) -> [u8; 32] {
tiny_keccak::keccak256(state.encode().as_slice())
}

#[derive(Default, Encode, Decode)]
pub struct AddMessage {
/// The amount to add based on this message.
pub amount: u64,
}

/// Start state mismatched with parent header's state hash.
#[derive(Debug)]
pub struct StateMismatch;

/// Process all incoming messages, yielding the amount of addition from messages.
///
/// Ignores unknown message kinds.
pub fn process_messages<I, T>(iterable: I) -> u64
where I: IntoIterator<Item=T>, T: AsRef<[u8]>
{
iterable.into_iter()
.filter_map(|data| AddMessage::decode(&mut data.as_ref()).ok())
.fold(0u64, |a, c| a.overflowing_add(c.amount).0)
}

/// Execute a block body on top of given parent head, producing new parent head
/// if valid.
pub fn execute(
Expand Down
13 changes: 8 additions & 5 deletions test-parachains/adder/src/wasm_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

use crate::{HeadData, BlockData};
use core::{intrinsics, panic};
use parachain::ValidationResult;
use parachain::primitives::{ValidationResult, HeadData as GenericHeadData};
use codec::{Encode, Decode};

#[panic_handler]
Expand All @@ -40,17 +40,20 @@ pub fn oom(_: core::alloc::Layout) -> ! {
#[no_mangle]
pub extern fn validate_block(params: *const u8, len: usize) -> u64 {
let params = unsafe { parachain::load_params(params, len) };
let parent_head = HeadData::decode(&mut &params.parent_head[..])
let parent_head = HeadData::decode(&mut &params.parent_head.0[..])
.expect("invalid parent head format.");

let block_data = BlockData::decode(&mut &params.block_data[..])
let block_data = BlockData::decode(&mut &params.block_data.0[..])
.expect("invalid block data format.");

let parent_hash = tiny_keccak::keccak256(&params.parent_head[..]);
let parent_hash = tiny_keccak::keccak256(&params.parent_head.0[..]);

match crate::execute(parent_hash, parent_head, &block_data) {
Ok(new_head) => parachain::write_result(
&ValidationResult { head_data: new_head.encode() }
&ValidationResult {
head_data: GenericHeadData(new_head.encode()),
new_validation_code: None,
}
),
Err(_) => panic!("execution failure"),
}
Expand Down