Byzantine Quorums (3f+1) and the PBFT → HotStuff → Tendermint Lineage TODO
Concept
In a partially synchronous setting, tolerating f Byzantine nodes requires a total node count of at least 3f+1; setting the quorum size to 2f+1 makes any two quorums overlap in at least f+1 nodes. That intersection is guaranteed to contain at least one honest node, which is where the safety property — that two conflicting values can never both be finalized — comes from. PBFT reaches agreement in three phases, pre-prepare, prepare, and commit, but its view-change cost grows sharply with the number of nodes. HotStuff aggregates votes with threshold signatures and relays them through the leader, cutting communication to linear cost, and simplifies view changes with a chained-block rule. Tendermint's propose/prevote/precommit structure adds a locking rule that guarantees instant finality — once a block is committed, it is never reverted.
Proof-of-stake chains, rollup sequencers, and side infrastructure are all in this family, so interpreting a failure requires knowing exactly what assumptions finality rests on and how liveness recovers when a leader dies.
Code & Formula
# 비잔틴 정족수(3f+1)와 PBFT 계보 — n=3f+1, 정족수=2f+1일 때
# 서로 다른 두 정족수는 항상 최소 f+1개 노드에서 겹치고, 그 교집합엔 정직한 노드가 반드시 있다.
from itertools import combinations
def check_byzantine_safety(f):
n = 3 * f + 1
quorum_size = 2 * f + 1
nodes = set(range(n))
min_intersection = n # 최소 교집합 크기 추적
for q1 in combinations(nodes, quorum_size):
for q2 in combinations(nodes, quorum_size):
overlap = len(set(q1) & set(q2))
min_intersection = min(min_intersection, overlap)
# 비잔틴 노드가 최대 f개이므로, 교집합이 f+1개 이상이면 정직한 노드가 반드시 하나 이상 포함
guaranteed_honest = min_intersection - f
return n, quorum_size, min_intersection, guaranteed_honest
for f in [1, 2]:
n, q, min_overlap, honest = check_byzantine_safety(f)
print(f"f={f}: n={n}, quorum={q} -> 임의의 두 정족수 최소 교집합={min_overlap} "
f"(이론값 f+1={f+1})")
print(f" 교집합 중 정직 노드 최소 보장 = {min_overlap} - f = {honest} "
f"({'안전' if honest >= 1 else '위험'})")
print("\n-> 두 정족수의 교집합에 정직한 노드가 항상 1개 이상 있으므로,")
print(" 그 노드가 서로 모순되는 두 값에 동시에 서명할 수 없어 안전성이 성립한다.")
print(" (PBFT: 3단계 통신, HotStuff: 서명 집계로 선형 통신량, Tendermint: lock 규칙으로 즉시 완결성)")
docs/code/algorithms/algorithms-56.py
Exercise
With n=4, f=1, sketch on paper a scenario where two honest nodes commit different values, and walk through why the quorum-intersection property makes that impossible.
Practical Connection
Under instant finality, reorganization risk effectively disappears, changing what confirmation-depth policy makes sense for a settlement system like Verex — so you need to be precise about how this differs from Ethereum's probabilistic finality.
Where it lands in Jayverse
- Devnet: when moving from forked Anvil to an OP-Stack L2, write down which finality model it inherits. Probabilistic like L1, or BFT-style instant finality from the sequencer — that decides every downstream confirmation-depth policy.
- Verex: set settlement confirmation-depth policy explicitly per chain. Don't reuse an Ethereum-style probabilistic-finality wait time on a chain with instant finality, and don't assume instant finality where it doesn't hold.
- Bridge: justify the lock-and-mint relayer's "safe to mint" threshold by the source chain's actual quorum/finality assumptions. Not a fixed block-confirmation constant copied from elsewhere.
Key expressions
| Expression | 뜻 · 쓰이는 자리 |
|---|---|
| quorum intersection | 정족수 교집합 · 두 정족수가 겹치는 성질로, 안전성의 근거가 됨. "the quorum-intersection property makes that impossible" |
| view-change | 뷰 체인지, 리더 교체 절차 · 리더가 바뀔 때 필요한 합의 재조정 과정. "its view-change cost grows sharply" |
| aggregate (votes) | (표를) 집계하다, 취합하다 · 임계서명으로 여러 표를 하나로 모으는 것. "aggregates votes with threshold signatures" |
| relay through | ~을 거쳐 중계하다 · 리더를 통해 메시지를 전달하는 방식. "relays them through the leader" |
| grow sharply with | ~에 따라 가파르게 증가하다 · 노드 수가 늘수록 비용이 급증한다는 뜻. "grows sharply with the number of nodes" |
| locking rule | 잠금 규칙 · 한 번 커밋된 블록이 절대 되돌려지지 않도록 보장하는 장치. "adds a locking rule that guarantees instant finality" |
| Byzantine | 비잔틴 장애(임의 고장) · 노드가 임의로 거짓 행동을 할 수 있다고 가정하는 가장 강한 장애 모델. "tolerating f Byzantine nodes requires a total node count" |
| PBFT | 실용적 비잔틴 장애 허용(Practical Byzantine Fault Tolerance) · pre-prepare/prepare/commit 3단계로 합의하는 초기 BFT 합의 프로토콜. "PBFT reaches agreement in three phases" |
| HotStuff | 호트스터프 · 임계서명으로 표를 집계해 통신 비용을 선형으로 줄인 BFT 합의 프로토콜. "HotStuff aggregates votes with threshold signatures" |
| Tendermint | 텐더민트 · propose/prevote/precommit 구조로 즉시 파이널리티를 보장하는 BFT 합의 프로토콜. "Tendermint's propose/prevote/precommit structure adds a locking rule" |
If you study this on a given day, add a note link and a ✅ to this line in the source curriculum (docs/knowledge/dev-100-curriculum.md) and this spot will lead straight to the note body. You can also write directly on this page — but regenerating overwrites it, so it's safer to keep anything you want to save as markdown under docs/algorithms/.