2026/9/15 22:18:32

EIP-7793 条件交易(Conditional Transactions)全解析:用 `TXINDEX` 操作码为加密内存池锁定区块内执行位置

EIP-7793 条件交易(Conditional Transactions)全解析:用 `TXINDEX` 操作码为加密内存池锁定区块内执行位置 EIP-7793 条件交易Conditional Transactions全解析用TXINDEX操作码为加密内存池锁定区块内执行位置【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPsEIP-7793 提出了一种全新的以太坊交易格式——条件交易Conditional Transactions通过为交易静态声明其合法的区块 slot 与区块内交易索引配合新引入的TXINDEX操作码从协议层面杜绝加密内存池encrypted mempool中交易被解码后遭构建者builder抢先交易frontrun的可能。阅读本文后你将掌握该提案的完整技术脉络条件交易的 EIP-2718 载荷结构、conditional_slot/conditional_tx_index双条件校验语义、签名摘要的构造方式、TXINDEX操作码的栈行为与 gas 定价以及它与 EIP-7843SLOTNUM操作码的依赖关系。背景加密内存池的排序承诺难题传统公开内存池中待确认交易对所有人可见这催生了系统性的抢跑、三明治攻击等 MEV 提取行为。加密内存池的设想是交易在加密状态下完成排序与打包承诺之后才被解密并按承诺顺序上链。但这里存在一个结构性缺口——构建者可能不遵守解密前的排序承诺。如果解密后的交易没有被放在承诺的位置而是被插队或重排那么先承诺、后解密的保护就形同虚设恶意构建者可以在看到解密后的交易内容后将自己的交易放在前面实现对解密交易的抢跑。EIP-7793 的解法非常直接把执行位置变成交易有效性的硬约束。如果一条解密交易没有被包含在正确的索引位置它直接就是无效交易invalid任何构建者都无法通过重排来获利。正如 EIP-8184LUCID 加密内存池 所讨论的这类机制旨在为 MEV 敏感订单流保留一条公开、无需许可的包含路径——而 EIP-7793 正是为这类加密包含管线提供顺序不可篡改的底层保障。核心参数一览提案定义了三个常量贯穿整个规范| 常量 | 值 | 说明 | | - | - | - | |COND_TX_TYPE|Bytes1(0x05)| 条件交易的 EIP-2718 类型标识即交易首字节为0x05| |TXINDEX_OPCODE_BYTE|Bytes1(0x4c)| 新操作码TXINDEX的字节码即0x4c十进制 76 | |TXINDEX_OPCODE_GAS|2|TXINDEX的固定 gas 费用 |类型标识0x05落在 EIP-2718 规定的类型区间[0x00, 0x7f]内与旧版交易首字节 0xc0的 RLP 列表天然可区分也避开了已被占用的0x01EIP-2930、0x02EIP-1559、0x03EIP-4844等类型号。条件交易类型在 blob 交易基础上叠加位置约束EIP-2718 信封与载荷结构条件交易是一种新的 EIP-2718 类型化交易TransactionType为COND_TX_TYPE0x05TransactionPayload是以下TransactionPayloadBody的 RLP 序列化[chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, max_fee_per_blob_gas, blob_versioned_hashes, conditional_slot, conditional_tx_index, y_parity, r, s]对照 EIP-4844 的 blob 交易载荷[chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, max_fee_per_blob_gas, blob_versioned_hashes, y_parity, r, s]可以清晰地看到条件交易本质上是在 blob 交易的 15 个字段中间插入了两个新字段conditional_slot与conditional_tx_index位于blob_versioned_hashes之后、签名之前其余字段语义完全复用chain_id、nonce、max_priority_fee_per_gas、max_fee_per_gas、gas_limit、to、value、data、access_list与 EIP-4844 完全一致其中max_priority_fee_per_gas/max_fee_per_gas的双费率模型源自 EIP-1559access_list的可选访问列表机制源自 EIP-2930max_fee_per_blob_gasblob gas 的每单位最高费率uint256blob_versioned_hashes与 EIP-4844 的语义一致唯一区别是条件交易中该列表可以为空blob_versioned_hashesmay be empty也就是说条件交易并不强制携带 blob它保留 blob 能力但允许退化为纯执行交易conditional_slot、conditional_tx_index均为uint64分别指定该交易被认为有效所处的区块 slot 与交易索引y_parity、r、ssecp256k1 签名三元组。双条件校验语义与-1哨兵值两个新字段共同构成位置有效性的双重约束conditional_slot校验区块级位置交易只在其声明的 slot 区块内有效。要验证该字段是否正确需要区块头中携带 slot 号——这正是提案将 EIP-7843 列为依赖的原因详见下文依赖 EIP-7843一节conditional_tx_index校验区块内索引交易只在区块内该索引位置有效确保构建者必须把交易原样放到承诺的槽位。两个字段都支持-1哨兵值表示跳过对应维度的检查conditional_slot -1不限制所在区块的 slotconditional_tx_index -1不限制区块内的交易索引。这赋予该交易类型极高的灵活性——用户可以单独锁定索引、单独锁定 slot或两者同时锁定同时为-1时等价于普通 blob 交易的灵活性。在以太坊的 RLP/整数惯例中uint64类型用全1位0xffffffffffffffff表示-1哨兵值。签名构造条件交易的签名摘要将交易类型字节作为首字节参与哈希遵循 EIP-2718 对签名数据首字节应包含 TransactionType的强建议防止不同交易类型的签名互相复用。具体地y_parity、r、s是对如下摘要构造 secp256k1 签名keccak256(COND_TX_TYPE || rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value, data, access_list, max_fee_per_blob_gas, blob_versioned_hashes, conditional_slot, conditional_tx_index]))注意签名的 RLP 列表不包含签名三元组自身也不包含conditional_slot/conditional_tx_index之外的新字段——这与 EIP-1559签名keccak256(0x02 || rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, amount, data, access_list]))和 EIP-4844 的签名构造模式一脉相承签名单元组的字段与载荷中签名之前的字段一一对应。TXINDEX 操作码把条件索引暴露给链上仅靠交易格式本身还不够——合约需要能读取当前交易的索引才能围绕条件交易构建复杂的执行逻辑。为此提案引入新操作码TXINDEX字节码0x4c。栈行为执行TXINDEX时向 EVM 栈顶压入一个元素TransactionIndex类型为uint64采用**大端序big endian**编码若当前交易是条件交易其值等于该交易的conditional_tx_index否则非条件交易值为-1。这里有一个值得注意的设计细节TXINDEX返回的是交易声明的条件索引而非交易在区块中的实际位置。如果构建者违反了条件交易在入块校验阶段就已被判定无效根本不会进入执行阶段——因此链上看到的TransactionIndex必然等于实际索引或被-1哨兵跳过检查。从源码结构看这种设计让 EVM 执行层无需单独计算实际索引仅需从交易载荷中读出声明值即可极大简化了执行层的实现。Gas 定价TXINDEX的 gas 成本为固定费用TXINDEX_OPCODE_GAS 2。提案在 Rationale 中说明该定价对标W_base基础操作码集合中的同类操作码——W_base是 EVM 操作码按访问模式分类的基础类别通常不访问状态、价格低廉例如 EIP-7843 的SLOTNUM同样定价为2gas。这种对标确保了新操作码不会成为执行路径上的计价异常点。依赖 EIP-7843SLOTNUM与区块头扩展条件交易的conditional_slot校验依赖区块头中直接携带 slot 号。在以太坊现有协议中区块头并不包含 beacon chain 的 slot 号因此 EIP-7793 将 EIP-7843 列为硬性依赖。EIP-7843 提案的要点包括引入新操作码SLOTNUM0x4b返回当前区块对应的 slot 号uint64大端序gas 固定为2区块头编码扩展一个slotNumber字段uint64通过引擎 APIEngine API将 slot 号从共识层传入执行层新增ExecutionPayloadV4/PayloadAttributesV4对象及engine_newPayloadV4、engine_getPayloadV6、engine_forkChoiceUpdateV4方法。EIP-7843 的 Motivation 也解释了为何不推荐用时间戳反推 slot硬编码 slot 时长到合约中会在 slot 时长变更时破坏合约而用 calldata 携带 slot 号并基于 EIP-4788 的 beacon block root 证明则 gas 开销过高。由共识层客户端计算并通过操作码暴露则把 slot 时长彻底从应用层抽象出来。这也正是 EIP-7793 选择依赖它的原因——只有区块头携带权威 slot 号conditional_slot才能被执行层可靠校验。值得一提的是EIP-7843 还专门论证了 ZK-VM 友好性slot 号放进区块头而非引擎 API 参数保证区块对证明电路自包含无需额外输入。这一性质同样惠及依赖它的 EIP-7793 条件交易。设计权衡Rationale解读为什么必须新增交易类型而不是只加操作码一个表面更简单的替代方案是不新增交易类型仅让TXINDEX直接返回当前交易在区块中的实际索引合约据此动态判断。提案明确否决了这一方案理由如下新增交易类型意味着期望的索引必须在交易广播前静态声明statically declared upfront而不是执行时才动态读取若允许基于返回索引的动态行为合约可以施加任意复杂的条件约束只有当我排在某个位置时才做某事这会让构建者在组装区块时难以预测和满足约束显著增加出块的复杂度静态声明的条件则使构建者可以提前、确定性地检查每个位置约束是否满足区块构建过程保持简单可预测。为什么TXINDEX返回声明值而非实际值如前述栈行为分析返回声明值而非实际值与静态声明的设计哲学一脉相承链上合约看到的是交易作者承诺的索引而校验责任由协议层在入块时完成链上逻辑无需关心真实位置进一步避免在合约中构造复杂的位置相关逻辑。向后兼容性与安全考量向后兼容提案声明未发现任何向后兼容性问题。条件交易是全新的 EIP-2718 类型类型字节0x05与所有既有交易类型legacy、0x01、0x02、0x03不冲突旧客户端在遇到未知交易类型时按 EIP-2718 的既定规则处理无需改动既有交易的处理路径。安全考量提案声明无新增安全风险。从协议机制看条件交易的约束只会使错误位置包含变为无效交易不会引入新的重放面或签名漏洞签名摘要包含类型字节与全部约束字段conditional_slot/conditional_tx_index一旦签名即不可篡改。测试用例原提案标注为 N/A暂无公开测试向量。作为一种仍处于 Stagnant停滞状态的 Standards Track / Core 类提案其规范目前以文字形式定义待后续进入活跃开发阶段后可补充对应的执行层测试向量。应用场景与展望EIP-7793 的典型落地场景是加密内存池 / 加密交易包含管线用户提交条件交易声明conditional_slot与conditional_tx_index交易在加密状态下被排序、承诺解密后构建者必须按承诺的 slot 与索引原样包含交易若构建者试图重排或插队交易因位置不匹配而直接无效抢跑行为在协议层面被杜绝。这种以位置约束换取排序承诺的思路与 EIP-8184LUCID 加密内存池、EIP-7805FOCIL 包含列表等提案共同构想了公开、无需许可、抗 MEV的以太坊包含管线加密保护交易内容的机密性条件交易保护解密后的排序完整性包含列表拓宽审查阻力。三者叠加为以太坊保留一条不依赖私有订单流private order flow的公开执行路径。小结EIP-7793 以最小的协议改动——一个交易类型0x05 一个操作码TXINDEX0x4c2 gas——解决了加密内存池的核心信任问题。其技术精髓可以概括为三点静态声明期望的执行位置在签名时即被锁定构建者无法事后篡改双重约束conditional_slot依赖 EIP-7843 的区块头 slot 字段与conditional_tx_index分别锁定区块级与索引级位置-1哨兵提供按需跳过能力全链可见TXINDEX让合约能够读取条件索引为链上逻辑与条件交易的组合提供基础原语。需要说明的是该提案当前状态为 Stagnant属于规格讨论阶段的方案而非已部署的协议变更本文所述行为均以 EIP-7793 原文 及其依赖的 EIP-2718、EIP-4844、EIP-7843 等仓库内文档为准。【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考