本文介绍了LI.FI为解决在多链环境下部署和管理智能合约的挑战而开发的自定义脚本框架。该框架结合了Bash和Solidity脚本功能,简化了在25个以上网络中数百个智能合约的部署、配置和管理。LI.FI通过使用Foundry工具和Bash脚本,实现了安全、高效、可控的多链合约管理。
由于 RPC 问题、gas 价格波动和其他神秘错误,在 EVM 网络上部署和管理智能合约通常会带来重大挑战,尤其是在处理多个网络时。为了应对这些挑战,LI.FI 开发了一个定制的脚本框架,该框架结合了 Bash 和 Solidity 脚本功能,以简化我们在 25 多个网络中的数百个智能合约的部署、配置和管理。今天,我们很高兴与大家分享这一创新解决方案,旨在提高多链智能合约管理的整体效率。
LI.FI 是加密货币领域领先的桥和 DEX 聚合器,连接了 20 个 EVM 链、12 个桥、25 个 DEX 和 5 个 DEX 聚合器(并且还在增长)。
LI.FI 的产品组合具有复杂的白标 B2B 解决方案,不仅允许相同/跨链代币交换功能,还允许任意合约调用,以实现高级跨链策略,例如收益聚合、LP-zapping、NFT 购买等等。
LI.FI 还通过 jumper.exchange 为 B2C 市场提供服务,jumper.exchange 是加密货币领域快速增长的 “everything exchange”,使用户能够以最具竞争力的价格从庞大的代币池中进行交换(可选保险以增加安全性),并使用超过 130 种不同的法定货币购买加密货币。
部署智能合约可能是一项繁琐的任务。如果你以前这样做过,你很可能会遇到各种问题,例如 RPC 不响应或抛出错误、gas 估算不足,或者只是普通的(错误)谜团导致你的部署脚本失败。将合约验证添加到该过程中,你的脚本在没有错误的情况下完成的可能性会Swift降低。
仅在一个网络上成功部署合约通常很麻烦,但在多个网络上部署(在 LI.FI 的情况下,超过 25 个网络,包括测试网)Swift会快速成为一项复杂的任务,可能需要几天才能完成。例如,更改所有网络中单个合约的配置这样的简单任务需要 LI.FI 执行 20 次左右的脚本 - 并且这仅在一切顺利的情况下才成立。
此外,对于像 LI.FI 一样将安全性视为重中之重的人来说,跟踪哪些代码已部署在何处以及哪些版本的代码已通过审计(在哪个审计中)也很重要。
最后但并非最不重要的一点是,在我们的合约仓库中维护已部署合约地址的列表也很有帮助,以供其他团队和开发人员参考,并且其他脚本可以从中读取,以防他们需要与这些合约中的任何一个进行交互。
在我们深入研究我们如何应对这些挑战之前,我们想简要介绍一下我们的智能合约设置。
LI.FI 的智能合约设置是一种所谓的 “钻石合约” 设置,这是 Nick Mudge 开发的概念,并在 EIP2535 中进行了描述。它最大的优点是它绕过了合约部署的 字节码大小限制,这允许合约采用接近无限量的业务逻辑。
我们的主要(钻石)合约根本不包含任何业务逻辑。相反,它通过近 40 个 facet 合约、12 个 helper/library 合约和另外 8 个与其交互的外部合约(例如,用于费用收集和消息执行)获得其功能。
编者注:我们将在即将发布的专门博客文章中更详细地描述我们的钻石合约设置。
上述合约的网络特定子集已部署到大约 25 个 EVM 网络,其中 20 个是主网。无需让 Pepe 进行数学计算 - 我们可以自信地说,我们有超过 300 个合约在运行。我们花费了大量时间来部署它们,并且我们经常需要添加合约或更改配置。
有了这么多的技术开销,我们开始认真改进我们的智能合约管理并使其更高效。现在,事不宜迟,让我们向你展示我们如何利用像 Bash 脚本这样的简单编程语言来简化多链智能合约管理。
在 LI.FI,我们始终力求卓越,因此第一个合乎逻辑的步骤是定义高效多链智能合约管理的基本要求。
我们得出的结论是,LI.FI 的解决方案……
为了满足所有这些要求,同时尽量保持简单,我们选择了 Bash 脚本的组合,这些脚本利用各种 Foundry 工具,例如 cast、anvil 和 script。在控制性的最上层使用 Bash 脚本不仅允许我们重新运行失败的 Foundry 脚本,还可以在一次脚本执行中在多个网络上执行一个特定任务。
让我们看一下主要组成部分:
我们有一个主脚本,我们从中控制所有其他脚本:scriptMaster.sh
此脚本生成简单的用户对话框,以找出要执行的用例以及在哪个网络/环境(如果不在我们连接的所有网络中)。然后,中央脚本将调用其他脚本文件,这些脚本文件专门用于协调特定任务,例如:
使我们的脚本如此强大的大部分功能都位于各种 helper 函数中,这些函数都收集在 helperFunctions.sh 中。其中一些函数处理日志记录,并从区块链或本地文件系统读取,而另一些函数则只是循环访问多个网络来执行操作。
主脚本还使用一个名为 config.sh 的配置文件,该文件允许我们以多种方式调整脚本执行。例如,我们可以设置失败时的尝试次数,更改目录,激活或停用某些功能(例如验证或具有扩展日志记录的“调试模式”),启动本地网络,并在此本地网络上测试部署和脚本,或排除特定脚本执行的某些网络或合约。
合约部署由用 Solidity 编写的 Foundry 脚本完成,该脚本位于文件夹 script/deploy/facets/… 中。每个合约都有自己的部署脚本 (Deploy< ContractName >.s.sol),该脚本从特定于桥的配置文件(位于 config/… 中)收集所有必要的数据(即构造函数和初始化参数),并使用我们的自定义 Create3Factory 合约部署该合约,以确保我们在所有 EVM 网络上都具有相同的合约地址。此外,对于每个合约,我们都有一个更新脚本 (Update<ContractName>.s.sol),该脚本将合约添加到我们的钻石中(将通过 DiamondCut 添加 facet,并且将利用我们的 PeripheryRegistryFacet 的代码在我们的钻石中注册外部合约)。任何 facet 更改(也称为钻石切割)都Swift必须由 多重签名钱包(我们使用 Safe 合约)批准。这确保即使一个私钥被盗用,我们的合约以及我们的用户始终Swift是安全的。
我们分享 LI.FI 之旅的目的不是追求完美,而是本着社群学习和公开构建的精神。我们的合约代码库已经有机地增长到相当大的规模和复杂性,我们意识到所提出的解决方案是高度定制的,以满足我们的需求和代码库结构。但是,我们鼓励加密社区根据其团队可能有的任何特定要求来适应、构建和改进这些脚本。其他创造性的应用和建设性的反馈将激励我们,我们很高兴看到其他团队可以使用这个工具集实现什么。
请与我们分享你的经验、解决方案和扩展。
现在,是你深入研究高效多链智能合约管理世界的时候了。探索我们的合约代码库并发现新的可能性:Github
发现这篇文章很有见地? 在 Medium 上用一些当之无愧的掌声来表达你的感谢,并在 Twitter 上分享它。通过加入我们的 Twitter 和 Discord,与我们的旅程保持联系,绝不会错过任何更新。
LI.FI 作为桥和 DEX 聚合器引领潮流 - 加入我们并成为我们旅程的一部分。
准备好体验无缝的代币交换,或者希望用法定货币购买加密货币?
有关 LI.FI 协议的更多信息,
- 原文链接: blog.li.fi/how-li-fi-man...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!