在 Zcash 中,zkSNARKs 證明了哪些陳述?
Zcash 使用 zkSNARKs 隱藏交易細節。我的理解是,驗證者是維護區塊鏈的任何人。我的問題是:
- 如果我決定向另一個使用者發送 x 數量的 Zcash,zkSNARKs 會隱藏什麼聲明?
- 特別是,交易圖還公開嗎?
我的理解是,驗證者是維護區塊鏈的任何人。
所有完全驗證交易的節點都將充當 zk-SNARK 驗證者。
- 特別是,交易圖還公開嗎?
屏蔽交易的交易圖是盡可能私密的。
創建便箋時,
cm
會公開對該便箋的承諾(實際上是便箋的散列)。當票據被使用時,它的無效符nf
被派生(實際上是另一個雜湊)並公開。對於消費紙幣的人來說,本地交易圖如下所示:(... -> tx1 -> cm)[<--- note --->](nf -> tx2 -> ...)
但是對於網路上的所有其他節點,他們看到的只是:
(... -> tx1 -> cm) (nf -> tx2 -> ...)
也就是說,他們看到了一些筆記的創建時間,以及一些筆記的使用時間,但在不知道私人資訊的情況下(假設他們無法找到散列函式的前映像),他們無法直接連結這兩個事件. 但是,它們可以排除某些交易組合:
- note 在創建之前是不能使用的,所以當一個 nullifier 被發佈時,每個人都知道它對應於之前發布的某個承諾,但不對應於後來發布的任何承諾。
- 一些無效者和承諾可以根據其他披露的資訊合理地排除,例如,如果交易所的記錄被洩露,或者它們是否在也涉及透明輸入和輸出的交易中。特別是,如果您將資金從 t-address 發送到 z-address,然後再發送到另一個 t-address,則您基本上沒有隱私。有關更多資訊,請參閱我之前的回答。
- 如果我決定向另一個使用者發送 x 數量的 Zcash,zkSNARKs 會隱藏什麼聲明?
Zcash 協議規範的第 4.9.1 節給出了用 zk-SNARK 證明的特定語句(對於 Sprout 電路)(因此是隱藏的)。在這裡總結它的部分:
**無效符完整性:**已發布的無效符正確對應於所花費的輸入註釋。
**註釋承諾完整性:**已發布的承諾正確對應於正在創建的輸出註釋。
**Merkle 路徑有效性:**從輸入註釋的承諾到承諾 Merkle 樹錨點之間存在一條有效路徑
rt
。
- 這強制使用的票據是先前創建的。
**餘額:**輸入票據價值的總和等於輸出票據價值的總和(加上任何進入或離開透明池的資金,例如費用)。
**支出權限:**為每個輸入票據提供的支出密鑰正確對應於創建票據的公鑰。
還有一些其他的正確性要求。
這是適用於透明交易的大多數共識規則。唯一缺少的是雙花規則,它仍然在電路之外檢查(通過檢查以前從未見過的無效器)。
最高級別的觀點是,它證明某處存在一組 UTXO,並且它們的值之和等於或大於此交易輸出之和。確切的屏蔽值在交易中被加密並且永遠不會被披露。
執行完整節點並有權訪問受信任設置數據(您必須下載才能執行完整節點)的每個人都可以驗證屏蔽交易。然而,沒有人知道使用了哪些確切的 UTXO 以及它們的值是什麼的詳細資訊。