票據承諾
在屏蔽付款系統中,一枚幣並非以可見餘額儲存,而是以一張「票據」儲存——一筆私密紀錄,記載它持有多少價值、誰能花用,以及一點讓它獨一無二的隨機數。票據承諾是該票據在鏈上的公開指紋:一個隱藏且綁定的密碼學承諾,不洩漏關於數值或擁有者的任何資訊,卻把票據釘死,使它日後無法被更改。它是屏蔽版的 UTXO 條目,差別在於人人都看得見條目存在,卻沒人能讀出它的內容。
一張票據通常打包收款人的地址(或由它推導的公鑰)、數值,以及一個或多個隨機欄位,例如 rho 與一個致盲因子。承諾以一個抗碰撞、具隱藏性的承諾方案把這些一起雜湊而成——Zcash Sapling 為此使用橢圓曲線上的 Pedersen 雜湊。「隱藏」意味公佈的承諾在統計上與數值及收款人獨立,故觀察者一無所獲;「綁定」意味擁有者日後無法把同一個承諾開啟成另一張票據,這正是阻止他們增發餘額的關鍵。
這些承諾並非孤立儲存。每個新的票據承諾都作為葉子被附加到一棵僅可追加的增量 Merkle 樹——即「票據承諾樹」——其根概括了曾被建立的全部屏蔽幣集合。要花用一張票據,你不會直接指向它(那會破壞隱私);而是讓你的零知識證明透過一條 Merkle 認證路徑,證明你知道某張票據的開啟方式、而其承諾是當前樹根下的一片葉子,並同時揭露該票據的作廢符以標記為已花用。驗證者對著公開的樹根檢查證明,從不得知你用了哪一片葉子。
「票據/承諾/作廢符」三元組是每個現代屏蔽協定與 zk 混幣器的核心資料模型。承諾是進入匿名集的幣、永不移除;作廢符是離開的幣、另行記錄。因為花費只參照樹根而非特定葉子,一筆花費的匿名集原則上就是「製作證明當下存在的每一張票據」——這正是為何一棵深邃、被廣泛使用的承諾樹,是強屏蔽隱私的基礎。
當 Alice 付款時,一張票據 (value=2, recipient=Bob 的 pk, rho, rcm) 被建立,其承諾 cm = PedersenHash(value, pk, rho, rcm) 作為第 4,210,983 號葉子被附加到樹。日後 Bob 要花用它時,證明一條從 cm 到公佈樹根的 Merkle 路徑、並揭露該票據的作廢符——而無人得知被消耗的正是第 4,210,983 號葉子。
票據成為一片葉子;花費以零知識對著樹根證明葉子的成員身分。
因為承諾樹僅可追加,你的花費能對任一個過去的樹根(而非只有最新的)證明成員身分——這對輕用戶端有用,但實作必須限制樹根可以多舊,以維持作廢符檢查可行。