pub fn new_full(
	mut config: Configuration,
) -> Result<
	(
		TaskManager,
		InherentDataProviders,
		Arc<FullClient>,
		Arc<sc_network::NetworkService<Block, <Block as BlockT>::Hash>>,
		sc_service::NetworkStatusSinks<Block>,
		Arc<sc_transaction_pool::FullPool<Block, FullClient>>,
	),
	ServiceError,
> {
	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),
	} = new_partial(&config)?;

	let backoff_authoring_blocks = Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default());

	let shared_voter_state = rpc_setup;

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

	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,
			backend.clone(),
			task_manager.spawn_handle(),
			client.clone(),
			network.clone(),
		);
	}

	let role = config.role.clone();
	let force_authoring = config.force_authoring;
	let name = config.network.node_name.clone();
	let enable_grandpa = !config.disable_grandpa;
	let prometheus_registry = config.prometheus_registry().cloned();

	let telemetry_span = TelemetrySpan::new();
	let _telemetry_span_entered = telemetry_span.enter();

	let (_rpc_handlers, telemetry_connection_notifier) = sc_service::spawn_tasks(sc_service::SpawnTasksParams {
		config,
		backend: backend,
		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: network_status_sinks.clone(),
		system_rpc_tx,
		telemetry_span: Some(telemetry_span.clone()),
	})?;

	let (block_import, grandpa_link, babe_link) = import_setup;

	if role.is_authority() {
		let proposer = sc_basic_authorship::ProposerFactory::new(
			task_manager.spawn_handle(),
			client.clone(),
			transaction_pool.clone(),
			prometheus_registry.as_ref(),
		);

		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,
			block_import,
			env: proposer,
			sync_oracle: network.clone(),
			inherent_data_providers: inherent_data_providers.clone(),
			force_authoring,
			backoff_authoring_blocks,
			babe_link,
			can_author_with,
		};

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

	let _authority_discovery_service = if role.is_authority() {
		use futures::StreamExt;
		use sc_network::Event;

		let authority_discovery_role = if role.is_authority() {
			sc_authority_discovery::Role::PublishAndDiscover(keystore_container.keystore())
		} else {
			// don't publish our addresses when we're only a collator
			sc_authority_discovery::Role::Discover
		};
		let dht_event_stream = network.event_stream("authority-discovery").filter_map(|e| async move {
			match e {
				Event::Dht(e) => Some(e),
				_ => None,
			}
		});
		let (worker, service) = sc_authority_discovery::new_worker_and_service(
			client.clone(),
			network.clone(),
			Box::pin(dht_event_stream),
			authority_discovery_role,
			prometheus_registry.clone(),
		);

		task_manager
			.spawn_handle()
			.spawn("authority-discovery-worker", worker.run());
		Some(service)
	} else {
		None
	};

	// 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 grandpa_config = sc_finality_grandpa::Config {
		// FIXME #1578 make this available through chainspec
		gossip_duration: Duration::from_millis(1000),
		justification_period: 512,
		name: Some(name),
		observer_enabled: false,
		keystore,
		is_authority: role.is_authority(),
	};

	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 = sc_finality_grandpa::GrandpaParams {
			config: grandpa_config,
			link: grandpa_link,
			network: network.clone(),
			telemetry_on_connect: telemetry_connection_notifier.map(|x| x.on_connect_stream()),
			voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(),
			prometheus_registry: prometheus_registry,
			shared_voter_state,
		};

		// 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", sc_finality_grandpa::run_grandpa_voter(grandpa_config)?);
	}

	network_starter.start_network();
	Ok((
		task_manager,
		inherent_data_providers,
		client,
		network,
		network_status_sinks,
		transaction_pool,
	))
}
/// Builds a new service for a full client.
Builds a new service for a full client.
Builds a new service for a full client .
pub fn new_full(
	mut config: Configuration,
) -> Result<
	(
		TaskManager,
		InherentDataProviders,
		Arc<FullClient>,
		Arc<sc_network::NetworkService<Block, <Block as BlockT>::Hash>>,
		sc_service::NetworkStatusSinks<Block>,
		Arc<sc_transaction_pool::FullPool<Block, FullClient>>,
	),
	ServiceError,
> {
	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),
	} = new_partial(&config)?;
	let backoff_authoring_blocks = Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default());
	let shared_voter_state = rpc_setup;
	config
		.network
		.extra_sets
		.push(sc_finality_grandpa::grandpa_peers_set_config());
	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,
			backend.clone(),
			task_manager.spawn_handle(),
			client.clone(),
			network.clone(),
		);
	}
	let role = config.role.clone();
	let force_authoring = config.force_authoring;
	let name = config.network.node_name.clone();
	let enable_grandpa = !config.disable_grandpa;
	let prometheus_registry = config.prometheus_registry().cloned();
	let telemetry_span = TelemetrySpan::new();
	let _telemetry_span_entered = telemetry_span.enter();
	let (_rpc_handlers, telemetry_connection_notifier) = sc_service::spawn_tasks(sc_service::SpawnTasksParams {
		config,
		backend: backend,
		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: network_status_sinks.clone(),
		system_rpc_tx,
		telemetry_span: Some(telemetry_span.clone()),
	})?;
	let (block_import, grandpa_link, babe_link) = import_setup;
	if role.is_authority() {
		let proposer = sc_basic_authorship::ProposerFactory::new(
			task_manager.spawn_handle(),
			client.clone(),
			transaction_pool.clone(),
			prometheus_registry.as_ref(),
		);
		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,
			block_import,
			env: proposer,
			sync_oracle: network.clone(),
			inherent_data_providers: inherent_data_providers.clone(),
			force_authoring,
			backoff_authoring_blocks,
			babe_link,
			can_author_with,
		};
		let babe = sc_consensus_babe::start_babe(babe_config)?;
		task_manager.spawn_essential_handle().spawn_blocking("babe", babe);
	}
	let _authority_discovery_service = if role.is_authority() {
		use futures::StreamExt;
		use sc_network::Event;
		let authority_discovery_role = if role.is_authority() {
			sc_authority_discovery::Role::PublishAndDiscover(keystore_container.keystore())
		} else {
			// don't publish our addresses when we're only a collator
			sc_authority_discovery::Role::Discover
		};
		let dht_event_stream = network.event_stream("authority-discovery").filter_map(|e| async move {
			match e {
				Event::Dht(e) => Some(e),
				_ => None,
			}
		});
		let (worker, service) = sc_authority_discovery::new_worker_and_service(
			client.clone(),
			network.clone(),
			Box::pin(dht_event_stream),
			authority_discovery_role,
			prometheus_registry.clone(),
		);
		task_manager
			.spawn_handle()
			.spawn("authority-discovery-worker", worker.run());
		Some(service)
	} else {
		None
	};
	// 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 grandpa_config = sc_finality_grandpa::Config {
		// FIXME #1578 make this available through chainspec
		gossip_duration: Duration::from_millis(1000),
		justification_period: 512,
		name: Some(name),
		observer_enabled: false,
		keystore,
		is_authority: role.is_authority(),
	};
	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 = sc_finality_grandpa::GrandpaParams {
			config: grandpa_config,
			link: grandpa_link,
			network: network.clone(),
			telemetry_on_connect: telemetry_connection_notifier.map(|x| x.on_connect_stream()),
			voting_rule: sc_finality_grandpa::VotingRulesBuilder::default().build(),
			prometheus_registry: prometheus_registry,
			shared_voter_state,
		};
		// 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", sc_finality_grandpa::run_grandpa_voter(grandpa_config)?);
	}
	network_starter.start_network();
	Ok((
		task_manager,
		inherent_data_providers,
		client,
		network,
		network_status_sinks,
		transaction_pool,
	))
}
pub fn new_full ( mut config : Configuration , ) -> Result < ( TaskManager , InherentDataProviders , Arc < FullClient > , Arc < sc_network :: NetworkService < Block , < Block as BlockT > :: Hash > > , sc_service :: NetworkStatusSinks < Block > , Arc < sc_transaction_pool :: FullPool < Block , FullClient > > , ) , ServiceError , > { 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 ) , } = new_partial ( & config ) ? ; let backoff_authoring_blocks = Some ( sc_consensus_slots :: BackoffAuthoringOnFinalizedHeadLagging :: default ( ) ) ; let shared_voter_state = rpc_setup ; config . network . extra_sets . push ( sc_finality_grandpa :: grandpa_peers_set_config ( ) ) ; 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 , backend . clone ( ) , task_manager . spawn_handle ( ) , client . clone ( ) , network . clone ( ) , ) ; } let role = config . role . clone ( ) ; let force_authoring = config . force_authoring ; let name = config . network . node_name . clone ( ) ; let enable_grandpa = ! config . disable_grandpa ; let prometheus_registry = config . prometheus_registry ( ) . cloned ( ) ; let telemetry_span = TelemetrySpan :: new ( ) ; let _telemetry_span_entered = telemetry_span . enter ( ) ; let ( _rpc_handlers , telemetry_connection_notifier ) = sc_service :: spawn_tasks ( sc_service :: SpawnTasksParams { config , backend : backend , 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 : network_status_sinks . clone ( ) , system_rpc_tx , telemetry_span : Some ( telemetry_span . clone ( ) ) , } ) ? ; let ( block_import , grandpa_link , babe_link ) = import_setup ; if role . is_authority ( ) { let proposer = sc_basic_authorship :: ProposerFactory :: new ( task_manager . spawn_handle ( ) , client . clone ( ) , transaction_pool . clone ( ) , prometheus_registry . as_ref ( ) , ) ; 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 , block_import , env : proposer , sync_oracle : network . clone ( ) , inherent_data_providers : inherent_data_providers . clone ( ) , force_authoring , backoff_authoring_blocks , babe_link , can_author_with , } ; let babe = sc_consensus_babe :: start_babe ( babe_config ) ? ; task_manager . spawn_essential_handle ( ) . spawn_blocking ( " " , babe ) ; } let _authority_discovery_service = if role . is_authority ( ) { use futures :: StreamExt ; use sc_network :: Event ; let authority_discovery_role = if role . is_authority ( ) { sc_authority_discovery :: Role :: PublishAndDiscover ( keystore_container . keystore ( ) ) } else { // don't publish our addresses when we're only a collator sc_authority_discovery :: Role :: Discover } ; let dht_event_stream = network . event_stream ( " " ) . filter_map ( | e | async move { match e { Event :: Dht ( e ) => Some ( e ) , _ => None , } } ) ; let ( worker , service ) = sc_authority_discovery :: new_worker_and_service ( client . clone ( ) , network . clone ( ) , Box :: pin ( dht_event_stream ) , authority_discovery_role , prometheus_registry . clone ( ) , ) ; task_manager . spawn_handle ( ) . spawn ( " " , worker . run ( ) ) ; Some ( service ) } else { None } ; // 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 grandpa_config = sc_finality_grandpa :: Config { // FIXME #1578 make this available through chainspec gossip_duration : Duration :: from_millis ( 1000 ) , justification_period : 512 , name : Some ( name ) , observer_enabled : false , keystore , is_authority : role . is_authority ( ) , } ; 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 = sc_finality_grandpa :: GrandpaParams { config : grandpa_config , link : grandpa_link , network : network . clone ( ) , telemetry_on_connect : telemetry_connection_notifier . map ( | x | x . on_connect_stream ( ) ) , voting_rule : sc_finality_grandpa :: VotingRulesBuilder :: default ( ) . build ( ) , prometheus_registry : prometheus_registry , shared_voter_state , } ; // 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 ( " " , sc_finality_grandpa :: run_grandpa_voter ( grandpa_config ) ? ) ; } network_starter . start_network ( ) ; Ok ( ( task_manager , inherent_data_providers , client , network , network_status_sinks , transaction_pool , ) ) }
Builds a new service for a full client.
Builds a new service for a full client .
config
Configuration