1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
//! # Consensus Groups
//!
//! Consensus groups are clusters of trusted nodes on the same mosaik network
//! that coordinate with each other for load balancing and failover. Members of
//! a group share a secret key that authenticates membership, and they maintain
//! a consistent, replicated view of group state through a modified Raft
//! consensus protocol.
//!
//! ## Trust Model
//!
//! Groups are **not** Byzantine fault tolerant. All members within a group are
//! assumed to be honest and operated by the same entity. The group key acts as
//! the primary admission control — only nodes that know the key can join.
//!
//! For stronger integrity guarantees, groups can optionally require
//! hardware attestations via
//! [`TicketValidator`](crate::primitives::TicketValidator)s (see
//! [`GroupBuilder::require_ticket`]). When combined with TEE
//! enclaves such as Intel TDX, this provides cryptographic proof that
//! every group member is running the expected software, hardening the
//! trust model against compromised or tampered nodes.
//!
//! ## Bonds
//!
//! Every pair of group members maintains a persistent **bond** — an
//! authenticated, bidirectional connection established through a mutual secret
//! proof exchange. Bonds carry Raft consensus messages, heartbeats, and
//! log-sync traffic. The full mesh of bonds gives every member a direct channel
//! to every other member.
//!
//! ## Consensus
//!
//! Groups run a modified Raft protocol to elect a leader and replicate a log of
//! commands to a pluggable [`StateMachine`]. Key differences from standard
//! Raft:
//!
//! - **Non-voting followers.** A follower whose log is behind the leader's
//! state is considered a non-voting follower. Non-voting followers send
//! `Abstain` responses to both `RequestVote` and `AppendEntries` messages.
//! They automatically become voting members once their log catches up.
//!
//! - **Leader simplicity.** The leader does not track per-follower progress
//! (`next_index` / `match_index`). It broadcasts `AppendEntries` with the
//! latest entries and advances its commit index based on the count of
//! affirmative acknowledgements, ignoring abstentions.
//!
//! - **Dynamic quorum.** Abstaining (out-of-sync) followers are excluded from
//! the quorum denominator for both elections and commit advancement, so
//! consensus can proceed while lagging nodes catch up.
//!
//! - **Pluggable state sync.** When a follower falls behind, it synchronizes
//! through a [`StateSync`] implementation. The built-in [`LogReplaySync`]
//! recovers missing entries by broadcasting a discovery request to all bonded
//! peers, partitioning the needed range for balanced load, and pulling
//! entries in parallel. This is a good starting point for custom state
//! machines. For domain-specific needs, custom [`StateSync`] implementations
//! can use more efficient strategies (e.g. snapshot transfer, as the
//! [`collections`](crate::collections) subsystem does). Incoming
//! `AppendEntries` are buffered during catch-up and applied once the gap is
//! closed.
//!
//! ## Group Identity
//!
//! A [`GroupId`] is derived from the group key, the consensus-relevant
//! configuration (election timeouts, heartbeat intervals, etc.), the
//! replicated state machine's identifier, and the signatures of any
//! configured [`TicketValidator`](crate::primitives::TicketValidator)s. Any
//! divergence in these values produces a different group id, preventing
//! misconfigured nodes from bonding.
//!
//! ## Usage
//!
//! ```ignore
//! // join a group with a specific key and default configuration
//! let group = network.groups().with_key(key).join();
//!
//! // Wait for the group to be ready (leader elected, initial sync complete, etc.)
//! group.when().online().await;
//! ```
use ;
pub use ;
/// A unique identifier for a group that is derived from:
///
/// - The group key
/// - The group consensus-relevant configuration values, such as election
/// timeouts and heartbeat intervals.
/// - The id of the replicated state machine that is used by the raft replicated
/// log.
///
/// Any difference in any of the above values will result in a different group
/// id and will prevent the nodes from forming a bond connection with each
/// other.
pub type GroupId = Digest;
/// Public API gateway for the Groups subsystem.
///
/// This type is instantiated once per `Network` instance and is used to join
/// groups and manage them.
/// Public API
// Internal APIs