mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-18 07:11:03 +00:00
Add some message types from subsystem definitions (#1265)
* introduce polkadot-node-primitives * guide: change statement distribution message types * guide: remove variant from `CandidateSelectionMessage` * add a few more message types * add TODOs * Almost all messages * NewBackedCandidate notification * Formatting * Use AttestedCandidate as BackedCandidate * Update node/primitives/src/lib.rs Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com> * Fix the tests * Bring in types from #1242 * Adds network bridge messages * More message types from doc * use fn pointer type * Fixes from the review * Add missing Runtime subsystem message * rename to CandidateValidationMessage and fix tests Co-authored-by: Fedor Sakharov <fedor.sakharov@gmail.com> Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
87ae6e42f5
commit
c226c4403d
@@ -14,7 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Shareable Polkadot types.
|
||||
//! Polkadot types shared between the runtime and the Node-side code.
|
||||
|
||||
#![warn(missing_docs)]
|
||||
|
||||
|
||||
@@ -593,6 +593,15 @@ pub enum Statement {
|
||||
Invalid(Hash),
|
||||
}
|
||||
|
||||
impl Statement {
|
||||
/// Produce a payload on this statement that is used for signing.
|
||||
///
|
||||
/// It includes the context provided.
|
||||
pub fn signing_payload(&self, context: &SigningContext) -> Vec<u8> {
|
||||
(self, context).encode()
|
||||
}
|
||||
}
|
||||
|
||||
/// An either implicit or explicit attestation to the validity of a parachain
|
||||
/// candidate.
|
||||
#[derive(Clone, Eq, PartialEq, Decode, Encode, RuntimeDebug)]
|
||||
@@ -661,6 +670,95 @@ impl FeeSchedule {
|
||||
}
|
||||
}
|
||||
|
||||
/// A bitfield concerning availability of backed candidates.
|
||||
#[derive(PartialEq, Eq, Clone, Encode, Decode)]
|
||||
#[cfg_attr(feature = "std", derive(Debug))]
|
||||
pub struct AvailabilityBitfield(pub BitVec<bitvec::order::Lsb0, u8>);
|
||||
|
||||
impl From<BitVec<bitvec::order::Lsb0, u8>> for AvailabilityBitfield {
|
||||
fn from(inner: BitVec<bitvec::order::Lsb0, u8>) -> Self {
|
||||
AvailabilityBitfield(inner)
|
||||
}
|
||||
}
|
||||
|
||||
impl AvailabilityBitfield {
|
||||
/// Encodes the signing payload into the given buffer.
|
||||
pub fn encode_signing_payload_into(
|
||||
&self,
|
||||
signing_context: &SigningContext,
|
||||
buf: &mut Vec<u8>,
|
||||
) {
|
||||
self.0.encode_to(buf);
|
||||
signing_context.encode_to(buf);
|
||||
}
|
||||
|
||||
/// Encodes the signing payload into a fresh byte-vector.
|
||||
pub fn encode_signing_payload(
|
||||
&self,
|
||||
signing_context:
|
||||
&SigningContext,
|
||||
) -> Vec<u8> {
|
||||
let mut v = Vec::new();
|
||||
self.encode_signing_payload_into(signing_context, &mut v);
|
||||
v
|
||||
}
|
||||
}
|
||||
|
||||
/// A bitfield signed by a particular validator about the availability of pending candidates.
|
||||
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)]
|
||||
pub struct SignedAvailabilityBitfield {
|
||||
/// The index of the validator in the current set.
|
||||
pub validator_index: ValidatorIndex,
|
||||
/// The bitfield itself, with one bit per core. Only occupied cores may have the `1` bit set.
|
||||
pub bitfield: AvailabilityBitfield,
|
||||
/// The signature by the validator on the bitfield's signing payload. The context of the signature
|
||||
/// should be apparent when checking the signature.
|
||||
pub signature: ValidatorSignature,
|
||||
}
|
||||
|
||||
/// Check a signature on an availability bitfield. Provide the bitfield, the validator who signed it,
|
||||
/// the signature, the signing context, and an optional buffer in which to encode.
|
||||
///
|
||||
/// If the buffer is provided, it is assumed to be empty.
|
||||
pub fn check_availability_bitfield_signature<H: Encode>(
|
||||
bitfield: &AvailabilityBitfield,
|
||||
validator: &ValidatorId,
|
||||
signature: &ValidatorSignature,
|
||||
signing_context: &SigningContext,
|
||||
payload_encode_buf: Option<&mut Vec<u8>>,
|
||||
) -> Result<(),()> {
|
||||
use runtime_primitives::traits::AppVerify;
|
||||
|
||||
let mut v = Vec::new();
|
||||
let payload_encode_buf = payload_encode_buf.unwrap_or(&mut v);
|
||||
|
||||
bitfield.encode_signing_payload_into(signing_context, payload_encode_buf);
|
||||
|
||||
if signature.verify(&payload_encode_buf[..], validator) {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(())
|
||||
}
|
||||
}
|
||||
|
||||
/// A set of signed availability bitfields. Should be sorted by validator index, ascending.
|
||||
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)]
|
||||
pub struct SignedAvailabilityBitfields(pub Vec<SignedAvailabilityBitfield>);
|
||||
|
||||
/// A backed (or backable, depending on context) candidate.
|
||||
// TODO: yes, this is roughly the same as AttestedCandidate.
|
||||
// After https://github.com/paritytech/polkadot/issues/1250
|
||||
// they should be unified to this type.
|
||||
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)]
|
||||
pub struct BackedCandidate {
|
||||
/// The candidate referred to.
|
||||
pub candidate: AbridgedCandidateReceipt,
|
||||
/// The validity votes themselves, expressed as signatures.
|
||||
pub validity_votes: Vec<ValidityAttestation>,
|
||||
/// The indices of the validators within the group, expressed as a bitfield.
|
||||
pub validator_indices: BitVec<bitvec::order::Lsb0, u8>,
|
||||
}
|
||||
|
||||
sp_api::decl_runtime_apis! {
|
||||
/// The API for querying the state of parachains on-chain.
|
||||
#[api_version(3)]
|
||||
|
||||
Reference in New Issue
Block a user