Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
5f4c137
feat(core): add SailfishPlusPlus protocol variant and update README
polinikita Mar 16, 2026
dd46278
Implement Sailfish live certification pipeline
polinikita Mar 16, 2026
822eb12
refactor(core): clean up SailfishPlusPlus implementation
polinikita Mar 16, 2026
b0852c7
feat(core): add Sailfish++ timeout/no-vote control plane
polinikita Mar 17, 2026
332690a
fix(core): disable TC gate and reject Sailfish++ header-only blocks
polinikita Mar 17, 2026
31b44f2
feat(core): wire Sailfish++ control plane and fix parent selection
polinikita Mar 17, 2026
40b78f4
fix(core): count own_previous in Sailfish quorum check and requeue in…
polinikita Mar 17, 2026
d486333
fix(dag_state): mark empty SailfishPlusPlus blocks as data-available
polinikita Mar 17, 2026
d26170b
feat(metrics): add Sailfish++ RBC fast/slow path counters
polinikita Mar 17, 2026
356ce82
fix(dashboard): move Sailfish RBC panel next to Block sync requests
polinikita Mar 17, 2026
01327e8
feat(sailfish): buffer early RBC messages for unknown blocks
polinikita Mar 17, 2026
f117450
Require Sailfish timeout proofs when leader is absent
polinikita Mar 17, 2026
a1a4045
Adjust Sailfish defaults and timeout proof checks
polinikita Mar 17, 2026
a5950c7
Use certified rounds for Sailfish proposal timing
polinikita Mar 18, 2026
6b6511f
Make Sailfish certification ancestor-closed
polinikita Mar 18, 2026
ad97906
Exclude Sailfish broadcaster from RBC thresholds
polinikita Mar 18, 2026
b1129e2
Add Sailfish delivered-support commit rule
polinikita Mar 18, 2026
48c0ce9
Persist Sailfish certified refs across recovery
polinikita Mar 18, 2026
42a618a
Infer Sailfish certifications from f+1 support
polinikita Mar 18, 2026
1c8d095
Buffer Sailfish certified refs until flush
polinikita Mar 18, 2026
e4c18d7
fix(core): CI lint and test fixes for SailfishPlusPlus
polinikita Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 17 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,18 @@ Three versions of Starfish are available in this repository:

- **`starfish-speed`**: Strong-vote optimistic variant
- Uses strong votes for optimistic transaction sequencing
- Lower latency when validators have same acknowledgments as a leader. Matches
- Lower latency when validators have same acknowledgments as a leader

- **`starfish-bls`**: BLS-optimized variant
- Uses BLS aggregate signatures to reduce communication complexity for header metadata
- Embeds compact aggregate certificates (round, leader, data availability) in block headers
- Async BLS verification service offloads signature processing from the critical path

The repository also supports other partially synchronous uncertified DAG-based consensus protocols:
The repository also supports other partially synchronous DAG-based consensus protocols:

- **`sailfish++`**: Implementation based on [SFSailfish](https://arxiv.org/abs/2505.02761) ("Optimistic, Signature-Free Reliable Broadcast and Its Applications", CCS'25).
A certified DAG protocol using signature-free optimistic reliable broadcast (RBC) for vertex certification.
Achieves 2-round optimistic commit latency with authentication derived from TCP channels rather than cryptographic signatures.
- **`mysticeti`**: Implementation of [Mysticeti](https://www.cs.cornell.edu/~babel/papers/mysticeti.pdf).
Validators use a bandwidth efficient pull-based block dissemination strategy:
they push their own blocks and request the peers about missing ancestors only.
Expand All @@ -37,6 +40,17 @@ pushing all unknown history of blocks to their peers.
Due to the push strategy, Cordial Miners can tolerate Byzantine attacks,
but it is overall a less scalable solution.

### Protocol Comparison

| Feature | Starfish | Starfish-Speed | Starfish-BLS | Sailfish++ | Mysticeti | Cordial Miners |
|---|---|---|---|---|---|---|
| DAG type | Uncertified | Uncertified | Uncertified | Certified (RBC) | Uncertified | Uncertified |
| Commit latency (rounds) | 3 | 3 (opt: 2) | 3 | 2 | 3 | 3 |
| Transaction encoding | Reed-Solomon | Reed-Solomon | Reed-Solomon | Full blocks | Full blocks | Full blocks |
| Dissemination default | Push-causal | Push-causal | Push-causal | Pull | Pull | Push-causal |
| Certification mechanism | None | None | BLS aggregate sigs | Signature-free RBC | None | None |
| Acknowledgment references | Yes | Yes | Yes (DAC) | No | No | No |

## Key Features of Starfish

- Starfish is a Byzantine Fault Tolerant protocol capable of tolerating up to 1/3 of Byzantine nodes in a partially synchronous network.
Expand Down Expand Up @@ -182,7 +196,7 @@ NUM_VALIDATORS=10 DESIRED_TPS=1000 CONSENSUS=starfish-speed \
|---|---|---|
| `NUM_VALIDATORS` | 10 | Number of validators (recommend < physical cores, max 128) |
| `DESIRED_TPS` | 1000 | Target transactions per second |
| `CONSENSUS` | starfish-speed | Protocol: `starfish`, `starfish-speed`, `starfish-bls`, `cordial-miners`, `mysticeti` |
| `CONSENSUS` | starfish-speed | Protocol: `starfish`, `starfish-speed`, `starfish-bls`, `sailfish-pp`, `cordial-miners`, `mysticeti` |
| `NUM_BYZANTINE_NODES` | 0 | Must be < `NUM_VALIDATORS / 3` |
| `BYZANTINE_STRATEGY` | random-drop | See [Byzantine strategies](#byzantine-strategies) |
| `TEST_TIME` | 3000 | Duration in seconds |
Expand Down
1 change: 1 addition & 0 deletions crates/starfish-core/src/bls_certificate_aggregator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1100,6 +1100,7 @@ mod tests {
None,
None,
None,
None,
)
}

Expand Down
12 changes: 7 additions & 5 deletions crates/starfish-core/src/broadcaster.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ impl BroadcasterParameters {
causal_push_shard_round_lag: RoundNumber,
) -> Self {
match consensus_protocol {
ConsensusProtocol::Mysticeti => Self {
ConsensusProtocol::Mysticeti | ConsensusProtocol::SailfishPlusPlus => Self {
batch_own_block_size: committee_size,
batch_other_block_size: 3 * committee_size,
batch_shard_size: 3 * committee_size,
Expand Down Expand Up @@ -412,7 +412,9 @@ where
.await
.ok()?;
}
ConsensusProtocol::Mysticeti | ConsensusProtocol::CordialMiners => {
ConsensusProtocol::Mysticeti
| ConsensusProtocol::CordialMiners
| ConsensusProtocol::SailfishPlusPlus => {
let all_blocks = self.inner.dag_state.get_storage_blocks(&block_references);

let mut blocks = Vec::new();
Expand Down Expand Up @@ -814,9 +816,9 @@ fn push_transport_format(consensus_protocol: ConsensusProtocol) -> PushOtherBloc
ConsensusProtocol::Starfish
| ConsensusProtocol::StarfishSpeed
| ConsensusProtocol::StarfishBls => PushOtherBlocksFormat::HeadersAndShards,
ConsensusProtocol::CordialMiners | ConsensusProtocol::Mysticeti => {
PushOtherBlocksFormat::FullBlocks
}
ConsensusProtocol::CordialMiners
| ConsensusProtocol::Mysticeti
| ConsensusProtocol::SailfishPlusPlus => PushOtherBlocksFormat::FullBlocks,
}
}

Expand Down
Loading
Loading