尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

EIP-8282 Builder Execution Requests 详解:EIP-7732 构建者的押金与退出请求预部署合约

EIP-8282 Builder Execution Requests 详解:EIP-7732 构建者的押金与退出请求预部署合约 EIP-8282 Builder Execution Requests 详解EIP-7732 构建者的押金与退出请求预部署合约【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs导读本文基于 EIP-8282Builder Execution Requests状态为 Review展开系统讲解如何为 EIP-7732Enshrined Proposer-Builder Separation引入的独立质押实体——builder构建者——提供两条专用生命周期通道构建者押金预部署合约与构建者退出预部署合约。二者作为 EIP-7685 请求总线上的两个新请求类型0x03/0x04运行遵循与 EIP-7002执行层触发退出和 EIP-7251合并/加注完全一致的请求队列、系统调用与动态费用模式。读完本文你将掌握两个预部署合约的地址与部署方式、写路径/费用读取/系统调用三条代码路径的调用规则、184 字节押金请求与 48 字节退出请求的字节级布局、动态请求费用的fake_exponential计算原理以及共识层如何通过DOMAIN_BUILDER_DEPOSIT签名域与execution_address授权完成对构建者生命周期状态转换的收口。背景从借用验证者流程到专用请求类型EIP-7732 在协议内引入了builder这一独立角色它是质押实体但其质押不参与信标链主动验证它不经过常规的押金与退出 churn 队列最低只需 1 ETH 即可质押。在该 EIP 的初始设计中builder 的生命周期复用了验证者流程注册通过验证者押金完成押金取款凭据携带0xB0前缀BUILDER_WITHDRAWAL_PREFIX退出通过 voluntary-exit 操作中的 builder 分支完成。EIP-8282 的核心动机是终结这种复用。专用请求类型带来的直接收益包括角色显式化仅凭请求类型即可区分 actor共识层不再需要检查凭据前缀来路由押金验证者注册表与 builder 注册表各自独立键控即时验证 proof-of-possession验证者押金请求的签名验证被推迟到受 churn 限制的pending_deposits队列中且继承验证者押金请求极高的单块上限builder 押金请求则在处理时内联验证签名并将每块验证工作量封顶在MAX_DEPOSIT_REQUESTS_PER_BLOCK更安全的退出授权EIP-7732 下 builder 只能由其 BLS 热密钥持续签署出价的那个密钥签名退出而退出合约改为由 builder 的execution_address授权正如 EIP-7002 对验证者所做的那样分叉兼容分叉时必须存在的 builder 不受影响——EIP-7732 分叉过渡期对 builder 凭据 pending deposits 的上线逻辑被保留只有分叉后的新注册流程迁移到新合约。常量与预部署地址EIP-8282 定义的核心常量为名称值说明BUILDER_DEPOSIT_CONTRACT_ADDRESS0x0000bFF46984e3725691FA540a8C7589300D8282构建者押金合约的预部署地址BUILDER_EXIT_CONTRACT_ADDRESS0x000064D678505ad48F8cCb093BC65613800E8282构建者退出合约的预部署地址BUILDER_DEPOSIT_REQUEST_TYPE0x03EIP-7685 请求类型字节构建者押金BUILDER_EXIT_REQUEST_TYPE0x04EIP-7685 请求类型字节构建者退出SYSTEM_ADDRESS0xfffffffffffffffffffffffffffffffffffffffe在块结束时发起系统调用的地址同 EIP-7002MAX_DEPOSIT_REQUESTS_PER_BLOCK64构建者押金合约每块最多排空的记录数TARGET_DEPOSIT_REQUESTS_PER_BLOCK8超过该每块请求数后押金合约费用上升MAX_EXIT_REQUESTS_PER_BLOCK16构建者退出合约每块最多排空的记录数TARGET_EXIT_REQUESTS_PER_BLOCK2超过该每块请求数后退出合约费用上升MIN_REQUEST_FEE1最小请求费用weiREQUEST_FEE_UPDATE_FRACTION17控制费用的变化速率BUILDER_MIN_DEPOSIT1000000000000000000一笔押金的最小计值质押wei即 1 ETH——EIP-7732 的 builder 最小值BUILDER_DEPOSIT_CONTRACT_RUNTIME_CODE见 参考实现构建者押金合约的运行时代码BUILDER_EXIT_CONTRACT_RUNTIME_CODE见 参考实现构建者退出合约的运行时代码最终请求类型值必须在所有活跃的 EIP-7685 请求类型中唯一。类型分配在 consensus-specs 中协调——现有类型如 EIP-7002 的0x01、EIP-7251 的0x02、EIP-6110 的押金类型已在electra/beacon-chain.md中定义。部署CREATE2 工厂与地址挖掘两个合约都由CREATE2工厂EIP-7997部署。EIP-7997 将位于0x4e59b44847b379578588920cA78FbF26c0B4956C的著名无密钥CREATE2工厂作为正式要求它调用 EIP-1014 的CREATE2指令salt 取调用输入的前 32 字节init code 取剩余数据从而保证跨链确定性部署。每个合约地址由三要素决定工厂地址、salt 与合约 init code。EIP-8282 中的 salt 是经过挖掘的使得上述两个地址恰好由当前参考字节码得出。部署要求非常严格合约必须在激活本 EIP 的分叉之前部署一旦 EIP 激活而任一地址上没有代码则从激活时刻起的每一个区块都必须被判为无效。这与 EIP-7002 的空代码失败安全考虑一脉相承激活时预部署地址无代码会导致分叉后首个及后续所有区块全部失效。请求队列与系统调用无 ABI 的调度设计两个预部署合约沿用 EIP-7002 / EIP-7251 的合约设计仅有细微调整并复用其存储布局excess 槽、count 槽、队列 head/tail 指针、队列存储偏移。合约没有 Solidity 兼容的 ABI仅凭caller与calldatasize进行调度。不匹配以下任何分支的调用必须 revert。写路径Write path调用者不是SYSTEM_ADDRESS且 calldata 长度恰好等于合约的输入尺寸时提交一个请求。合约必须校验请求与随附价值见下文向队列追加一条记录递增本块计数将接受的记录作为匿名日志发出。费用读取Fee getter调用者不是SYSTEM_ADDRESS且 calldata 为空时返回当前费用且不修改状态。若附带了任何 value合约必须 revert读操作不允许带值。系统调用System call每个区块结束时合约被SYSTEM_ADDRESS调用带 calldata通过 inhibitor 永久禁用队列这是为未来退役/挂起合约预留的机制一旦协议停止逐块系统调用若不设此开关合约会继续接受请求与费用进入一个永不排空的队列不带 calldata按最旧优先顺序排空最多MAX_DEPOSIT_REQUESTS_PER_BLOCK押金或MAX_EXIT_REQUESTS_PER_BLOCK退出条记录以串联形式返回作为request_data并重置本块计数超出上限的记录留在队列中等待后续区块。执行层在request_data前拼接合约的请求类型字节形成request_type request_data加入区块请求列表通过requests_hash提交见 EIP-7685 中compute_requests_hash的 sha256 中间哈希列表算法区块请求按类型字节升序排列。系统调用遵循 EIP-7002 的规则专用 gas 上限30_000_000不占用区块 gas 上限不遵循 EIP-1559 的费用销毁语义。任一合约的系统调用失败区块必须无效。请求费用EIP-1559 风格的指数动态定价每个请求都携带费用按 EIP-7002 的方式计算fee fake_exponential(MIN_REQUEST_FEE, excess, REQUEST_FEE_UPDATE_FRACTION)其中fake_exponential是对MIN_REQUEST_FEE * e**(excess / REQUEST_FEE_UPDATE_FRACTION)的 EIP-1559 风格整数近似EIP-7002 给出了完整的伪代码累加器从factor * denominator出发逐项除以denominator * i直至累加器归零。费用在区块包含的请求数超过目标值时超线性上升否则回落到MIN_REQUEST_FEE。费用加在任意质押价值之上且永久锁定在合约中。与 EIP-7002 的一个关键差异是两个合约被修改为在每条写路径上应用费用上涨而非像 EIP-7002 那样在块结束时更新从而更细粒度地抑制突发请求。押金请求184 字节的精确布局押金请求通过向BUILDER_DEPOSIT_CONTRACT_ADDRESS发起恰好184字节 calldata 的调用提交字节字段描述0:48pubkey48 字节 BLS 公钥48:80withdrawal_credentials32 字节承诺version字节 execution_address80:88amount大端uint64单位 gwei88:184signature96 字节 BLS proof-of-possession一笔押金请求同时服务 builder 的首笔押金与后续加注top-up。合约必须拒绝请求除非同时满足amount * 1 gwei BUILDER_MIN_DEPOSIT即至少 1 ETHmsg.value amount * 1 gwei fee。任何超出amount * 1 gwei fee的价值被合约保留不计入builder 的质押。成功时合约将 184 字节输入原样入队。出队记录是输入的原样拷贝仅amount转为小端与 EIP-7002 一致。合约不验证signature——它被携带在记录中由共识层验证。提交方在广播首笔押金之前 SHOULD 在链下自行验证 proof-of-possession这是避免首笔押金本金永久锁定的唯一保护详见安全考量。退出请求48 字节与 execution_address 授权退出请求通过向BUILDER_EXIT_CONTRACT_ADDRESS发起恰好48字节 calldata 的调用提交内容为要退出的 builder 的pubkey。合约必须要求msg.value fee且不质押任何价值。成功时入队一条source_address (20) pubkey (48)记录其中source_address即msg.sender。授权完全基于source_address同 EIP-7002合约记录msg.sender且不做任何进一步检查。共识层仅当source_address等于目标 builder 的execution_address时才兑现请求。这体现了冷热分离原则——builder 的 BLS 密钥是持续签署出价的热密钥不应同时授权退出退出授权交给偏冷的execution_address与 EIP-7002 对验证者取款凭据的论证一致。共识层处理SSZ 容器与状态转换共识层按请求类型将每条出队记录解码为两个 SSZ 容器之一class BuilderDepositRequest(Container): pubkey: Bytes48 withdrawal_credentials: Bytes32 amount: uint64 # Gwei signature: Bytes96 class BuilderExitRequest(Container): source_address: Bytes20 pubkey: Bytes48类型的request_data即其记录的定长 SSZ 序列化串联恰好等于系统调用返回的字节且顺序一致。值得注意BuilderDepositRequest正是 EIP-6110 的DepositRequest去掉index字段后的形态。详细的状态转换行为由 consensus-specs 规定EIP-8282 概括为三点新 builder 注册针对不在 builder 注册表中的pubkey的BuilderDepositRequest若其signature是对(pubkey, withdrawal_credentials, amount)在DOMAIN_BUILDER_DEPOSITbuilder 专用签名域下的有效 proof-of-possession则注册新 builder签名无效的记录被忽略且其质押被没收。押金立即应用而非路由到验证者pending_deposits队列。加注针对已注册pubkey的BuilderDepositRequest是加注amount被计入记录的withdrawal_credentials与signature被忽略与验证者押金行为一致。退出BuilderExitRequest仅在pubkey是活跃 builder、source_address等于该 builder 的execution_address、且该 builder 无待取余额pending balance时发起全额退出否则记录被丢弃而非重新入队请求必须重新提交。对 EIP-7732 的修改押金路由process_deposit_request的 builder 分支被移除对验证者押金合约的押金永远是普通验证者押金。Builder 只能通过BUILDER_DEPOSIT_REQUEST_TYPE创建与加注。分叉后若向验证者合约提交带0xB0凭据的押金会产生一个无法取出余额的验证者因为0xB0前缀不再是有效取款凭据——因此 builder 押金必须发送到 builder 押金合约。分叉过渡期上线EIP-7732 在分叉时一次性对 builder 凭据 pending deposits 的上线被保留使得 builder 从第一个 slot 就存在。这是唯一通过验证者押金合约上线上 builder 的路径。此后0xB0的BUILDER_WITHDRAWAL_PREFIX被弃用。其合理性在于某些应用依赖 builder 在分叉首槽即存在而分叉后对新合约的押金无法提供这一点。退出路由process_voluntary_exit的 builder 分支被移除voluntary-exit 操作成为纯验证者操作。Builder 只能通过BUILDER_EXIT_REQUEST_TYPE退出。设计权衡Rationale两个预部署、两个请求类型镜像取款0x01与合并0x02的既有格局。执行层不需要任何新的读取语义共识层按请求类型路由而非检查凭据。一笔请求同时承担押金与加注与验证者押金合约一致——proof-of-possession 在pubkey首次出现时校验后续押金只计入质押加注无法重定向 builder 的取款因为其withdrawal_credentials与signature被忽略。按execution_address退出BLS 密钥是热的不应同时授权退出路由到冷的execution_address给 builder 一个单一、明确界定的退出授权者。请求费用与 EIP-7002 / EIP-7251 相同的需求响应式费用用于计量提交配合每块上限与每笔押金的质押要求构成完整的防滥用体系。分叉时上线保留既有 EIP-7732 上线路径以服务初始 builder 集合。向后兼容性本 EIP 在执行层是纯增量的在先前为空的地址上引入新合约不修改验证者押金合约或验证者请求预部署。共识层按 Changes to EIP-7732 修改了 EIP-7732 的 builder 生命周期在分叉时上线的 builder 不受影响。安全考量退出授权退出合约记录msg.sender为source_address且不做进一步检查。请求不携带签名因此共识层处理阶段的source_address检查是唯一的退出授权——缺失它任意调用者都能退出任何 builder。签名域分离Builder 押金在DOMAIN_BUILDER_DEPOSIT下签名区别于验证者的DOMAIN_DEPOSIT因此两类押金的 proof-of-possession 不能跨类重放。分叉过渡期的种子押金经由验证者押金合约提交必然在DOMAIN_DEPOSIT下签名。可重放的押金记录押金字段在 calldata 中是公开的第三方可以为已注册 builder 以自己的资金重放这些字段。这种重放只是加注凭据与签名被忽略计入质押但不重定向任何东西。托管拆分退出僵局退出要求零待取余额而每次赢得出价都会增加待取余额且只有execution_address能授权退出。当execution_address资金所有者与 BLS 密钥出价操作者分属不同方时持续赢得出价的操作者可以无限期阻塞所有者的退出。委托方应在链下保留对操作者出价的控制权。垃圾请求与状态增长每块上限约束的是排空速率而非入队速率因此链上队列可以跨块增长。增长由价值门槛限制——每笔押金至少锁定BUILDER_MIN_DEPOSIT加费用。攻击者提交有效 proof-of-possession 不会损失任何东西质押仍是可取的 builder 余额因此可以用锁定资本为代价延迟分叉后的上线。这是可容忍的因为时间关键的初始 builder 集合通过分叉过渡期播种而非依赖稳态合约。锁定资金请求费用、任何超额支付、以及共识层因无效 proof-of-possession 拒绝的首笔押金本金都永久锁定在预部署合约中。执行层不验证 BLS 签名因此押金请求一节建议的链下 proof-of-possession 检查是提交方防止首笔押金本金损失的唯一保护。参考实现参考实现位于以太坊 sys-asm 仓库构建者押金合约与构建者退出合约的实现EIP 正文中给出了对应源码链接。与 EIP-7002 / EIP-7251 相同这类预部署合约以手写 EVM 汇编的形式存在无需 Solidity 编译器的 ABI 开销存储布局按槽位手工编排。延伸阅读本仓库相关文档EIP-7685通用执行层请求总线——requests_hash承诺与请求列表编排EIP-7732Enshrined Proposer-Builder Separation——builder 角色、注册表与分叉过渡期上线逻辑EIP-7002执行层可触发取款——请求队列、系统调用与fake_exponential费用的原型EIP-7251提高 MAX_EFFECTIVE_BALANCE——合并请求的同类预部署模式EIP-6110链上提供验证者押金——DepositRequest容器与押金请求处理的先例EIP-7997确定性工厂合约——两个预部署合约所依赖的 CREATE2 部署机制【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表