mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 09:51:10 +00:00
002d9260f9
**Update:** Pushed additional changes based on the review comments. **This pull request fixes various spelling mistakes in this repository.** Most of the changes are contained in the first **3** commits: - `Fix spelling mistakes in comments and docs` - `Fix spelling mistakes in test names` - `Fix spelling mistakes in error messages, panic messages, logs and tracing` Other source code spelling mistakes are separated into individual commits for easier reviewing: - `Fix the spelling of 'authority'` - `Fix the spelling of 'REASONABLE_HEADERS_IN_JUSTIFICATION_ANCESTRY'` - `Fix the spelling of 'prev_enqueud_messages'` - `Fix the spelling of 'endpoint'` - `Fix the spelling of 'children'` - `Fix the spelling of 'PenpalSiblingSovereignAccount'` - `Fix the spelling of 'PenpalSudoAccount'` - `Fix the spelling of 'insufficient'` - `Fix the spelling of 'PalletXcmExtrinsicsBenchmark'` - `Fix the spelling of 'subtracted'` - `Fix the spelling of 'CandidatePendingAvailability'` - `Fix the spelling of 'exclusive'` - `Fix the spelling of 'until'` - `Fix the spelling of 'discriminator'` - `Fix the spelling of 'nonexistent'` - `Fix the spelling of 'subsystem'` - `Fix the spelling of 'indices'` - `Fix the spelling of 'committed'` - `Fix the spelling of 'topology'` - `Fix the spelling of 'response'` - `Fix the spelling of 'beneficiary'` - `Fix the spelling of 'formatted'` - `Fix the spelling of 'UNKNOWN_PROOF_REQUEST'` - `Fix the spelling of 'succeeded'` - `Fix the spelling of 'reopened'` - `Fix the spelling of 'proposer'` - `Fix the spelling of 'InstantiationNonce'` - `Fix the spelling of 'depositor'` - `Fix the spelling of 'expiration'` - `Fix the spelling of 'phantom'` - `Fix the spelling of 'AggregatedKeyValue'` - `Fix the spelling of 'randomness'` - `Fix the spelling of 'defendant'` - `Fix the spelling of 'AquaticMammal'` - `Fix the spelling of 'transactions'` - `Fix the spelling of 'PassingTracingSubscriber'` - `Fix the spelling of 'TxSignaturePayload'` - `Fix the spelling of 'versioning'` - `Fix the spelling of 'descendant'` - `Fix the spelling of 'overridden'` - `Fix the spelling of 'network'` Let me know if this structure is adequate. **Note:** The usage of the words `Merkle`, `Merkelize`, `Merklization`, `Merkelization`, `Merkleization`, is somewhat inconsistent but I left it as it is. ~~**Note:** In some places the term `Receival` is used to refer to message reception, IMO `Reception` is the correct word here, but I left it as it is.~~ ~~**Note:** In some places the term `Overlayed` is used instead of the more acceptable version `Overlaid` but I also left it as it is.~~ ~~**Note:** In some places the term `Applyable` is used instead of the correct version `Applicable` but I also left it as it is.~~ **Note:** Some usage of British vs American english e.g. `judgement` vs `judgment`, `initialise` vs `initialize`, `optimise` vs `optimize` etc. are both present in different places, but I suppose that's understandable given the number of contributors. ~~**Note:** There is a spelling mistake in `.github/CODEOWNERS` but it triggers errors in CI when I make changes to it, so I left it as it is.~~
106 lines
3.7 KiB
Rust
106 lines
3.7 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
use alloc::{vec, vec::Vec};
|
|
use codec::{Decode, Encode};
|
|
use scale_info::TypeInfo;
|
|
use sp_runtime::traits::Block;
|
|
|
|
/// Id of different payloads in the [`crate::Commitment`] data.
|
|
pub type BeefyPayloadId = [u8; 2];
|
|
|
|
/// Registry of all known [`BeefyPayloadId`].
|
|
pub mod known_payloads {
|
|
use crate::BeefyPayloadId;
|
|
|
|
/// A [`Payload`](super::Payload) identifier for Merkle Mountain Range root hash.
|
|
///
|
|
/// Encoded value should contain a [`crate::MmrRootHash`] type (i.e. 32-bytes hash).
|
|
pub const MMR_ROOT_ID: BeefyPayloadId = *b"mh";
|
|
}
|
|
|
|
/// A BEEFY payload type allowing for future extensibility of adding additional kinds of payloads.
|
|
///
|
|
/// The idea is to store a vector of SCALE-encoded values with an extra identifier.
|
|
/// Identifiers MUST be sorted by the [`BeefyPayloadId`] to allow efficient lookup of expected
|
|
/// value. Duplicated identifiers are disallowed. It's okay for different implementations to only
|
|
/// support a subset of possible values.
|
|
#[derive(Decode, Encode, Debug, PartialEq, Eq, Clone, Ord, PartialOrd, Hash, TypeInfo)]
|
|
pub struct Payload(Vec<(BeefyPayloadId, Vec<u8>)>);
|
|
|
|
impl Payload {
|
|
/// Construct a new payload given an initial value
|
|
pub fn from_single_entry(id: BeefyPayloadId, value: Vec<u8>) -> Self {
|
|
Self(vec![(id, value)])
|
|
}
|
|
|
|
/// Returns a raw payload under given `id`.
|
|
///
|
|
/// If the [`BeefyPayloadId`] is not found in the payload `None` is returned.
|
|
pub fn get_raw(&self, id: &BeefyPayloadId) -> Option<&Vec<u8>> {
|
|
let index = self.0.binary_search_by(|probe| probe.0.cmp(id)).ok()?;
|
|
Some(&self.0[index].1)
|
|
}
|
|
|
|
/// Returns a decoded payload value under given `id`.
|
|
///
|
|
/// In case the value is not there or it cannot be decoded does not match `None` is returned.
|
|
pub fn get_decoded<T: Decode>(&self, id: &BeefyPayloadId) -> Option<T> {
|
|
self.get_raw(id).and_then(|raw| T::decode(&mut &raw[..]).ok())
|
|
}
|
|
|
|
/// Push a `Vec<u8>` with a given id into the payload vec.
|
|
/// This method will internally sort the payload vec after every push.
|
|
///
|
|
/// Returns self to allow for daisy chaining.
|
|
pub fn push_raw(mut self, id: BeefyPayloadId, value: Vec<u8>) -> Self {
|
|
self.0.push((id, value));
|
|
self.0.sort_by_key(|(id, _)| *id);
|
|
self
|
|
}
|
|
}
|
|
|
|
/// Trait for custom BEEFY payload providers.
|
|
pub trait PayloadProvider<B: Block> {
|
|
/// Provide BEEFY payload if available for `header`.
|
|
fn payload(&self, header: &B::Header) -> Option<Payload>;
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn payload_methods_work_as_expected() {
|
|
let id1: BeefyPayloadId = *b"hw";
|
|
let msg1: String = "1. Hello World!".to_string();
|
|
let id2: BeefyPayloadId = *b"yb";
|
|
let msg2: String = "2. Yellow Board!".to_string();
|
|
let id3: BeefyPayloadId = *b"cs";
|
|
let msg3: String = "3. Cello Cord!".to_string();
|
|
|
|
let payload = Payload::from_single_entry(id1, msg1.encode())
|
|
.push_raw(id2, msg2.encode())
|
|
.push_raw(id3, msg3.encode());
|
|
|
|
assert_eq!(payload.get_decoded(&id1), Some(msg1));
|
|
assert_eq!(payload.get_decoded(&id2), Some(msg2));
|
|
assert_eq!(payload.get_raw(&id3), Some(&msg3.encode()));
|
|
assert_eq!(payload.get_raw(&known_payloads::MMR_ROOT_ID), None);
|
|
}
|
|
}
|