mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 15:07:59 +00:00
Add new Runtime API messages and make runtime API request fallible (#1485)
* polkadot-subsystem: update runtime API message types * update all networking subsystems to use fallible runtime APIs * fix bitfield-signing and make it use new runtime APIs * port candidate-backing to handle runtime API errors and new types * remove old runtime API messages * remove unused imports * fix grumbles * fix backing tests
This commit is contained in:
committed by
GitHub
parent
d234ba38bb
commit
c8cdfbfd17
@@ -25,11 +25,13 @@
|
||||
use futures::channel::{mpsc, oneshot};
|
||||
|
||||
use polkadot_primitives::v1::{
|
||||
BlockNumber, Hash, CommittedCandidateReceipt,
|
||||
Hash, CommittedCandidateReceipt,
|
||||
CandidateReceipt, PoV, ErasureChunk, BackedCandidate, Id as ParaId,
|
||||
SignedAvailabilityBitfield, SigningContext, ValidatorId, ValidationCode, ValidatorIndex,
|
||||
CoreAssignment, CoreOccupied, HeadData, CandidateDescriptor,
|
||||
ValidatorSignature, OmittedValidationData, AvailableData,
|
||||
SignedAvailabilityBitfield, ValidatorId, ValidationCode, ValidatorIndex,
|
||||
CoreAssignment, CoreOccupied, CandidateDescriptor,
|
||||
ValidatorSignature, OmittedValidationData, AvailableData, GroupRotationInfo,
|
||||
CoreState, LocalValidationData, GlobalValidationData, OccupiedCoreAssumption,
|
||||
CandidateEvent, SessionIndex,
|
||||
};
|
||||
use polkadot_node_primitives::{
|
||||
MisbehaviorReport, SignedFullStatement, View, ProtocolId, ValidationResult,
|
||||
@@ -286,23 +288,39 @@ pub struct SchedulerRoster {
|
||||
pub availability_cores: Vec<Option<CoreOccupied>>,
|
||||
}
|
||||
|
||||
/// A description of an error causing the runtime API request to be unservable.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct RuntimeApiError(String);
|
||||
|
||||
/// A sender for the result of a runtime API request.
|
||||
pub type RuntimeApiSender<T> = oneshot::Sender<Result<T, RuntimeApiError>>;
|
||||
|
||||
/// A request to the Runtime API subsystem.
|
||||
#[derive(Debug)]
|
||||
pub enum RuntimeApiRequest {
|
||||
/// Get the current validator set.
|
||||
Validators(oneshot::Sender<Vec<ValidatorId>>),
|
||||
/// Get the assignments of validators to cores.
|
||||
ValidatorGroups(oneshot::Sender<SchedulerRoster>),
|
||||
/// Get a signing context for bitfields and statements.
|
||||
SigningContext(oneshot::Sender<SigningContext>),
|
||||
/// Get the validation code for a specific para, assuming execution under given block number, and
|
||||
/// an optional block number representing an intermediate parablock executed in the context of
|
||||
/// that block.
|
||||
ValidationCode(ParaId, BlockNumber, Option<BlockNumber>, oneshot::Sender<ValidationCode>),
|
||||
/// Get head data for a specific para.
|
||||
HeadData(ParaId, oneshot::Sender<HeadData>),
|
||||
Validators(RuntimeApiSender<Vec<ValidatorId>>),
|
||||
/// Get the validator groups and group rotation info.
|
||||
ValidatorGroups(RuntimeApiSender<(Vec<Vec<ValidatorIndex>>, GroupRotationInfo)>),
|
||||
/// Get information on all availability cores.
|
||||
AvailabilityCores(RuntimeApiSender<Vec<CoreState>>),
|
||||
/// Get the global validation data.
|
||||
GlobalValidationData(RuntimeApiSender<GlobalValidationData>),
|
||||
/// Get the local validation data for a particular para, taking the given
|
||||
/// `OccupiedCoreAssumption`, which will inform on how the validation data should be computed
|
||||
/// if the para currently occupies a core.
|
||||
LocalValidationData(
|
||||
ParaId,
|
||||
OccupiedCoreAssumption,
|
||||
RuntimeApiSender<Option<LocalValidationData>>,
|
||||
),
|
||||
/// Get the session index that a child of the block will have.
|
||||
SessionIndexForChild(RuntimeApiSender<SessionIndex>),
|
||||
/// Get a the candidate pending availability for a particular parachain by parachain / core index
|
||||
CandidatePendingAvailability(ParaId, oneshot::Sender<Option<CommittedCandidateReceipt>>),
|
||||
CandidatePendingAvailability(ParaId, RuntimeApiSender<Option<CommittedCandidateReceipt>>),
|
||||
/// Get all events concerning candidates (backing, inclusion, time-out) in the parent of
|
||||
/// the block in whose state this request is executed.
|
||||
CandidateEvents(RuntimeApiSender<Vec<CandidateEvent>>),
|
||||
}
|
||||
|
||||
/// A message to the Runtime API subsystem.
|
||||
|
||||
@@ -21,7 +21,9 @@
|
||||
//! this module.
|
||||
|
||||
use crate::{
|
||||
messages::{AllMessages, RuntimeApiMessage, RuntimeApiRequest, SchedulerRoster},
|
||||
messages::{
|
||||
AllMessages, RuntimeApiError, RuntimeApiMessage, RuntimeApiRequest, RuntimeApiSender,
|
||||
},
|
||||
FromOverseer, SpawnedSubsystem, Subsystem, SubsystemContext, SubsystemError, SubsystemResult,
|
||||
};
|
||||
use futures::{
|
||||
@@ -37,8 +39,8 @@ use keystore::KeyStorePtr;
|
||||
use parity_scale_codec::Encode;
|
||||
use pin_project::{pin_project, pinned_drop};
|
||||
use polkadot_primitives::v1::{
|
||||
EncodeAs, Hash, HeadData, Id as ParaId, Signed, SigningContext,
|
||||
ValidatorId, ValidatorIndex, ValidatorPair,
|
||||
EncodeAs, Hash, Signed, SigningContext, SessionIndex,
|
||||
ValidatorId, ValidatorIndex, ValidatorPair, GroupRotationInfo,
|
||||
};
|
||||
use sp_core::{
|
||||
Pair,
|
||||
@@ -70,6 +72,9 @@ pub enum Error {
|
||||
/// A subsystem error
|
||||
#[from]
|
||||
Subsystem(SubsystemError),
|
||||
/// An error in the runtime API.
|
||||
#[from]
|
||||
RuntimeApi(RuntimeApiError),
|
||||
/// The type system wants this even though it doesn't make sense
|
||||
#[from]
|
||||
Infallible(std::convert::Infallible),
|
||||
@@ -83,14 +88,17 @@ pub enum Error {
|
||||
AlreadyForwarding,
|
||||
}
|
||||
|
||||
/// A type alias for Runtime API receivers.
|
||||
pub type RuntimeApiReceiver<T> = oneshot::Receiver<Result<T, RuntimeApiError>>;
|
||||
|
||||
/// Request some data from the `RuntimeApi`.
|
||||
pub async fn request_from_runtime<RequestBuilder, Response, FromJob>(
|
||||
parent: Hash,
|
||||
sender: &mut mpsc::Sender<FromJob>,
|
||||
request_builder: RequestBuilder,
|
||||
) -> Result<oneshot::Receiver<Response>, Error>
|
||||
) -> Result<RuntimeApiReceiver<Response>, Error>
|
||||
where
|
||||
RequestBuilder: FnOnce(oneshot::Sender<Response>) -> RuntimeApiRequest,
|
||||
RequestBuilder: FnOnce(RuntimeApiSender<Response>) -> RuntimeApiRequest,
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
{
|
||||
@@ -111,7 +119,7 @@ where
|
||||
pub async fn request_validators<FromJob>(
|
||||
parent: Hash,
|
||||
s: &mut mpsc::Sender<FromJob>,
|
||||
) -> Result<oneshot::Receiver<Vec<ValidatorId>>, Error>
|
||||
) -> Result<RuntimeApiReceiver<Vec<ValidatorId>>, Error>
|
||||
where
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
@@ -119,11 +127,11 @@ where
|
||||
request_from_runtime(parent, s, |tx| RuntimeApiRequest::Validators(tx)).await
|
||||
}
|
||||
|
||||
/// Request the scheduler roster from `RuntimeApi`.
|
||||
/// Request the validator groups.
|
||||
pub async fn request_validator_groups<FromJob>(
|
||||
parent: Hash,
|
||||
s: &mut mpsc::Sender<FromJob>,
|
||||
) -> Result<oneshot::Receiver<SchedulerRoster>, Error>
|
||||
) -> Result<RuntimeApiReceiver<(Vec<Vec<ValidatorIndex>>, GroupRotationInfo)>, Error>
|
||||
where
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
@@ -131,29 +139,18 @@ where
|
||||
request_from_runtime(parent, s, |tx| RuntimeApiRequest::ValidatorGroups(tx)).await
|
||||
}
|
||||
|
||||
/// Request a `SigningContext` from the `RuntimeApi`.
|
||||
pub async fn request_signing_context<FromJob>(
|
||||
/// Request the session index of the child block.
|
||||
pub async fn request_session_index_for_child<FromJob>(
|
||||
parent: Hash,
|
||||
s: &mut mpsc::Sender<FromJob>,
|
||||
) -> Result<oneshot::Receiver<SigningContext>, Error>
|
||||
) -> Result<RuntimeApiReceiver<SessionIndex>, Error>
|
||||
where
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
{
|
||||
request_from_runtime(parent, s, |tx| RuntimeApiRequest::SigningContext(tx)).await
|
||||
}
|
||||
|
||||
/// Request `HeadData` for some `ParaId` from `RuntimeApi`.
|
||||
pub async fn request_head_data<FromJob>(
|
||||
parent: Hash,
|
||||
s: &mut mpsc::Sender<FromJob>,
|
||||
id: ParaId,
|
||||
) -> Result<oneshot::Receiver<HeadData>, Error>
|
||||
where
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
{
|
||||
request_from_runtime(parent, s, |tx| RuntimeApiRequest::HeadData(id, tx)).await
|
||||
request_from_runtime(parent, s, |tx| {
|
||||
RuntimeApiRequest::SessionIndexForChild(tx)
|
||||
}).await
|
||||
}
|
||||
|
||||
/// From the given set of validators, find the first key we can sign with, if any.
|
||||
@@ -185,14 +182,21 @@ impl Validator {
|
||||
FromJob: TryFrom<AllMessages>,
|
||||
<FromJob as TryFrom<AllMessages>>::Error: std::fmt::Debug,
|
||||
{
|
||||
// Note: request_validators and request_signing_context do not and cannot run concurrently: they both
|
||||
// have a mutable handle to the same sender.
|
||||
// Note: request_validators and request_session_index_for_child do not and cannot
|
||||
// run concurrently: they both have a mutable handle to the same sender.
|
||||
// However, each of them returns a oneshot::Receiver, and those are resolved concurrently.
|
||||
let (validators, signing_context) = futures::try_join!(
|
||||
let (validators, session_index) = futures::try_join!(
|
||||
request_validators(parent, &mut sender).await?,
|
||||
request_signing_context(parent, &mut sender).await?,
|
||||
request_session_index_for_child(parent, &mut sender).await?,
|
||||
)?;
|
||||
|
||||
let signing_context = SigningContext {
|
||||
session_index: session_index?,
|
||||
parent_hash: parent,
|
||||
};
|
||||
|
||||
let validators = validators?;
|
||||
|
||||
Self::construct(&validators, signing_context, keystore)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user