Skip to content

Commit 24216c2

Browse files
authored
A0-1876: refactor session info (#1000)
* refactor SessionInfo to use BlockNumber type * rename SessionInfo to SessionBoundaryInfo * rename AuthorityProvider argument
1 parent 370ecde commit 24216c2

13 files changed

Lines changed: 151 additions & 197 deletions

File tree

finality-aleph/src/lib.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,7 @@ use crate::{
2323
abft::{CurrentNetworkData, LegacyNetworkData, CURRENT_VERSION, LEGACY_VERSION},
2424
aggregation::{CurrentRmcNetworkData, LegacyRmcNetworkData},
2525
network::data::split::Split,
26-
session::{
27-
first_block_of_session, last_block_of_session, session_id_from_block_num,
28-
SessionBoundaries, SessionId,
29-
},
26+
session::{SessionBoundaries, SessionId},
3027
VersionedTryFromError::{ExpectedNewGotOld, ExpectedOldGotNew},
3128
};
3229

finality-aleph/src/nodes/mod.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod validator_node;
33

44
use std::{future::Future, sync::Arc};
55

6+
use aleph_primitives::BlockNumber;
67
pub use nonvalidator_node::run_nonvalidator_node;
78
use sc_client_api::Backend;
89
use sc_network::NetworkService;
@@ -15,9 +16,9 @@ use crate::{
1516
justification::{
1617
JustificationHandler, JustificationRequestSchedulerImpl, SessionInfo, SessionInfoProvider,
1718
},
18-
last_block_of_session, mpsc,
19+
mpsc,
1920
mpsc::UnboundedSender,
20-
session_id_from_block_num,
21+
session::SessionBoundaryInfo,
2122
session_map::ReadOnlySessionMap,
2223
sync::SessionVerifier,
2324
BlockchainBackend, JustificationNotification, Metrics, MillisecsPerBlock, SessionPeriod,
@@ -44,23 +45,26 @@ struct JustificationParams<B: Block, H: ExHashT, C, BB> {
4445

4546
struct SessionInfoProviderImpl {
4647
session_authorities: ReadOnlySessionMap,
47-
session_period: SessionPeriod,
48+
session_info: SessionBoundaryInfo,
4849
}
4950

5051
impl SessionInfoProviderImpl {
5152
fn new(session_authorities: ReadOnlySessionMap, session_period: SessionPeriod) -> Self {
5253
Self {
5354
session_authorities,
54-
session_period,
55+
session_info: SessionBoundaryInfo::new(session_period),
5556
}
5657
}
5758
}
5859

5960
#[async_trait::async_trait]
60-
impl<B: Block> SessionInfoProvider<B, SessionVerifier> for SessionInfoProviderImpl {
61+
impl<B: Block> SessionInfoProvider<B, SessionVerifier> for SessionInfoProviderImpl
62+
where
63+
B::Header: Header<Number = BlockNumber>,
64+
{
6165
async fn for_block_num(&self, number: NumberFor<B>) -> SessionInfo<B, SessionVerifier> {
62-
let current_session = session_id_from_block_num(number, self.session_period);
63-
let last_block_height = last_block_of_session(current_session, self.session_period);
66+
let current_session = self.session_info.session_id_from_block_num(number);
67+
let last_block_height = self.session_info.last_block_of_session(current_session);
6468
let verifier = self
6569
.session_authorities
6670
.get(current_session)
@@ -83,6 +87,7 @@ fn setup_justification_handler<B, H, C, BB, BE>(
8387
)
8488
where
8589
B: Block,
90+
B::Header: Header<Number = BlockNumber>,
8691
H: ExHashT,
8792
C: crate::ClientForAleph<B, BE> + Send + Sync + 'static,
8893
C::Api: aleph_primitives::AlephSessionApi<B>,

finality-aleph/src/nodes/nonvalidator_node.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
use aleph_primitives::BlockNumber;
12
use log::{debug, error};
23
use sc_client_api::Backend;
34
use sc_network_common::ExHashT;
45
use sp_consensus::SelectChain;
5-
use sp_runtime::traits::Block;
6+
use sp_runtime::traits::{Block, Header};
67

78
use crate::{
89
nodes::{setup_justification_handler, JustificationParams},
@@ -13,6 +14,7 @@ use crate::{
1314
pub async fn run_nonvalidator_node<B, H, C, BB, BE, SC>(aleph_config: AlephConfig<B, H, C, SC, BB>)
1415
where
1516
B: Block,
17+
B::Header: Header<Number = BlockNumber>,
1618
H: ExHashT,
1719
C: crate::ClientForAleph<B, BE> + Send + Sync + 'static,
1820
C::Api: aleph_primitives::AlephSessionApi<B>,

finality-aleph/src/nodes/validator_node.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ use crate::{
2020
},
2121
nodes::{setup_justification_handler, JustificationParams},
2222
party::{
23-
impls::{ChainStateImpl, SessionInfoImpl},
24-
manager::NodeSessionManagerImpl,
25-
ConsensusParty, ConsensusPartyParams,
23+
impls::ChainStateImpl, manager::NodeSessionManagerImpl, ConsensusParty,
24+
ConsensusPartyParams,
2625
},
26+
session::SessionBoundaryInfo,
2727
session_map::{AuthorityProviderImpl, FinalityNotificatorImpl, SessionMapUpdater},
2828
AlephConfig, BlockchainBackend,
2929
};
@@ -165,7 +165,7 @@ where
165165
connection_manager,
166166
keystore,
167167
),
168-
session_info: SessionInfoImpl::new(session_period),
168+
session_info: SessionBoundaryInfo::new(session_period),
169169
});
170170

171171
debug!(target: "aleph-party", "Consensus party has started.");

finality-aleph/src/party/impls.rs

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ use sp_consensus::SyncOracle;
88
use sp_runtime::traits::{Block as BlockT, Header as HeaderT};
99

1010
use crate::{
11-
party::traits::{ChainState, SessionInfo, SyncState},
12-
session::{first_block_of_session, last_block_of_session, session_id_from_block_num},
13-
ClientForAleph, SessionId, SessionPeriod,
11+
party::traits::{ChainState, SyncState},
12+
ClientForAleph,
1413
};
1514

1615
pub struct ChainStateImpl<B, BE, CFA>
@@ -38,30 +37,6 @@ where
3837
}
3938
}
4039

41-
pub struct SessionInfoImpl {
42-
session_period: SessionPeriod,
43-
}
44-
45-
impl SessionInfoImpl {
46-
pub fn new(session_period: SessionPeriod) -> Self {
47-
Self { session_period }
48-
}
49-
}
50-
51-
impl SessionInfo for SessionInfoImpl {
52-
fn session_id_from_block_num(&self, n: BlockNumber) -> SessionId {
53-
session_id_from_block_num(n, self.session_period)
54-
}
55-
56-
fn last_block_of_session(&self, session_id: SessionId) -> BlockNumber {
57-
last_block_of_session(session_id, self.session_period)
58-
}
59-
60-
fn first_block_of_session(&self, session_id: SessionId) -> BlockNumber {
61-
first_block_of_session(session_id, self.session_period)
62-
}
63-
}
64-
6540
impl<B: BlockT, H: ExHashT> SyncState for Arc<NetworkService<B, H>> {
6641
fn is_major_syncing(&self) -> bool {
6742
NetworkService::is_major_syncing(self)

finality-aleph/src/party/mocks.rs

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@ use crate::{
1313
party::{
1414
backup::ABFTBackup,
1515
manager::AuthorityTask,
16-
traits::{ChainState, NodeSessionManager, SessionInfo, SyncState},
16+
traits::{ChainState, NodeSessionManager, SyncState},
1717
},
18-
session::{first_block_of_session, last_block_of_session, session_id_from_block_num},
19-
AuthorityId, NodeIndex, SessionId, SessionPeriod,
18+
AuthorityId, NodeIndex, SessionId,
2019
};
2120

2221
type AMutex<T> = Arc<Mutex<T>>;
@@ -176,29 +175,3 @@ impl NodeSessionManager for Arc<MockNodeSessionManager> {
176175
None
177176
}
178177
}
179-
180-
pub struct MockSessionInfo {
181-
pub session_period: SessionPeriod,
182-
}
183-
184-
impl MockSessionInfo {
185-
pub fn new(session_period: u32) -> Self {
186-
Self {
187-
session_period: SessionPeriod(session_period),
188-
}
189-
}
190-
}
191-
192-
impl SessionInfo for MockSessionInfo {
193-
fn session_id_from_block_num(&self, n: BlockNumber) -> SessionId {
194-
session_id_from_block_num(n, self.session_period)
195-
}
196-
197-
fn last_block_of_session(&self, session_id: SessionId) -> BlockNumber {
198-
last_block_of_session(session_id, self.session_period)
199-
}
200-
201-
fn first_block_of_session(&self, session_id: SessionId) -> BlockNumber {
202-
first_block_of_session(session_id, self.session_period)
203-
}
204-
}

finality-aleph/src/party/mod.rs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ use tokio::{task::spawn_blocking, time::sleep};
77
use crate::{
88
party::{
99
manager::{Handle, SubtaskCommon as AuthoritySubtaskCommon, Task},
10-
traits::{ChainState, NodeSessionManager, SessionInfo, SyncState},
10+
traits::{ChainState, NodeSessionManager, SyncState},
1111
},
12+
session::SessionBoundaryInfo,
1213
session_map::ReadOnlySessionMap,
1314
SessionId,
1415
};
@@ -21,40 +22,38 @@ pub mod traits;
2122
#[cfg(test)]
2223
mod mocks;
2324

24-
pub(crate) struct ConsensusPartyParams<ST, CS, NSM, SI> {
25+
pub(crate) struct ConsensusPartyParams<ST, CS, NSM> {
2526
pub session_authorities: ReadOnlySessionMap,
2627
pub chain_state: CS,
2728
pub sync_state: ST,
2829
pub backup_saving_path: Option<PathBuf>,
2930
pub session_manager: NSM,
30-
pub session_info: SI,
31+
pub session_info: SessionBoundaryInfo,
3132
}
3233

33-
pub(crate) struct ConsensusParty<ST, CS, NSM, SI>
34+
pub(crate) struct ConsensusParty<ST, CS, NSM>
3435
where
3536
ST: SyncState,
3637
CS: ChainState,
3738
NSM: NodeSessionManager,
38-
SI: SessionInfo,
3939
{
4040
session_authorities: ReadOnlySessionMap,
4141
chain_state: CS,
4242
sync_state: ST,
4343
backup_saving_path: Option<PathBuf>,
4444
session_manager: NSM,
45-
session_info: SI,
45+
session_info: SessionBoundaryInfo,
4646
}
4747

4848
const SESSION_STATUS_CHECK_PERIOD: Duration = Duration::from_millis(1000);
4949

50-
impl<ST, CS, NSM, SI> ConsensusParty<ST, CS, NSM, SI>
50+
impl<ST, CS, NSM> ConsensusParty<ST, CS, NSM>
5151
where
5252
ST: SyncState,
5353
CS: ChainState,
5454
NSM: NodeSessionManager,
55-
SI: SessionInfo,
5655
{
57-
pub(crate) fn new(params: ConsensusPartyParams<ST, CS, NSM, SI>) -> Self {
56+
pub(crate) fn new(params: ConsensusPartyParams<ST, CS, NSM>) -> Self {
5857
let ConsensusPartyParams {
5958
session_authorities,
6059
sync_state,
@@ -269,19 +268,16 @@ mod tests {
269268

270269
use crate::{
271270
party::{
272-
mocks::{MockChainState, MockNodeSessionManager, MockSessionInfo, MockSyncState},
271+
mocks::{MockChainState, MockNodeSessionManager, MockSyncState},
273272
ConsensusParty, ConsensusPartyParams, SESSION_STATUS_CHECK_PERIOD,
274273
},
274+
session::SessionBoundaryInfo,
275275
session_map::SharedSessionMap,
276276
SessionId, SessionPeriod,
277277
};
278278

279-
type Party = ConsensusParty<
280-
Arc<MockSyncState>,
281-
Arc<MockChainState>,
282-
Arc<MockNodeSessionManager>,
283-
MockSessionInfo,
284-
>;
279+
type Party =
280+
ConsensusParty<Arc<MockSyncState>, Arc<MockChainState>, Arc<MockNodeSessionManager>>;
285281

286282
struct PartyState {
287283
validator_started: Vec<SessionId>,
@@ -504,12 +500,7 @@ mod tests {
504500
fn create_mocked_consensus_party(
505501
session_period: SessionPeriod,
506502
) -> (
507-
ConsensusParty<
508-
Arc<MockSyncState>,
509-
Arc<MockChainState>,
510-
Arc<MockNodeSessionManager>,
511-
MockSessionInfo,
512-
>,
503+
ConsensusParty<Arc<MockSyncState>, Arc<MockChainState>, Arc<MockNodeSessionManager>>,
513504
MockController,
514505
) {
515506
let shared_map = SharedSessionMap::new();
@@ -518,7 +509,7 @@ mod tests {
518509
let chain_state = Arc::new(MockChainState::new());
519510
let sync_state = Arc::new(MockSyncState::new());
520511
let session_manager = Arc::new(MockNodeSessionManager::new());
521-
let session_info = MockSessionInfo::new(session_period.0);
512+
let session_info = SessionBoundaryInfo::new(session_period);
522513

523514
let controller = MockController {
524515
shared_session_map: shared_map,

finality-aleph/src/party/traits.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,3 @@ pub trait SyncState {
6060
/// [1]: finality_aleph::network::RequestBlocks::is_major_syncing
6161
fn is_major_syncing(&self) -> bool;
6262
}
63-
64-
/// Abstraction of the session boundaries.
65-
pub trait SessionInfo {
66-
/// Returns session id of the session that block belongs to.
67-
fn session_id_from_block_num(&self, n: BlockNumber) -> SessionId;
68-
/// Returns block number which is the last block of the session.
69-
fn last_block_of_session(&self, session_id: SessionId) -> BlockNumber;
70-
/// Returns block number which is the first block of the session.
71-
fn first_block_of_session(&self, session_id: SessionId) -> BlockNumber;
72-
}

finality-aleph/src/session.rs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1+
use aleph_primitives::BlockNumber;
12
use codec::{Decode, Encode};
2-
use sp_runtime::{
3-
traits::{AtLeast32BitUnsigned, Block},
4-
SaturatedConversion,
5-
};
3+
use sp_runtime::traits::Block;
64

75
use crate::NumberFor;
86

@@ -15,8 +13,8 @@ pub struct SessionBoundaries<B: Block> {
1513
impl<B: Block> SessionBoundaries<B> {
1614
pub fn new(session_id: SessionId, period: SessionPeriod) -> Self {
1715
SessionBoundaries {
18-
first_block: first_block_of_session(session_id, period),
19-
last_block: last_block_of_session(session_id, period),
16+
first_block: first_block_of_session(session_id, period).into(),
17+
last_block: last_block_of_session(session_id, period).into(),
2018
}
2119
}
2220

@@ -29,25 +27,42 @@ impl<B: Block> SessionBoundaries<B> {
2927
}
3028
}
3129

32-
pub fn first_block_of_session<N: AtLeast32BitUnsigned>(
33-
session_id: SessionId,
34-
period: SessionPeriod,
35-
) -> N {
36-
(session_id.0 * period.0).into()
30+
fn first_block_of_session(session_id: SessionId, period: SessionPeriod) -> BlockNumber {
31+
session_id.0 * period.0
3732
}
3833

39-
pub fn last_block_of_session<N: AtLeast32BitUnsigned>(
40-
session_id: SessionId,
41-
period: SessionPeriod,
42-
) -> N {
43-
((session_id.0 + 1) * period.0 - 1).into()
34+
fn last_block_of_session(session_id: SessionId, period: SessionPeriod) -> BlockNumber {
35+
(session_id.0 + 1) * period.0 - 1
4436
}
4537

46-
pub fn session_id_from_block_num<N: AtLeast32BitUnsigned>(
47-
num: N,
48-
period: SessionPeriod,
49-
) -> SessionId {
50-
SessionId((num / period.0.into()).saturated_into())
38+
fn session_id_from_block_num(num: BlockNumber, period: SessionPeriod) -> SessionId {
39+
SessionId(num / period.0)
40+
}
41+
42+
pub struct SessionBoundaryInfo {
43+
session_period: SessionPeriod,
44+
}
45+
46+
/// Struct for getting the session boundaries.
47+
impl SessionBoundaryInfo {
48+
pub fn new(session_period: SessionPeriod) -> Self {
49+
Self { session_period }
50+
}
51+
52+
/// Returns session id of the session that block belongs to.
53+
pub fn session_id_from_block_num(&self, n: BlockNumber) -> SessionId {
54+
session_id_from_block_num(n, self.session_period)
55+
}
56+
57+
/// Returns block number which is the last block of the session.
58+
pub fn last_block_of_session(&self, session_id: SessionId) -> BlockNumber {
59+
last_block_of_session(session_id, self.session_period)
60+
}
61+
62+
/// Returns block number which is the first block of the session.
63+
pub fn first_block_of_session(&self, session_id: SessionId) -> BlockNumber {
64+
first_block_of_session(session_id, self.session_period)
65+
}
5166
}
5267

5368
#[cfg(test)]

0 commit comments

Comments
 (0)