linkex.cclinkex.cc
Open Tally 協議

六項檢查

完整的驗證語義——每項檢查同時聲明 PASS 證明什麼、刻意不證明什麼。

驗證報告對每項檢查分別給出結論。Open Tally 驗證語義的定義性特徵是:每項檢查同時聲明「PASS 證明什麼」與「PASS 不證明什麼」——且界限是輸出的一部分,印在結果旁邊,而不是留在沒人讀的規範裡。「不證明」欄不是免責小字:它正是「證明」欄可信的原因——界限未寫明的檢查會被讀成證明了更多,而這件事第一次被發現時,整份報告的可信度就一起沒了。

#檢查PASS 證明PASS 證明
1簽名有效性每張回執由其 key_id 指認、且在公開密鑰歷史中該流該序位有效的密鑰簽署簽名者有權簽,或內容為真
2序號連續性期間內及跨期邊界,序號連續——無空洞、無重複、無亂序每個實際發生的事件都被賦了序號(見殘餘缺口
3哈希鏈連續性每張回執的 prev_hash 等於同流前一張的自哈希其他流的任何事情
4Merkle 包含每張回執可證明屬於所屬期間承諾;承諾聲明的範圍與數量和葉子一致承諾覆蓋了所有存在過的回執——那是檢查 2 的職責
5時間固定每個承諾哈希攜帶經驗證的 RFC 3161 令牌,且(已錨定窗口)有已確認的鏈上錨:內容自該時刻起未變被固定時內容就是對的——只證明此後沒改
6確定性重算按回執內部記錄的單價、價目版本與計量參數重算金額,與報告一致記錄的單價就是合同上正確的那個價——那屬於對帳與商務流程。檢查 6 確認算術,不確認政策。

第七行

在 linkex.ai 實例中,驗證器的報告實際帶第七行:零售拆解——對客戶側攜帶逐項拆解的回執(第五代起),客戶側各行必須逐行乘得出、並折算到旁邊被簽名的零售金額。

它單列出來,因為它按披露範圍劃界,且是刻意設計。回執被拆成供應側與客戶側,正是為了讓任何一方都看不到運營方的完整毛利:

  • 供應商拿到的包攜帶供應側分段——檢查 1–6 可跑,零售拆解為 SKIPPED,且跳過理由寫明原因;
  • 客戶核自己的帳單時關心的是零售拆解,而不是供應側。

沒有任何一方會看到七行全綠——那是拆分的目的,不是它的缺口。對供應商的包而言,6 passed, 1 skipped 就是滿分。

怎麼讀這張表

  • 檢查 1、3、4、5 回答完整性:自簽發以來有沒有被改?
  • 檢查 2 回答完備性:已簽發的內容有沒有缺失?完整性與完備性不是同一個問題——Merkle 證明只能確立「某條記錄屬於某個集合」,對「該集合是否即為全部」一言未發:一方完全可以自始就不記錄 100 筆中的 30 筆,剩下 70 筆條條驗證通過。完備性靠的是序號連續性規則——而對手方真正關心的通常正是這一問。
  • 檢查 6–7 回答可重算性:錢是否機械地從記錄的輸入推出?

一個包能確立什麼、不能確立什麼

同樣的檢查,手裡拿的東西不同,射程就不同:

檢查單條證據包期間包(不含回執)
1 簽名該筆完整可驗整個期間每份承諾的簽名
2 序號前後鄰接續,加上所屬承諾的計數與區間相符整條鏈:期間內無空洞、無重疊、無亂序
3 鏈包內攜帶的那幾環承諾鏈,逐環
4 包含該筆完整可驗,對照承諾的根無——期間包裡沒有葉子
5 時間固定所屬承諾的令牌/錨僅當每份承諾的令牌都驗過才 PASS;部分覆蓋報 SKIPPED 並附計數,絕不報 PASS
6 重算披露分段載荷時完整可跑無——它讀的是回執內部的取值

期間包的常態結論因此是「1/2/3/5 通過、4/6 跳過」——那是期間包之所是,不是某個包的缺陷:期間包存在的意義正是避免攜帶數億張回執。證明包說明抽樣如何以明示的概率補上這一段。

驗證器的硬規則

  1. 跳過的檢查不算通過的檢查。 每項報告 PASS / FAIL / SKIPPED,跳過必附原因。若某項檢查其實什麼也沒做、工具卻報全綠,那麼第一個追問「這項檢查到底做了什麼」的人得到答案的那一刻,工具說過的其他一切都會一併受到質疑。嚴格模式(-strict)下,無法滿足的前提——例如 TSA 根證書加載不了——是致命錯誤,不是一次跳過。
  2. 失敗要點名,不做籠統匯總。 在數百萬條的鏈上,「鏈無效」不可行動;驗證器報告哪一種失敗(自哈希不符、鏈接斷開、序號跳號——三種不同的事故)以及在哪個位置。
  3. 驗帳與算帳共用同一份計算代碼。 在 linkex.ai 實例中,結算路徑與驗證器調用同一個實現——「算帳的」和「驗帳的」不可能發生演算法漂移。
  4. 因結構性原因跑不了的檢查,如實說明。 早期代際的回執沒有簽全重算所需的每個輸入;對它們,檢查 6 報 SKIPPED 並附原因——報 FAIL 是把代際的局限歸咎於回執本身,報 PASS 則是撒謊。

本頁內容