Crypto OS
Non-Technical Crypto OS第一阶段 · Crypto 为什么出现

第 6 章 · 一次链上交易发生了什么

点下确认之后的那十几秒里,到底发生了什么?

练习的能力
Onchain LiteracyProtocol Literacy
动手
在测试网发一笔转账,截图记录 pending、已打包、已确认三个状态,写下每一步花了多久。
AI Lab
把交易哈希交给 AI,让它逐字段解释这笔交易,再自己到浏览器上核对每一个字段。

一个现实问题

你点了确认。

界面开始转圈。三秒,十秒。然后变成「已提交」,下面多了一行小字:待确认 1/12

你把交易编号发给对方。对方说:还没收到。

又过了一会儿,变成 3/12。对方说:我这边显示到账了,但平台说还要等。

所以,这笔钱到底算不算到了?

这个问题比它看起来复杂。同一条链上,你会遇到一堆不一致的规则:

  • 有的平台要 1 个确认,有的要 30 个。
  • 同一个平台,充 100 块和充一大笔,要求的确认数可能不一样。
  • 有的链根本不显示确认数,只显示「已完成」。
  • 有时候界面显示「成功」,钱却没到,而且手续费照样扣了

最后这一条是新手最困惑的:失败了为什么还要收钱?

第 1 章讲过「显示到账」和「完成结算」是两件事。这一章要把那个差值整个拆开,看清楚从你按下确认到钱真正不可能被收回,中间一共有几步、每一步会怎么坏、以及你该在哪一步才算放心。

这也是前五章的汇合点。你会在这一章里同时用到:账本(第 2 章)、共识(第 3 章)、排序与工作量(第 4 章)、签名与密钥(第 5 章)。

思想实验

回到第 5 章那面村口的墙,加上第 4 章的「一页一页往下接」。

你要付 5 枚给小卖部。 完整的过程是这样的:

第一步,写条子。 你写下「从我这一行转 5 枚给小卖部那一行」。注意这张条子上除了金额和收款方,还必须有两样东西:

  • 一个编号,表示「这是我写的第 8 张条子」。没有它,同一张条子被人捡去重复投一次,你就被扣两次。
  • 一笔跑腿费,给愿意把你这张条子抄上墙的人。

第二步,盖章。 用你的私章按一下。全村都能验证这确实是你按的,而且改动条子上任何一个字,这个印就失效了。

第三步,扔进筐。 村中心有一个大筐,所有待处理的条子都堆在里面。

这里有一件事非常重要:筐是公开的。 任何人都能走过去翻看里面所有的条子——包括你那张。他们在你的条子生效之前,就知道你要做什么。

第四步,等人来抄。 抄页的人每隔一段时间过来,从筐里挑一批条子抄成新的一页。

他凭什么挑你的? 跑腿费。给得高的先抄,给得低的可能在筐里躺很久。筐里条子多的时候,跑腿费会被抬得很高;筐里空的时候,给一点点也能很快被抄走。

第五步,你的条子上了第 100 页。 现在,算不算数?

第六步,第二天早上,有人搬来一叠更长的册子。

这叠册子从第 99 页开始就和大家手里的不一样,而且它比现在这一串更长。按第 4 章的规则,全村改认这一串。

你那张条子不在上面。 它回到了筐里——运气好的话。运气不好的话,那个人在他的版本里塞了一张你付给的条子,同样带着你的真印(因为他在筐里看到过你那张,能构造出冲突的版本吗?不能——他没有你的私章。但付款人自己可以这么干)。

第七步,村里于是形成了一个习惯: 你的条子上墙之后,后面每多接一页,要推翻它就要多重做一页的工作量。接到六七页之后,推翻它的成本高到没有人会去做。

但注意:那个成本永远不是无穷大。 它只是高到不值得。

第八步,隔壁村改了规则。 他们不靠「谁的串更长」,而是每隔一小段时间,让一组事先押了保证金的记账人集体签字确认:「到第 100 页为止,锁死,谁再改就没收保证金。」

签完之后,第 100 页就真的不能改了——除非这组人里有足够多的人愿意一起赔上全部保证金。

现在停下来想一想:第七步和第八步,「算数」这两个字的含义一样吗?

一个是「推翻它太贵了,所以不会有人做」。另一个是「推翻它要赔钱,而且规则上明确不允许」。

这是两种不同的安全感,而它们在界面上都显示为「已完成」。

你来决定

你是那家小卖部的老板。有人用条子付款买东西。

你什么时候把货给他?

观察结果

四个选择其实是同一个问题的四个刻度:

你愿意为「这笔交易被推翻」这件事,买多少保险?

保险费的支付方式是等待。等得越久,被推翻的概率越低,成本越高。

你等到被推翻需要什么适合的场合
进入公共筐付款人自己再发一笔,加价替换极小额,或你信任对方
被打包进区块重做这一个区块日常小额
后面又接了若干区块重做全部区块并反超进度大额,按金额调整等待
明确的最终确认足够多的记账人同时被罚没支持这类规则的链上的大额

三个结论从这张表里出来,一个比一个重要。

第一,最终性不是开关,是一条曲线。

没有哪条链在第 0 秒就是百分之百。有些链的曲线在某一点之后变成近乎垂直(明确的最终确认),有些链的曲线永远在逼近而不到达。但曲线的左端,所有链都一样:刚发出的那一刻,什么保证都没有。

第二,「成功」这个词在三个不同的地方出现,含义完全不同。

这三者经常被同一个绿色对勾表示,但它们是三件事:

界面说实际含义这时候钱怎么样了
已提交你的钱包把交易发给了一个节点还没生效,随时可能被替换或丢弃
已打包它被写进了一个区块可能成功,也可能标记为失败
已确认 N 次后面又接了 N 个区块被推翻的概率随 N 下降

第三,也是最反直觉的一条:交易失败了,手续费照扣。

原因在第 4 章:手续费买的不是「成功」,是抄页的人为你付出的处理工作。他把你的条子读进来、执行、发现余额不够或者条件不满足、把失败结果记上——这些工作真实发生了,所以要付费。

你付的是计算资源,不是结果。 这个区分会在第 7 章展开成一整章。

建立模型

一笔交易从你心里的念头到不可推翻,中间是七格。这是整个第一阶段最值得背下来的一张图。

  1. 构造
  2. 签名
  3. 广播
  4. 进入待处理池
  5. 被打包进区块
  6. 获得若干确认
  7. 达到最终性
每一格都会以不同的方式失败,表现出来的症状也不一样。看懂症状在哪一格,才知道能不能补救。

把每一格摊开:

阶段这一步在做什么典型的坏法你还能做什么
构造填收款方、金额、编号、手续费地址填错、金额多一位、编号冲突还没签名,改就行
签名用私钥授权这份内容签了一个你没看懂的授权签名前能拒绝,签完就晚了
广播发给网络,扩散到各个节点节点没接受、格式不合规、网络断了重发,通常无损失
待处理池在公共候选区里排队手续费给低了,长期挂着加价替换,或发一笔同编号的空交易顶掉
打包被写进一个区块并执行执行失败,但费用照扣无法撤销,只能排查原因重发
确认后面接上更多区块区块被重组,交易退回待处理池只能等,或等更多确认
最终性不可能再被推翻——到此为止

三格需要单独说清楚,因为它们是真实损失最集中的地方。

签名那一格。 这是整条链上唯一一个「你还能说不」的时刻。过了这一格,你的意志就不再起作用了——链只认签名。第 5 章说过,一次签名可能授权的不只是这一笔转账,而是未来一整类资产的转移权。看不懂就拒绝,这是成本最低的安全措施。

待处理池那一格。 这里有一件很多人不知道的事:待处理池是公开的。 你的交易在生效之前,全世界都能看到你打算做什么——转多少、给谁、换什么币、能接受多少滑点。

有人专门盯着这个池子。看到一笔会推高价格的大额交易,他可以抢在你前面买、等你的交易把价格推上去、再卖出。你付的差价就是他的利润,而这一切完全合法地发生在规则之内。 第 18 章和第 24 章会完整拆解这件事。

打包那一格。 「被打包」和「成功」是两回事。在区块浏览器上,一笔失败的交易和成功的交易并排躺在同一个区块里,只是状态标记不同。失败的原因通常是:资源预算给少了、执行中触发了合约的拒绝条件、或者价格滑动超出了你设定的容忍范围。

最后是一把实用的尺子,你以后每次转账都可以在心里过一遍:

金额越大、对方越不认识、撤销的可能性越小,你就该往右边多等几格。

反过来,不要为一笔小额支付等到最终性——那是把成本花在了错误的地方。

它叫什么

现在给名字。

签名Sign

用私钥对一份具体的交易内容生成授权。

请记住它的两个性质:它和内容严格绑定(改一个字节就失效),它是不可撤回的意思表示(签完之后,你的态度不再被询问)。

整个流程里,这是唯一由你决定的一格。 后面每一格都由网络决定。

编号Nonce

同一个地址发出的交易的序号,从 0 开始依次递增。

它解决两个问题:防止同一笔交易被重复执行,以及规定同一个地址的交易必须按顺序生效

第二条有一个很实用的推论:如果你的第 8 笔卡住了,第 9 笔就算手续费给得再高也动不了。 想解开,要么给第 8 笔加价,要么用同一个编号发一笔手续费更高的空交易把它顶掉。

这是「我的交易卡住了怎么办」这个问题的完整答案。

广播Broadcast

把签好名的交易发给一个节点,由它扩散给其他节点。

注意:你的钱包并没有「发送」资产给任何人,它只是把一份签名文件交给了网络。资产的转移发生在后面的打包环节。

待处理池Mempool

每个节点各自维护的、还没被打包的交易候选区,也就是那个筐。

三个必须记住的性质:它是公开的(任何人都能看到里面的内容);每个节点的池子可能不一样(没有全局统一的一份);里面的交易还没有任何效力(可以被替换、被丢弃、永远不被打包)。

第一条是整个链上交易环境里最被低估的一件事。

区块Block

一批被打包在一起、并按确定顺序排好的交易,接在前一个区块后面。

区块是排序的最小单位。同一个区块里的交易,先后顺序也是确定的——而这个顺序由打包的人决定,这件事的经济后果非常大。

验证者Validator

负责打包交易、生产区块的参与者。

在工作量证明的链上,他们通过算力竞争获得这个资格(第 4 章的矿工);在其他设计里,通过押上资产获得。

不管哪一种,他们都有一项没有被明确写进规则的权力:决定收哪些交易、以及按什么顺序排。 这项权力值多少钱,是第 18 章的主题。

确认数Confirmation

你的交易所在的区块后面又接了多少个区块。

它是一个风险度量,不是一个状态。确认数越多,被推翻所需的代价越高。

没有一个放之四海皆准的确认数。 合理的做法是问:这笔金额值得别人花多少钱来推翻?

重组Reorg

网络改认了另一串更长或权重更高的区块,原来那一串上的部分交易被退回待处理池。

它不是攻击,是正常运行的一部分——两个人几乎同时出块时就会发生,通常只影响一两个区块。

但深度重组(影响很多个区块)通常意味着有人在主动攻击,第 4 章讲过它在小链上真实发生过。

最终性Finality

一笔交易不可能再被推翻的状态。

它有两种形态,区别很大:

概率最终性:后面接的区块越多,被推翻的概率越低,但永远不严格等于零。第 4 章那条链属于这一类。

确定最终性:到某个明确的时刻,这批交易被锁死,推翻它需要足够多的参与者同时被罚没全部押金。

两者在界面上都显示为「已完成」,但含义完全不同。 判断一条链能给你什么保证,看的就是这一条。

收成一句话:

最终性不是一个瞬间,而是一个逐步增强的概率。

所以「到账了吗」这个问题永远要带一个后半句:到账到什么程度,以及这个程度配不配得上这笔金额。

动手

动手在测试网发一笔转账,把七格走一遍并计时一个测试网钱包 + 对应的区块浏览器 + 手机秒表0 元。全程使用测试网,测试网代币没有任何价值。不要在这个 Lab 里动用任何真实资产

这个 Lab 全程在测试网上做。 用第 5 章那个测试网钱包,不要碰任何真实资产。测试网的行为和主网不完全一样,但七格的结构是一致的,这正是要观察的东西。

准备一支秒表,或者手机自带的计时器。

准备两个地址。 在同一个钱包里建第二个账户,你要从第一个转给第二个。

打开区块浏览器,搜索你的第一个地址,把这个页面留着,一会儿要一直刷新它。

发起转账,但先别确认。

填好金额,走到最后一步那个确认页面。停在这里,把这一屏看完。

找出这几样东西并记下来:收款地址(逐字核对前四位和后四位)、金额、手续费、以及它预估的时间。

这一屏就是模型里的「签名」那一格。 这是整个流程里唯一一个你还能反悔的地方。养成在这里停三秒的习惯,它以后会救你至少一次。

按下确认,同时按下秒表。

接下来的几分钟里,每隔十秒刷新一次浏览器页面,记录三个时间点:

T1:界面显示「已提交」的时刻 T2:浏览器上能查到这笔交易、状态是待处理的时刻 T3:状态变成已打包、并且显示出区块高度的时刻

T1 到 T3 这段时间,你的钱既不在你这里,也不在对方那里。它在筐里。

打开这笔交易的详情页,逐个字段抄下来。

至少抄这些:交易哈希、状态、所在区块高度、发送方、接收方、金额、手续费、编号、时间戳。

有些字段现在看不懂没关系,先抄下来,下一节的 AI Lab 就用这份记录。

盯着确认数看五分钟。

刷新页面,看确认数从 1 开始往上爬。记下它每增加一个大概要多久。

你会发现间隔并不均匀——这正是第 4 章 Lab 里看到的那个现象:平均值稳定,单次随机。

这意味着「大概要等 N 分钟」这句话本身就是一个概率描述。

做一次对照实验:把手续费设到最低再发一笔。

如果钱包允许自定义手续费,把它调到最低(有些钱包在「高级」里),再发一笔。

观察它在待处理池里待多久。如果它挂住了,试着用同一个编号、更高的手续费再发一笔,看它能不能把前一笔顶掉。

这就是"我的交易卡住了"的标准解法,在测试网上练一次,比在主网上着急时现学好得多。

填完这张表,它就是你的阶段作品。

阶段发生时刻距上一步多久这一步如果失败,你会看到什么
签名
广播
进入待处理池
被打包
1 个确认
5 个确认

最后写三句话:我在哪一步之后才真正放心?为什么是那一步?如果这是一笔大额,我会改成等到哪一步?

AI Lab

AI Lab让 AI 逐字段解释你那笔交易,你到浏览器上一格一格核对Level 2 · AI Copilot

用上一节 Lab 里那笔测试网交易。

第一步,让它逐字段解释:

这是一笔链上交易的详情,来自测试网。请逐个字段解释:

(把你抄下来的字段贴在这里)

每个字段说明三件事:
1. 它记录的是什么
2. 它由谁决定:发送方、网络,还是打包这个区块的人
3. 如果这个字段的值不对,会表现成什么症状

最后单独回答:这笔交易现在处于什么状态,以及它还有没有可能被推翻。

第二步,问四个它容易答错的问题:

基于上面这笔交易:

一、「已打包」和「执行成功」是同一件事吗?如果一笔交易被打包但执行失败,
手续费会被扣吗?为什么?

二、假设我现在想撤销这笔交易,有没有任何办法?如果它还在待处理池里呢?
如果它已经被打包了呢?

三、如果我要收一笔大额转账,应该等几个确认?请不要直接给数字,
先说出这个数字取决于哪几个变量。

四、这条链的最终性是概率型还是确定型?依据是什么?

第三步,也是最重要的一步:拿着它的答案回到浏览器,一格一格核对。

按右边的清单逐条查。凡是对不上的,记下来:它说的是什么、实际是什么、它为什么会这么说。

两个提醒。

第一,第三问的正确回答方式是反问你。 一个直接给出「等 12 个确认就安全了」的模型,是在套模板。正确的答案必须包含:这笔金额值得别人花多少钱来推翻、这条链此刻的安全预算有多大、你能不能承受最坏情况。

第二个提醒和内容无关,但更重要。 交易哈希和地址都是公开信息,贴给模型本身没有风险。但不要把你所有地址一次性贴给它——那等于主动把自己的完整资产分布交给一个第三方服务。第 23 章会讲清楚,把几个地址关联起来能推断出多少东西。

测试网地址随便贴。主网地址,按上面这条办。

AI 说完之后,你必须自己验证

  • 状态字段:它有没有把「被打包」和「执行成功」当成一回事。这两者在浏览器上是两个不同的标记,混为一谈的直接判错
  • 手续费:它算的实际花费,和浏览器上显示的数字是否一致;它有没有说清「预算」和「实际消耗」是两个不同的字段
  • 编号:它有没有解释清楚同一地址的交易必须按编号顺序生效,以及卡住时该怎么办
  • 时间戳:它说的是区块的时间,还是你发起的时间。这两者能差很多,而它经常不区分
  • 确认数:它有没有给出一个「万能确认数」。给了就追问依据——正确的回答必须和金额、和这条链的具体情况挂钩
  • 最终性:它有没有说清这条链属于概率型还是确定型。答不上来的,说明它在套模板
  • 凡是它写的具体数字(区块时间、费率、确认时长),逐个到浏览器上对,对不上的标出来

真实案例

被推翻的已确认交易2020 年前后,多次

一条采用工作量证明的小型公链,在几个月里连续发生深度重组:攻击者掌握了足够算力,把已经确认了几十个区块的历史推翻,实现了双花。

这件事对本章的意义非常直接:那些交易当时在浏览器上全都显示「已确认」,确认数还不少。

事后多家交易平台大幅提高了该资产的充值确认数要求。这个动作本身说明了一切:确认数不是一个技术常数,是一个根据安全预算动态调整的风险参数。

第 4 章讲过它的经济逻辑:推翻这条链要花多少钱,推翻它能赚多少钱。两个数字的差额,决定了你该等几个确认。

筐堆满的时候多条链上,反复发生

在链上出现热门事件时——大规模的资产发行、清算集中触发、某个应用突然爆火——待处理池会在几分钟内堆满。

后果是连锁的。手续费被竞价推到平时的几十倍;出价不够的交易挂上几个小时甚至几天;而最要命的是,有些操作本身对时间敏感——比如需要在价格跌破某条线之前补充抵押。交易挂在筐里,清算却不会等你。

这解释了本章的一个核心结论:待处理池不是一个排队大厅,是一个实时竞价市场。 你付的不是「手续费」,是在买一个有限资源的优先级。

第 7 章整章都在讲这个市场,第 16 章会讲清算为什么不等人。

别人能看见你还没生效的交易持续发生

待处理池公开这件事,催生了一整个产业。

典型形态:你发出一笔会显著推高某个价格的交易,它在筐里被人看到。对方抢在你前面买入,等你的交易把价格推上去,再立刻卖出。你实际成交的价格比预期差,这个差额进了他的口袋。

整个过程里没有任何一步违反了规则。他没有拿到你的私钥,没有伪造你的签名,没有攻击任何系统——他只是比你先知道了你要做什么,并且有权决定顺序。

这件事把第 2 章那个问题重新提了出来,只是换了一副面孔:谁有权决定账本上这一页的顺序,谁就掌握着一种可以变现的权力。 第 18 章和第 24 章会完整展开,这里只需要记住:你的交易在生效之前是公开的。

改一个变量

如果待处理池变成保密的,谁也看不见还没生效的交易

抢跑和夹击立刻失去了信息基础,普通用户的实际成交会变好。

但三个新问题跟着来了。第一,节点怎么互相同步? 交易必须被传播才能被打包,完全保密和必须传播是矛盾的,只能靠加密和分阶段揭示来折中。

第二,谁来保证提交的内容是真的? 一笔加密的交易被打包之后才解密,如果解密出来是无效的,这个区块空间已经浪费了。

第三,也是最微妙的:保密给了谁特权? 如果排序权交给一个看得见明文的专门角色,你只是把这项权力从「所有人都能看」变成了「只有一个人能看」——那正是第 2 章的老王。

这个方向是当前一个非常活跃的工程领域,各种方案都在这三个问题之间找平衡点。第 18 章会介绍思路。

如果出块时间缩短到不到一秒

确认速度大幅提升,体验接近传统支付。这是很多链在做的事,方向本身没有问题。

代价在第 4 章讲过一次:单个确认的含金量下降了。 区块间隔和网络传播时间接近时,短暂分叉变成常态,你可能要等几十个确认才相当于原来几个的安全性。

还有一个更现实的代价:跑节点的门槛上升。 出块越快,节点要处理的数据越多、带宽要求越高、追上最新状态越难。能独立验证的人越少,第 3 章那把尺子上你的位置就越往左——你对这条链的信任,又有一部分变回了「听别人说」。

速度不是免费的,它的成本通常记在"谁还能自己验证"这一栏。 第 8 章会把这笔账算完。

如果手续费固定不变,不再竞价

所有人都能预测成本,体验确定性大幅提升,也不会再出现天价手续费。

但固定价格解决不了拥堵,只是把排队方式换掉。需求超过供给时,总得有一种机制决定谁先。 不按价格排,就得按时间排(先到先得,于是变成拼网络速度)、按随机排(于是有人刷大量交易提高中签率),或者按某个人的意志排(回到老王)。

更深一层的问题:固定价格会让这个市场失去信号。 第 7 章会讲,手续费的波动本身是一条重要信息——它告诉你这条链此刻的真实需求有多强,也告诉验证者该不该扩容。

拥堵是需求的表现,不是 bug。 把价格摁死,拥堵不会消失,它只是换一种形式出现在别的地方。

如果交易被打包之后还能撤销

第 2 章讲过,可撤销性是现实金融的核心功能:转错账能追回,被骗能申诉,判决能执行。把它加回来,用户体验会好很多。

但你现在能推出完整的代价链了。能撤销,就意味着存在一个有权撤销的角色。 那个角色要么是某个机构,要么是一次投票——不管哪一种,第 2 章那张表的第三列又填满了。

而一旦「已确认」变得可以反悔,链上的一切组合都会松动。 一笔交易的结果被另一个应用当作输入用掉之后,撤销它意味着要连带撤销后面所有依赖它的操作。这不是加一个功能,是拆掉一个地基。

第 3 章那次 2016 年的事件,实质上就是一次人工撤销。它之所以引发那么大的争议并最终导致分裂,原因正在这里。

请注意这不意味着「不可撤销一定更好」。 它意味着:不可撤销是链上一切组合能力的前提,而你为这个前提付出的代价,就是转错地址之后没有客服可以找。第 9 章会讲这个前提换来了什么。

带走的问题

十八问里挑三问,用在这一章。

5
谁在支付?

这一章给出了一个很干净的答案:发起交易的人付,付给打包区块的人。

但要追问一层:他付的到底是什么? 不是「成功」——失败了也照付。他买的是网络的处理资源,以及一个排在前面的优先级。

这个区分在后面很多章里会反复出现。凡是看到"免费"「零手续费」的产品,就去找这笔成本被转嫁到了哪里——通常在价差里,在补贴里,或者在你看不见的排序权里。

10
激励是什么?

验证者为什么要收你的交易?因为有手续费。那他为什么按这个顺序排?

规则本身并没有要求他按手续费高低排序,他只是在最大化自己的收入。而当他发现「调整顺序」本身能赚更多钱时——比如在你的大额交易前后各插一笔——他会这么做,而且完全合规。

任何时候看到一个角色拥有未被明确约束的自由度,就去算这个自由度值多少钱。 这是分析任何协议时最有穿透力的一个动作,第 18 章会把它用到极致。

18
哪些决策必须保留 Human-in-the-loop?

这一章的七格里,签名那一格是天然属于人的

它是唯一一个「你还能说不」的时刻,也是唯一一个需要判断意图而不只是执行规则的时刻。前面六格和后面的一切,都可以自动化;唯独这一格,一旦交出去,就等于把资产的全部控制权交了出去——第 5 章讲过为什么。

所以判断任何一个自动化工具、脚本或者智能体,问题永远是同一个:它自己能不能完成签名这一格? 能,你就是在把第 5 章那把私章交给它;不能,风险等级立刻低一个量级。

这条线从这里一直延伸到第 34 章。 中间会出现很多精巧的设计,但它们都在做同一件事:在保留自动化效率的同时,不把这一格整个交出去。

本章自测

一句话带走

最终性不是一个瞬间,而是一个逐步增强的概率。

做完这一章的动手环节了?勾上它查看全部进度

本页目录