diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs b/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs index da10aa3641..3898f9f27d 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/v1.rs @@ -25,11 +25,12 @@ use primitives::v1::{ Id as ParaId, OccupiedCoreAssumption, SessionIndex, ValidationCode, CommittedCandidateReceipt, ScheduledCore, OccupiedCore, CoreOccupied, CoreIndex, GroupIndex, CandidateEvent, PersistedValidationData, SessionInfo, - InboundDownwardMessage, InboundHrmpMessage, Hash, + InboundDownwardMessage, InboundHrmpMessage, Hash, AuthorityDiscoveryId }; use frame_support::debug; use crate::{initializer, inclusion, scheduler, configuration, paras, session_info, dmp, hrmp, shared}; + /// Implementation for the `validators` function of the runtime API. pub fn validators() -> Vec { >::validators() @@ -231,6 +232,27 @@ pub fn session_index_for_child() -> SessionIndex { >::session_index() } +/// Implementation for the `AuthorityDiscoveryApi::authorities()` function of the runtime API. +/// It is a heavy call, but currently only used for authority discovery, so it is fine. +/// Gets next, current and some historical authority ids using session_info module. +pub fn relevant_authority_ids() -> Vec { + let current_session_index = session_index_for_child::(); + let earliest_stored_session = >::earliest_stored_session(); + let mut authority_ids = >::next_authorities(); + + for session_index in earliest_stored_session..=current_session_index { + let info = >::session_info(session_index); + if let Some(mut info) = info { + authority_ids.append(&mut info.discovery_keys); + } + } + + authority_ids.sort(); + authority_ids.dedup(); + + authority_ids +} + /// Implementation for the `validation_code` function of the runtime API. pub fn validation_code( para_id: ParaId, diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index ba2d833eaa..b04cd72609 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -849,7 +849,7 @@ sp_api::impl_runtime_apis! { impl authority_discovery_primitives::AuthorityDiscoveryApi for Runtime { fn authorities() -> Vec { - AuthorityDiscovery::authorities() + runtime_api_impl::relevant_authority_ids::() } }