探索以太坊元交易的通用標準
編者按:本文來自:以太坊愛好者(ID:ethfans)編者按:本文來自:
以太坊愛好者(ID:ethfans)
以太坊愛好者(ID:ethfans)
引言
以太坊愛好者(ID:ethfans)
引言
本文是Bloxis 對Metamask 在Gitcoin 上舉辦的普遍化元交易競賽的回應。由於我們計劃將這項功能整合進我們即將面世的產品中,因而在該領域投入了大量時間與精力,也正因如此,我們由衷地希望能夠參與到該領域的討論中來。如果您對我的觀點有任何異議,歡迎指出,我非常樂於與您討論。
圖片描述
引言
- 圖源:Gitcoin -
引言
實現
只要你願意花錢,你可以在一筆以太坊交易內執行任何(不超出Gas 限制的)操作—— 在一個幾乎是完全去中心化的無國界區塊鍊網絡上。聽起來非常酷不是麼?事實也確實如此。但是!問題就在於,執行交易需要耗費Gas,而Gas 是用以太幣來支付的,可是新用戶誰有以太幣啊親? (什麼?你說賽博朋克、囤幣黨、傳銷組織都有?拜託那都不是正常人)
- 圖源:這個表情包是我自己P 的: ) -
實現
DeFi、區塊鏈遊戲和dApp 生態的未來依賴於入場玩家的規模。這意味著我們需要解決新玩家的上手問題,並降低安全操作的知識門檻。當下最主要的兩個問題是:玩家上手時需要擁有一個數字錢包以及一些以太幣—— 這也是行業內許多人正在努力攻克的方向。
在元交易出現之前,完成上述服務需要預存資金,即先將以太幣存入終端用戶的賬戶中以促進交易。 Uport 推出的Lambda Sensui 是這方面的一個典型應用。
如果你想更加深入地了解元交易,可以閱讀下面這篇文章,其作者是社區中的標桿人物—— Austin Griffith。
在鏈上,實現元交易需要一種編碼標準來編碼原始發送者發出的交易數據—— 以使目標合約能複原他們的簽名和數據,而不被msg.sender (即中繼者)影響。然而,在鏈下,必須通過API 或者通信協議才能將終端用戶連接到中繼者。且中繼者本身還必須擁有一些以太幣和基礎設施來獲取並轉發元交易。
圖片描述
很適合所在具體場景的解決方案,比如在Dai 的ERC-20 代幣合約中使用的permit() 方法,就很優雅地解決了鏈上部分的難題—— 這是一種需要終端用戶直接提交的approve方法。此外,這一方法還實現了EIP-712,該標準用於表示和簽名供鏈上使用的消息數據。可以說, Dai 只需要支持這一種元交易就足夠了,因為所有其它的用例(例如發送Dai 和協調DeFi 的操作)都可以利用這一解決方案來實現。
圖片描述
圖片描述
諸如Dapper Labs、Gnosis 和Argent 在內的許多組織正在推出合約錢包,旨在兼得用戶體驗和安全性。合約錢包將用戶的資金託管於智能合約之中,而合約內發送交易和保護賬戶安全的功能可以遠超以太坊協議本身的水平。
圖片描述
圖片描述
有了這一方法,賬戶內即使沒有以太幣也可以發出交易,而且不需要整個行業都接受同一個標準—— 合約錢包可以像外部所有者賬戶(即由標準密鑰對控制的普通用戶地址, EOA)一樣調用其它合約。此外,它還帶來了一系列安全功能,諸如Authereum 的交易防火牆。
圖片描述
合約錢包帶來的困擾
圖片描述
對於合約錢包和諸如以太坊域名服務(ENS)等創舉,以太坊社區內的呼聲很高。然而,隨著許多用戶在其所有的鏈上活動中都使用ENS 域名作為身份(並且域名可讀部分使用了真實姓名),巨大的隱私和安全問題開始顯現。
以太坊的錢包地址本身是“偽匿名的”(因此具有一定的隱私性),但現在許多錢包軟件提供商都在鼓勵其用戶獲取ENS 地址,卻不告知他們這樣做的後果。簡言之,以太坊賬戶的交易記錄(包括其投資組合及與dApp 之間的互動記錄)在鏈上是公開的,一個地址註冊ENS 域名之後,這些交易活動就跟這個ENS 域名關聯起來了。而用戶所註冊的ENS 名字很可能是用戶在其它服務或是現實生活中已經使用過的名字。這就是我對(供個人使用的)合約錢包地址綁定ENS 持懷疑態度的主要原因。
圖片描述
然而,對於將ENS 用於識別智能合約以防止詐騙,以及可以從透明操作中獲益的組織使用合約錢包/多重簽名錢包,我舉雙手支持🙌。
通過分層確定性錢包規則(Hierarchical Deterministic Wallet,簡稱HD 錢包),用戶可以用單個私鑰來生成許多EOA 地址,以保管不同的資產;使用多個地址分別操作,即便用戶會使用dApp、DeFi 協議並發起大量交易,仍然可以保持一定程度的匿名性。使用這套規則,用戶甚至可以只持有一把私鑰,然後為每一個要用到的dApp 和token 專門創建一個EOA 地址用於交互。合約錢包雖然也能做到這一點,但因為Gas 費用的存在,為用戶使用的每一個dApp/代幣創建一個合約錢包顯得十分昂貴而不切實際。就算不考慮Gas 費用,這樣做也會造成網絡擁堵。
圖片描述
假設以太坊生態內所有的用戶對於與其交互的每一個dApp 都有一個對應的合約錢包,從而既能利用元交易功能,又能保護自己的隱私—— 屆時智能合約採用一個通用的標準會更加合理。
邁向普遍化標準
無論你對基於合約及合約錢包的解決方案持有何種立場,目前都還沒有一個確定的標準—— 方法調用因合約而異,用於中繼交易的系統也各不相同。 Gas Station Network 已經做了許多基礎性的工作,但依舊不夠靈活。收款方合約可能不會支付Gas 費。那麼用戶又如何使用其資產來為中繼者支付報酬呢?我們該如何讓另一方來為這筆交易支付Gas 費呢?這些都是我們希望在普遍化元交易競賽中解決的問題—— 真正有價值的提案就是要面對這些問題。
ethereum/EIP-1613:Gas Station Network
ethereum/EIP-712
此外,讓中繼者能夠批處理交易,是不是也能降低Gas 費用?
有機制可支持替代性的中繼者報銷/支付方式
適合在資產dApp 和DeFi 的智能合約(而非合約錢包標準)中運行的方法
Makerdao/dss:https://github.com/makerdao/
圖片描述
支持在目標合約或用於中繼交易的合約內進行交易批處理的機制
我們的提議概述
圖片描述
如你所見,我們強烈支持Gas Station Network提出的想法。由RelayRecipient 提供的getSender() 和getMessageData() 方法實現了一個統一的接口,使所有合約的元交易可以相互兼容。然而,這些方法在其當前的形式下還存在兩個短板—— 無法防止釣魚網絡和重放攻擊。詳情:
為了防止釣魚,EIP-712 提出了一個巧妙的解決方案—— 域名分隔符。該對象包含了(用戶簽名交易要轉發給的)合約的詳細信息—— 也就是地址,以及dApp 的名稱和版本。這些數據都包含在簽名中,並和所有其它的交易數據一併以一種非常友好的方式呈現給終端用戶。這樣就限制了用戶簽名交易的方式,防止他們發起預期以外類型的交易(比如有意把交易發到錯誤的合約)。
圖片描述
支持EIP-712 的合約需要驗證域名分隔符與合約自身是否匹配,如果不匹配則回絕該交易。從下面列出的Dai 合約的代碼中,你可以看到這一點。我們希望將EIP-712 整合進getSender() 和getMessageData() 中,以便能在每一次方法調用時執行這項檢查—— 一旦簽名不匹配,就回絕該交易。你可以點擊下面的鏈接查看該函數的代碼。 (很抱歉,文章內嵌代碼的格式無法正常顯示)
此外,在上面的代碼中,你還可以看到MakerDAO 自己用nonce 屬性實現了重放保護—— 如果沒有該屬性,得到授權的參與方可以通過重放交易來耗盡用戶的資金。
一筆元交易經常屬於一組操作的一部分,而這些操作可能依賴於前面的交易。舉個例子,在我們構建的概念驗證案例中,用戶可以將xDai 存入Compound 協議。而在主網上,這意味著我們要批准cDai 合約訪問用戶資金,然後調用mint() 方法將該資金存入貸款協議。
如果有一種人人可用的普遍化元交易批處理方法,那肯定是一個重大的創新。這會大大簡化鏈上的活動,就像上文舉過的種種例子。此外,該方法還要允許用戶可以同時簽名和轉發多筆互不相關的交易。
總結
然而,在某些情況下,用戶可能希望往某一個合約發送多筆元交易。例如,某一個只持有一種資產的EOA 想要批量發薪水的時候。一個批處理元交易的系統在設計的時候必須考慮到這一點,並確保保持了交易發送的順序。
此外,批處理交易也讓中繼者可以通過用戶簽名的交易集中地收取手續費,也就是在一批交易中加入一筆轉賬給中繼者的交易,方法也是可以定制化的。可以是將ERC-20 代幣轉給中繼者,或者讓用戶的目標合約來支付該費用。
總結


