该EIP旨在解决以太坊160位地址可能存在的外部账户(EOA)和合约账户之间的哈希碰撞问题,攻击者可能利用此漏洞部署看似安全的合约后盗取资金。为防止最严重的攻击,EIP规定客户端必须拒绝来自已部署代码的地址发起的交易。
以太坊地址目前仅为160位长。这意味着,使用估计为 2**80 的计算操作,可以在合约账户和外部拥有账户(EOA)之间制造冲突,这在当前拥有大量预算(约100亿美元)的情况下是可行的。本EIP中的修复方案可以防止最糟糕的攻击:部署一个看起来安全的合约(例如代币封装器或AMM类型合约)来吸引用户资金,然后使用同一地址的EOA密钥花费这些资金。修复方案是绝不允许将已部署代码的地址用作EOA地址。
通过为 2**80 个EOA创建密钥,并模拟从这些EOA部署 2**80 个合约(每个EOA一个),预期会发现大约一个冲突,即一个EOA与一个合约拥有相同的地址。
这种非常简单的攻击形式需要存储 2**80 个地址,这是一个实际障碍:它将需要 2.4*10**25 字节的内存(24 Yottabyte)。然而,存在可以执行冲突搜索而无需大量存储的循环查找算法。复杂度的估计已在此处给出。我们估计,通过投入约100亿美元的硬件和电力,可以在大约一年内找到合约与EOA之间的冲突。
目前正在讨论将以太坊地址迁移到256位,这将把抗冲突性提高到 2**128 的复杂度,这在可预见的未来被认为是不可行的。然而,如上所述,对于160位地址,冲突问题现在可以有效解决。
大多数通过地址冲突发生的攻击都相当不切实际:它们涉及用户在合约部署前将资金发送到某个地址。这在实践中是非常罕见的应用,用户可以很容易地通过在合约安全部署并获得足够确认之前绝不向其发送资金来规避攻击。
然而,黄皮书并未明确规定客户端应如何处理从已部署合约代码的账户发送交易的情况;这大概是因为当时认为这是不可行的。假设是大多数客户端在当前状态下会允许这种交易。
本EIP旨在明确此行为,即始终禁止此类交易。这修复了由于地址冲突引起的最真实或最严重的攻击。
任何 tx.sender 的 CODEHASH != EMPTYCODEHASH 的交易都必须被拒绝为无效,其中 EMPTYCODEHASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470。
无效交易必须被客户端拒绝,并且不被包含在区块中。
包含此类交易的区块必须被视为无效。
我们注意到,一直以来都期望合约账户的行为受限于该合约中的代码——这意味着账户的资金不应突然被某个私钥花费。过去只是隐式地假设160位地址长度足以提供抗冲突性,因此这种情况永远不会发生。从这个意义上讲,本EIP应被视为对先前未定义情况下的协议行为的澄清,而不是对共识规则的明确升级。
这并非排除了所有可能的攻击向量,而只是最严重的一种。通过合约和EOA之间的地址冲突的进一步可能攻击向量是:
所有这些场景对攻击者来说都更难利用,并且收益可能低得多,使得这些攻击不太可能在经济上可行。
这种攻击不太可能已经在以太坊主网上发生,否则我们很可能已经听说过。无法想象有人会将其作为一项“功能”,同时使合约成为EOA,因为他们只需通过向合约添加一些方法即可实现此目的,而不是花费数十亿美元构建硬件来寻找哈希冲突。
私有网络可能在创世时部署了也作为EOA工作的合约,应检查此升级是否影响其工作流程。
客户端可以选择对 eth_call 和 eth_estimateGas 等RPC调用禁用此规则,因为某些Multi-Sig合约使用这些调用来创建交易,就像它们源自多重签名合约本身一样。
给定一个创世分配:
Address: 0x71562b71999873DB5b286dF957af199Ec94617F7
Balance: 1000000000000000000 // 1 ether
Nonce: 0,
Code: 0xB0B0FACE",
对应于 0x715656... (b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291) 的私钥发送的每笔交易都应被拒绝。
这些交易必须被拒绝,并且不包含在区块中。
在检查发送者的随机数正确之后,必须将以下检查添加到状态转换检查中。 发送者是从交易签名中恢复的地址。
// 确保发送者是 EOA
Set ch to the CodeHash of the sender account // 将 ch 设置为发送者账户的 CodeHash
if ch is not equal to EmptyCodeHash then // 如果 ch 不等于 EmptyCodeHash 则
return ErrSenderNoEOA // 返回 ErrSenderNoEOA
end if // 结束 If
go-ethereum中实现EIP-3607的差异可以在此处找到。
本EIP是一项严格的安全升级:它只是使一些以前有效的交易现在变为无效。此类交易没有合法用途,因此不应有安全方面的负面影响。
本EIP可以作为软分叉实现,因为新的有效性规则是旧有效性规则的严格超集。
通过CC0放弃版权及相关权利。
- 原文链接: github.com/nerolation/EI...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!