EIP-7664: Access-Key 操作码
access-key 操作码使合约能够读取在访问列表中静态声明的输入。
Authors | Diederik Loerakker (@protolambda) |
---|---|
Created | 2024-03-27 |
Discussion Link | https://ethereum-magicians.org/t/access-key-opcode/19395 |
Requires | EIP-1153, EIP-2930, EIP-4844 |
Table of Contents
摘要
此 EIP 引入了一个新的操作码来检查执行地址的访问列表键。
动机
此 EIP 用作顶层调用检测的替代品,以使智能合约能够强制执行属性的静态声明。
以前,应用层合约通常依赖于 tx.origin
来强制执行顶层调用,从而将合约输入编码为交易输入,这与帐户抽象支持者的常见建议相悖。
虽然交易的访问列表直接影响执行,但它只影响 gas 成本。
此 EIP 增强了访问列表功能,以提供静态定义的合约输入的属性,而无需依赖顶层调用、tx.origin
行为或 gas 自省。
这使智能合约能够可靠地强制执行输入的静态声明。
这是朝着实现 EIP-2930 动机中所述目标迈出的一步:
引入访问列表格式和处理该格式的逻辑。 这种逻辑稍后可以重新用于许多其他目的,包括全区块见证、 在 ReGenesis 中使用、随着时间的推移转向静态状态访问等等。”
规范
参数
常量 | 值 |
---|---|
ACCESS_KEY_OPCODE_GAS |
3 |
ACCESS_KEY_OPCODE_BYTE |
0x4B |
操作码
我们添加一个指令 ACCESS_KEY
(操作码为 ACCESS_KEY_OPCODE_BYTE
),它从堆栈顶部弹出 index
作为大端 uint256
,并将 tx.access_list[address][index]
推回堆栈上,如果 address
存在于 tx.access_list
中,并且 index < len(tx.access_list[address])
,否则推送一个零值 bytes32
值。
Gas 消耗
该操作码具有固定的 gas 成本 ACCESS_KEY_OPCODE_GAS
。
交易本身访问列表内容的内在 gas 成本不会改变。
理由
静态分析交易
合约输入的静态声明支持高级第二层结构和区块构建技术: 数据在没有 EVM 自省的情况下可用,并且合约可以可靠地判断正在执行的交易是否向区块构建者和验证节点声明了关键属性。
合约输入的静态声明现在独立于帐户抽象相关的更改, 例如交易捆绑器,以及与 3074 的协议内。
全局只读值
类似于 EIP-1153 中描述的 TLOAD
,
ACCESS_KEY
操作码为合约提供了一个视图,该视图对于 EVM 中交易的消息执行是全局的。
但是,使用 ACCESS_KEY
可以保证它是只读的,并且在交易执行期间无法更改。
访问列表实用程序
如今,访问列表的使用不足: 很少有用户利用它来预热存储交互以降低 gas 成本。 一般来说,EIP-2930 实现的 gas 成本节省在很多用例中并不适用。
通过此 EIP,访问列表功能的实用性得到提高, 而无需 EVM 提供额外的资源。
见证数据
此 EIP 通过支持只读应用程序状态提供给合约,而无需合约调用者支持数据转发,从而支持应用程序的转换以减少状态性。
访问列表内容可能包含见证数据,合约可以验证该数据并利用无状态性。
Gas 消耗
ACCESS_KEY_OPCODE_GAS
gas 成本与类似操作的成本相匹配,
特别是 EIP-4844 的 BLOBHASH
操作码:
此操作码还从堆栈中弹出一个类似索引的 EVM 字,
并根据嵌入在交易中的哈希列表将一个完整的 32 字节 EVM 字推回到堆栈上。
但是,EIP-4844 的 BLOBHASH
功能不能用于此 EIP 的目的,
因为目的是仅访问静态声明的哈希,而不是 blob 的成本。
ACCESS_KEY
的命名
访问列表当前仅支持访问键列表。 未强制要求列表进行排序,因此支持索引查找。
这不是 LOAD
操作码,因为 SLOAD
或 TLOAD
是,因为该操作码返回一个键。
向后兼容性
没有交易类型更改
此访问列表实用程序的增强不会影响访问列表编码, 或支持访问列表的现有交易类型。
对 EVM 交易上下文的最小影响
使用 EIP-2930,访问列表内容在 EVM 执行期间已经在交易上下文中可用, 以及触发所述执行的 RPC 方法。
因此,此 EIP 不需要对 EVM 上下文的构建进行重大更改, 也不需要对 RPC 方法进行任何更改。
测试用例
区块费用接收者,以及任何其他未在交易访问列表中静态声明的预热属性, 不得被视为访问列表的一部分。
安全考虑
访问列表属性已在 EIP-2930 中进行 gas 计量, 并且在 EVM 中可以随时访问,以确定存储 gas 成本。 在拒绝服务风险方面, 此 EIP 没有引入任何新的重要数据或数据处理成本。
访问列表是只读的,因此对应用程序开发人员的风险最小。
访问严格限制于原本会执行预热 SLOAD
的合约,
因此存储布局抽象不会在不同的智能合约应用程序之间泄漏。
版权
在 CC0 下放弃版权和相关权利。
Citation
Please cite this document as:
Diederik Loerakker (@protolambda), "EIP-7664: Access-Key 操作码 [DRAFT]," Ethereum Improvement Proposals, no. 7664, March 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7664.