linkex.cclinkex.cc
驗證帳本

證明包與抽樣

爭議發生時交付的工件——單條爭議包、期間證明包、帶明示漏檢率的確定性抽樣,以及全量重算。

一個期間有數億張回執。把每一張連同其包含性證明一起攜帶,在 linkex.ai 實例中實測為 2.41 TB,所以不提供這樣的包。證據改為分層,每層寫明自己的射程。

單條爭議包

「我不信這一筆」的答案的形狀——按回執公開提供於 /api/receipt/bundle,約 6 KB:

  • 爭議中的那張回執(信封),連同前後鄰,鏈連續性因此可查;
  • 支撐其數字的已披露分段載荷;
  • 把它放進所屬期間承諾的 Merkle 證明;
  • 承諾本身(已簽名、已成鏈、已固定時間);
  • 簽名密鑰歷史。

一切離線可驗。這筆收費要麼由簽名記錄推得出來,要麼推不出來——雙方用同一個工具,都看得見是哪一種。

披露載荷時有一處要緊:載荷在哈希對上之前只是一項主張。 驗證器在讀取任何取值之前,先把每份載荷與信封承諾的分段哈希核對——先重算後比對,等於確認了一份無人承諾過的文檔的算術。(載荷也以 JSON 字串而非內嵌 JSON 傳輸:重新序列化會改變字節——會做 HTML 轉義的序列化器把 < 變成 \u003c——字節不同即哈希不同。)

期間包

審計整個期間用:承諾鏈、密鑰歷史與時間戳令牌——刻意不含回執。其規模是 O(承諾數) 而非 O(回執數):無論流量多大,一條流每天產出的承諾數是固定的,一條流一個月是一份人打得開的幾 MB 文件,而它覆蓋的那段回執不是。

期間包確立承諾簽名、整期序號連續、承諾鏈連續與時間固定。它無法確立 Merkle 包含、也無法重算金額——那些需要回執,而不帶回執正是這個工件存在的全部意義。缺的那段由抽樣補上。

抽樣:抽出來的,不是挑出來的

「一張」與「全部」之間是抽樣——做法讓運營方挑不了樣本:

  • 種子是該期間最後一個承諾的哈希——一個已被簽名、且一經固定時間便由運營方之外的人固定的值,早於抽籤可能發生的時刻
  • 成員資格一次 HMAC 可判。 序號為 seq 的回執入樣,當且僅當 HMAC-SHA256(seed, tagged("linkex.receipt.sample.v1", uint64_be(seq))) 的 64 位前綴低於由總量與目標樣本量推出的閾值。精確構造——字節編碼、閾值算術、邊界情形——連同一致性向量釘死在規範裡,因為一條只有簽發方算得出的抽樣規則,與簽發方自己挑的樣本無從區分。
  • 對手方可獨立重抽並復核任意回執的成員資格。被塞進包裡卻未被抽中的回執會失敗;被抽中卻被省略的回執,可通過在期間序號區間上重算抽籤發現——那是一次 O(總量) 的遍歷,審計方要做完全可行,默認驗證運行如實聲明不做。

驗過的樣本給篡改劃界,不排除篡改。 報告印出漏檢概率而不是躲在 PASS 一詞後面——十萬條裡抽一千條,十條被篡改的情況約九成會被漏掉。概率隨期間增長而變化:同一條流今天報出的界可以與昨天不同,因為回執更多了而樣本上限沒動。結論是那個數字,不是那行綠色。 想要更強的界?提高樣本量,或就爭議範圍協商一次限定的全量披露。

組裝側寧可拒絕,也不發可疑證據

裁出任何證明之前,組裝器先重建每份承諾的整段回執並與被簽名的根比對。兩種情況讓它當場停住:

  • 段長短於承諾聲明——樹已不是那棵樹,其證明驗不過任何東西;
  • 段重建出的根與被簽名的不同——證明只在包內驗得過、出了包處處不過,這比沒有包更糟,因為它看起來仍像證據。

原則:寧可拒絕出證,不發可疑證據。(組裝不是篡改檢測器,也不當它讀——篡改由接收側的驗證檢查抓住:它們由信封重算每條抽樣回執的自哈希。)

披露後的全量重算

分段載荷被披露時,確定性重算逐筆運行——且重算庫與計費路徑用的是同一份代碼,記帳的與驗帳的不可能發生演算法漂移。公式演進由分段代際承載:每張回執按它自己聲明的代際重算,已簽名的歷史從不被追溯性重新詮釋。沒簽全重算輸入的早期代際報 SKIPPED 並附原因,絕不編造 PASS。

本頁內容