mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-15 05:35:44 +00:00
6ef1117685
* Update substrate & polkadot * min changes to make async backing compile * (async backing) parachain-system: track limitations for unincluded blocks (#2438) * unincluded segment draft * read para head from storage proof * read_para_head -> read_included_para_head * Provide pub interface * add errors * fix unincluded segment update * BlockTracker -> Ancestor * add a dmp limit * Read para head depending on the storage switch * doc comments * storage items docs * add a sanity check on block initialize * Check watermark * append to the segment on block finalize * Move segment update into set_validation_data * Resolve para head todo * option watermark * fix comment * Drop dmq check * fix weight * doc-comments on inherent invariant * Remove TODO * add todo * primitives tests * pallet tests * doc comments * refactor unincluded segment length into a ConsensusHook (#2501) * refactor unincluded segment length into a ConsensusHook * add docs * refactor bandwidth_out calculation Co-authored-by: Chris Sosnin <48099298+slumber@users.noreply.github.com> * test for limits from impl * fmt * make tests compile * update comment * uncomment test * fix collator test by adding parent to state proof * patch HRMP watermark rules for unincluded segment * get consensus-common tests to pass, using unincluded segment * fix unincluded segment tests * get all tests passing * fmt * rustdoc CI * aura-ext: limit the number of authored blocks per slot (#2551) * aura_ext consensus hook * reverse dependency * include weight into hook * fix tests * remove stray println Co-authored-by: Chris Sosnin <48099298+slumber@users.noreply.github.com> * fix test warning * fix doc link --------- Co-authored-by: Chris Sosnin <48099298+slumber@users.noreply.github.com> Co-authored-by: Chris Sosnin <chris125_@live.com> * parachain-system: ignore go ahead signal once upgrade is processed (#2594) * handle goahead signal for unincluded segment * doc comment * add test * parachain-system: drop processed messages from inherent data (#2590) * implement `drop_processed_messages` * drop messages based on relay parent number * adjust tests * drop changes to mqc * fix comment * drop test * drop more dead code * clippy * aura-ext: check slot in consensus hook and remove all `CheckInherents` logic (#2658) * aura-ext: check slot in consensus hook * convert relay chain slot * Make relay chain slot duration generic * use fixed velocity hook for pallets with aura * purge timestamp inherent * fix warning * adjust runtime tests * fix slots in tests * Make `xcm-emulator` test pass for new consensus hook (#2722) * add pallets on_initialize * tests pass * add AuraExt on_init * ".git/.scripts/commands/fmt/fmt.sh" --------- Co-authored-by: command-bot <> --------- Co-authored-by: Ignacio Palacios <ignacio.palacios.santos@gmail.com> * update polkadot git refs * CollationGenerationConfig closure is now optional (#2772) * CollationGenerationConfig closure is now optional * fix test * propagate network-protocol-staging feature (#2899) * Feature Flagging Consensus Hook Type Parameter (#2911) * First pass * fmt * Added as default feature in tomls * Changed to direct dependency feature * Dealing with clippy error * Update pallets/parachain-system/src/lib.rs Co-authored-by: asynchronous rob <rphmeier@gmail.com> --------- Co-authored-by: asynchronous rob <rphmeier@gmail.com> * fmt * bump deps and remove warning * parachain-system: update RelevantMessagingState according to the unincluded segment (#2948) * mostly address 2471 with a bug introduced * adjust relevant messaging state after computing total * fmt * max -> min * fix test implementation of xcmp source * add test * fix test message sending logic * fix + test * add more to unincluded segment test * fmt --------- Co-authored-by: Chris Sosnin <chris125_@live.com> * Integrate new Aura / Parachain Consensus Logic in Parachain-Template / Polkadot-Parachain (#2864) * add a comment * refactor client/service utilities * deprecate start_collator * update parachain-template * update test-service in the same way * update polkadot-parachain crate * fmt * wire up new SubmitCollation message * some runtime utilities for implementing unincluded segment runtime APIs * allow parachains to configure their level of sybil-resistance when starting the network * make aura-ext compile * update to specify sybil resistance levels * fmt * specify relay chain slot duration in milliseconds * update Aura to explicitly produce Send futures also, make relay_chain_slot_duration a Duration * add authoring duration to basic collator and document params * integrate new basic collator into parachain-template * remove assert_send used for testing * basic-aura: only author when parent included * update polkadot-parachain-bin * fmt * some fixes * fixes * add a RelayNumberMonotonicallyIncreases * add a utility function for initializing subsystems * some logging for timestamp adjustment * fmt * some fixes for lookahead collator * add a log * update `find_potential_parents` to account for sessions * bound the loop * restore & deprecate old start_collator and start_full_node functions. * remove unnecessary await calls * fix warning * clippy * more clippy * remove unneeded logic * ci * update comment Co-authored-by: Marcin S. <marcin@bytedude.com> * (async backing) restore `CheckInherents` for backwards-compatibility (#2977) * bring back timestamp * Restore CheckInherents * revert to empty CheckInherents * make CheckInherents optional * attempt * properly end system blocks * add some more comments * ignore failing system parachain tests * update refs after main feature branch merge * comment out the offending tests because CI runs ignored tests * fix warnings * fmt * revert to polkadot master * cargo update -p polkadot-primitives -p sp-io --------- Co-authored-by: asynchronous rob <rphmeier@gmail.com> Co-authored-by: Ignacio Palacios <ignacio.palacios.santos@gmail.com> Co-authored-by: Bradley Olson <34992650+BradleyOlson64@users.noreply.github.com> Co-authored-by: Marcin S. <marcin@bytedude.com> Co-authored-by: eskimor <eskimor@users.noreply.github.com> Co-authored-by: Andronik <write@reusable.software>
262 lines
8.8 KiB
Rust
262 lines
8.8 KiB
Rust
// Copyright 2022 Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Polkadot is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
use futures::{select, StreamExt};
|
|
use lru::LruCache;
|
|
use std::sync::Arc;
|
|
|
|
use polkadot_availability_recovery::AvailabilityRecoverySubsystem;
|
|
use polkadot_collator_protocol::{CollatorProtocolSubsystem, ProtocolSide};
|
|
use polkadot_network_bridge::{
|
|
Metrics as NetworkBridgeMetrics, NetworkBridgeRx as NetworkBridgeRxSubsystem,
|
|
NetworkBridgeTx as NetworkBridgeTxSubsystem,
|
|
};
|
|
use polkadot_node_collation_generation::CollationGenerationSubsystem;
|
|
use polkadot_node_core_runtime_api::RuntimeApiSubsystem;
|
|
use polkadot_node_network_protocol::{
|
|
peer_set::PeerSetProtocolNames,
|
|
request_response::{
|
|
v1::{self, AvailableDataFetchingRequest},
|
|
vstaging, IncomingRequestReceiver, ReqProtocolNames,
|
|
},
|
|
};
|
|
use polkadot_node_subsystem_util::metrics::{prometheus::Registry, Metrics};
|
|
use polkadot_overseer::{
|
|
BlockInfo, DummySubsystem, Handle, Overseer, OverseerConnector, OverseerHandle, SpawnGlue,
|
|
KNOWN_LEAVES_CACHE_SIZE,
|
|
};
|
|
use polkadot_primitives::CollatorPair;
|
|
|
|
use sc_authority_discovery::Service as AuthorityDiscoveryService;
|
|
use sc_network::NetworkStateInfo;
|
|
use sc_service::TaskManager;
|
|
use sp_runtime::traits::Block as BlockT;
|
|
|
|
use cumulus_primitives_core::relay_chain::{Block, Hash as PHash};
|
|
use cumulus_relay_chain_interface::RelayChainError;
|
|
|
|
use crate::BlockChainRpcClient;
|
|
|
|
/// Arguments passed for overseer construction.
|
|
pub(crate) struct CollatorOverseerGenArgs<'a> {
|
|
/// Runtime client generic, providing the `ProvieRuntimeApi` trait besides others.
|
|
pub runtime_client: Arc<BlockChainRpcClient>,
|
|
/// Underlying network service implementation.
|
|
pub network_service: Arc<sc_network::NetworkService<Block, PHash>>,
|
|
/// Syncing oracle.
|
|
pub sync_oracle: Box<dyn sp_consensus::SyncOracle + Send>,
|
|
/// Underlying authority discovery service.
|
|
pub authority_discovery_service: AuthorityDiscoveryService,
|
|
/// Receiver for collation request protocol v1.
|
|
pub collation_req_receiver_v1: IncomingRequestReceiver<v1::CollationFetchingRequest>,
|
|
/// Receiver for collation request protocol vstaging.
|
|
pub collation_req_receiver_vstaging:
|
|
IncomingRequestReceiver<vstaging::CollationFetchingRequest>,
|
|
/// Receiver for availability request protocol
|
|
pub available_data_req_receiver: IncomingRequestReceiver<AvailableDataFetchingRequest>,
|
|
/// Prometheus registry, commonly used for production systems, less so for test.
|
|
pub registry: Option<&'a Registry>,
|
|
/// Task spawner to be used throughout the overseer and the APIs it provides.
|
|
pub spawner: sc_service::SpawnTaskHandle,
|
|
/// Determines the behavior of the collator.
|
|
pub collator_pair: CollatorPair,
|
|
/// Request response protocols
|
|
pub req_protocol_names: ReqProtocolNames,
|
|
/// Peerset protocols name mapping
|
|
pub peer_set_protocol_names: PeerSetProtocolNames,
|
|
}
|
|
|
|
fn build_overseer(
|
|
connector: OverseerConnector,
|
|
CollatorOverseerGenArgs {
|
|
runtime_client,
|
|
network_service,
|
|
sync_oracle,
|
|
authority_discovery_service,
|
|
collation_req_receiver_v1,
|
|
collation_req_receiver_vstaging,
|
|
available_data_req_receiver,
|
|
registry,
|
|
spawner,
|
|
collator_pair,
|
|
req_protocol_names,
|
|
peer_set_protocol_names,
|
|
}: CollatorOverseerGenArgs<'_>,
|
|
) -> Result<
|
|
(Overseer<SpawnGlue<sc_service::SpawnTaskHandle>, Arc<BlockChainRpcClient>>, OverseerHandle),
|
|
RelayChainError,
|
|
> {
|
|
let spawner = SpawnGlue(spawner);
|
|
let network_bridge_metrics: NetworkBridgeMetrics = Metrics::register(registry)?;
|
|
let builder = Overseer::builder()
|
|
.availability_distribution(DummySubsystem)
|
|
.availability_recovery(AvailabilityRecoverySubsystem::with_availability_store_skip(
|
|
available_data_req_receiver,
|
|
Metrics::register(registry)?,
|
|
))
|
|
.availability_store(DummySubsystem)
|
|
.bitfield_distribution(DummySubsystem)
|
|
.bitfield_signing(DummySubsystem)
|
|
.candidate_backing(DummySubsystem)
|
|
.candidate_validation(DummySubsystem)
|
|
.pvf_checker(DummySubsystem)
|
|
.chain_api(DummySubsystem)
|
|
.collation_generation(CollationGenerationSubsystem::new(Metrics::register(registry)?))
|
|
.collator_protocol({
|
|
let side = ProtocolSide::Collator {
|
|
peer_id: network_service.local_peer_id(),
|
|
collator_pair,
|
|
request_receiver_v1: collation_req_receiver_v1,
|
|
request_receiver_vstaging: collation_req_receiver_vstaging,
|
|
metrics: Metrics::register(registry)?,
|
|
};
|
|
CollatorProtocolSubsystem::new(side)
|
|
})
|
|
.network_bridge_rx(NetworkBridgeRxSubsystem::new(
|
|
network_service.clone(),
|
|
authority_discovery_service.clone(),
|
|
sync_oracle,
|
|
network_bridge_metrics.clone(),
|
|
peer_set_protocol_names.clone(),
|
|
))
|
|
.network_bridge_tx(NetworkBridgeTxSubsystem::new(
|
|
network_service,
|
|
authority_discovery_service,
|
|
network_bridge_metrics,
|
|
req_protocol_names,
|
|
peer_set_protocol_names,
|
|
))
|
|
.provisioner(DummySubsystem)
|
|
.runtime_api(RuntimeApiSubsystem::new(
|
|
runtime_client.clone(),
|
|
Metrics::register(registry)?,
|
|
spawner.clone(),
|
|
))
|
|
.statement_distribution(DummySubsystem)
|
|
.prospective_parachains(DummySubsystem)
|
|
.approval_distribution(DummySubsystem)
|
|
.approval_voting(DummySubsystem)
|
|
.gossip_support(DummySubsystem)
|
|
.dispute_coordinator(DummySubsystem)
|
|
.dispute_distribution(DummySubsystem)
|
|
.chain_selection(DummySubsystem)
|
|
.activation_external_listeners(Default::default())
|
|
.span_per_active_leaf(Default::default())
|
|
.active_leaves(Default::default())
|
|
.supports_parachains(runtime_client)
|
|
.known_leaves(LruCache::new(KNOWN_LEAVES_CACHE_SIZE))
|
|
.metrics(Metrics::register(registry)?)
|
|
.spawner(spawner);
|
|
|
|
builder
|
|
.build_with_connector(connector)
|
|
.map_err(|e| RelayChainError::Application(e.into()))
|
|
}
|
|
|
|
pub(crate) fn spawn_overseer(
|
|
overseer_args: CollatorOverseerGenArgs,
|
|
task_manager: &TaskManager,
|
|
relay_chain_rpc_client: Arc<BlockChainRpcClient>,
|
|
) -> Result<polkadot_overseer::Handle, RelayChainError> {
|
|
let (overseer, overseer_handle) = build_overseer(OverseerConnector::default(), overseer_args)
|
|
.map_err(|e| {
|
|
tracing::error!("Failed to initialize overseer: {}", e);
|
|
e
|
|
})?;
|
|
|
|
let overseer_handle = Handle::new(overseer_handle);
|
|
{
|
|
let handle = overseer_handle.clone();
|
|
task_manager.spawn_essential_handle().spawn_blocking(
|
|
"overseer",
|
|
None,
|
|
Box::pin(async move {
|
|
use futures::{pin_mut, FutureExt};
|
|
|
|
let forward = forward_collator_events(relay_chain_rpc_client, handle).fuse();
|
|
|
|
let overseer_fut = overseer.run().fuse();
|
|
|
|
pin_mut!(overseer_fut);
|
|
pin_mut!(forward);
|
|
|
|
select! {
|
|
_ = forward => (),
|
|
_ = overseer_fut => (),
|
|
}
|
|
}),
|
|
);
|
|
}
|
|
Ok(overseer_handle)
|
|
}
|
|
|
|
/// Minimal relay chain node representation
|
|
pub struct NewMinimalNode {
|
|
/// Task manager running all tasks for the minimal node
|
|
pub task_manager: TaskManager,
|
|
/// Overseer handle to interact with subsystems
|
|
pub overseer_handle: Handle,
|
|
/// Network service
|
|
pub network: Arc<sc_network::NetworkService<Block, <Block as BlockT>::Hash>>,
|
|
}
|
|
|
|
/// Glues together the [`Overseer`] and `BlockchainEvents` by forwarding
|
|
/// import and finality notifications into the [`OverseerHandle`].
|
|
async fn forward_collator_events(
|
|
client: Arc<BlockChainRpcClient>,
|
|
mut handle: Handle,
|
|
) -> Result<(), RelayChainError> {
|
|
let mut finality = client.finality_notification_stream().await?.fuse();
|
|
let mut imports = client.import_notification_stream().await?.fuse();
|
|
|
|
loop {
|
|
select! {
|
|
f = finality.next() => {
|
|
match f {
|
|
Some(header) => {
|
|
tracing::info!(
|
|
target: "minimal-polkadot-node",
|
|
"Received finalized block via RPC: #{} ({} -> {})",
|
|
header.number,
|
|
header.parent_hash,
|
|
header.hash()
|
|
);
|
|
let block_info = BlockInfo { hash: header.hash(), parent_hash: header.parent_hash, number: header.number };
|
|
handle.block_finalized(block_info).await;
|
|
}
|
|
None => return Err(RelayChainError::GenericError("Relay chain finality stream ended.".to_string())),
|
|
}
|
|
},
|
|
i = imports.next() => {
|
|
match i {
|
|
Some(header) => {
|
|
tracing::info!(
|
|
target: "minimal-polkadot-node",
|
|
"Received imported block via RPC: #{} ({} -> {})",
|
|
header.number,
|
|
header.parent_hash,
|
|
header.hash()
|
|
);
|
|
let block_info = BlockInfo { hash: header.hash(), parent_hash: header.parent_hash, number: header.number };
|
|
handle.block_imported(block_info).await;
|
|
}
|
|
None => return Err(RelayChainError::GenericError("Relay chain import stream ended.".to_string())),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|