VIEW THIS AS

Auto mode follows the Route Engine until you choose a viewpoint.

YOU ARE HERE

ROUTE CHECK

CONNECTED TO

WHAT NEXT

Use the canonical route for this room, or HELP if you are unsure.

追踪EIP-7702执行前的授权处理

Three students in school uniforms work through open books at a classroom table, with textbooks and stationery nearby and study notes on the whiteboard behind them.

English version · 区块链学习导航

区块链学习 · 延伸文章 BCX019

三名学生在教室桌旁一起阅读书本,身边放有课本和文具。
学习场景配图;不代表照片中的学生正在学习区块链。

应用调用可能失败,而授权列表已经改变了账户nonce和代码委托。要重建结果,应先根据持续变化的账户状态,按顺序处理授权列表,再应用单独给定的执行结果。

本文提供一个完整虚构资料包:五个账户、七行有序授权、给定的签名检查结果,以及一次最终回退的独立目录调用。任务是计算哪些行生效、哪些行跳过、执行入口状态和最终模型状态。单独一个失败标签,无法回答这些问题。

所有地址、代码目标和存储值均为符号。练习不生成或验证签名,不运行字节码,不涉及钱包、密钥、资产或真实交易。十九个有限案例和三个前置检查探针验证教学模型,不是客户端一致性测试,也不声称每个网络都支持该机制。

选择适合你的阅读路线

本篇目录

  • 要完成主要七行计算,依次阅读第1—5节。
  • 要理解重复授权主体、列表换序和自行发起,阅读第6—7节。
  • 要理解清除代码及关键nonce边界,阅读第8—9节。
  • 要复现并自测,继续阅读第10—12节。

先修账户状态与交易nonce课程介绍普通发送者顺序,交易失败诊断介绍拒绝与执行失败。两者都明确没有把本次授权列表计算纳入其例题范围。

返回目录 · 下一节

1. 分开发送者、每个授权主体与执行目标

选定虚构链的标识为71。发送者P初始nonce为7,代码为空。授权主体A初始nonce为3,已有指向D0的委托,并有一个值为5的存储字段。B初始nonce为9、代码为空、存储值为2。C初始nonce为2,具有普通代码,存储值为4。

独立应用T具有普通代码,nonce为1,存储值为5。外层type-4交易调用T,不调用A或B。D0、D1、D2、D3是符号代码指针目标,不是真实地址,也不是我们运行的程序。

一行授权给出拟用目标、nonce及密码学检查结果。检查成功时,资料包给出恢复出的授权主体。签名失败行可以有一个与B关联的归档标签,但该标签不证明B已经被恢复为授权主体。

P是外层发送者;A或B可以是某一行的授权主体;T是应用目标。这些角色不必重合。后文会故意让P也成为列表中的授权主体,检查角色重合时的变化。

除明确拒绝外层交易的对照外,省略的封套、发送者资格、目标、资源和协议支持条件均给定有效。模型跟踪nonce、代码类型或指针、每个账户的一个存储值,以及符号应用日志,不计算gas、退款或访问预热。

返回目录 · 下一节

2. 处理第一行前先建立阶段顺序

对获准处理的外层交易,先增加发送者nonce。因此,任何授权行评估之前,P已从7变为8。这是发送者更新,不表示P的一行授权已经成功。

接着按给定顺序逐行处理授权。每一行看到的是此前所有生效行留下的状态。不能把每一行都与原始账户快照比较,也不能把重复授权主体合并成一条记录。

列表处理结束后,才开始调用应用T。执行入口快照已经包含获接受的授权变更。主要案例中,T把存储值从5写成99,发出T.changed,然后回退。应用效果恢复到这个执行入口快照。

该顺序对应固定版本的Geth v1.16.5状态转换及其调用快照边界。无需假造每一行授权都是一笔独立交易。

工作表应保留三个检查点:初始状态、执行入口状态、最终状态。只保存初始与最终值,容易把应用回退误认为连调用快照之前的预处理也一起撤销。

返回目录 · 下一节

3. 为每一行规定有序检查

有限模型先检查该行链值是否为0或选定链71,再检查元组nonce是否低于可用上限,然后使用给定签名结果。只有恢复成功后,工作表才读取授权主体账户。

恢复后,检查主体代码是否为空或已是委托。普通代码不满足资格条件。再比较元组nonce与主体当前nonce。匹配且符合资格的行更新代码指针,或在特殊零目标时清除代码,并把主体nonce增加一。

失败行停止在该检查处,继续处理下一行。在本模型投影中,跳过行不改变所跟踪的主体nonce或代码。但这不表示gas为零、没有访问预热,或没有其他协议处理。较晚失败可能发生在账户访问已预热之后;被包含的元组仍影响固有计费。

恢复成功之前,恢复主体、账户变更前及变更后字段都应留空。对链不匹配、nonce达到不可用上限或签名失败的行,正确轨迹没有恢复主体或账户快照。从归档标签填入这些列,会虚构一个尚未到达的处理步骤。

第9节会具体区分可用nonce上限与封套字段宽度,不能把两者压成一个“nonce错误”类别。

返回目录 · 下一节

4. 处理七行资料

第1行给出A、nonce 3、目标D1,链值匹配且恢复成功。A当前是符合资格的委托代码,nonce为3。该行生效:A变为nonce 4、指针D1,存储值仍为5。

第2行再次给出A nonce 3,这次目标为D2。恢复成功,A的委托代码仍符合资格,但当前nonce已经为4,因此在nonce不匹配处跳过。A保持nonce 4和D1。后出现的一行,不会仅因为位置更后就自动胜出。

第3行归档为B nonce 9、目标D1,但链值为72。它在签名恢复之前就因链检查失败而跳过。轨迹不能报告已经恢复出B。B所跟踪账户仍为nonce 9、空代码。

第4行在选定链上给出A nonce 4、目标D2,恢复成功。A当前nonce为4,因此该行生效。A变为nonce 5、指针D2、存储值5。

第5行成功恢复出C,给定nonce 2、目标D1。C具有普通代码,不满足代码资格,所以不会到达成功更新nonce和代码的步骤。C仍为nonce 2、普通代码、存储值4。

第6行有与B关联的资料标签,nonce为9、目标D3,但给定签名结果失败。没有恢复出授权主体,也没有该行的账户前后快照。不能把它描述成一份有效B授权,只是执行失败。

第7行在选定链上成功恢复出B,nonce 9、目标D1。B仍为空代码且nonce为9,因此该行生效。B变为nonce 10、指针D1,存储值仍为2。

有序结果为:生效、nonce不匹配、链不匹配、生效、普通代码资格失败、签名失败、生效。共三行生效。A增加两次,B增加一次,C没有增加。P此前作为发送者已独立增加一次。

返回目录 · 下一节

5. 比较执行入口与最终失败结果

执行入口时,P的nonce为8。A为nonce 5、D2、存储值5。B为nonce 10、D1、存储值2。C未变。T的存储值仍为5。

安装这些委托标记,不会自动为每一行调用D1或D2。给定外层目标是T。本练习不通过A或B发出应用调用,也不模拟任何委托目标代码。

T现在执行规定的写入99和符号日志T.changed,然后回退。最终存储值恢复为5,日志不保留,模型回执状态为0。已接受的预处理状态仍存在:P nonce 8、A nonce 5/D2、B nonce 10/D1。

用完全相同列表但让T成功执行作为对照。预处理结果不变。T最终为99,T.changed保留,模型状态为1。在所跟踪的投影中,仅改变执行结果,只影响T效果以及应用日志和状态。

所以,仅看状态0,不能推断所有账户nonce和代码都还是初始值。反过来,委托保留也不证明T的预期应用动作成功。工作表故意分开报告这些事实。

这里的持久性指在该已接受交易的应用失败后仍保留,不表示免受以后有效更新、链重组或其他状态转换影响。

返回目录 · 下一节

6. 重复授权主体必须顺序评估

把A重置为nonce 3和D0。先处理A nonce 3到D1,再处理A nonce 3到D2。第一行生效并使A变为4,第二行跳过,最终指针为D1而非D2。“最后一个有效出现”不等于“最后列出的一行”。

再次重置,改用连续nonce:A nonce 3到D1,然后A nonce 4到D2。两行都生效,结果为nonce 5和D2。第二行有效,是因为第一行建立了它需要的nonce状态。

保持相同初始快照,把这两行倒序。A nonce 4到D2先出现时,A仍为3,因此跳过。随后A nonce 3到D1生效,结果是nonce 4和D1。nonce改变后,系统不会回头重试第一行。

这是一次有序遍历,不是排序、重试队列或寻找全局兼容子集。按授权主体去重、预先选择最后目标,或按nonce重新排序,都会改变给定程序。

再做后续交易对照:从主要案例最终状态开始,由P发出另一笔其他条件均获准的交易,带上旧的A nonce-3元组。P从8变为9,A因旧元组过期而仍为nonce 5和D2。复用旧授权元组,与重复整笔外层交易,是不同问题。

返回目录 · 下一节

7. 自行发起使用发送者增加后的nonce

把P重置为nonce 7和空代码,让P同时是发送者和列表授权主体。获准处理的外层交易先把P增加到nonce 8,因此P nonce 7那一行会在nonce比较处跳过。

随后一行P nonce 8、目标D2可以生效,再次把P增加到9,并设置指针D2。如果应用随后回退,模型最终仍为P nonce 9和D2。

如果列表只有旧nonce-7行,P最终为nonce 8、空代码。发送者增加已经发生,但没有P授权行生效。若按行数而不是成功更新数计数,就会预测错误nonce。

这个例子让同一个账户承担两种角色,却不合并阶段。一次增加来自外层发送者身份,另一次来自获接受的授权行。在主要案例中,这两类增加落在不同账户上,区别没有这么明显。

这些算术是给定的教学状态处理,不是要求准备或签署自行发起交易,也不模拟任何费用或代付服务。

返回目录 · 下一节

8. 清除代码保留单独跟踪的存储

把A重置为nonce 3、D0、存储值5。一行符合资格且nonce匹配、目标为特殊ZERO的授权,会清除A代码,并把nonce增加到4,不会把存储值5改成零。

使用无操作应用对照:最终代码为空、nonce为4、存储值仍为5,状态成功。改用独立T回退对照:相同清除和nonce更新仍保留,T的应用写入与日志不保留。

另一次重置中,先在nonce 3清除A,再应用nonce 4到D2的一行。两行通过,A最终为nonce 5、D2,存储值仍为5。

这些对照解释了初始B为何可以代码为空,却有非零存储值。空代码不表示所有历史存储字段已经擦除。不过,本文不推断后续委托程序能否安全解释保留存储;那需要另行分析程序和布局。

清除仍受该行前面各项检查约束。过期或无效行仅仅写了ZERO目标,不保证代码发生任何变化。

返回目录 · 下一节

9. 区分外层拒绝与单行跳过

模型计算两个选定的封套检查:type-4授权列表不能为空,元组nonce必须在字段宽度内。空列表或nonce等于2的64次方,会在这些对照中导致外层拒绝。

模型中,外层被拒绝时,不增加发送者nonce,也不处理授权。结果没有回执状态,而不是状态0。另一个直接给定外层无效的对照,也不进入预处理。这并不是全部交易有效性规则的完整实现。

现在定义MAX为2的64次方减1。元组nonce等于MAX,虽然能放进字段,却不能用于还需增加nonce的授权更新。外层可以获准处理,而该行在前面的nonce上限检查处跳过。发送者仍增加,应用仍到达其给定结果。

更精确的边界对照把A初始化为MAX减1。匹配行可以把它增加到MAX并安装D1。随后nonce为MAX的一行跳过,不能把D1替换为D2。即使应用后来回退,最后一次可用更新仍保留。

链值零的对照也有明确范围:在给定链上下文中,链值0通过该项检查,但仍受其他检查约束。这不表示所有网络都实现该机制,也不证明任何真实签名有效。

返回目录 · 下一节

10. 全部行跳过,应用仍可能执行

重置主要初始状态,使用三行:链不匹配、签名失败、C普通代码。每一行都跳过,但外层列表非空,其他条件给定有效。

P增加到8,A仍为nonce 3和D0。如果T的给定执行成功,T变为99、符号日志保留、状态为1。对这个应用的给定成功行为而言,并不需要有任何授权行生效。

因此要分清三个类别:外层交易拒绝、外层获准但授权行跳过、应用执行失败。它们不是可以互换的失败标签。资料包应先记录类别,再推断最终nonce或代码。

同样,单行跳过不表示处理免费。结果有意省略gas、退款计数和访问预热状态,因此不能回答费用或完整资源记账问题。

返回目录 · 下一节

11. 复现十九个案例和三个前置探针

有限检查器维护一份账户映射,增加获准发送者nonce,逐行只处理一次,并在T执行前保存所得状态。它记录行结果、恢复主体和可用账户快照。独立表达方式重建全部完整状态、轨迹、状态码和日志列表。

十九个案例包括主要失败与成功执行、重复及连续nonce、倒序、两种自行发起、三种清除、全跳过列表、两种选定封套失败、两种nonce上限对照、链值零、普通代码拒绝、单独外层拒绝,以及后续旧元组复用。

三个额外探针使用未知的资料账户标签,分别配合链不匹配、不可用最大nonce和签名失败,检查两种模型是否在读取账户之前就停在前置检查。所审查案例中的八行早期失败,恢复主体和账户状态轨迹字段均为null。

这些是本地符号检查。每行密码学结果是前提,不是签名验证实现。上游测试作为源码证据阅读,没有执行。任何一个模型都不能证明完整Geth一致性、最终性或已部署钱包安全。

审查答案时,应保留初始映射、有序行、最先失败的检查、每次成功nonce与代码更新、执行入口检查点及最终应用结果。单独最终指针,无法解释前后各行为什么跳过。

返回目录 · 下一节

12. 练习与参考答案

  1. 主要第1行之前,P的nonce是多少?
  2. 为什么主要第2行没有把D1替换为D2?
  3. 主要第6行能如实把B列为已恢复授权主体吗?
  4. 为什么T状态为0时,A仍能保留D2?
  5. 把连续的A nonce-3和nonce-4两行倒序,会怎样?
  6. 清除代码是否证明存储值被擦除了?

答案:1. 发送者增加后为8。2. A已为nonce 4,因此nonce-3行跳过。3. 不能,失败签名结果没有提供恢复主体。4. 获接受的预处理发生在应用快照之前,T失败恢复的是那个快照。5. nonce-4行先跳过,nonce-3行随后生效,留下nonce 4和D1。6. 不证明,对照仍保留存储值5。

延伸问题:解释元组nonce为2的64次方与MAX的区别。前者超出选定封套检查的字段宽度;后者能放进字段,但在授权的可增加性检查处跳过。因此,两者对发送者处理和回执状态的影响不同。

返回目录 · 下一节

来源与版本说明

来源于2026年10月13日核对。EIP-7702状态为Final,创建于2024年5月7日。该状态不证明每条链都支持它。

实现参考固定为Geth v1.16.5状态转换及调用处理。上游授权测试固定到所列提交,用于核对nonce顺序、自行发起、失败执行后保留和存储保留对照;版本固定不表示最新发行版。

有用的结论是一套程序:先计算授权阶段并保留其有序状态变化,再相对于正确的执行入口快照解释应用结果。

返回目录