ASE 代表地址空间扩展(Address Space Extension),一边提高安全性及添加周期
ASE 代表地址空间扩展(Address Space Extension),这是 Vitalik Buterin 于 2021 年 3 月在一个论坛上首次提出的概念。正如稍后将讨论的那样,ASE 的本质是将地址大小从 20 字节增加到 32 字节。Vitalik 提出了三个需要扩展地址空间的原因:
1. 为引入状态过期添加地址空间 ID
2. 为 EVM 支持的执行分片添加分片 ID
3. 从安全角度来看,20 字节不足
在这三个原因中,由于计划变更,为 EVM 支持的执行分片添加分片 ID 已被放弃,目前仅剩下为引入状态过期添加地址空间 ID 和从安全角度来看 20 字节不足这两个有效原因。了解 ASE 出现的背景有助于更好地理解 ASE 的概念,因此在深入探讨 ASE 概念之前,我们首先要了解其出现的两个有效背景。
状态过期是旨在通过减少状态大小来减轻节点操作负担的几项措施之一。它涉及删除最近未访问的状态。为了定义“最近”的含义,状态过期中引入了一个周期的概念。根据当前标准,每年开始一个新周期,并使用一棵新树,在状态过期中,除了最后一个和当前的周期外,所有周期都被删除,只保留它们的根。
可能有用户自两个周期前以来未更改其钱包状态。这些用户可能希望将他们拥有的 ETH 转移到另一个钱包。然而,由于状态过期,用户的状态已被删除。在这种情况下,用户是否无法恢复他们的 ETH?
不,并非如此。用户可以通过支付少量费用并提交称为见证的证明来复活他们的状态。见证是一种证明特定值在某个位置存在或不存在的证据。如果你想了解更多关于状态过期和见证的信息,请查看本系列的第 1 篇。
然而,根据拥有的 ETH 数量和复活成本之间的机会成本,用户面临两种选择。首先,如果复活成本高于拥有的 ETH 数量,用户放弃他们的 ETH 并创建一个新地址。这样,他们可以将损失降到最低。其次,如果拥有的 ETH 数量多于复活成本,他们支付费用并复活他们的状态。
因此,随着状态过期和见证的引入,即使过去周期的状态(除了最后一个)被删除后,也可以检索到自己的状态。然而,从地址的角度来看,众多地址的创建和消失可能会引起混乱。因此,Vitalik 主张在地址空间中添加与周期相关的信息以防止这种混乱。
要理解为什么当前 20 字节的地址大小从安全角度来看是不足的,首先需要掌握哈希函数中的碰撞和碰撞抗性的概念。
碰撞意味着两个不同的消息具有相同的哈希值。 你可以将其视为将两个不同的输入放入哈希函数并得到相同的输出。
碰撞抗性则指的是找到碰撞的难度。 例如,如果碰撞抗性为 128 位,则意味着找到碰撞需要 2 ¹²⁸ 次操作(哈希计算)。
以太坊主要使用 Keccak-256 哈希函数。理想情况下,Keccak-256 哈希函数的输出为 256 位,但以太坊目前仅使用 Keccak-256 公钥哈希的最后 20 字节(=160 位),任意截断并以十六进制表示为地址。根据 Vitalik 的“Increasing address size from 20 to 32 bytes”,当前以太坊地址的碰撞抗性为 80 位。
文本没有描述碰撞抗性值的计算方法,但推测是通过生日攻击确定的。本文不会深入探讨生日攻击的细节,但会简要解释它是一种用于找到哈希碰撞的密码攻击。在具有 H 个可能值(碰撞抗性)的哈希函数中使用这种生日攻击找到碰撞的概率可以通过以下公式表示:
对于当前 H =2¹⁶⁰ 的以太坊地址,计算 Q(2¹⁶⁰) 得到的值约为 1.51516382 * 10²⁴。由于 2⁸⁰ = 1.20892581 * 10²⁴,Q(2¹⁶⁰) 可以近似为 2⁸⁰。
假设有一个攻击者通过 1 单位的计算工作生成一个输入。这个攻击者必须执行超过 2⁸⁰ 的计算工作才能在以太坊地址中找到碰撞。最初,当以太坊网络创建时,达到 2⁸⁰ 的数量是不可能的,因此它并不构成重大安全问题。然而,到 2021 年 3 月,比特币已经生成了超过 2⁹⁰ 个哈希,导致 Vitalik 认为当前 80 位的碰撞抗性在可攻击范围内。因此,Vitalik 提议将地址大小从 20 字节增加到 32 字节,将公钥哈希纳入地址空间的 26 字节中以增加碰撞抗性。
有些人可能会好奇为什么在总共 32 字节的地址空间中只有 26 字节用于纳入公钥哈希值。这是因为哈希值占用的空间越大,安全性越强。然而,如第 2 章所述,剩余的 6 字节中的一些必须包含引入状态过期的周期信息。此外,将地址配置为“哈希值 + 周期信息”也可以从安全角度受益。与地址仅由哈希值组成相比,它对攻击者的简单重复攻击不那么脆弱。
到目前为止,我们已经研究了导致 ASE 出现的两个背景,现在我们打算深入探讨 ASE 的概念。如前所述,ASE 表示将地址空间从 20 字节增加到 32 字节。然而,这不仅仅是地址大小的简单增加;公钥的哈希值以及版本信息和周期信息已被纳入地址空间。将原始地址模式与新地址模式进行比较如下:
原始地址模式
#legacy address
字节 0-19 : 20 字节 Keccak-256 哈希
新地址模式
#new address
字节 0 : 版本字节(目前必须为 1)
字节 1-2 : 保留(必须为零)
字节 3-5 : 周期编号(0 <= e <= 16777215)
字节 6-31 : 26 字节 Keccak-256 哈希
每个字节的含义如下:
为了帮助理解 ASE,我们假设一个情景:Alice 的 A 地址由于状态过期被删除,Bob 想将位于 C 地址的 9,101 ETH 转移给 Alice。当前周期为 2。
Bob 有两个选择:1)支付复活费用并将 9,101 ETH 转移到 A 地址,或 2)不支付复活费用并创建一个新地址,将 9,101 ETH 转移到该新地址。Bob 选择了前者,因此 A 地址在周期 2 中复活。插图展示了转移 9,101 ETH 之前的情况。
ASE 代表了现有地址系统的彻底改革,因此不可避免地面临一些挑战。要实现 ASE,必须解决四个主要挑战:
1. 现有合约依赖于 20 字节地址。
2. 外部协议也在很大程度上依赖于 20 字节地址。
3. 如何在当前合约中支持 20 字节和 32 字节地址?
4. 如何在新合约中支持 20 字节和 32 字节地址?
Ipsilon 在论坛中提出了一个名为翻译映射的想法,以解决上述四个挑战。让我们仔细看看 Ipsilon 如何建议解决这些问题。
符号表示:
地址格式
字节 0 ; 版本字节(必须为 1)
字节 1-5 : 保留(必须为零)
字节 6-31 ; 26 字节 Keccak-256 哈希
外部拥有地址(EOAs)
对于 EOAs,longaddress 通过以下代码计算,同一个 EOA 公私钥对可以控制 longaddress 和 shortaddress。
hex"010000000000" || keccak256(pubkey)[6:]
执行
这是对执行语义如何受影响的解释。为了清晰起见,Ipsilon 将 shortaddress 命名为 legacy account,将 longaddress 命名为 extended account。此外,在 EVM 执行框架中引入了一个新的上下文变量 isLegacyAccount。如果当前执行的账户属于 legacy account,则返回 true,否则返回 false。
地址翻译过程如下:由于 legacy account 只能处理 shortaddress,因此引入了一个转换步骤到 longaddress。此外,还定义了几个辅助函数。
TRANSLATION_MAP_ADDR = hex"00000000000000000000000000000000000000ff"
EMPTY_CHUNK = bytes32([0] * 32)
DOMAIN = hex"efefefef"
# 前 12 个字节不为空,认为它是一个 LongAddress
def is_longaddress(address: LongAddress) -> bool:
return address[:12] != hex"0000000000000000000000"
#这个辅助函数压缩一个 LongAddress
def compress(address: LongAddress) -> ShortAddress:
return keccak256(keccak256(DOMAIN + address))[12:]
如果地址是 LongAddress,则在翻译映射中插入一个条目。
# 如果地址是 LongAddress,则在翻译映射中插入一个条目
#
# 这仅在非遗留上下文中调用。
def compress_and_touch(state: EthereumState, address: LongAddress) -> ShortAddress:
if is_longaddress(address):
short_address = compress(address)
state[TRANSLATION_MAP_ADDR][short_address] = address
return short_address
else
return address
当需要将 ShortAddress 翻译为 LongAddress 时,可以使用以下函数,例如在查询目标地址时。此函数仅在遗留上下文中调用。
#查找目标地址(如果 ShortAddress 翻译为 LongAddress)
#
#这仅在遗留上下文中调用。
def lookup_target(state: EthereumState, address: LongAddress) -> LongAddress:
# 截断输入
address = address[12:]
if state[TRANSLATION_MAP_ADDR][address] != EMPTY_CHUNK:
return state[TRANSLATION_MAP_ADDR][address]
else
# 账户可能是也可能不是遗留账户
return address
虽然翻译映射是一个很好的解决方案,但必须克服一个缺点。截至 2024 年 2 月 12 日,根据 ychart,以太坊中大约存在 258,080,000 个唯一地址,假设链条以类似的速度增长,在接下来的两年中将增加大约 1.5 亿个新地址,转换为短地址。根据 Ipsilon 的说法,在这种情况下,翻译映射至少需要 150,000,000 * 64 / 1024 / 1024 ≈ 9,155Mb 的大小,因此必须考虑存储问题。
到目前为止,我们已经探讨了 ASE 的背景和概念、引入 ASE 的挑战以及这些挑战的解决方案。ASE 表示地址空间从 20 字节扩展到 32 字节。然而,这不仅仅是大小的增加;扩展还将公钥的哈希值、版本信息和周期信息纳入地址空间。
这个 ASE 是引入状态过期的必要前提。随着状态过期的引入,地址将根据周期被删除和复活,因此需要在地址空间中添加周期信息以防止混淆。此外,从安全角度来看,现有的 20 字节地址已经达到了可以被攻击的范围,因此有必要将地址大小增加到 32 字节以增强碰撞抵抗力。
然而,由于现有合约和外部协议依赖于 20 字节地址,因此有必要设计一种方法来支持 20 字节和 32 字节地址。因此,Ipsilon 提出了利用翻译映射的解决方案。这使得可以根据需要将 32 字节地址压缩为 20 字节地址,并将压缩的 20 字节地址查找为 32 字节地址。在第 3 部分中,我们将探讨默克尔树验证。
到目前为止,我们已经探讨了 ASE 的背景和概念、引入 ASE 的挑战以及这些挑战的解决方案。ASE 表示地址空间从 20 字节扩展到 32 字节。然而,这不仅仅是大小的增加;扩展还将公钥的哈希值、版本信息和周期信息纳入地址空间。 这个 ASE 是引入状态过期的必要前提。随着状态过期的引入,地址将根据周期被删除和复活,因此需要在地址空间中添加周期信息以防止混淆。此外,从安全角度来看,现有的 20 字节地址已经达到了可能被攻击的范围,因此有必要将地址大小增加到 32 字节以增强碰撞抵抗力。
然而,由于现有的合约和外部协议都依赖于 20 字节地址,因此有必要设计一种方法来支持 20 字节和 32 字节地址。因此,Ipsilon 提出了一种利用翻译映射的解决方案。这使得可以根据需要将 32 字节地址压缩为 20 字节地址,并将压缩的 20 字节地址查找为 32 字节地址。在第 3 部分中,我们将研究默克尔树验证。
ETHGlobal, Statelessness & Verkle Trees
Ipsilon, ASE (Address Space Extension) with Translation Map
Vitalik Buterin, Increasing address size from 20 to 32 bytes
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!