EIP-3508: 交易数据操作码
Authors | Alex Papageorgiou (@alex-ppg) |
---|---|
Created | 2021-04-16 |
Discussion Link | https://ethereum-magicians.org/t/eip-draft-transaction-data-opcodes/6017 |
Table of Contents
简述
提供对原始交易数据的访问。
摘要
本 EIP 引入了以下三个 EVM 指令:ORIGINDATALOAD
、ORIGINDATASIZE
和 ORIGINDATACOPY
。
这三个指令旨在提供对原始交易的 data
有效负载的访问,从而实现以 gas 效率的方式访问跨合约调用中的大型数据有效负载。
动机
随着以太坊开发场景的成熟,更多雄心勃勃和复杂的功能被引入到智能合约中,这通常需要利用复杂且有时很大的数据结构。然而,鉴于 EVM 固有的限制,在合约之间传输大型数据结构是一项代价高昂的任务,有时甚至会导致徒劳的场景,即此类操作的 gas 消耗无法在 gas 限制范围内执行,并且需要牺牲大量的 ETH 来支付其 gas 成本。
本 EIP 的目的是,通过引入一种方式,使多合约系统能够访问相同的内存数据源,而无需在它们之间传输完整的 payload,从而使这些功能可行。
本 EIP 使得精巧的智能合约功能能够成为更大的调用链的一部分,通过有效地从原始交易 payload 中读取数据,而不是要求将数据作为调用级别的数据传递。它的包含将主要有利于高级的无需信任的方案的实现,例如高效地验证 Merkle Patricia 树,从而验证特定以太坊区块的存储值或基于 EVM 的 layer 2 解决方案。
此更改的一个副作用是,完全依赖于原始数据的智能合约系统,本质上保证了他们接收到的数据没有被中间智能合约调用错误地格式化。
规范
ORIGINDATALOAD (0x47
)、ORIGINDATASIZE (0x48
) 和 ORIGINDATACOPY (0x49
)
这些指令的运行方式与它们带有调用前缀的对应指令类似,唯一的区别是它们操作的是交易的原始 data
,而不是当前调用的数据。详细说明:
- ORIGINDATALOAD (
0x47
) 的功能类似于 CALLDATALOAD (0x35
) - ORIGINDATASIZE (
0x48
) 的功能类似于 CALLDATASIZE (0x36
) - ORIGINDATACOPY (
0x49
) 的功能类似于 CALLDATACOPY (0x37
)
由于数据是从执行环境中再次检索的,因此这三个指令的成本将分别为 G_verylow
、G_base
和 G_base + G_verylow * (复制的字数,向上取整)
。
ORIGINDATA*
操作码操作的交易数据,将等同于堆栈中最近的 AUTHCALL
(0xf7
) 的 args*
参数中指定的 calldata
。如果堆栈中没有 AUTHCALL
,则 ORIGINDATA*
将操作交易的原始 data
字段。
这种交互确保了与 EIP-3074 的完全兼容性,并确保本 EIP 不会将任何形式的歧视引入到系统中,例如,合约完全依赖于 ORIGINDATA*
,从而只允许 EOA 向其提供数据。
原理
AUTHCALL (0xf7
) 交互
将成为伦敦分叉一部分的 EIP-3074 引入了一个新的调用指令,称为 AUTHCALL
(0xf7
),它将交易的 ORIGIN
(0x32
) 替换为上下文变量 authorized
。AUTHCALL
的目的是防止智能合约和 EOA 之间的歧视,ORIGIN
最初促进了这种歧视,因此,将 ORIGINDATA*
操作码检索到的值替换为 AUTHCALL
中使用的值也是合理的。
命名约定
由于存在 ORIGIN
(0x32
) 指令,该指令等效于 CALLER
(0x33
) 指令,但在原始交易的上下文中,因此 ORIGIN
前缀的指令试图符合现有的 CALL
前缀指令的命名约定。
指令地址空间
0x30-0x3f
的指令地址空间已被已经提供关于调用执行上下文信息的调用所耗尽,因此必须确定一个新的适合 EIP 目的的范围。
鉴于 EIP-1344 CHAINID
操作码包含在 0x46
中,因此将额外的交易相关数据包含在它之后是有意义的,因为除了区块本身之外,链 ID 也包含在交易 payload 中,从而使 0x46-0x4f
地址空间保留给未来可能需要的更多交易相关数据,例如 EOA 的 nonce。
Gas 成本
操作码 ORIGINDATALOAD (0x47
)、ORIGINDATASIZE (0x48
) 和 ORIGINDATACOPY (0x49
) 本质上执行与操作码 CALLDATALOAD (0x35
)、CALLDATASIZE (0x36
) 和 CALLDATACOPY (0x37
)respectively 相同的事情,因此共享完全相同的 gas 成本。
指令空间污染
有人可能会认为,多个新的 EVM 指令污染了 EVM 指令地址空间,并可能导致在为未来的指令分配合理的指令代码时出现问题。已经评估了这个问题,并构想了一种方法,通过该方法,原始 RLP 编码的交易可以被 EVM 访问。这将 面向未来 的新指令集,因为它可用于交易的其他成员,这些成员可能需要在未来在链上访问,但是,它也会导致 ORIGIN
操作码的冗余。
向后兼容性
本 EIP 不会更改或调整 EVM 提供的现有功能,因此不存在已知问题。
测试用例
待办。
安全注意事项
自省合约
从原子性上讲,ORIGINDATALOAD
和 ORIGINDATACOPY
值应被认为是不安全的,因为可以通过创建一个具有适当函数签名和参数的入口智能合约来轻松欺骗它们,该合约随后在调用链中调用其他合约。简而言之,应该始终假设 tx.data != calldata
,并且这些指令不应单独用作自省工具。
拒绝服务攻击
本 EIP 可能引起的一个初步担忧是,节点软件级别必须向 EVM 提供额外的上下文数据,以便它能够通过 ORIGINDATALOAD
和 ORIGINDATACOPY
指令访问必要的数据。
这将导致内存消耗的增加,但是,如果交易的数据已经作为其执行过程的一部分存在于内存中,那么这种增加应该是可以忽略不计的,这是将交易包含在区块中的总体步骤。
多合约系统 Gas 减少
鉴于当今部署在以太坊上的大多数复杂智能合约系统都依赖于跨合约交互,其中值通过函数调用从一个合约传递到另一个合约,因此 ORIGIN
前缀的指令集将使智能合约系统能够在调用链执行的任何给定步骤中访问原始交易数据,如果由于此更改的副作用而减少了在它们之间传递的数据,则可能导致跨合约调用最终消耗更少的 gas。
但是,gas 的减少将是基于实现的优化,并且也仅适用于基本的内存参数,而不是基于存储的数据,后者在这些类型的调用中最常用。因此,此更改观察到的总体 gas 减少对于大多数实现而言可以忽略不计。
版权
在 CC0 下放弃版权及相关权利。
Citation
Please cite this document as:
Alex Papageorgiou (@alex-ppg), "EIP-3508: 交易数据操作码 [DRAFT]," Ethereum Improvement Proposals, no. 3508, April 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3508.