Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-3521: 降低访问列表成本

Authors Matt Garnett (@lightclient)
Created 2021-04-15
Discussion Link https://ethereum-magicians.org/t/eip-3521-reduce-access-list-cost/6072
Requires EIP-2028, EIP-2930

简单摘要

降低在访问列表中声明 tx.to 存储键的成本。

动机

目前,一个交易必须至少读取 tx.to 中的 25 个不同的存储插槽,放弃访问列表才会更昂贵。

ACCESS_LIST_ADDRESS_COST + (ACCESS_LIST_STORAGE_KEY_COST + WARM_STORAGE_READ_COST) * x = COLD_SLOAD_COST * x
x = 24

EIP-2930 要求显式声明存储键所在的地址,因为它必须添加到 EIP-2929 的 accessed_addresses 列表中。但是,tx.to 是一个默认添加的特例,因此为 tx.to 支付 ACCESS_LIST_ADDRESS_COST 本质上是为同一个地址支付两次费用。避免在此处过度支付将减少差额,只需 5 次独特的读取,使用访问列表就会更便宜——使它们成为更具吸引力的选项。

规范

将访问列表中第一次出现的 tx.to 视为 calldata,用于 gas 记账。不要为此收取 ACCESS_LIST_ADDRESS_COST 费用。地址下的存储键不受影响。

如果 tx.to == nil,则将 tx.to 定义为交易创建的派生合约地址。

理由

为什么还要收费?

EIP-2930 专门用于使访问列表易于推理和验证。可以修改访问列表的结构以避免显式包含 tx.to,但这将违背 EIP-2930 的精神。

为什么按 calldata 收费?

EIP-2028 中彻底分析了 calldata 的成本,以确定一个不易受到拒绝服务攻击的公平值。我们认为这是交易数据应花费的下限。由于将 tx.to 添加到 accessed_addresses 映射(默认情况下由 EIP-2929 添加)没有计算负担,因此没有理由收取超过数据绝对最小值的费用。

测试用例

{
    "0xffffffffffffffffffffffffffffffffffffffff": []
}
cost = 320

{
    "0x00ffffffffffffffffffffffffffffffffffffff": []
}
cost = 308

{
    "0xffffffffffffffffffffffffffffffffffffffff": []
    "0xffffffffffffffffffffffffffffffffffffffff": []
}
cost = 2720

{
    "0xffffffffffffffffffffffffffffffffffffffff": [
        "0x00"
    ]
    "0xffffffffffffffffffffffffffffffffffffffff": []
}
cost = 4620

{
    "0xffffffffffffffffffffffffffffffffffffffff": [
        "0x00"
    ]
    "0xffffffffffffffffffffffffffffffffffffffff": [
        "0x00"
    ]
}
cost = 6520

向后兼容性

没有问题。

安全注意事项

没有。

版权

CC0 下放弃版权及相关权利。

Citation

Please cite this document as:

Matt Garnett (@lightclient), "EIP-3521: 降低访问列表成本 [DRAFT]," Ethereum Improvement Proposals, no. 3521, April 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3521.