主页 > 下载imtoken被盗 > 好号的地址能安全吗?详解无许可多链部署唯一安全方法
好号的地址能安全吗?详解无许可多链部署唯一安全方法
Wintermute 是业内最敏锐的做市基金之一,损失了 1.6 亿美元,它在 9 月的一个早晨醒来,发现他们的一个主要钱包基金丢失了 9 个数字。 那么是什么导致 Wintermute 被盗呢? 这是由虚荣地址生成器中的不良随机性引起的。 黑帽黑客从零开始暴力破解私钥和公网地址对,大量加密资产被转移走。
还有一个关于 Indexed Finance 被盗的故事,他们在 2021 年 10 月被盗了 1600 万美元,然后被盗资金被转移到以 0xba5ed 开头的地址......。 他们不知道的是,这个虚荣地址也受到了困扰 Wintermute 的可怕随机性错误的影响,并且在 2022 年 9 月所有的钱再次被盗,转到另一个被黑的钱包地址。 盗贼无情。
那么这些才华横溢的开发者遇到了哪些问题,我们可以从他们身上学到什么?
左边是 WETH 合约使用的正常地址。 右侧是带有 14 个针对 MEV 机器人优化的前导零的虚荣地址。 最常见的虚荣地址类型是具有许多前导零的地址。
一、什么是虚荣地址(也称虚荣地址)? 虚荣地址是指用户故意创建的与他们的钱包或智能合约相关联的公共地址。 它可能以 0x0000000、0xdeadbeef 或其他常规地址开头。 它们受欢迎的原因有几个:
1. Gas 优化:Wintermute 通过使用带有多个前导零的 EOA 地址节省了 15,000 美元。 听起来很傻? 很多人都同意,但这就是 EVM 的工作原理! 如果你的地址中有很多零,交易 gas 成本就会下降。 因此,如果您使用带有很多前导零的智能合约地址,当用户与之交互时,他们会很高兴,因为这可以节省他们的钱。
以太坊黄皮书描述了带有前导零的地址如何使 gas 更便宜
2.协议品牌。 你知道 1inch 代币合约以 0x111111111... 开头吗?
1inch代币合约
3. 多链重复性。 在我看来,这是最重要的,也是为什么每个协议都应该使用虚荣地址进行部署的原因。 您的应用程序可以存在于 15 个不同的 EVM 链上,并且在任何地方都具有相同的地址! 这对开发者和用户来说不是更容易吗?
那么虚名账户的地址什么时候是安全的呢?
以太坊地址有两种类型:外部拥有账户(EOA)和智能合约账户。 如果你用过像 MetaMask 这样的钱包,里面的每个地址都是一个 EOA,用来签署消息和处理交易。 将其与智能合约帐户(如 Uniswap 合约)进行比较,人们可以与之交互,但它不能在不被触发的情况下采取自己的行动。 总结一下,很简单,虚荣地址对EOA账户不安全,但对智能合约账户是安全的。
那么为什么会这样呢? 我们在下面进行更详细的解释,但这取决于虚荣地址是如何生成的。 对于 EOA 帐户,您循环使用数百万个私钥,直到找到一个与一个不错的公共地址相对应的私钥。 然而被泄露的以太坊私钥,私钥控制着 EOA 账户内的资金,所以如果你用来迭代私钥的随机性被破坏,你的整个账户就会被破坏。 另一方面,创建智能合约虚荣地址只需要遍历公共种子,这不会授予智能合约任何管理权限。
这就是 Wintermute 失败而 OpenSea 成功的原因——使用不安全的软件在不安全的内存中生成私钥是不好的。 但是以这种方式生成公共种子非常好! 所以EOA虚荣地址是一条破产之路,而智能合约虚荣地址是一条成功之路。
为什么协议需要虚荣地址
注意:我们即将深入研究详细的手册。 这是第一次将所有部分放在一起,我们正在深入技术领域,目标受众是具有在链上部署智能合约经验的智能合约开发人员。 如果您有兴趣,请继续阅读,但如果它不适合您,请不要担心跟不上! 最后还有一个额外的技术挑战(有奖励)。
智能合约智能号地址
有一种方法可以生成 100% 安全的智能合约虚荣地址,无论您使用什么软件,迭代技术是否公开泄露都无所谓。 它被称为“CREATE2 工厂方法”,它不仅提供虚荣地址,而且还是确保您在多个链上拥有相同合约部署地址的万无一失的方法。 它还允许其他人以不信任的方式代表您部署代码,而无需任何私钥共享或随机数假设。
首先,快速概述一下如何选择智能合约地址。 有两个部署选项,CREATE 和 CREATE2。 当您直接从 EOA 部署智能合约时,默认过程是 CREATE。 该地址是通过将合约创建者地址与合约创建者随机数进行散列来确定的。 这个nonce是指一个地址发送了多少笔交易,所以新钱包从0开始,每发送一笔新交易就加1。 这是 CREATE 部署的智能合约地址的神奇公式:
new_address = hash(发件人,随机数)
不太常见但更有趣的是使用 CREATE2 部署的智能合约地址,其公式如下:
new_address = hash(0xFF, sender, salt, bytecode)
前者似乎更简单,对吧? 但是让我们举一个例子,说明与更健壮的 CREATE2 过程相比,这种简单性在哪些方面是有害的。
Airy Alice:多链存在问题
想象一下,一个名叫 Alice 的加密货币开发人员创建了两个智能合约:一个名为 GriddleSwap 的 Uniswap 分支,以及一个名为 ph00ts 的 NFT 项目。 它们都是不可变的独立原语,这意味着没有外部依赖或跨链桥的风险。 Alice 使用随机数 0 将 GriddleSwap 部署到以太坊,然后使用随机数 1 将 ph00ts 部署到以太坊。可悲的是,Alice 的注意力持续时间很短,在将她的工作部署到币安智能链(BSC)之前被加密推特分散了几分钟,第二大智能合约平台。
糟糕,打乱了部署顺序!
可是等等! 她弄乱了部署顺序,在 GriddleSwap 之前部署了 ph00ts。 由于智能合约地址只依赖于创建者地址,而在部署的区块链中,以太坊gridleswap与BSC ph00ts的地址完全相同! 雪上加霜的是,以太坊 ph00ts 与 BSC GriddleSwap 的地址相同。 认为最终用户会感到困惑是轻描淡写的说法。 事实上,恶意部署者可能会滥用它来诱使人们认为合约在链上的行为相同——这是一个公平的假设,给定相同的地址!
小心爱丽丝:还是会有问题
即使 Alice 认真对待部署并且从不混淆她的 nonces 的顺序,还有其他问题。 如果 Alice 正确部署到 Ethereum 和 BSC,但随后在 Polygon 上进行了不相关的交易,则 nonce 0 已被花费。 她永远不能在那里部署 GriddleSwap,因为她的 nonce 已经增加了。 因此,必须不惜一切代价保护部署者私钥。 如果 Alice 泄露了它,恶意行为者就可以进行不相关的交易。 如果 Alice 丢失了它,她也将失去在新链上再次部署到该地址的能力。 这是一个永久性漏洞,依赖于保护私钥的诚实个人。 如果连比特币核心开发人员都做不到,我们其他人怎么能做到呢?
解决方案:CREATE2
值得庆幸的是,有一种更好的方法可以跨链实现一致的地址——一种不依赖秘密私钥、不依赖单个部署者并且能够抵抗部署者错误的方法。 请记住用于查找使用 CREATE2 部署的智能合约地址的公式:
new_address = hash(0xFF, sender, salt, bytecode)
第一个参数 0xFF 是一个常量值,可以忽略。 第二个参数(发送者地址)在大多数EVM链中选择z0age的CREATE2Factory deployment 0x0000000000FFe8B47B3e2130213B802212439497可以保持一致。 第三个参数是用户选择的盐,我们可以用它来找到一个虚地址,然后在链上保持不变。 第四个是合约字节码,它作为一种有用的健全性检查来确保我们在链上部署完全相同的功能。 无论任何一个部署者做什么,所有四个参数都可以保持不变。
为什么这样更好? 与私钥不同,部署者选择的盐可以公开! 知道 salt 允许部署合约,但对合约的资产或功能的控制为零。 因为它不绑定任何秘密信息,任何人都可以在不泄露或共享私钥的情况下将合约部署到新链上。 字节码参数还确保当且仅当字节码相同时,这些新的无许可部署将具有相同的地址。 因此被泄露的以太坊私钥,最终用户无需进行详细的代码差异即可获得更强的保证。
创建您自己的虚荣地址
认为以太坊合并后工作量证明 (PoW) 没用了吗? 再想一想! 有助于为比特币块查找具有大量前导零的哈希原像的 GPU 能力同样适用于为 EVM 智能合约查找具有大量前导零的哈希原像。 来自 OpenSea 的 z0age(感谢这篇文章的解释)找到了一个简单的设置来创建您自己的虚荣地址。
1、使用vast.ai启动一个GPU示例实例,每秒约20亿次尝试,成本约为25美分/小时:
图片:nvidia/opencl
图形处理器:1 个 RTX 3090
要分配的磁盘空间:1.83 GB
2. SSH并安装rust + create2crunch
sudo apt install build-essential -y; curl –proto '=https' –tlsv1.2 -sSf | sh -s — -y; 来源“$HOME/.cargo/env”; git clone && cd create2crunch; sed -i 's/0x4/0x40/g' src/lib.rs
3. 运行洪流搜索。 对于环境变量,INIT_CODE_HASH 是合约创建代码的keccak256。 可以在此处找到打印出来的样本铸造测试? 确保在消耗大量计算资源之前对其进行验证! LEADING 应该是你想要的前导零字节数,TOTAL 应该是你想要在合约地址中的零字节总数。
导出工厂=”0x0000000000ffe8b47b3e2130213b802212439497”; export CALLER=”0x0000000000000000000000000000000000000000”; 导出 INIT_CODE_HASH=”0xabc…def”; 出口前导=5; 出口总计=7; cargo run——release $FACTORY $CALLER $INIT_CODE_HASH 0 $LEADING $TOTAL
当 z0age 首次发布他的 repo 时,它能够在上述 vastAI 硬件上每秒运行 19 亿次尝试。 从那时起,矢量化在某些 OpenGL 内核上变得疯狂起来,我观察到每秒有 21.5 亿次尝试。 这意味着找到 5 个前导零字节地址需要 256^5/(2150000000 * 60) ~= 8 分钟,找到 6 个前导零字节地址需要 256^6/(2150000000 * 3600) ~= 36 小时,并且找到一个 7 前导零字节地址需要 256^7/(2150000000 * 86400) ~= 387 天。 请注意,一个字节等于两个十六进制字符,因此 5 个前导字节的地址将有 10 个零。 当然,这种搜索可以完全并行化,实际成功的概率随时间服从泊松分布。
部署 CREATE2 工厂
细心的读者可能已经注意到 CREATE2 Factory 已经存在于所有链上的 0x0000000000FFe8B47B3e2130213B802212439497 处。 有点鸡生蛋还是蛋生鸡的问题,一致地址部署如何依赖一致地址部署?
当我第一次知道这个方法时,我以为它只是一个比我聪明的人持有的私钥(上面的“小心爱丽丝”场景)。 但它实际上比那更强大! ENS 创始人 Nick Johnson 的“无密钥交易”方法利用了这样一个事实,即您可以从任何交易签名中恢复公共地址,而无需知道签署它的相应私钥。 因此,可以创建一个事务(“部署一个 create2 工厂”),然后为它发明一个假签名,例如一个只包含 2 的签名。 这个假签名的私钥存在,但没有人知道它是什么。 但是我们可以恢复“无钥匙签名”对应的公网地址,给它发送一些ETH,将签名后的交易提交到内存池。 尽管这种方法有歧义,但它是一个有效的交易,而且确实是唯一可以从这个公共地址发送的有效交易。
结果? 任何人都可以在没有任何专有信息的情况下将工厂部署到新链上,同时防止恶意行为者造成损害。 创建一个只能部署一个事务的单一用途 EOA 是一种非常巧妙的技术。
无密钥交易期间创建的特定地址和合约
这可以通过三个简单的“forge cast”命令来完成。 字节码太长无法在此处重现,但您可以按照上面的说明在您选择的任何链上未经许可地部署 CREATE2 Factory!
当然,如果已经部署过,就不需要再部署了。
旁注:EIP-155 要求不好
支持我的 L1 治理事业的简短尝试,请随意跳过。 EIP-155? 是Vitalik在2016年提出的一个提案,引入了“链ID”的概念来防止重放攻击。 每条链都有自己唯一的标识符——1 个用于以太坊,56 个用于 BSC,137 个用于 Polygon——这些标识符将包含在签名交易中以防止重放攻击,它很快被以太坊采用,所有其他 EVM 链也纷纷效仿。 That's fine, but here comes the problem, when choosing a few chains, for example Evmos recently decided to explicitly ban pre-EIP-155 transactions?, for strange reasons, it prevents an operational error that Optimism will transfer 20 million OP tokens to Sent到 Wintermute 不存在的多重签名(是的,又是他们)地址,声称拥有但从未初始化。 然而,禁用 155 之前的交易会严重破坏整个跨链部署,例如 CREATE2 工厂和 Seaport 等领先项目。 这些治理建议应该立即回滚,像这样的保护细节应该来自钱包而不是共识层。 如果多链是未来,那么这些不必要的限制将成为顶级项目在您的区块链上部署的巨大障碍。
有趣的事情:部署赏金
今天部署在 7 个不同的 EVM 链(Ethereum、Polygon、Optimism、Celo、Avalanche、Fantom 和 Arbitrum)和与这些链对应的 7 个测试网上。 它们的合约地址都是相同的:0x00000000000076A84feF008CDAbe6409d2FE638B。
够了吗? 不,我们需要更多链条。 因为 delegatecash 是一个零依赖的独立原语,这意味着多链的风险实际上是零。 这是纯粹的好处! 因此,我将奖励 100 USDC 的赏金给前 5 名部署和验证 delegatecash 智能合约到新链和相应测试网的人!
您需要使用此处开源存储库中的部署脚本。 这可能需要部署 CREATE2 Factory(如果它不存在),并且不要忘记 Etherscan 验证! 部署愉快,享受体验式学习!
(免责声明:请读者严格遵守当地法律法规,本文不代表任何投资建议)