證明包與抽樣
爭議發生時交付的工件——單條爭議包、期間證明包、帶明示漏檢率的確定性抽樣,以及全量重算。
一個期間有數億張回執。把每一張連同其包含性證明一起攜帶,在 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。