跳轉到

D-20260802-03|三平面連線與分割安全定稿

背景與驅動力

同一 PeerId 的等待房控制線、賽內 mesh 與觀戰串流可以各自斷線或恢復。若任一通道關閉都被解讀為全域離線,等待房繼任、race forfeit 與觀戰終局會互相污染;更嚴重的是 race partition 兩側若都先移除失聯者再縮小 quorum,可能各自形成不同 MatchResult。

考慮過的選項

  • 由 room host 裁決 race roster:拒絕;等待房是中心化控制面,不是賽內共識權威。
  • 另建 removal-certificate 簽章欄:拒絕;它可能與最終 candidate 的 disconnects 剪刀差。
  • 三平面獨立世代,MatchResult signatures 兼作 removal certificate(採納):既有簽章已覆蓋完整 disconnects,live 與 fold 都能驗證。

決定

  • 共用連線狀態形為 (peerId, plane, generation, status);plane 固定為 room-controlrace-meshspectator-stream。每次重綁遞增 generation,舊 generation 的 close 或 async 完成不得覆寫新通道。
  • room-control 失效只觸發等待房生命週期/房主繼任;spectator-stream 失效只重新索取 source 並撥號,重建失敗才 source-unavailable;兩者都不改 race roster。
  • spectator source 只從固定 room.members participant roster 選出:初次取第一位在線者,重連從上一 source 後方循環;spectator 永不候選。每位 participant 都維持 presentation broadcaster/server,非 host 以 room-state.spectators 已 admission 名冊守門。每次成功索源遞增本地 sourceEpoch;channel 一進 reconnecting 即拒絕舊 generation 訊息,防舊 source 回流。
  • race-mesh disconnected 先維持既有 15 秒重連與 catch-up。正式 GO 後最終 offline 才進固定 original active roster 的嚴格多數守門:本端可達數至少 floor(N/2)+1 才能續賽;否則 partition-void、停止模擬且不得結算。GO 前仍依 D-20260802-02 無懲罰取消。
  • reason: network removal 的 MatchResult,簽章門檻以 original active roster(ranking ∪ disconnects 去重)計算,不以剩餘 finishers 計算;signer 仍只能是非 forfeit 完賽者。MatchResultEvent.signatures 因覆蓋完整 candidate,直接兼作 removal certificate。
  • 因此 3 人 2–1 需 2 簽、4 人 3–1 需 3 簽;4 人 2–2 與 2 人 1–1 都無法定稿。live admission、settlement runner 與 timeless fold 必須使用同一門檻函式。

後果與影響

等待房、比賽與觀戰故障不再互相放大;分割少數側不能靠縮小分母落帳。代價是 4 人賽只要一人 network forfeit,剩餘三人必須全數簽章;若多數側也缺任一簽章,該場 fail-closed 無事件。D-20260710-06 的「重連窗後即移除並按剩餘在場者 quorum」由本決策修訂;D-20260802-02 的 GO 前取消保持不變。