D-20260812-06|治理信任根與比賽傳輸契約單一化¶
背景與驅動力¶
Ledger 已以 genesis/前一個已採納 checkpoint 的 derived state 定義治理 authority,但 options
仍保留 getSignerSet 測試 seam;當 genesis signer 為空時,該 seam 會變成第二份可繞過 canonical
state 的信任根。pinning 又把部署 signer 直接接到這個 seam,使測試相容分支進入 production。
比賽同步的 NetworkLayer.broadcast 與 RaceWirePort.sendRaceTo 另保留 boolean | void,讓沒有
回傳值的舊測試 stub 被當成成功,無法區分「已交付」與「未交付」。
考慮過的選項¶
- 保留 seam 並限制只供測試:型別與 runtime 都無法證明 production 沒有注入,且同一 checkpoint 會有兩個可能 authority 來源,棄。
- 把部署 signer 留在 callback,另要求與 genesis 相等:仍需維護雙來源與一致性驗證,沒有收益,棄。
- 只保留 canonical state trust root,並讓測試建立含治理 signer 的 genesis;傳輸 API 收斂為明確 布林值(採納)。
決定¶
Open4wdLedgerOptions移除getSignerSet。首個 checkpoint 的 signer set 只來自 genesisEconomyConfig.governanceSigners;其後只來自前一個已採納 checkpoint 的 derived state。- pinning 的
GOVERNANCE_SIGNERS維持部署入口,但啟動時排序後寫入genesisState,不建立平行 trust root。空集合維持N規則的 fail-closed 行為。 NetworkLayer.broadcast與RaceWirePort.sendRaceTo必須回傳boolean。false表示未交付; retry、offer 與 correlation 清理依此判斷。所有測試 double 亦須回傳真實布林值。RaceWirePort.sendRace是對多 peer 的 best-effort fanout,保留void與 per-peer 失敗隔離。 本決策不改 quorum、checkpoint epoch 或比賽同步演算法。
後果與影響¶
Ledger authority 只剩一條可稽核的 canonical state 鏈,pinning 部署設定仍可用但不再繞過 genesis。
測試需要顯式建立治理 genesis,傳輸測試 stub 需要明確回傳成功或失敗;這些是首發前一次性遷移。
定向傳輸失敗不會再被 void 誤判為成功,offer/correlation 狀態可依一致契約保留或清除。