以太坊暂停 Glamsterdam 的 Hoodi 分叉,审计发现了什么
crypto.news
1小时前
Ai 焦点
以太坊开发者已暂停 Glamsterdam 的 Hoodi 测试网分叉,原因是他们正在处理关于交易 gas 余额不足时应用行为的审计发现。此次升级会改变网络对部分触及或扩展状态操作的计费方式,审计方发现,即便是升级前编写的合约,在新规则下也可能表现不同。
有帮助
No.帮助

以太坊开发者已暂停 Glamsterdam 的 Hoodi 测试网分叉,原因是他们正在处理关于交易 gas 余额不足时应用行为的审计发现。此次升级会改变网络对部分触及或扩展状态的操作如何计费,审计方发现,即便是升级前编写的合约,在新规则下也可能表现不同。

要点如下:

  • 以太坊开发者原本计划在 10 月 26 日进行 Hoodi 分叉,随后推迟。11 月 6 日的一份开发者更新显示,在团队处理审查中提出的问题期间,分叉仍处于暂停状态。
  • 两项提案 EIP-8037 和 EIP-8038 会影响创建状态和访问现有状态的成本。该变化可能改变合约在执行到某一节点时剩余的 gas 数量。
  • ChainSecurity 发现,在某些情况下,一个调用可能失败,但发起该调用的合约仍能完成其失败处理逻辑。在此前的 gas 规则下,同一路径可能会导致外层交易回滚。
  • 开发者正在核查各客户端实现和现有合约中的假设。根据以太坊基金会的更新,ChainSecurity、Dedaub 以及内部审查人员都参与了审查。
  • Hegota 的工作仍在并行推进。Glamsterdam 接下来需要关注的是修订后的测试网时间表,以及其背后测试的结果。

以太坊开发者原定于 10 月 26 日对 Hoodi 进行分叉测试,但这一安排被推迟。11 月 6 日,以太坊基金会开发者 Marius van der Wijden 表示,在开发者处理 gas 审查中发现的问题期间,该分叉仍然处于暂停状态。

争议的核心在于一个大多数人只有在交易失败时才会遇到的细节。合约可以调用其他合约,并决定当这些调用返回失败时该如何处理。即便升级后这段代码看起来完全一样,由于网络现在对部分操作的计费方式不同,它仍可能走向不同的路径。

这也是为什么一项旨在调整以太坊状态核算方式的升级,既成了应用开发者的问题,也成了编写以太坊客户端团队的问题。双方都需要知道,哪些旧假设在这次变化后仍然成立。

Glamsterdam 对 gas 的改动

EIP-8037 改变了协议对创建状态类操作的核算方式。以太坊的状态包括合约存储等记录。状态变化会跨交易持续存在,因此其成本会影响原始交易结束后仍需维护链的节点。该提案将部分状态创建的核算与普通执行 gas 分开,并设置一个可供符合条件操作调用的独立储备。

EIP-8038 则重新定价访问状态的操作。这两项提案影响执行路径中的不同部分。一个合约可能先读取一个值,再发起外部调用,最后写入结果。若只审查最终写入的拟议价格,而忽略前面的读取和调用对执行到该点时可用预算的影响,就会遗漏问题。

因此,即便用户输入相同的交易参数,一个熟悉的应用也可能产生不同结果。关键问题在于,哪些差异反映的是预期中的重新定价,哪些则暴露了客户端或合约所依赖的假设。

一次失败调用如何改变最终结果

设想一个合约调用第二个合约来完成更大操作中的一步。如果第二个合约失败,调用方可以选择中止全部操作,也可以处理失败并继续执行。批处理程序可能会记录某一项失败,然后继续下一项;另一类应用则可能预期,只要失败调用耗尽了足够 gas,整个操作就应回滚。

ChainSecurity 的分析描述了新的核算方式如何影响这种区别。以太坊已经通过 EIP-150 规则限制了调用方可以向前转发多少 gas。在相关情形下,大约会有六十四分之一保留在调用方手中。问题在于,执行返回后调用方实际还能使用多少 gas,以及完成该路径上的指令需要多少成本。

假设某个应用把调用失败视为普通业务结果。如果它有足够 gas 完成失败处理逻辑,就可能记录结果或继续执行交易的其余部分;如果在此过程中 gas 用尽,外层交易就会回滚。这两种结果会留下不同记录,尽管内层调用在两种情况下都失败了。

审计方还检查了基于 gasleft() 的判断。合约可以用这条指令将剩余执行预算与一个硬编码的最低值进行比较。在一种计费安排下校准出的阈值,在另一种安排下可能就不再是可靠预测,尤其当合约遇到状态操作或向其他地址转发 gas 时更是如此。合约无法自动修正开发者在部署时嵌入的数值。

审计方需要确认什么

基金会 11 月的更新描述了正在审查的八项假设。测试至少涉及两个不同问题。实现新规则的客户端必须对同一笔交易得出相同结果;应用审查者也必须识别出,哪些情况下这个共同结果与现有合约的预期不同。

第一个问题的测试,可以在多个客户端上执行同一笔交易,并比较状态和 gas 结果。第二个问题的测试则需要沿着应用自身逻辑来追踪。关键在于,合约是否把失败回调视为继续执行的信号,是否在调用前记录了状态变化,以及它能否区分业务拒绝与因 gas 不足而根本未能完成的调用。

这些路径在常规部署测试中很容易被忽略。典型的交易预算可能足以让调用及其处理逻辑在两种规则下都顺利通过。刻意压紧的预算则可能暴露差异。因此,边界测试必须包含失败调用,以及接近进入或完成失败处理逻辑所需 gas 数量的情形。

Hoodi 能展示什么

Glamsterdam 之前已经进入以太坊的 Sepolia 测试网,开发者在那里测试了 2 亿 gas 的上限。Hoodi 则会为开发者提供另一个共享部署环境,用于进一步验证修订后的升级。

公开测试网分叉能为客户端团队和应用运营方提供一个共同环境,用来运行这些检查。运营方可以按共享时间表更新客户端、比较结果,并针对分叉规则测试工具。应用团队则可以检查交易模拟和 gas 估算是否反映了执行过程中看到的同样变化。

如果 Hoodi 分叉成功,开发者就能获得关于所测试版本和交易的证据。更长期的问题在于,代表性应用在 gas 预算边界处会如何表现。新的分叉日期如果能与已复现的案例、变化内容以及测试方式一起公布,会更容易评估。

gas 相关工作也与其他修复并行推进。以太坊开发者在 Hoodi gas 审查进行期间,单独修订了验证者存款规范。这些修复需要各自的测试,因为它们影响的是分叉的不同部分。

目前,最新的开发者更新给出了暂停的原因,并表示 Hegota 的工作仍在继续。它没有给出 Glamsterdam 下一次测试的具体时间,而是留待后续决定。

gas 上限与状态成本如何配合

更高的区块 gas 上限意味着以太坊在其核算体系下可以承载更多工作。单个操作被赋予的价格,则决定了这块“空间”中有多少被该操作占用。因此,上限变化和价格变化可能影响同一笔交易的不同部分。

有些工作会在交易结束时结束。创建状态则不同,因为数据可以持续存在,之后仍会给节点运营方留下需要存储和处理的内容。即便创建该状态的应用之后流量很少,一个新的存储槽、账户或合约也会增加这部分负担。

EIP-8037 改变了某些状态创建的成本核算方式。EIP-8038 则重新定价对状态的访问,这可能包括涉及已有记录的操作。一笔交易如果先读取一个值、再调用另一个合约、最后创建一个存储条目,就可能在一次执行中同时遇到这两项变化。

仅仅提高区块上限,并不能说明这一路径的成本会更高还是更低。区块上限描述的是整个区块可用的空间;交易路径以及每个操作的价格,才决定它能否装进发送方提供的 gas 中。

这一点在 Sepolia 开始以 2 亿 gas 上限测试 Glamsterdam 时就已经很重要。那次测试展示了开发者在该网络上运行的内容。Hoodi 的暂停则是在回答:这些规则是否已经准备好进入下一个测试网,以及依赖旧 gas 假设的应用会如何表现。

正在审查的八项假设

以太坊基金会的审计仓库将示例分为两类:一类是操作价格变化,另一类是 gas 跟踪方式变化。仓库中的数字来自所提议规范的固定版本,如果提案被修订,这些数字也可能变化。

第一类问题涉及固定额度以及在调用之后完成工作的成本。开发者可能为某个操作设定了 gas 上限,而该操作现在的成本更高。原本用于支付最后一次写入的储备,可能已经不够用了。另一种情况下,调用方保留的那一小部分 gas 可能足以完成应用原本预期会回滚的失败路径。

这些核算变化还带来其他可能性。如果单独的储备仍可为符合条件的状态创建提供资金,那么即使普通执行预算很紧,调用方也可能在失败调用后写入一条记录。此时,调用方的最终结果就可能取决于哪些操作使用了那笔单独预算。

在同一笔交易中,清除先前创建的槽位可以在审查后的规范里立即返还部分 state gas。一次回滚的调用也可能返还 state gas。因此,假设“回滚前消耗的所有 gas 都会消失”的代码,可能会误判实际发生了什么。

一对 gasleft() 测量也可能无法完整反映工作的成本。合约如果用两次读取之间的差值来计费或计算退款,就依赖于对这两次读取之间 gas 变化的假设。来自单独池子的收费,以及执行过程中返还的 state gas,都可能改变这种关系。

第八种情况涉及 EIP-7702,它允许账户授权委托给合约代码。即便交易中的授权因 gas 不足而未真正生效,该交易仍可能被打包进区块。若钱包或服务仅凭交易被包含进区块,就推断委托已经生效,就可能把一个未完成的动作当成已完成。

仓库表示,作者收到的许多发现都与固定金额或储备有关。它要求开发者和审计人员用这些示例测试自己的应用,并报告问题。该清单识别的是需要审查的模式,并不意味着使用这些模式的每个应用都会造成损失。

一次失败调用如何仍可能留下成功的交易

以太坊交易可以包含多次调用。一个合约可以请求另一个合约执行某一步,然后根据结果决定如何响应。内层调用失败与整笔交易失败,是两个不同的结果。

批处理程序是一个有用的例子。如果某一项失败,处理器可能记录该失败并继续下一项;如果它在记录结果之前就耗尽 gas,外层交易就可能回滚,并撤销先前的更改。因此,同样的内层失败,在调用方后续能做什么不同的情况下,最终状态也会不同。

另一类应用可能会把调用失败视为改变谁可以提交请求、或者请求是否允许重试的理由。如果调用方能够完成一条应用原本预期会回滚的路径,那么结果状态就可能被保留下来。安全影响取决于这条已完成路径实际记录了什么。

某个参与者可能可以选择交易提供多少 gas。如果此人能让外层合约有足够 gas 进入某条路径,却又不足以让内层调用完成,那么失败就可以通过交易预算被诱发。对失败作出反应的合约,需要区分这种情况与“调用确实到达被调用方并真实失败”的情况。

EIP-150 的转发限制是其中一部分。调用方在按该规则尽可能转发 gas 时,相关情形下会保留大约六十四分之一。保留下来的 gas 仍必须支付后续指令的成本。这些指令能否完成,取决于计费安排和适用的核算方式。

合约可能只对一小段 gas 预算敏感。给内层调用足够 gas,它就正常工作;给整笔交易太少 gas,外层路径就会回滚。问题区间在于:内层调用失败,但调用方仍有足够 gas 去执行开发者并不希望在失败时发生的动作。

为什么改一个固定 gas 数字未必能解决问题

硬编码阈值可以让合约在发起调用前简单检查自己是否有足够 gas。开发者可能用常见交易测试过这个阈值,并为后续工作留出缓冲。这个数字于是就成了当初选择它时所依赖的调度安排的一个依赖项。

某项操作的成本也可能因应用是在更新已有记录还是创建新记录而不同。向已经有余额的人转账,可能走的是不同的存储路径;而向首次收到余额的人转账,则可能触发更昂贵的路径。只覆盖重复收款人的测试,可能会漏掉更贵的那条路径。

合约测量 gas 的时点也很重要。紧贴调用前的一次读取,与经过若干次状态访问和调用本身之后的一次读取,并不相同。若合约根据后一次读取推断失败原因,它实际上是在假设自己理解了中间可能被收费或返还了什么。

调整补贴额度本身也可能带来后果。它可能让此前失败的路径得以完成,也可能让被调用方获得足够 gas 去执行在旧额度下无法完成的工作。开发者在调整前,需要先弄清楚这笔额度原本是想阻止什么。

有些合约可以通过治理或管理流程修改;另一些则是不可变的,或者依赖无法就地更改的组件。即便合约本身可以修改,估算、赞助或转发其交易的服务,也可能需要更新自己的假设。

一个有说服力的复现需要展示什么

测试可以从同一笔交易、同一状态和同一 gas 上限开始,在旧规则和拟议规则下分别运行。比较结果应当能识别出哪个调用返回失败、调用方随后做了什么,以及交易是否记录了此前不会持久化的变化。

在阈值上下方分别测试预算,有助于显示这种影响是否只存在于一个很窄的区间内。它也能帮助找出执行从哪里开始分叉。更早的余额检查、传给被调用方的 gas 数量,以及失败处理逻辑中的写入,都是变化可能显现的不同位置。

审查者随后还要问:谁能走到这条路径?在测试合约中复现某种变化,只能证明执行上存在差异。真实应用可能还需要授权、额外条件检查,或者让受影响的操作可重试。这些细节决定了某人是否能强行制造出不想要的结果。

客户端团队还有另一项独立测试。所有执行客户端在相同分叉配置下,都应对同一笔交易得出相同结果。客户端之间出现分歧,是另一类问题;而所有客户端都一致地产生了应用未预期的结果,则是不同的问题。

测试套件既需要成功路径,也需要失败路径。强行让每一次失败调用都回滚,可能会阻止某种不想要的状态变化,但也可能剥夺批处理继续完成其余部分的合法能力。最终应保留什么行为,取决于应用的预期。

一个好的复现应当让最终状态易于检查。如果一次运行后失败记录仍在,而另一次运行后它消失了,测试就能展示出精确差异,而不是只给出一份关于 gas 使用的一般性报告。这样更容易评估风险和拟议修改。

公共测试网在本地复现之后能补充什么

开发者可以在本地分叉或受控客户端环境中测试边缘情况。随后,公共测试网可以让多个运营方在共享条件下运行同样的升级并比较行为。这也给钱包和基础设施团队提供了一个针对当前规则测试自己软件的地方。

Sepolia 和 Hoodi 在这一流程中承担不同步骤。Sepolia 的激活表明,开发者可以在该网络上运行计划中的代码,并在配置好的 gas 上限下检查其运行情况。Hoodi 则是在审查中出现重要发现后,为他们提供的进一步部署。

测试网上的应用、流量和历史状态与主网不同。一次顺利的分叉可以为客户端一致性和常规交易提供证据,但未必能覆盖用户依赖的所有合约模式。针对性的复现则能为某个边缘案例提供证据,而这种案例在普通测试网流量中可能并不存在。

升级指令也是测试的一部分。运营方需要一个实现目标配置的版本,以及一个精确的激活点;应用则需要知道何时应开始使用修订后的规则进行模拟。新的日期与这些细节配合起来才有意义。

10 月的延期和 11 月的状态报告,从不同时间点描述了同一次暂停。前者取消了原定的 Hoodi 日期,后者解释了问题仍需解决。下一次部署通知则可以显示哪些变化已经准备好供运营方测试。

钱包如何在动作失败时仍报告成功

钱包通常会先估算 gas,再让用户签名。这个估算取决于节点在模拟中应用的状态和规则。如果服务使用的是旧的分叉配置,它给出的估算可能已经不再适用于当前链实际执行的交易。

一笔回滚的交易仍可能让发送方支付 gas。一个在捕获内层失败后继续执行的外层交易,则可能更难解释。链上可以把整笔交易记录为成功,但其中某个动作实际上并未发生。钱包可能需要借助应用的事件或状态,向用户解释这种差异。

转发方和交易赞助方也面临类似问题。他们可能为他人请求的交易选择预算或承担费用。如果预算已经不足以覆盖预期路径,赞助方就可能为一笔未能交付所需动作的执行买单。

索引器会在执行后看到这种影响。一个现在能够完成的失败路径,可能会产生下游系统此前看不到的日志或状态变化。索引器仍然遵循链上的真实状态;依赖索引器的应用可能需要改变对结果记录的解读方式。

端到端测试可以比较钱包估算、转发方提交的预算、客户端执行结果以及界面对结果的解释。每一步都可能各自成功,但用户仍可能收到关于哪些动作真正生效的误导性说明。尤其当应用把某个结果视为最终结果时,这种区别最为重要。

什么能解除 Hoodi 的暂停

基金会正在要求应用团队识别他们使用的假设,并提供开发者可以复现的案例。某些问题可能通过修改拟议的 gas 规则来解决;另一些则可能需要应用或基础设施提供方调整其对新行为的处理方式。

如果规范发生变化,相关测试就要看:此前会分叉的案例,是否现在能得到预期结果。如果开发者保留某种行为变化,应用团队就需要足够详细的信息,以判断自己的软件是否依赖于旧结果。两种结果都取决于对受影响调用以及调用后保留状态的描述。

修订后的规范也必须进入运营方实际运行的客户端构建版本。支持早期 Glamsterdam 配置的构建版本,未必包含后续变化。新的 Hoodi 通知中的发布编号,将标明哪些版本可以一起测试。

基金会 11 月的更新称,Hegota 的工作仍在并行推进。这意味着,较早分叉的暂停并不涵盖下一次分叉的所有开发决策。对于 Glamsterdam 来说,下一项相关里程碑将是修订后的 Hoodi 时间表,以及开发者准备公开运行的配置。

如果分叉成功,团队就会在主网决策前拥有一份可共同审视的记录。导致延期的那些案例,仍然是检验修订规则是否准备就绪的最清晰测试。这些测试必须展示:当调用在接近 gas 上限时失败,而外层交易仍有工作要做时,会发生什么。

拟议 gas 数字如何揭示不同路径

基金会的仓库给出了创建状态与更新状态之间差异的一个具体例子。在其固定的 Glamsterdam 规范下,创建新槽位的冷写入会被拆分为执行成本和一笔明显更高的状态费用。写入已有槽位也会重新定价,但计算方式不同。

这种差异可能出现在两个看起来发起了同样应用请求的用户之间。一个用户可能以前用过该服务,因此合约更新的是已有条目;另一个用户则可能需要新建记录。对前者有效的 gas 额度,对后者可能就不够。

仓库还指出,在其测试的配置中,单独储备只在超过某个指定交易 gas 上限时才可用。在较小的交易中,状态成本则来自普通预算。因此,测试多个预算非常重要,不能假设这笔储备对每次调用都以同样方式运作。

因此,在某些情况下,读取剩余 gas 的代码只能看到交易资源的一部分。不过,这些数据对于该指令所暴露的预算仍然有意义。变化的是,应用可以据此对已消耗或仍可用的总资源作出的推断。

这些 gas 示例与拟议配置绑定,并不能直接作为一个统一倍率套用到钱包现有估算上。首次存储写入、使用固定补贴的调用以及失败的委托,都需要分别检查,因为它们触及的是规则中的不同部分。

这也是为什么修订后的 Hoodi 日期如果能与规范修订和本次发布覆盖的案例清单一起公布,会更有用。这样团队就能在得出测试网整体稳定性结论之前,重新运行与自身应用相匹配的测试。

关注点

  • Hoodi 时间表:修订后的分叉日期应标明运营方预期运行的客户端版本和分叉配置。
  • 客户端一致性:跨客户端测试可以显示执行客户端在新边界附近是否会得到相同的状态和 gas 结果。
  • 合约行为:复现测试应展示失败的外部调用何时仍会让调用方有足够 gas 完成,以及外层交易会记录什么。
  • 提案修订:EIP-8037 或 EIP-8038 的变化将有助于说明哪些审查发现需要协议层修改。
  • 应用工具:模拟和 gas 估算结果可以显示钱包和基础设施提供方是否正确反映了分叉规则。

常见问题

什么是 Hoodi?

Hoodi 是以太坊用于在共享环境中测试网络升级的测试网。原定的分叉本应在那里应用 Glamsterdam 规则,以便运营方和应用团队共同观察其表现。

为什么分叉被推迟?

开发者正在审查与 gas 核算以及现有应用如何处理失败调用相关的发现。他们也在检查客户端实现是否对拟议规则下的结果保持一致。

这次暂停会立刻改变以太坊主网吗?

11 月的更新针对的是 Hoodi 测试分叉,并未宣布将拟议的 gas 规则激活到主网,也没有给出新的主网日期。

合约可以在不更新的情况下改变行为吗?

可以。合约指令是在网络的 gas 调度下执行的。如果计费变化让外部调用或其失败处理逻辑可用预算不同,同样的指令就可能得出不同结果。

失败调用一定会让整笔交易回滚吗?

不会。调用方可以处理一次不成功的外部调用并继续执行。外层交易是否完成,取决于调用方的指令以及执行这些指令时剩余的 gas。

gas 储备有什么作用?

它为符合条件的状态创建操作提供一个在提案下单独跟踪的预算。审查者必须考虑这笔预算如何与调用方可见或可转发的执行 gas 互动。

为什么审计人员要测试低 gas 路径?

预算充裕的调用在两种调度下可能表现相同。接近执行上限的交易则可能揭示:某个处理逻辑在一种调度下能完成,而在另一种调度下会回滚。

Hegota 的工作停止了吗?

基金会 11 月的更新称,Hegota 的工作仍在并行推进。该工作有自己的里程碑,而 Glamsterdam 的 Hoodi 分叉仍取决于 gas 审查结果。

打赏
$0
点赞
0
收藏
0
浏览量 22
WalletJYS提醒,请广大读者理性看待区块链,切实提高风险意识,警惕各类虚拟代币发行与炒作, 站内所有内容仅系市场信息或相关方观点,不构成任何形式投资建议。如发现站内内容含敏感信息,可点击“举报”,我们会及时处理。
提交
评论 0
最热
最新
还没有人评论哦~快抢沙发吧!
相关阅读
AI交易冲击10月美股基金平均回报率-1.3% 华尔街为何反而建议抄底加仓
经历AI主题抛售后,美股科技股估值出现回调,10月美国股票共同基金和ETF平均总回报率为-1.3%。多位华尔街投资人和策略师认为,这更像是调整而非泡沫破裂,并建议在未来几周增加美股风险敞口、逢低加仓。
The Block
·2026-11-09 19:02:26
9
花旗策略师:增长风险上升,下调美股与科技板块、上调欧洲股市评级
花旗策略师转向更偏防御的立场,下调美股、全球科技股和欧洲科技股评级,同时上调除英国外的欧洲股市评级。团队称,交易拥挤、估值偏高、盈利增速放缓以及AI投入前景不确定,可能令市场短期继续波动,但这次调整属于战术调仓,并非看空股市。
The Block
·2026-11-09 19:02:25
2
Coinbase获得美国全国性信托银行牌照,但附带关键限制
Coinbase已从美国货币监理署获得完整的全国性信托银行牌照,使其机构加密托管业务纳入联邦银行监管。但该牌照不允许其吸收普通零售存款、开展传统放贷或直接发行稳定币。公司计划在三年内把现有受纽约州监管的托管业务逐步转移至新的全国性信托实体。
crypto.news
·2026-11-09 19:02:23
2
限制数据中心为何是战略错误
文章认为,在电网跟不上需求时,政府不应限制数据中心,而应扩大电力供应和电网容量。作者以爱尔兰、纽约、乌克兰以及美中欧的案例说明,AI竞争不仅取决于模型和芯片,也取决于算力、发电和电网能否同步扩张。
Fortune
·2026-11-09 19:02:21
2
英伟达股价盘前跌近5%,源于关于CEO黄仁勋婚外情的重磅披露
截至美国东部时间上午5:45,英伟达股价盘前下跌4.5%,按周五收盘市值计算约相当于蒸发1900亿美元。报道还称,围绕CEO黄仁勋个人生活的披露引发了市场对“关键人物风险”的讨论。
Businessinsider
·2026-11-09 19:02:19
10
查看更多