LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > EIP1167 案例解读:最小化代理如何将 Gas 效率提升 10 倍

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

2021-06-23 链闻ChainNews 来源:区块链网络

感谢 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 费下降多少。

创建

测试应该通过,并输出如下内容

深入挖掘

我们的应用案例实际上是由两个合约组成的,即 PairFactory 和 Pair。在一个去中心化的 AMM 中,任何人都应该能够创建一个代币交易对来进行交易,如果它还不存在。这就是 PairFactory 的主要目的--实现 Pair 交易对的创建。我们应用程序中的 Pair 合约可以被认为是一个部署的库或占位符,用于我们想要部署的许多交易对。让我们通过测试来进一步了解。

编写测试

在上面的测试中,我们在第 23 行和第 29 行部署了 PairFactory 和 Pair 合约。现在这些已经部署完毕,我们就可以开始部署我们的最小化代理克隆了。

部署最小化代理

注意在测试的第 38 行,我们使用 PairFactory.getPairAddress 方法和一个盐(在密码学中,盐是指在散列之前将散列内容的任意固定位置插入特定的字符串)来获得部署的合约的预期地址。OpenZeppelin 克隆库使我们能够以一种确定的方式获得预期地址。我们还可以使用第 41 行中看到的相同的盐来部署最小化代理合约。请注意,在第 53 行,部署的地址和预取的地址是一样的。

PairFactory.sol

第 15 行实质上是用 Clones.sol 中的函数来装饰地址对象,使之成为我们在第 23 行和第 27 行分别使用的 predictDeterministicAddress 和 cloneDeterministic 函数。

Pair.sol

Pair.sol 合约是主合约,所有的最小化代理将从该合约中获得功能。请注意,一旦代理被部署,它就可以初始化并维护自己的存储,与主合约的存储分开。这使得 PairFactory 可以廉价地部署大量的 Pair。

$$$

恭喜您走到这一步。现在,您应该已经很好地掌握了如何在您的应用程序中使用最小化代理模式来管理您的 dApps 的成本和维护。您是否碰巧发现了 test.js 中的一行,我们比较了 Pair 合约的典型部署和最小化部署的成本。它在下面,在测试文件的第 70 行。

您没看错,在这种情况下,最小化代理模式比典型的合约部署至少提高了 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

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...