pub fn new_full_base<Runtime, Executor>(
    mut config: Configuration,
) -> Result<
    (
        TaskManager,
        InherentDataProviders,
        Arc<FullClient<Runtime, Executor>>,
        Arc<NetworkService<Block, <Block as BlockT>::Hash>>,
        Arc<sc_transaction_pool::FullPool<Block, FullClient<Runtime, Executor>>>,
    ),
    ServiceError,
>
where
    Runtime: ConstructRuntimeApi<Block, FullClient<Runtime, Executor>> + Send + Sync + 'static,
    Runtime::RuntimeApi:
        RuntimeApiCollection<StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,
    Executor: sc_executor::NativeExecutionDispatch + 'static,
{
    let sc_service::PartialComponents {
        client,
        backend,
        mut task_manager,
        import_queue,
        keystore_container,
        select_chain,
        transaction_pool,
        inherent_data_providers,
        other: (rpc_extensions_builder, import_setup, rpc_setup, mut telemetry),
    } = new_partial(&config)?;

    let shared_voter_state = rpc_setup;

    config
        .network
        .extra_sets
        .push(grandpa::grandpa_peers_set_config());

    #[cfg(feature = "cli")]
    config.network.request_response_protocols.push(
        sc_finality_grandpa_warp_sync::request_response_config_for_chain(
            &config,
            task_manager.spawn_handle(),
            backend.clone(),
            import_setup.1.shared_authority_set().clone(),
        ),
    );

    let (network, network_status_sinks, system_rpc_tx, network_starter) =
        sc_service::build_network(sc_service::BuildNetworkParams {
            config: &config,
            client: client.clone(),
            transaction_pool: transaction_pool.clone(),
            spawn_handle: task_manager.spawn_handle(),
            import_queue,
            on_demand: None,
            block_announce_validator_builder: None,
        })?;

    if config.offchain_worker.enabled {
        sc_service::build_offchain_workers(
            &config,
            task_manager.spawn_handle(),
            client.clone(),
            network.clone(),
        );
    }

    let role = config.role.clone();
    let force_authoring = config.force_authoring;
    let backoff_authoring_blocks =
        Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default());
    let name = config.network.node_name.clone();
    let enable_grandpa = !config.disable_grandpa;
    let prometheus_registry = config.prometheus_registry().cloned();

    sc_service::spawn_tasks(sc_service::SpawnTasksParams {
        config,
        backend: backend.clone(),
        client: client.clone(),
        keystore: keystore_container.sync_keystore(),
        network: network.clone(),
        rpc_extensions_builder: Box::new(rpc_extensions_builder),
        transaction_pool: transaction_pool.clone(),
        task_manager: &mut task_manager,
        on_demand: None,
        remote_blockchain: None,
        network_status_sinks,
        system_rpc_tx,
        telemetry: telemetry.as_mut(),
    })?;

    let (block_import, grandpa_link, babe_link) = import_setup;

    if let sc_service::config::Role::Authority { .. } = &role {
        let proposer = sc_basic_authorship::ProposerFactory::new(
            task_manager.spawn_handle(),
            client.clone(),
            transaction_pool.clone(),
            prometheus_registry.as_ref(),
            telemetry.as_ref().map(|x| x.handle()),
        );

        let can_author_with =
            sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone());

        let babe_config = sc_consensus_babe::BabeParams {
            keystore: keystore_container.sync_keystore(),
            client: client.clone(),
            select_chain,
            env: proposer,
            block_import,
            sync_oracle: network.clone(),
            inherent_data_providers: inherent_data_providers.clone(),
            force_authoring,
            backoff_authoring_blocks,
            babe_link,
            can_author_with,
            block_proposal_slot_portion: sc_consensus_babe::SlotProportion::new(0.5),
            telemetry: telemetry.as_ref().map(|x| x.handle()),
        };

        let babe = sc_consensus_babe::start_babe(babe_config)?;
        task_manager
            .spawn_essential_handle()
            .spawn_blocking("babe-proposer", babe);
    }

    // if the node isn't actively participating in consensus then it doesn't
    // need a keystore, regardless of which protocol we use below.
    let keystore = if role.is_authority() {
        Some(keystore_container.sync_keystore())
    } else {
        None
    };

    let config = grandpa::Config {
        // FIXME #1578 make this available through chainspec
        gossip_duration: std::time::Duration::from_millis(333),
        justification_period: 512,
        name: Some(name),
        observer_enabled: false,
        keystore,
        is_authority: role.is_authority(),
        telemetry: telemetry.as_ref().map(|x| x.handle()),
    };

    if enable_grandpa {
        // start the full GRANDPA voter
        // NOTE: non-authorities could run the GRANDPA observer protocol, but at
        // this point the full voter should provide better guarantees of block
        // and vote data availability than the observer. The observer has not
        // been tested extensively yet and having most nodes in a network run it
        // could lead to finality stalls.
        let grandpa_config = grandpa::GrandpaParams {
            config,
            link: grandpa_link,
            network: network.clone(),
            voting_rule: grandpa::VotingRulesBuilder::default().build(),
            prometheus_registry,
            shared_voter_state,
            telemetry: telemetry.as_ref().map(|x| x.handle()),
        };

        // the GRANDPA voter task is considered infallible, i.e.
        // if it fails we take down the service with it.
        task_manager
            .spawn_essential_handle()
            .spawn_blocking("grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)?);
    }

    network_starter.start_network();
    Ok((
        task_manager,
        inherent_data_providers,
        client,
        network,
        transaction_pool,
    ))
}
/// Creates a full service from the configuration.
Creates a full service from the configuration.
Creates a full service from the configuration .
pub fn new_full_base<Runtime, Executor>(
    mut config: Configuration,
) -> Result<
    (
        TaskManager,
        InherentDataProviders,
        Arc<FullClient<Runtime, Executor>>,
        Arc<NetworkService<Block, <Block as BlockT>::Hash>>,
        Arc<sc_transaction_pool::FullPool<Block, FullClient<Runtime, Executor>>>,
    ),
    ServiceError,
>
where
    Runtime: ConstructRuntimeApi<Block, FullClient<Runtime, Executor>> + Send + Sync + 'static,
    Runtime::RuntimeApi:
        RuntimeApiCollection<StateBackend = sc_client_api::StateBackendFor<FullBackend, Block>>,
    Executor: sc_executor::NativeExecutionDispatch + 'static,
{
    let sc_service::PartialComponents {
        client,
        backend,
        mut task_manager,
        import_queue,
        keystore_container,
        select_chain,
        transaction_pool,
        inherent_data_providers,
        other: (rpc_extensions_builder, import_setup, rpc_setup, mut telemetry),
    } = new_partial(&config)?;
    let shared_voter_state = rpc_setup;
    config
        .network
        .extra_sets
        .push(grandpa::grandpa_peers_set_config());
    #[cfg(feature = "cli")]
    config.network.request_response_protocols.push(
        sc_finality_grandpa_warp_sync::request_response_config_for_chain(
            &config,
            task_manager.spawn_handle(),
            backend.clone(),
            import_setup.1.shared_authority_set().clone(),
        ),
    );
    let (network, network_status_sinks, system_rpc_tx, network_starter) =
        sc_service::build_network(sc_service::BuildNetworkParams {
            config: &config,
            client: client.clone(),
            transaction_pool: transaction_pool.clone(),
            spawn_handle: task_manager.spawn_handle(),
            import_queue,
            on_demand: None,
            block_announce_validator_builder: None,
        })?;
    if config.offchain_worker.enabled {
        sc_service::build_offchain_workers(
            &config,
            task_manager.spawn_handle(),
            client.clone(),
            network.clone(),
        );
    }
    let role = config.role.clone();
    let force_authoring = config.force_authoring;
    let backoff_authoring_blocks =
        Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default());
    let name = config.network.node_name.clone();
    let enable_grandpa = !config.disable_grandpa;
    let prometheus_registry = config.prometheus_registry().cloned();
    sc_service::spawn_tasks(sc_service::SpawnTasksParams {
        config,
        backend: backend.clone(),
        client: client.clone(),
        keystore: keystore_container.sync_keystore(),
        network: network.clone(),
        rpc_extensions_builder: Box::new(rpc_extensions_builder),
        transaction_pool: transaction_pool.clone(),
        task_manager: &mut task_manager,
        on_demand: None,
        remote_blockchain: None,
        network_status_sinks,
        system_rpc_tx,
        telemetry: telemetry.as_mut(),
    })?;
    let (block_import, grandpa_link, babe_link) = import_setup;
    if let sc_service::config::Role::Authority { .. } = &role {
        let proposer = sc_basic_authorship::ProposerFactory::new(
            task_manager.spawn_handle(),
            client.clone(),
            transaction_pool.clone(),
            prometheus_registry.as_ref(),
            telemetry.as_ref().map(|x| x.handle()),
        );
        let can_author_with =
            sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone());
        let babe_config = sc_consensus_babe::BabeParams {
            keystore: keystore_container.sync_keystore(),
            client: client.clone(),
            select_chain,
            env: proposer,
            block_import,
            sync_oracle: network.clone(),
            inherent_data_providers: inherent_data_providers.clone(),
            force_authoring,
            backoff_authoring_blocks,
            babe_link,
            can_author_with,
            block_proposal_slot_portion: sc_consensus_babe::SlotProportion::new(0.5),
            telemetry: telemetry.as_ref().map(|x| x.handle()),
        };
        let babe = sc_consensus_babe::start_babe(babe_config)?;
        task_manager
            .spawn_essential_handle()
            .spawn_blocking("babe-proposer", babe);
    }
    // if the node isn't actively participating in consensus then it doesn't
    // need a keystore, regardless of which protocol we use below.
    let keystore = if role.is_authority() {
        Some(keystore_container.sync_keystore())
    } else {
        None
    };
    let config = grandpa::Config {
        // FIXME #1578 make this available through chainspec
        gossip_duration: std::time::Duration::from_millis(333),
        justification_period: 512,
        name: Some(name),
        observer_enabled: false,
        keystore,
        is_authority: role.is_authority(),
        telemetry: telemetry.as_ref().map(|x| x.handle()),
    };
    if enable_grandpa {
        // start the full GRANDPA voter
        // NOTE: non-authorities could run the GRANDPA observer protocol, but at
        // this point the full voter should provide better guarantees of block
        // and vote data availability than the observer. The observer has not
        // been tested extensively yet and having most nodes in a network run it
        // could lead to finality stalls.
        let grandpa_config = grandpa::GrandpaParams {
            config,
            link: grandpa_link,
            network: network.clone(),
            voting_rule: grandpa::VotingRulesBuilder::default().build(),
            prometheus_registry,
            shared_voter_state,
            telemetry: telemetry.as_ref().map(|x| x.handle()),
        };
        // the GRANDPA voter task is considered infallible, i.e.
        // if it fails we take down the service with it.
        task_manager
            .spawn_essential_handle()
            .spawn_blocking("grandpa-voter", grandpa::run_grandpa_voter(grandpa_config)?);
    }
    network_starter.start_network();
    Ok((
        task_manager,
        inherent_data_providers,
        client,
        network,
        transaction_pool,
    ))
}
pub fn new_full_base < Runtime , Executor > ( mut config : Configuration , ) -> Result < ( TaskManager , InherentDataProviders , Arc < FullClient < Runtime , Executor > > , Arc < NetworkService < Block , < Block as BlockT > :: Hash > > , Arc < sc_transaction_pool :: FullPool < Block , FullClient < Runtime , Executor > > > , ) , ServiceError , > where Runtime : ConstructRuntimeApi < Block , FullClient < Runtime , Executor > > + Send + Sync + ' static , Runtime :: RuntimeApi : RuntimeApiCollection < StateBackend = sc_client_api :: StateBackendFor < FullBackend , Block > > , Executor : sc_executor :: NativeExecutionDispatch + ' static , { let sc_service :: PartialComponents { client , backend , mut task_manager , import_queue , keystore_container , select_chain , transaction_pool , inherent_data_providers , other : ( rpc_extensions_builder , import_setup , rpc_setup , mut telemetry ) , } = new_partial ( & config ) ? ; let shared_voter_state = rpc_setup ; config . network . extra_sets . push ( grandpa :: grandpa_peers_set_config ( ) ) ; # [ cfg ( feature " " ) ] config . network . request_response_protocols . push ( sc_finality_grandpa_warp_sync :: request_response_config_for_chain ( & config , task_manager . spawn_handle ( ) , backend . clone ( ) , import_setup . 1 . shared_authority_set ( ) . clone ( ) , ) , ) ; let ( network , network_status_sinks , system_rpc_tx , network_starter ) = sc_service :: build_network ( sc_service :: BuildNetworkParams { config : & config , client : client . clone ( ) , transaction_pool : transaction_pool . clone ( ) , spawn_handle : task_manager . spawn_handle ( ) , import_queue , on_demand : None , block_announce_validator_builder : None , } ) ? ; if config . offchain_worker . enabled { sc_service :: build_offchain_workers ( & config , task_manager . spawn_handle ( ) , client . clone ( ) , network . clone ( ) , ) ; } let role = config . role . clone ( ) ; let force_authoring = config . force_authoring ; let backoff_authoring_blocks = Some ( sc_consensus_slots :: BackoffAuthoringOnFinalizedHeadLagging :: default ( ) ) ; let name = config . network . node_name . clone ( ) ; let enable_grandpa = ! config . disable_grandpa ; let prometheus_registry = config . prometheus_registry ( ) . cloned ( ) ; sc_service :: spawn_tasks ( sc_service :: SpawnTasksParams { config , backend : backend . clone ( ) , client : client . clone ( ) , keystore : keystore_container . sync_keystore ( ) , network : network . clone ( ) , rpc_extensions_builder : Box :: new ( rpc_extensions_builder ) , transaction_pool : transaction_pool . clone ( ) , task_manager : & mut task_manager , on_demand : None , remote_blockchain : None , network_status_sinks , system_rpc_tx , telemetry : telemetry . as_mut ( ) , } ) ? ; let ( block_import , grandpa_link , babe_link ) = import_setup ; if let sc_service :: config :: Role :: Authority { .. } = & role { let proposer = sc_basic_authorship :: ProposerFactory :: new ( task_manager . spawn_handle ( ) , client . clone ( ) , transaction_pool . clone ( ) , prometheus_registry . as_ref ( ) , telemetry . as_ref ( ) . map ( | x | x . handle ( ) ) , ) ; let can_author_with = sp_consensus :: CanAuthorWithNativeVersion :: new ( client . executor ( ) . clone ( ) ) ; let babe_config = sc_consensus_babe :: BabeParams { keystore : keystore_container . sync_keystore ( ) , client : client . clone ( ) , select_chain , env : proposer , block_import , sync_oracle : network . clone ( ) , inherent_data_providers : inherent_data_providers . clone ( ) , force_authoring , backoff_authoring_blocks , babe_link , can_author_with , block_proposal_slot_portion : sc_consensus_babe :: SlotProportion :: new ( 0.5 ) , telemetry : telemetry . as_ref ( ) . map ( | x | x . handle ( ) ) , } ; let babe = sc_consensus_babe :: start_babe ( babe_config ) ? ; task_manager . spawn_essential_handle ( ) . spawn_blocking ( " " , babe ) ; } // if the node isn't actively participating in consensus then it doesn't // need a keystore, regardless of which protocol we use below. let keystore = if role . is_authority ( ) { Some ( keystore_container . sync_keystore ( ) ) } else { None } ; let config = grandpa :: Config { // FIXME #1578 make this available through chainspec gossip_duration : std :: time :: Duration :: from_millis ( 333 ) , justification_period : 512 , name : Some ( name ) , observer_enabled : false , keystore , is_authority : role . is_authority ( ) , telemetry : telemetry . as_ref ( ) . map ( | x | x . handle ( ) ) , } ; if enable_grandpa { // start the full GRANDPA voter // NOTE: non-authorities could run the GRANDPA observer protocol, but at // this point the full voter should provide better guarantees of block // and vote data availability than the observer. The observer has not // been tested extensively yet and having most nodes in a network run it // could lead to finality stalls. let grandpa_config = grandpa :: GrandpaParams { config , link : grandpa_link , network : network . clone ( ) , voting_rule : grandpa :: VotingRulesBuilder :: default ( ) . build ( ) , prometheus_registry , shared_voter_state , telemetry : telemetry . as_ref ( ) . map ( | x | x . handle ( ) ) , } ; // the GRANDPA voter task is considered infallible, i.e. // if it fails we take down the service with it. task_manager . spawn_essential_handle ( ) . spawn_blocking ( " " , grandpa :: run_grandpa_voter ( grandpa_config ) ? ) ; } network_starter . start_network ( ) ; Ok ( ( task_manager , inherent_data_providers , client , network , transaction_pool , ) ) }
Creates a full service from the configuration.
Creates a full service from the configuration .
config
Configuration