From ab2333da89451a2f6028a7e13129ae5366db3f1e Mon Sep 17 00:00:00 2001 From: Robert Habermeier Date: Wed, 4 Dec 2019 02:04:03 +0100 Subject: [PATCH] Add versioning to `ParachainHost` runtime API (#652) * add version to ParachainHost API * better error message --- polkadot/availability-store/src/worker.rs | 19 +++++++++++++++---- polkadot/primitives/src/parachain.rs | 1 + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/polkadot/availability-store/src/worker.rs b/polkadot/availability-store/src/worker.rs index 539b08548c..d7461cea52 100644 --- a/polkadot/availability-store/src/worker.rs +++ b/polkadot/availability-store/src/worker.rs @@ -22,7 +22,7 @@ use std::thread; use log::{error, info, trace, warn}; use sp_blockchain::{Result as ClientResult}; use sp_runtime::traits::{Header as HeaderT, ProvideRuntimeApi}; -use sp_api::ApiExt; +use sp_api::{ApiExt, ApiErrorFor}; use client::{ BlockchainEvents, BlockBody, blockchain::ProvideCache, @@ -214,9 +214,20 @@ where { let extrinsics = client.block_body(block)?; Ok(match extrinsics { - Some(extrinsics) => client.runtime_api() - .get_heads(&parent, extrinsics).map_err(|_| ConsensusError::ChainLookup("".into()))? - .and_then(|v| Some(v.into_iter())), + Some(extrinsics) => { + let api = client.runtime_api(); + + if api.has_api_with::>, _>( + parent, + |version| version >= 2, + ).map_err(|_| ConsensusError::ChainLookup("outdated runtime API".into()))? { + api.get_heads(&parent, extrinsics) + .map_err(|_| ConsensusError::ChainLookup("".into()))? + .map(|v| v.into_iter()) + } else { + None + } + } None => None, }) } diff --git a/polkadot/primitives/src/parachain.rs b/polkadot/primitives/src/parachain.rs index 66be2352c7..91731fd547 100644 --- a/polkadot/primitives/src/parachain.rs +++ b/polkadot/primitives/src/parachain.rs @@ -591,6 +591,7 @@ use runtime_primitives::traits::{Block as BlockT}; sp_api::decl_runtime_apis! { /// The API for querying the state of parachains on-chain. + #[api_version(2)] pub trait ParachainHost { /// Get the current validators. fn validators() -> Vec;