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.