English version · 区块链学习导航 · 上一篇
区块链学习 · 文章 BC033

账户型账本可以为每个账户保存余额和交易计数器。在本文采用的普通发送者模型中,交易必须携带所选执行前状态要求的计数值;执行后,计数器向前推进。这样,即使两条指令都获得了授权,它们在同一发送者序列中的位置仍然可以区分。
因此,nonce 能帮助判断顺序,却不是收据、全网排队号码,也不保证应用执行成功。本篇通过精确的账户状态练习,跟踪两条虚构指令,再检查序号缺口、重复提交和相互竞争的候选交易。全程不涉及真实资金、密钥或网络交易。
选择适合你的阅读路线
本篇目录
- 1. 余额与 nonce 回答不同的问题
- 2. 写出完整的课堂执行前状态
- 3. 第一条指令使用 nonce 4
- 4. 第二条指令依赖第一步产生的状态
- 5. 序号缺口不等于全网预留的排队位置
- 6. 重发同一交易不会产生一个新的轮次
- 7. 两个候选对象可以争取同一个位置
- 8. 不同发送者使用相同数字,未必发生冲突
- 9. 先问报告中的 nonce 属于哪个状态
- 10. 明确保留普通模型的边界
- 11. 练习:判断六项账户状态说法
- 12. 常见问题
- 13. 资料来源与后续阅读
先读账户卡片和两步计算,再用异常情形区分“当前计数器下不能执行的交易”与“节点可能暂存、留待以后检查的候选交易”。最后完成观察清单和练习,避免仅凭钱包的待处理显示就下结论。
练习仅覆盖具有单一递增计数器的普通发送者交易,并不是完整的以太坊实现。委托授权、合约创建账户、智能账户 nonce 方案以及实际 gas 计费都需要额外规则。后文会解释为何必须保留这些范围限制。
1. 余额与 nonce 回答不同的问题
余额描述所选账户状态中的数量。在本模型中,nonce 描述该发送者下一条能够执行的指令应使用哪个序号。余额足够,并不意味着每一条已经签名的指令都能立即执行。
假设档案馆课堂账户 A 拥有 20 个虚构点数,下一 nonce 为 4。20 回答的是 A 目前拥有多少点数;4 表示下一条普通指令必须使用 nonce 4。两者都不能识别真实个人、证明法律上的所有权,或解释此前状态为何发生变化。
以太坊交易文档将 nonce 列为与发送者有关的交易字段。本文借用这一基本排序思路,但不假定每种区块链、账户抽象系统和授权格式都使用完全相同的计数方案。
交易 nonce 也不同于应用记录的修订版本号。目录条目可能处于版本 7,而发送者的下一 nonce 为 4。前者跟踪应用对象,后者排列发送者的交易。即使交易序号正确,它仍可能要求修改一个已经过时的目录版本。
2. 写出完整的课堂执行前状态
本虚构账本的初始值如下:
- A 的余额为 20 点,下一 nonce 为 4。
- B 的余额为 0 点,下一 nonce 为 0。
- C 的余额为 0 点,下一 nonce 为 0。
- 单独设置的教学费用账户余额为 0 点。
所有点数都是虚构整数单位。每次成功的课堂转移额外从发送者扣除固定费用 1 点,并将其记入费用账户。这只是用于核对的记账规则,并非以太坊费用公式,也不代表任何网络报价。
在练习中,只有授权有效、网络上下文匹配、nonce 等于发送者当前要求的下一 nonce,而且发送者能够承担转移数量与固定费用时,转移才可执行。接收者和数值还必须符合给定的记录格式。成功执行会更新余额,并把发送者 nonce 增加 1。
两笔主要交易均假设授权有效且网络上下文匹配。在这个模型中,仅仅收到点数不会改变 B 或 C 的下一 nonce。算术练习排除了应用调用以及纳入区块后执行失败的情形,以便成功状态转移只有一种明确解释。
3. 第一条指令使用 nonce 4
交易 T4 的内容是:发送者 A、nonce 4、接收者 B、数量 6、固定费用 1。T4 是课堂标识,其名称中的数字不是密码学交易哈希。
执行前,A 要求 nonce 4,且足以承担 6+1=7 点。因此,在给定假设下,T4 通过练习规则的检查。A 减少 7 点,B 增加 6 点,费用账户增加 1 点。
结果状态为:A 余额 13、下一 nonce 5;B 余额 6、下一 nonce 0;C 余额 0、下一 nonce 0;费用账户余额 1。总量仍是 13+6+0+1=20。
注意,前进的是 A 的发送者计数器。B 的计数器仍为 0,因为在本模型中,B 只是接收了一次转移,并未执行一条向外发送的指令。不能因为某账户余额改变,就把所有被交易涉及的账户计数器都增加 1。
计数器更新是状态转移的一部分,而不是用户界面事后添加的备注。另一个验证者按照相同初始状态和规则重放时,必须使用更新后的计数器来检查 A 的下一笔交易。
4. 第二条指令依赖第一步产生的状态
交易 T5 的内容是:发送者 A、nonce 5、接收者 C、数量 5、固定费用 1。T4 执行后,A 要求的 nonce 是 5,余额为 13,足以承担 5+1=6 点。
T5 执行后,A 剩余 7 点,下一 nonce 为 6;B 仍有 6 点,C 获得 5 点,费用账户共计 2 点。最终核对式为 20=7+6+5+2。
完整顺序因此是先 T4,后 T5。这不只是为了讲解而任意排列。T5 的 nonce 与 T4 执行后的状态匹配,并不匹配初始状态。即使 A 初始余额充足,先尝试执行 T5 仍会因 nonce 不相等而无法通过检查。
诊断时必须区分这一点。“余额不足”与“前一个 nonce 尚未被使用”是不同解释。如果界面把两者都压缩成笼统的“等待中”,就丢失了理解下一次有效状态转移所需的信息。
也不能由此保证 T5 一定执行。本计算路径已经给定 T4 成功以及其他检查通过。在真实系统中,另一笔前序交易、状态变化或其他有效性条件,都可能阻止后续候选交易推进。
5. 序号缺口不等于全网预留的排队位置
假设一个节点先得知 T5,后得知 T4。此时选定规范链上的账户状态仍要求 nonce 4。按照普通发送者规则,节点不能把 T5 当作 A 的下一条指令有效执行。
但节点可能按照自身交易池策略,在本地暂存 T5。暂存只表示:当状态或可用交易序列发生变化后,节点可能重新考虑这个候选对象。它不表示交易已进入区块、已预留全网容量,或将被无限期保存。
Geth 的 txpool 文档最后编辑于 2023 年 8 月 16 日,介绍了按账户和 nonce 分组的 pending 与 queued 等非标准查询接口。这是特定客户端的观察接口,并不是对所有节点共享同一个全局候车室的定义。
在课堂案例中,应分别记录:“规范链状态要求 A 的下一 nonce 为 4”和“本节点观察到了携带 nonce 5 的候选交易 T5”。两句话可以同时成立。如果合并成“A 的 nonce 现在是 5”,就混淆了已签名候选对象与已接受状态。
缺少前序候选交易是出现缺口的一种可能原因,但仅凭计数器差异,不能证明有人删除了交易、审查了用户或丢失了私钥。更强的结论需要更多证据。
6. 重发同一交易不会产生一个新的轮次
当 T4 已在所选规范路径上执行后,A 要求的下一 nonce 是 5。再次提交相同的 T4 字节,不会让其中的 nonce 4 自动变成 5。在这个后续状态中,它不能通过同样的普通发送者检查。
交易标识用于区分字节层面的候选对象;发送者与 nonce 则标明它想占据的简化序列位置。不能用“用户点了几次按钮”这种模糊计数替代其中任何一个。
因此,重复传播与重复执行是两回事。节点可能从多个对等节点听到同一交易,多次观察不等于多次接受转移。在练习中,只有第一次有效状态转移使用 A 的 nonce 4。
“在所选规范路径上”这一限定十分重要。链重组可能替换最近观察所依赖的历史,此时必须查看新选定的状态以及交易在该路径上的情况。计数器规则不意味着一笔交易在所有曾被观察到的竞争历史中只能出现一次。
7. 两个候选对象可以争取同一个位置
现在引入 T4prime:发送者 A、nonce 4、接收者 C、数量 6、固定费用 1,并假设授权有效。它与 T4 的接收者不同,因此是在竞争同一个发送者位置,而不是 T4 之后的第二步。
如果初始状态先执行 T4,A 就前进到 nonce 5,T4prime 不能随后在同一规范序列中再次使用 nonce 4。如果执行的是 T4prime,A 同样到达余额 13、下一 nonce 5,但获得 6 点的是 C,B 没有收到点数。
可见,发送者交易后的余额和 nonce 完全相同,也不能证明课堂账本中哪位接收者获得了点数。需要查看被接受的交易及接收者结果状态。仅靠计数器不足以核实应用意图。
Geth 查询文档明确允许观察到同一账户、同一 nonce 下的多个候选对象。节点接纳、替换、保留或转发哪一个,取决于客户端和交易池规则。本练习没有提供替换价格规则,也不保证每个节点都会在本地偏好同一个候选对象。
钱包中标为“取消”的功能,不能被理解为把一条已签名指令从所有可能的观察者那里彻底擦除。应核对实际机制、交易状态和适用网络规则。本文不提供真实网络上的替换或取消操作流程。
8. 不同发送者使用相同数字,未必发生冲突
另设账户 D,假设其余额充足、授权有效,下一 nonce 同样为 4。在本模型中,D 的 nonce 4 交易不与 A 的 nonce 4 交易竞争同一位置。序列的范围由发送者账户和网络上下文确定,而不是单独由整数 4 确定。
同样,A 在一个网络上的 nonce 4,也不自动等于另一个网络上的同名含义。完整证据记录应同时标明网络、授权方案、发送者和 nonce。
EIP-155创建于 2016 年 10 月 14 日,状态为 Final,规定了其传统以太坊交易格式中包含链 ID 的签名方式。这一历史重放保护机制说明,发送者计数器本身并不是完整的跨网络授权边界。
但不能把这个例子扩大为“只要加入链 ID,所有应用中的所有签名消息就都受到保护”。作用范围取决于实际签名字段和验证者规则。对共享某种上下文的两个分支,也不能仅靠比较不同网络标签就完成分析。
9. 先问报告中的 nonce 属于哪个状态
如果报告只写“A 的 nonce 为 6”,却没有观察上下文,信息是不完整的。它指的是某个已接受区块的状态、节点当前选定链头,还是受到该节点本地候选交易影响的 pending 状态计算?
以太坊的 JSON-RPC 文档为状态查询方法提供区块上下文参数,包括 latest、pending 等具名上下文。不能把这些上下文当作可以互换的证据。应记录方法、参数、响应节点和观察时间;可以取得具体区块时,也应保留其身份。
在本练习中,执行 T4 和 T5 之后,A 的下一 nonce 为 6。如果某节点采用的已接受状态仍停留在 T4 之前,它会看到 A 的下一 nonce 为 4。两份报告可能基于不同状态,而不是算术发生分歧。
如果报告采用 pending 视图,还要问它纳入了哪些本地序列,以及客户端是否支持所请求的语义。pending 计数器可以帮助理解该节点的工作视图,却不能独立证明交易纳入区块或获得最终性。
可复核的比较应先对齐网络、区块身份和账户,再比较数值。如果把一个已最终确定的历史状态与另一节点的 pending 视图混在一起,却不说明差异,就会制造误导性的矛盾。
10. 明确保留普通模型的边界
nonce 不一定是随机数。这里的普通交易计数器是可预测地递增的。其他系统也使用 nonce 一词,但其协议角色及唯一性、不可预测性要求可能不同。挖矿 nonce、加密 nonce 与账户计数器不能仅因同名就互相套用规则。
也不能认定外部拥有账户的 nonce 永远等于区块浏览器恰好列出的向外发送交易数量。EIP-7702创建于 2024 年 5 月 7 日,状态为 Final,其授权处理包含检查并增加授权账户 nonce 的步骤。本转移练习排除了这些授权元组及委托执行。
应用成功与否又是另一个维度。真实交易处理中,即使已纳入交易的应用执行失败,发送者 nonce 仍可能前进;哪些变化被保留,应由适用执行规则决定。不能使用本篇虚构的成功转移和固定费用规则,推断真实失败交易的余额、费用或 nonce 结果。
同样,也不能直接把单一计数器练习套用到所有智能账户设计。应先识别其授权和 nonce 机制。真正可迁移的技能,是阅读状态转移规则及其适用范围,而不是假定所有账户式界面都实现这份练习。
11. 练习:判断六项账户状态说法
只使用给定的课堂规则。每题回答前,先说明相关执行前状态。
- 初始状态下,T5 授权正确,A 拥有 20 点。它能立即作为 A 的下一条指令执行吗?
- 依次执行 T4、T5 后,A 的余额和下一 nonce、B 的余额、C 的余额以及费用账户总额分别是多少?
- T4 执行后,有人重发完全相同的 T4 字节。B 会再获得 6 点吗?
- 初始状态下,同时观察到 T4 和 T4prime。它们能在同一规范序列中连续两次使用 A 的 nonce 4 吗?
- A 和 D 的下一 nonce 都为 4。是否仅因使用同一个整数,其中一个就必须等待?
- 报告说 A 的下一 nonce 为 6,但没有区块或 pending 上下文。这能独立证明 C 收到了 T5 原计划转移的 5 点吗?
答案与理由
- 不能。A 要求 nonce 4,T5 携带的是 5。余额和授权充分,也不能消除顺序条件。节点是否暂存是另一项策略问题。
- A 余额 7、下一 nonce 6;B 余额 6;C 余额 5;费用账户 2,总量为 20。按本篇接收规则,B、C 的下一 nonce 仍为 0。
- 不会。T4 执行后的所选状态要求 A 的 nonce 为 5,而相同字节仍携带 4,不能在那里产生所说的第二次状态转移。
- 不能。它们是同一发送者位置的备选对象,首先接受的转移会推进计数器。同时观察到两者,并不妨碍所选路径在该位置最多执行其中一个。
- 不需要。计数器按账户划分。更丰富的系统可能存在其他共享资源或应用冲突,但仅仅整数相同并不产生这种冲突。
- 不能。报告缺少状态上下文和交易证据。其他指令也可能推进 A 的计数器,需要检查被接受交易、执行结果以及相关接收者状态。
延伸:选择另一条路径
把 T4 换成 T4prime,再执行不变的 T5。A 最终仍有 7 点,下一 nonce 仍为 6;B 为 0,C 为 11,费用账户为 2。核对式变为 20=7+0+11+2。
这充分说明,发送者最终余额与计数器不能充当接收者结果的完整审计。两段不同的授权历史可以让发送者这两个字段相同,却产生实质不同的接收者状态。
12. 常见问题
nonce 是交易的唯一标识吗?
不是。在本模型中,它标明特定上下文中的发送者序列位置。不同的竞争交易字节可以使用同一发送者 nonce,而交易标识和效果不同。
nonce 越大,优先级越高吗?
不是。它表示该普通发送者序列中更靠后的位置。本练习没有规定按费用排序或调度优先级,序号缺口反而可能阻止立即执行。
收到转移会增加接收者 nonce 吗?
按本篇“仅接收”的规则不会。余额更新与发送者计数器更新是不同操作。真实系统应检查具体执行和授权路径,不能仅因某账户被涉及就概括结果。
计数器能证明用户本来就想得到这个结果吗?
不能。它帮助约束顺序。人的意图、授权范围、交易内容、应用执行以及最终性仍是不同问题,需要各自的证据。
13. 资料来源与后续阅读
技术资料于新加坡时间 2026 年 10 月 12 日核对。提案创建日期描述文档本身,不表示所有网络都实现了相应规则。
- 以太坊交易文档:交易字段与普通发送者模型。
- Geth txpool 命名空间:特定客户端的 pending、queued 查询;页面最后编辑于 2023 年 8 月 16 日。
- EIP-155:Final,创建于 2016 年 10 月 14 日;历史上的包含链 ID 的交易签名机制。
- 以太坊 JSON-RPC:状态查询上下文与观察参数。
- EIP-7702:Final,创建于 2024 年 5 月 7 日;超出单纯转移例子的授权账户 nonce 处理。
可以回顾 UTXO 课程,比较具名输出消耗与账户状态更新。接着阅读交易池,了解两个节点为何可能保存不同候选对象,再学习 gas 与失败执行的资源核算。在额外机制的规则尚未明确前,不要把它们混入本账户计数器练习。
