EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

感謝 Daniel Von Fange 和 Yu Pan 為 Origin 的初步實施以及為本文提供資源做出的貢獻。 「不堪重負」的以太坊網路所導致的高昂交互成本以及緩慢的速度讓開發者們不得不開始重新思考和優

感謝 Daniel Von Fange 和 Yu Pan 為 Origin 的初步實施以及為本文提供資源做出的貢獻。

「不堪重負」的以太坊網路所導致的高昂交互成本以及緩慢的速度讓開發者們不得不開始重新思考和優化他們的 Solidity 代碼和合約部署架構。Origin Protocol的團隊也不例外,團隊一直在嘗試通過優化現有的代碼庫來提高 OUSD 和 Launchpad 產品的效率。而本文介紹的是在其推出的 Launchpad 產品的存款界面中使用最小化代理的案例。

最小化代理合約

當大多數區塊鏈開發者聽到代理這個詞時,他們會立即想到一種可升級的設計模式。 即終端用戶與 ProxyFoo 交互,ProxyFoo 將其調用代理到 ContractFooAlpha。這使得 Foo 的開發者可以通過簡單地更新 ProxyFoo 中的一個地址,將 ContractFooAlpha 換成 ContractFooBeta。

上述模式並不是最小化代理合約所暗示的那樣。當您的項目需要部署多個大型合約時,通常會使用最小化代理,這些合約的代碼或多或少都是一樣的,但需要不同的初始化。最小化代理的實現允許您部署一個極小的獨立合約,它繼承了一個較大的部署合約的所有邏輯。EIP 1167 的引入和該標準在 OpenZeppelin 中的整合,使開發者能夠利用這個強大的工具。

EIP 1167 最常用的實現方式可能是由 Uniswap V1 在創建他們的 AMM 池時使用。有一個單一的 AMM 合約來管理兩個資產的分配,但是當一個新的池子被創建時,神奇的事情發生了。每當有新的資產對加入時,Uniswap V1 都會為基礎的 AMM 合約創建一個最小化代理。我們可以通過查看一個 AMM 池地址的底層代碼來觀察這個鏈上的情況,比如 SAI/WETH 池。如果您注意到合約的代碼,有一個小小的位元組碼字元串。
0x3660006000376110006000366000732157a7894439191e520825fe9399ab8655e0f7085af41558576110006000f3

很酷,是吧?

最小化代理的實現允許您部署一個極小的獨立合約,它繼承了一個較大的部署合約的所有邏輯。
在 Origin 的案例中,我們有一個相當大的合約來接收用戶存款,但我們不想為每個在我們平台上存款的用戶部署這個合約。正確使用最小化代理可以大大降低部署成本,減少鏈上合約的維護。

一個簡單的例子

我們將用一個簡單的 AMM 合約舉例,展現一下通過最小化代理模式創建配對合約能讓 Gas 費下降多少。

創建
EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

測試應該通過,並輸出如下內容

EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

深入挖掘

我們的應用案例實際上是由兩個合約組成的,即 PairFactory 和 Pair。在一個去中心化的 AMM 中,任何人都應該能夠創建一個代幣交易對來進行交易,如果它還不存在。這就是 PairFactory 的主要目的--實現 Pair 交易對的創建。我們應用程序中的 Pair 合約可以被認為是一個部署的庫或佔位符,用於我們想要部署的許多交易對。讓我們通過測試來進一步了解。

編寫測試
EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

在上面的測試中,我們在第 23 行和第 29 行部署了 PairFactory 和 Pair 合約。現在這些已經部署完畢,我們就可以開始部署我們的最小化代理克隆了。

部署最小化代理

注意在測試的第 38 行,我們使用 PairFactory.getPairAddress 方法和一個鹽(在密碼學中,鹽是指在散列之前將散列內容的任意固定位置插入特定的字元串)來獲得部署的合約的預期地址。OpenZeppelin 克隆庫使我們能夠以一種確定的方式獲得預期地址。我們還可以使用第 41 行中看到的相同的鹽來部署最小化代理合約。請注意,在第 53 行,部署的地址和預取的地址是一樣的。

PairFactory.sol
EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

第 15 行實質上是用 Clones.sol 中的函數來裝飾地址對象,使之成為我們在第 23 行和第 27 行分別使用的 predictDeterministicAddress 和 cloneDeterministic 函數。

Pair.sol

EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

Pair.sol 合約是主合約,所有的最小化代理將從該合約中獲得功能。請注意,一旦代理被部署,它就可以初始化並維護自己的存儲,與主合約的存儲分開。這使得 PairFactory 可以廉價地部署大量的 Pair。

$$$

恭喜您走到這一步。現在,您應該已經很好地掌握了如何在您的應用程序中使用最小化代理模式來管理您的 dApps 的成本和維護。您是否碰巧發現了 test.js 中的一行,我們比較了 Pair 合約的典型部署和最小化部署的成本。它在下面,在測試文件的第 70 行。
EIP1167 案例解讀:最小化代理如何將 Gas 效率提升 10 倍

您沒看錯,在這種情況下,最小化代理模式比典型的合約部署至少提高了 10 倍的 Gas 效率。標準與最小化代理部署的實際 Gas 費分別為 710,453 和 **,995。

結語

最小化代理是一個很好的模式,可以添加到您作為區塊鏈開發者的工具包中,如果應用得當,可以有巨大回報。Origin Protocol 的團隊致力於在該領域提供最安全、性能最強、最經濟的產品。

參考資料

https://github.com/OriginProtocol/minimal-proxy-example
https://github.com/OriginProtocol/nft-launchpad
https://docs.openzeppelin.com/contracts/4.x/api/proxy#Clones
https://eips.ethereum.org/EIPS/eip-1167
https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/

—-

編譯者/作者:鏈聞ChainNews

玩幣族申明:玩幣族作為開放的資訊翻譯/分享平台,所提供的所有資訊僅代表作者個人觀點,與玩幣族平台立場無關,且不構成任何投資理財建議。文章版權歸原作者所有。

0

發表迴響