在我們等待 Storm 審判的裁決時,提醒大家,保護池只是數學,並不難理解。 任何人都可以實現一個。 所以這裡有一個關於它們如何運作的基本直覺的線程:
目標是建立一個系統,使每筆交易中的所有信息對用戶完全保密。 我們對我們的交易系統不應有任何低於此的期望。 這是基本的人權——隱私權。
問題是,如果所有信息都是私密的,區塊鏈如何知道交易是有效的?它如何知道用戶實際上擁有他們打算發送的資金?他們沒有進行雙重支付? 顯而易見的答案是:零知識證明(zk-proofs)。但這真的那麼簡單嗎?
假設你有一個餘額為 10 的帳戶。你想要發送 5 給 Roman 的防禦。因此,你製作了一個 zk-proof,顯示你有 10,而你的交易發送了 5。看起來很簡單!
但等等!當你證明擁有10時,那個證明是關於過去某個狀態的,在你的交易被包含的最新區塊之前。也許從那時起,你已經花掉了所有的幣!你怎麼能證明在最新的區塊中你仍然擁有10呢?
這實際上相當棘手,這就是為什麼保護池在基於帳戶的系統中並不真正有效——沒有簡單、可靠的方法可以在 zk 中向區塊鏈證明最新的實時狀態。 解決方案?使用 UTXO。比特幣中著名的「未花費交易輸出」。
使用UTXO時,您並沒有一個可更新的單一帳戶,而是擁有只能一次性完全使用的個別「票據」(就像真正的硬幣)。UTXO系統在開發上通常有點麻煩,但這種「一次性使用」的特性使它們對於保護池非常有用。
在像比特幣這樣的UTXO系統中,當你要花費一個UTXO時,所有的完整節點都可以檢查該UTXO是否存在(它是在過去創建的)並且尚未被花費。這是直接明瞭的。但如果UTXO中的所有數據都是加密的,我們該如何檢查這一點呢?
不僅數據是加密的,我們甚至不想透露*哪個* UTXO 被花費。如果我們這樣做,那麼發送給你 UTXO 的人就會知道你何時花費它。在理想的保護池設計中,交易不會洩漏任何信息。
保護池的核心技巧是引入一個可以公開揭示的「無效化器」值,但這個值是由每個支出者為每個 UTXO 獨特衍生的。要支出 UTXO,區塊鏈會檢查該無效化器是否已經存在。這確保了每個 UTXO 只能被支出一次。
現在我們可以回到我們的 zk-proof。我們只需證明我們正在花費的 UTXO 實際上存在於鏈上,並且我們為其揭示的 nullifier 是正確地從我們正在花費的 UTXO 中推導出來的。 就這樣!
在實踐中,這意味著保護池系統通常保持兩棵不同的梅克爾樹。一棵包含 UTXO 的哈希(UTXO 通常被稱為「票據」,其哈希稱為「票據承諾」),另一棵包含無效化器。這兩棵樹都是僅可附加的!
當一個新票據被創建時,它的哈希值會被存儲在票據的梅克爾樹中。該票據本身是加密的。當用戶稍後去花費該票據時,他們計算該票據的無效化器,並製作一個 zk-證明,顯示該票據在梅克爾樹中,且無效化器是正確的。
nullifier 被公開揭示,鏈檢查它是否已經存在於 nullifier 樹中。然後它被存儲在那裡,因此該票據不能再次被花費。沒有人能真正知道哪一張票據正在被花費,因為原始票據仍然留在票據樹中!
這就是今天所有保護池的基本設計,包括 @Zcash、@TornadoCash、@penumbrazone、@namada 等等。 當然,保護池設計中還涉及很多其他內容。敬請關注更多主題,我們將深入探討這些機制。
@AThryver @0xkaiserkarel 這裡對“zk”這個術語的常見誤解和可能誤導的用法。請參見
Ethan Buchman (🐝,🦇)
Ethan Buchman (🐝,🦇)2024年7月24日
TEE?ZKP?MPC?FHE? 關於加密貨幣中最重要的三個字母縮寫,你需要知道的一切 或者,如何贏得朋友並影響他人 TEE 🧵
33.36K