zkRollup 改進提案:無需tx 歷史數據,以實現效率和隱私提升

摘要:雖然能提升效率和隱私性,但用戶在將資金退出到L1 時,需進行客戶端額外的計算,並且難以兼容EVM。撰文:Leona Hioki 編譯:隔夜的粥長話短說本文介紹了一種無需來自運營方tx 歷史數據的zkRollup,這具有在L1 上使用txcalldata 的gas 效率,並且還具有…

雖然能提升效率和隱私性,但用戶在將資金退出到L1 時,需進行客戶端額外的計算,並且難以兼容EVM。

撰文:Leona Hioki 編譯:隔夜的粥

長話短說

本文介紹了一種無需來自運營方tx 歷史數據的zkRollup,這具有在L1 上使用txcalldata 的gas 效率,並且還具有智能合約執行及資產隱私的特性。每個batch 只需要在txcalldata 中記錄一個狀態改變的所有者的賬戶列表。

缺點是每個用戶在將資金退出到L1 時,需進行客戶端zkp 計算,而另一個缺點是在EVM 兼容性方面帶來困難。

背景和動機

對於Rollup 的運營商和交易者而言,他們在使用txcalldata 時仍然會產生消耗。這種限制僅僅是因為需要恢復作為交易結果的狀態,以免用戶無法生成其資金的Merkle 證明。 Rollup 的大部分規範要求運營商將所有交易歷史數據轉儲到L1 上的txcalldata。

交易歷史數據的這種透明度,不僅增加了txcalldata 的gas 成本,而且還破壞了交易的隱私。

據推測,交易歷史數據的累加器,既解決了效率問題,也解決了隱私問題。

方法

簡而言之,在第一步中,我們構造了一個zkRollup,其中運營商將最終狀態差異直接寫入txcalldata。交易歷史數據將在一個zkp 電路的隱私輸入中。

第二步,我們通過分離常用存儲和用戶狀態存儲從txcalldata 中刪除最終狀態差異。這使用戶可以使用非包含證明(如Plasma Prime 的狀態版本)退出。用戶保留其用戶存儲並僅公開其Merkle 根。用戶可以用zkp 證明根轉換,並且可以更新智能合約的常用存儲。

詳細步驟如下:

第一步,zkRollup 中txcalldata 使用選項

使用txcalldata 恢復完整狀態有兩種選擇。

選項1:將所有交易歷史數據記錄到txcalldata。

選項2:記錄由於區塊(批處理)中的交易而導致的最終狀態的差異。

在選項2 中,由於txcalldata 中沒有要記錄的內容,數以百萬計具有相同結果的交易使用0 gas 進行txcalldata 使用。 Merkle 根轉換的可靠性由zkp 保證。

而採用“選項2”是第一步。

第二步,優化“選項2”

當批次/ 區塊中的交易更改合約中的相同存儲值時,上述選項2 會花費更少的gas。這種共享和更改的值就像ERC20 的總供應量、swap 協議的總資產池量等。

而且這種存儲值也會影響到所有資產持有者,這種數據的丟失會導致zkRollup 的活性損失。另一方面,其他不常共享和更改的數據大多是個人資產數據。這類數據的丟失,直接意味著資產持有者損失了資金。這種風險是分開的,不會影響到對方的資金。

然後分離用戶的狀態,並提供其狀態的用戶數據及其證明作為運營商對其交易的收據,從而降低了大量gas 成本。

  1. 交易者向運營方發送交易;

  2. 運營商將其用戶狀態的merle 證明作為交易的收據;

  3. 交易者簽署這個收據;

  4. 電路中只接收帶有簽名收據的交易數據;

如果一個用戶進行了交易,並且多個用戶的餘額發生了變化,並且他們知道自己的狀態,包括這些餘額和Merkle 證明,那麼他們中的任何一個都可以隨時通過zkp 退出其資金。

這證明這是其餘額的最後一個狀態,可以通過每個批次的更改狀態所有者的每個帳戶列表的不包含證明來確定。更改狀態所有者的帳戶列表的稀疏Merkle 樹可用於有效證明。

有兩種方法可以讓更改狀態的所有者知道他們最近的更改。

如果他們在線,運營商發送最後一個差異,接收簽名的差異,並將其放入zkp 電路的輸入,這樣的gas 成本是最低的。

如果他們不在線,運營商會將其發佈到txcalldata 或鏈下去中心化存儲。

通過這種狀態分離,運營商不再需要將最終狀態的任何差異都放在txcalldata 中,因為用戶的帳戶狀態對於退出來說足夠安全,而丟失共同共享的數據,只是意味著運營商無法更新zkRollup 的Merkle 根,他們將簡單地停止服務。然後,公共共享存儲和用戶存儲都可以在鏈外分發。每批只需要在txcalldata 中記錄一個狀態改變的所有者的賬戶列表。

第三步,隱私智能合約執行

用戶的交易不在鏈上,但運營商仍然可以看到並需要看到用戶狀態(包括餘額),以進行zkp 證明。

如果用戶在其一邊進行zkp 以證明其用戶狀態的Merkle 根和公共共享存儲的轉換,則運營商只需更改該Merkle 根和存儲,餘額的秘密仍然存在。

  1. 用戶向運營商發送交易;

  2. 運營商返回餘額和更新後的公共共享存儲的差異;

  3. 用戶對更新後的用戶狀態和公共共享存儲的Merkle 根進行zkp 證明;

製作每個批次(區塊)的運營商可通過更改批次中共享存儲的變化知道餘額差異,但其無法知道其他批次的餘額差異,因為運營商之間隻共享最終差異。這具有混合級別的隱私。

這種機制需要用到遞歸zk。

更詳細的討論

在鏈下與離線狀態改變者通信

這只是一種選擇。該協議可以在沒有這部分的情況下構建。

即使在最壞的情況下,狀態更改器處於離線狀態,這種情況下的數據可用性風險也非常有限。

離線用戶可以在其在線時獲取數據以安全退出,其可以設置代理而不是自己接收數據。

並且我們可以構造退出方法,以便上次狀態更新不會因為數據可用性問題而使之前的狀態變得危險。

典型的去中心化存儲結構如下所示:

  1. 提交哈希(存儲)

  2. 證明 preimage(hash(storage)) = preimage(hash(storage, last-Ethereum-block-header)) – last-Ethereum-block-header

  3. 繼續觀察有多少節點可以完成(2)

賬戶鏈上gas 費用

每個帳戶都可以獲得一個比地址本身短得多的ID。

每個batch 只需要一個賬戶列表,這樣就可以省略重複項,這比txcalldata 中使用的交易歷史要高效得多。

公共共享存儲的進一步優化

在以太坊L1 上,你無法擦除txcalldata。我們可以修改它,因為公共共享存儲不需要在鏈上。

與交易歷史數據不同,我們只需要最後的狀態數據,不需要任何之前的狀態。然後運營商可以放棄之前在網絡中共享的“最終狀態數據”。

運營商可以通過zkp 邏輯知道可以丟棄的數據。

結論

分離用戶狀態使得zkRollup 智能合約執行既高效又隱私,幾乎所有的txcalldata 成本都從zkRollup 中移除了。

感謝Alex Gluchowski (zkSync)以及Barry Whitehat 提供的意見和看法。

Total
0
Shares
Related Posts