Open Tally 協議
六項檢查
完整的驗證語義——每項檢查同時聲明 PASS 證明什麼、刻意不證明什麼。
驗證報告對每項檢查分別給出結論。Open Tally 驗證語義的定義性特徵是:每項檢查同時聲明「PASS 證明什麼」與「PASS 不證明什麼」——且界限是輸出的一部分,印在結果旁邊,而不是留在沒人讀的規範裡。「不證明」欄不是免責小字:它正是「證明」欄可信的原因——界限未寫明的檢查會被讀成證明了更多,而這件事第一次被發現時,整份報告的可信度就一起沒了。
| # | 檢查 | PASS 證明 | PASS 不證明 |
|---|---|---|---|
| 1 | 簽名有效性 | 每張回執由其 key_id 指認、且在公開密鑰歷史中該流該序位有效的密鑰簽署 | 簽名者有權簽,或內容為真 |
| 2 | 序號連續性 | 期間內及跨期邊界,序號連續——無空洞、無重複、無亂序 | 每個實際發生的事件都被賦了序號(見殘餘缺口) |
| 3 | 哈希鏈連續性 | 每張回執的 prev_hash 等於同流前一張的自哈希 | 其他流的任何事情 |
| 4 | Merkle 包含 | 每張回執可證明屬於所屬期間承諾;承諾聲明的範圍與數量和葉子一致 | 承諾覆蓋了所有存在過的回執——那是檢查 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 跳過」——那是期間包之所是,不是某個包的缺陷:期間包存在的意義正是避免攜帶數億張回執。證明包說明抽樣如何以明示的概率補上這一段。
驗證器的硬規則
- 跳過的檢查不算通過的檢查。 每項報告 PASS / FAIL / SKIPPED,跳過必附原因。若某項檢查其實什麼也沒做、工具卻報全綠,那麼第一個追問「這項檢查到底做了什麼」的人得到答案的那一刻,工具說過的其他一切都會一併受到質疑。嚴格模式(
-strict)下,無法滿足的前提——例如 TSA 根證書加載不了——是致命錯誤,不是一次跳過。 - 失敗要點名,不做籠統匯總。 在數百萬條的鏈上,「鏈無效」不可行動;驗證器報告哪一種失敗(自哈希不符、鏈接斷開、序號跳號——三種不同的事故)以及在哪個位置。
- 驗帳與算帳共用同一份計算代碼。 在 linkex.ai 實例中,結算路徑與驗證器調用同一個實現——「算帳的」和「驗帳的」不可能發生演算法漂移。
- 因結構性原因跑不了的檢查,如實說明。 早期代際的回執沒有簽全重算所需的每個輸入;對它們,檢查 6 報 SKIPPED 並附原因——報 FAIL 是把代際的局限歸咎於回執本身,報 PASS 則是撒謊。