📢 Gate廣場 #MBG任务挑战# 發帖贏大獎活動火熱開啓!
想要瓜分1,000枚MBG?現在就來參與,展示你的洞察與實操,成爲MBG推廣達人!
💰️ 本期將評選出20位優質發帖用戶,每人可輕鬆獲得50枚MBG!
如何參與:
1️⃣ 調研MBG項目
對MBG的基本面、社區治理、發展目標、代幣經濟模型等方面進行研究,分享你對項目的深度研究。
2️⃣ 參與並分享真實體驗
參與MBG相關活動(包括CandyDrop、Launchpool或現貨交易),並曬出你的參與截圖、收益圖或實用教程。可以是收益展示、簡明易懂的新手攻略、小竅門,也可以是現貨行情點位分析,內容詳實優先。
3️⃣ 鼓勵帶新互動
如果你的帖子吸引到他人參與活動,或者有好友評論“已參與/已交易”,將大幅提升你的獲獎概率!
MBG熱門活動(帖文需附下列活動連結):
Gate第287期Launchpool:MBG — 質押ETH、MBG即可免費瓜分112,500 MBG,每小時領取獎勵!參與攻略見公告:https://www.gate.com/announcements/article/46230
Gate CandyDrop第55期:CandyDrop x MBG — 通過首次交易、交易MBG、邀請好友註冊交易即可分187,500 MBG!參與攻略見公告:https://www.gate.com/announcements
zk-SNARKs如何實現錢包的交易邏輯與資產分離
作者:@Toni Wahrstätter 譯:DeBox研究院
前言
Vitalik 建議使用zk-SNARKs 將交易邏輯帳戶與持有資產的帳戶分開。這樣可以改善隱私,使用者體驗和一鍵式社交恢復。以太坊研究員Toni Wahrstätter 對此錢包原型進行詳細解析,涵蓋工作流程和優勢。
由於多種原因,管理多個帳戶可能具有挑戰性,包括社交恢復、隱私、L2 和整體使用者體驗問題。使用隱形位址會使事情變得更加複雜,因為每次互動都需要一個新帳戶。 Vitalik建議使用zk-SNARKs 將交易邏輯帳戶與持有資產的帳戶分開。這可以改善隱私、使用者體驗和一鍵社交恢復。
簡而言之,我們試圖實現的目標是:
**在不損害隱私的情況下一站式社交恢復。 **
一、傳統的方法
一個簡單但會損害隱私的實作如下:
缺點是,這將邏輯帳戶和資產持有帳戶公開聯繫起來,從而損害了隱私。
二、使用ZK-SNARK
透過使用zk-SNARK,用戶可以證明他們有權支出,而無需透露邏輯持有帳戶和資產持有帳戶之間的聯繫。
工作流程如下圖所示:
1.1. Merkle 樹基本上包含按日期或名稱排序的每個現有合約的slot0 和slot1 值。
1.2. 每個使用者都可以根據最近的狀態在本地建立Merkle 樹。
使用者建構一個zk 證明,證明知道邏輯持有帳戶中的秘密。稍後再詳細證明。
用戶將zk-proof 發送到資產持有帳戶。
資產持有帳戶驗證證明,確認以下內容:
4.1使用者知道邏輯在哪裡。
4.2 使用者知道一個秘密值,在雜湊後對應到儲存在邏輯持有帳戶中的值。
4.3使用者可以重建在規範鏈中維護的帳戶狀態默克爾樹根(例如預編譯)
4.4使用正確的隨機數(用於切換邏輯持有帳戶中的金鑰)。
本質上,用戶可以說:“我擁有邏輯持有帳戶的可證明的權限來執行此操作,並且我知道該邏輯帳戶的位置。”
優點
此外,透過在邏輯和資產持有合約之間添加另一個(聚合器)合約,可以在一次交易中提供不同資產持有帳戶的多個證明,從而幾乎可以像UTXO 一樣對待帳戶。聚合器將能夠取得多個zk 證明並將其轉發到各自的資產持有帳戶進行驗證。當然,這樣的聚合器可以在各個資產持有帳戶之間建立連結——包括隱私。
技術細節
zk-SNARK 設定包含私有元素:
1、邏輯持有帳戶
邏輯持有帳戶的原型可能如下所示:
編譯指示可靠性 >=0.7.0 <0.9.0;
合約 LogicHoldingAccount 是可擁有的 { uint256 public slot0 = 0x1234; // 散列秘密 uint256 public nonce = 0; // 追蹤公共所有者位址的關鍵變更;
函數 updateOwner(uint256 newValue) public onlyOwner { nonce += 1; slot0 = 新值;
該合約追蹤所有者目前的支出邏輯(slot0) 並允許透過該updateOwner函數進行更新。
2、帳戶持有帳戶
編譯指示可靠性 >=0.7.0 <0.9.0;
合約 AssetHoldingAccount { uint256 公共邏輯HoldingAccountHash = 1234 ...;
// 標量欄位大小、基底欄位大小、驗證金鑰資料等 // ...
函數 verifyProof( uint [2] calldata _pA,uint [2] [2] calldata _pB,uint [2] calldata _pC,uint [2] calldata _pubSignals) public view returns (bool val) { // 用於證明驗證的 Snarkjs 組譯程式碼... // ... }
// _pubSignals [0] - Contract-slot0 ||nonce Merkle 樹的根 // _pubSignals [1] - hased 邏輯持有者地址函數 ute( 應付地址, uint256 金額, uint [2] calldata _pA,uint [2] [2] calldata _pB,uint [2] calldata _pC,uint [2] calldata _pubSignals) public {contractRootPrecompile.getRoot(block.number) uint256指定LogicHolder = _pubSignals [1] ; require(specifiedLogicHolder ==logicHoldingAccountHash, "不允許");
bool validProof = verifyProof(_pA, _pB, _pC, _pubSignals) == true; if (validProof) { (bool success,) = to.call{value:amount}("");要求(成功); } }
receive() 外部應付帳款 {
資產持有帳戶儲存ETH等資產,並允許用戶提交提款證明。透過驗證是否specifiedLogicHolder匹配logicHoldingAccountHash,所有者可以確保資產持有合約僅接受來自授權邏輯持有合約的證明,而不是任何任意合約。
在構造證明時作為私人訊號提供的秘密確保只有包含支出邏輯的帳戶的所有者才能從資產持有帳戶存取資金。
3、電路
以下電路是使用circom開發的,完整的程式碼可以在這裡找到。
雜註 circom 2.0.2;
包括“./modules/merkleTree.circom”;包括“./modules/commitmentHasher.circom”;
模板Main(levels) { 訊號輸入根;訊號輸入邏輯HoldingAddressHash;訊號輸入邏輯HoldingAddress;訊號輸入秘密;訊號輸入隨機數;訊號輸入路徑元件 [levels] ;訊號輸入路徑索引 [levels] ;元件 SecretHasher = SecretHasher(); SecretHasher.secret <== 秘密;組件哈希器 = CommitmentHasher(); hasher.logicHoldingAddress <==logicHoldingAddress; hasher.secret <== SecretHasher.hashedSecret; hasher.nonce <== 隨機數; hasher.logicHoldingAddressHash ===logicHoldingAddressHash;組件樹 = MerkleTreeChecker(levels); tree.leaf <== hasher.commitment;樹.root <== 根; for ( i = 0; i < 級別; i++) { 樹.pathElements [i] <== 路徑元素 [i] ;樹路徑索引 [i] <== 路徑索引 [i] ;
元件主 {public [root,logicHoldingAddressHash]} = Main(N);
該電路共有7 個訊號,其中2 個是公開的,即Merkle 樹根和邏輯持有帳戶的雜湊地址(在編碼到資產持有合約之前必須進行雜湊處理,以防止觀察者對帳戶進行聚類別)基於相同的邏輯持有者帳戶)。
結論
在使用者必須管理多個帳戶的世界中,對一站式社交恢復功能的需求變得越來越重要。 Zk-SNARK 可用於實現邏輯/資產分離的錢包,使用戶能夠使用帳戶A 的「邏輯」從帳戶B 進行支出,而無需在兩者之間建立連結。作為第一步,SNARK 證明可以用於風險低於資產支出的行動。例如,一個好的起點可能是允許使用者發起「提款請求」。如果邏輯持有合約的所有者沒有提出異議,用戶可以在一段時間後最終確定該請求。
這樣,邏輯持有合約的所有者仍然可以進行幹預,儘管是以破壞隱私的方式,以防出現意外情況。