mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 17:01:09 +00:00
Rework inherent data client side (#8526)
* Lol * Yeah * Moare * adaasda * Convert AURA to new pallet macro * AURA: Switch to `CurrentSlot` instead of `LastTimestamp` This switches AURA to use `CurrentSlot` instead of `LastTimestamp`. * Add missing file * Update frame/aura/src/migrations.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Remove the runtime side provide inherent code * Use correct weight * Add TODO * Remove the Inherent from AURA * 🤦 * Remove unused stuff * Update primitives authorship * Fix babe inherent data provider * Fix consensus-uncles * Fix BABE * Do some further changes to authorship primitives... :D * More work * Make it compile the happy path * Make it async! * Take hash * More stuff * Hacks * Revert "Hacks" This reverts commit cfffad88668cfdebf632a59c4fbfada001ef8251. * Fix * Make `execute_block` return the final block header * Move Aura digest stuff * Make it possible to disable equivocation checking * Fix fix fix * Some refactorings * Comment * Fixes fixes fixes * More cleanups * Some love * Better love * Make slot duration being exposed as `Duration` to the outside * Some slot info love * Add `build_aura_worker` utility function * Copy copy copy * Some stuff * Start fixing pow * Fix pow * Remove some bounds * More work * Make grandpa work * Make slots use `async_trait` * Introduce `SharedData` * Add test and fix bugs * Switch to `SharedData` * Make grandpa tests working * More Babe work * Make grandpa work * Introduce `SharedData` * Add test and fix bugs * Switch to `SharedData` * Make grandpa tests working * More Babe work * Make it async * Fix fix * Use `async_trait` in sc-consensus-slots This makes the code a little bit easier to read and also expresses that there can always only be one call at a time to `on_slot`. * Make grandpa tests compile * More Babe tests work * Fix network test * Start fixing service test * Finish service-test * Fix sc-consensus-aura * Fix fix fix * More fixes * Make everything compile *yeah* * Make manual-seal compile * More fixes * Start fixing Aura * Fix Aura tests * Fix Babe tests * Make everything compile * Move code around and switch to async_trait * Fix Babe * Docs docs docs * Move to FRAME * Fix fix fix * Make everything compile * Last cleanups * Fix integration test * Change slot usage of the timestamp * We really need to switch to `impl-trait-for-tuples` * Update primitives/inherents/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Update primitives/inherents/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Update primitives/inherents/src/lib.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> * Some extra logging * Remove dbg! * Update primitives/consensus/common/src/import_queue/basic_queue.rs Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com> Co-authored-by: André Silva <123550+andresilva@users.noreply.github.com>
This commit is contained in:
@@ -49,6 +49,7 @@ use sp_transaction_pool::{
|
||||
TxHash,
|
||||
};
|
||||
use sp_consensus::{Environment, Proposer};
|
||||
use sp_inherents::InherentDataProvider;
|
||||
|
||||
use crate::{
|
||||
common::SizeType,
|
||||
@@ -153,10 +154,7 @@ impl core::Benchmark for ConstructionBenchmark {
|
||||
None,
|
||||
None,
|
||||
);
|
||||
let inherent_data_providers = sp_inherents::InherentDataProviders::new();
|
||||
inherent_data_providers
|
||||
.register_provider(sp_timestamp::InherentDataProvider)
|
||||
.expect("Failed to register timestamp data provider");
|
||||
let timestamp_provider = sp_timestamp::InherentDataProvider::from_system_time();
|
||||
|
||||
let start = std::time::Instant::now();
|
||||
|
||||
@@ -168,7 +166,7 @@ impl core::Benchmark for ConstructionBenchmark {
|
||||
|
||||
let _block = futures::executor::block_on(
|
||||
proposer.propose(
|
||||
inherent_data_providers.create_inherent_data().expect("Create inherent data failed"),
|
||||
timestamp_provider.create_inherent_data().expect("Create inherent data failed"),
|
||||
Default::default(),
|
||||
std::time::Duration::from_secs(20),
|
||||
None,
|
||||
|
||||
@@ -49,7 +49,8 @@ sp-consensus-babe = { version = "0.9.0", path = "../../../primitives/consensus/b
|
||||
grandpa-primitives = { version = "3.0.0", package = "sp-finality-grandpa", path = "../../../primitives/finality-grandpa" }
|
||||
sp-core = { version = "3.0.0", path = "../../../primitives/core" }
|
||||
sp-runtime = { version = "3.0.0", path = "../../../primitives/runtime" }
|
||||
sp-timestamp = { version = "3.0.0", default-features = false, path = "../../../primitives/timestamp" }
|
||||
sp-timestamp = { version = "3.0.0", path = "../../../primitives/timestamp" }
|
||||
sp-authorship = { version = "3.0.0", path = "../../../primitives/authorship" }
|
||||
sp-inherents = { version = "3.0.0", path = "../../../primitives/inherents" }
|
||||
sp-keyring = { version = "3.0.0", path = "../../../primitives/keyring" }
|
||||
sp-keystore = { version = "0.9.0", path = "../../../primitives/keystore" }
|
||||
@@ -65,6 +66,7 @@ sc-transaction-pool = { version = "3.0.0", path = "../../../client/transaction-p
|
||||
sc-network = { version = "0.9.0", path = "../../../client/network" }
|
||||
sc-consensus-slots = { version = "0.9.0", path = "../../../client/consensus/slots" }
|
||||
sc-consensus-babe = { version = "0.9.0", path = "../../../client/consensus/babe" }
|
||||
sc-consensus-uncles = { version = "0.9.0", path = "../../../client/consensus/uncles" }
|
||||
grandpa = { version = "0.9.0", package = "sc-finality-grandpa", path = "../../../client/finality-grandpa" }
|
||||
sc-client-db = { version = "0.9.0", default-features = false, path = "../../../client/db" }
|
||||
sc-offchain = { version = "3.0.0", path = "../../../client/offchain" }
|
||||
|
||||
@@ -27,7 +27,6 @@ use node_runtime::RuntimeApi;
|
||||
use sc_service::{
|
||||
config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager,
|
||||
};
|
||||
use sp_inherents::InherentDataProviders;
|
||||
use sc_network::{Event, NetworkService};
|
||||
use sp_runtime::traits::Block as BlockT;
|
||||
use futures::prelude::*;
|
||||
@@ -109,15 +108,29 @@ pub fn new_partial(
|
||||
client.clone(),
|
||||
)?;
|
||||
|
||||
let inherent_data_providers = sp_inherents::InherentDataProviders::new();
|
||||
|
||||
let slot_duration = babe_link.config().slot_duration();
|
||||
let import_queue = sc_consensus_babe::import_queue(
|
||||
babe_link.clone(),
|
||||
block_import.clone(),
|
||||
Some(Box::new(justification_import)),
|
||||
client.clone(),
|
||||
select_chain.clone(),
|
||||
inherent_data_providers.clone(),
|
||||
move |_, ()| {
|
||||
async move {
|
||||
let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
|
||||
|
||||
let slot =
|
||||
sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_duration(
|
||||
*timestamp,
|
||||
slot_duration,
|
||||
);
|
||||
|
||||
let uncles =
|
||||
sp_authorship::InherentDataProvider::<<Block as BlockT>::Header>::check_inherents();
|
||||
|
||||
Ok((timestamp, slot, uncles))
|
||||
}
|
||||
},
|
||||
&task_manager.spawn_essential_handle(),
|
||||
config.prometheus_registry(),
|
||||
sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()),
|
||||
@@ -183,14 +196,12 @@ pub fn new_partial(
|
||||
select_chain,
|
||||
import_queue,
|
||||
transaction_pool,
|
||||
inherent_data_providers,
|
||||
other: (rpc_extensions_builder, import_setup, rpc_setup, telemetry),
|
||||
})
|
||||
}
|
||||
|
||||
pub struct NewFullBase {
|
||||
pub task_manager: TaskManager,
|
||||
pub inherent_data_providers: InherentDataProviders,
|
||||
pub client: Arc<FullClient>,
|
||||
pub network: Arc<NetworkService<Block, <Block as BlockT>::Hash>>,
|
||||
pub network_status_sinks: sc_service::NetworkStatusSinks<Block>,
|
||||
@@ -213,7 +224,6 @@ pub fn new_full_base(
|
||||
keystore_container,
|
||||
select_chain,
|
||||
transaction_pool,
|
||||
inherent_data_providers,
|
||||
other: (rpc_extensions_builder, import_setup, rpc_setup, mut telemetry),
|
||||
} = new_partial(&config)?;
|
||||
|
||||
@@ -291,6 +301,8 @@ pub fn new_full_base(
|
||||
let can_author_with =
|
||||
sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone());
|
||||
|
||||
let client_clone = client.clone();
|
||||
let slot_duration = babe_link.config().slot_duration();
|
||||
let babe_config = sc_consensus_babe::BabeParams {
|
||||
keystore: keystore_container.sync_keystore(),
|
||||
client: client.clone(),
|
||||
@@ -298,7 +310,25 @@ pub fn new_full_base(
|
||||
env: proposer,
|
||||
block_import,
|
||||
sync_oracle: network.clone(),
|
||||
inherent_data_providers: inherent_data_providers.clone(),
|
||||
create_inherent_data_providers: move |parent, ()| {
|
||||
let client_clone = client_clone.clone();
|
||||
async move {
|
||||
let uncles = sc_consensus_uncles::create_uncles_inherent_data_provider(
|
||||
&*client_clone,
|
||||
parent,
|
||||
)?;
|
||||
|
||||
let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
|
||||
|
||||
let slot =
|
||||
sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_duration(
|
||||
*timestamp,
|
||||
slot_duration,
|
||||
);
|
||||
|
||||
Ok((timestamp, slot, uncles))
|
||||
}
|
||||
},
|
||||
force_authoring,
|
||||
backoff_authoring_blocks,
|
||||
babe_link,
|
||||
@@ -383,7 +413,6 @@ pub fn new_full_base(
|
||||
network_starter.start_network();
|
||||
Ok(NewFullBase {
|
||||
task_manager,
|
||||
inherent_data_providers,
|
||||
client,
|
||||
network,
|
||||
network_status_sinks,
|
||||
@@ -463,15 +492,27 @@ pub fn new_light_base(
|
||||
client.clone(),
|
||||
)?;
|
||||
|
||||
let inherent_data_providers = sp_inherents::InherentDataProviders::new();
|
||||
|
||||
let slot_duration = babe_link.config().slot_duration();
|
||||
let import_queue = sc_consensus_babe::import_queue(
|
||||
babe_link,
|
||||
babe_block_import,
|
||||
Some(Box::new(justification_import)),
|
||||
client.clone(),
|
||||
select_chain.clone(),
|
||||
inherent_data_providers.clone(),
|
||||
move |_, ()| async move {
|
||||
let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
|
||||
|
||||
let slot =
|
||||
sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_duration(
|
||||
*timestamp,
|
||||
slot_duration,
|
||||
);
|
||||
|
||||
let uncles =
|
||||
sp_authorship::InherentDataProvider::<<Block as BlockT>::Header>::check_inherents();
|
||||
|
||||
Ok((timestamp, slot, uncles))
|
||||
},
|
||||
&task_manager.spawn_essential_handle(),
|
||||
config.prometheus_registry(),
|
||||
sp_consensus::NeverCanAuthor,
|
||||
@@ -568,6 +609,7 @@ mod tests {
|
||||
use sp_transaction_pool::{MaintainedTransactionPool, ChainEvent};
|
||||
use sc_client_api::BlockBackend;
|
||||
use sc_keystore::LocalKeystore;
|
||||
use sp_inherents::InherentDataProvider;
|
||||
|
||||
type AccountPublic = <Signature as Verify>::Signer;
|
||||
|
||||
@@ -597,7 +639,7 @@ mod tests {
|
||||
|config| {
|
||||
let mut setup_handles = None;
|
||||
let NewFullBase {
|
||||
task_manager, inherent_data_providers, client, network, transaction_pool, ..
|
||||
task_manager, client, network, transaction_pool, ..
|
||||
} = new_full_base(config,
|
||||
|
|
||||
block_import: &sc_consensus_babe::BabeBlockImport<Block, _, _>,
|
||||
@@ -610,17 +652,13 @@ mod tests {
|
||||
let node = sc_service_test::TestNetComponents::new(
|
||||
task_manager, client, network, transaction_pool
|
||||
);
|
||||
Ok((node, (inherent_data_providers, setup_handles.unwrap())))
|
||||
Ok((node, setup_handles.unwrap()))
|
||||
},
|
||||
|config| {
|
||||
let (keep_alive, _, client, network, transaction_pool) = new_light_base(config)?;
|
||||
Ok(sc_service_test::TestNetComponents::new(keep_alive, client, network, transaction_pool))
|
||||
},
|
||||
|service, &mut (ref inherent_data_providers, (ref mut block_import, ref babe_link))| {
|
||||
let mut inherent_data = inherent_data_providers
|
||||
.create_inherent_data()
|
||||
.expect("Creates inherent data.");
|
||||
|
||||
|service, &mut (ref mut block_import, ref babe_link)| {
|
||||
let parent_id = BlockId::number(service.client().chain_info().best_number);
|
||||
let parent_header = service.client().header(&parent_id).unwrap().unwrap();
|
||||
let parent_hash = parent_header.hash();
|
||||
@@ -648,11 +686,6 @@ mod tests {
|
||||
// even though there's only one authority some slots might be empty,
|
||||
// so we must keep trying the next slots until we can claim one.
|
||||
let (babe_pre_digest, epoch_descriptor) = loop {
|
||||
inherent_data.replace_data(
|
||||
sp_timestamp::INHERENT_IDENTIFIER,
|
||||
&(slot * SLOT_DURATION),
|
||||
);
|
||||
|
||||
let epoch_descriptor = babe_link.epoch_changes().shared_data().epoch_descriptor_for_child_of(
|
||||
descendent_query(&*service.client()),
|
||||
&parent_hash,
|
||||
@@ -676,6 +709,13 @@ mod tests {
|
||||
slot += 1;
|
||||
};
|
||||
|
||||
let inherent_data = (
|
||||
sp_timestamp::InherentDataProvider::new(
|
||||
std::time::Duration::from_millis(SLOT_DURATION * slot).into(),
|
||||
),
|
||||
sp_consensus_babe::inherents::InherentDataProvider::new(slot.into()),
|
||||
).create_inherent_data().expect("Creates inherent data");
|
||||
|
||||
digest.push(<DigestItem as CompatibleDigestItem>::babe_pre_digest(babe_pre_digest));
|
||||
|
||||
let new_block = futures::executor::block_on(async move {
|
||||
|
||||
@@ -32,6 +32,7 @@ sc-consensus = { version = "0.9.0", path = "../../../client/consensus/common" }
|
||||
|
||||
sp-runtime = { path = "../../../primitives/runtime", version = "3.0.0" }
|
||||
sp-keyring = { version = "3.0.0", path = "../../../primitives/keyring" }
|
||||
sp-timestamp = { version = "3.0.0", path = "../../../primitives/timestamp" }
|
||||
sp-api = { version = "3.0.0", path = "../../../primitives/api" }
|
||||
sp-inherents = { version = "3.0.0", path = "../../../primitives/inherents" }
|
||||
sp-keystore = { version = "0.9.0", path = "../../../primitives/keystore" }
|
||||
|
||||
@@ -22,7 +22,7 @@ use test_runner::{Node, ChainInfo, SignatureVerificationOverride, default_config
|
||||
use grandpa::GrandpaBlockImport;
|
||||
use sc_service::{TFullBackend, TFullClient, Configuration, TaskManager, new_full_parts, TaskExecutor};
|
||||
use std::sync::Arc;
|
||||
use sp_inherents::InherentDataProviders;
|
||||
use sp_inherents::CreateInherentDataProviders;
|
||||
use sc_consensus_babe::BabeBlockImport;
|
||||
use sp_keystore::SyncCryptoStorePtr;
|
||||
use sp_keyring::sr25519::Keyring::Alice;
|
||||
@@ -59,6 +59,10 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
Self::SelectChain,
|
||||
>;
|
||||
type SignedExtras = node_runtime::SignedExtra;
|
||||
type InherentDataProviders = (
|
||||
sp_timestamp::InherentDataProvider,
|
||||
sp_consensus_babe::inherents::InherentDataProvider,
|
||||
);
|
||||
|
||||
fn signed_extras(from: <Self::Runtime as frame_system::Config>::AccountId) -> Self::SignedExtras {
|
||||
(
|
||||
@@ -84,7 +88,11 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
Arc<TFullBackend<Self::Block>>,
|
||||
SyncCryptoStorePtr,
|
||||
TaskManager,
|
||||
InherentDataProviders,
|
||||
Box<dyn CreateInherentDataProviders<
|
||||
Self::Block,
|
||||
(),
|
||||
InherentDataProviders = Self::InherentDataProviders
|
||||
>>,
|
||||
Option<
|
||||
Box<
|
||||
dyn ConsensusDataProvider<
|
||||
@@ -105,7 +113,6 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
new_full_parts::<Self::Block, Self::RuntimeApi, Self::Executor>(config, None)?;
|
||||
let client = Arc::new(client);
|
||||
|
||||
let inherent_providers = InherentDataProviders::new();
|
||||
let select_chain = sc_consensus::LongestChain::new(backend.clone());
|
||||
|
||||
let (grandpa_block_import, ..) =
|
||||
@@ -116,8 +123,9 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
None
|
||||
)?;
|
||||
|
||||
let slot_duration = sc_consensus_babe::Config::get_or_compute(&*client)?;
|
||||
let (block_import, babe_link) = sc_consensus_babe::block_import(
|
||||
sc_consensus_babe::Config::get_or_compute(&*client)?,
|
||||
slot_duration.clone(),
|
||||
grandpa_block_import,
|
||||
client.clone(),
|
||||
)?;
|
||||
@@ -125,7 +133,6 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
let consensus_data_provider = BabeConsensusDataProvider::new(
|
||||
client.clone(),
|
||||
keystore.sync_keystore(),
|
||||
&inherent_providers,
|
||||
babe_link.epoch_changes().clone(),
|
||||
vec![(AuthorityId::from(Alice.public()), 1000)],
|
||||
)
|
||||
@@ -136,7 +143,18 @@ impl ChainInfo for NodeTemplateChainInfo {
|
||||
backend,
|
||||
keystore.sync_keystore(),
|
||||
task_manager,
|
||||
inherent_providers,
|
||||
Box::new(move |_, _| {
|
||||
let slot_duration = slot_duration.clone();
|
||||
async move {
|
||||
let timestamp = sp_timestamp::InherentDataProvider::from_system_time();
|
||||
let slot = sp_consensus_babe::inherents::InherentDataProvider::from_timestamp_and_duration(
|
||||
*timestamp,
|
||||
slot_duration.slot_duration(),
|
||||
);
|
||||
|
||||
Ok((timestamp, slot))
|
||||
}
|
||||
}),
|
||||
Some(Box::new(consensus_data_provider)),
|
||||
select_chain,
|
||||
block_import,
|
||||
|
||||
Reference in New Issue
Block a user