第 3 章 · 如果我们不相信记账的人怎么办
互不信任的人,怎样共同维护同一份状态?
- 练习的能力
- Mental ModelProtocol Literacy
- 动手
- 三个人用纸笔模拟一次记账:其中一人偷偷改账,看其他人靠什么发现。
- AI Lab
- 让 AI 设计一个「不需要信任记账员」的方案,再用双花、女巫、串谋三个场景逐个攻击它。
一个现实问题
一个二十来人的羽毛球群,每周约一次球。场地费、球钱,轮流有人垫付,大家事后转给他。
一开始小王主动把账记在群公告里,大家都挺满意。三个月后出了第一次分歧:小王说你还欠 180,你翻了半天转账记录,觉得自己只欠 120。
谁也没撒谎。可能是小王漏记了一笔,也可能是你把另一次转账记混了。群里吵了两天,最后各退一步,算 150。
这件事本身不值一提。但把它放大看,三个变量一动,性质就变了:
人数从 20 变成 200。 现在没有人能凭记忆核对,只能信公告里的数字。
金额从几百变成几十万。 现在小王少记一笔的收益,足以让人动心。
小王和你从认识变成不认识。 现在你连「他不至于坑我」这个判断都没有了。
于是问题浮出来了:当没有一个所有人都服气的记账人时,一群人怎么共同维护同一份记录?
注意这个问题的形状。它不是「找一个更诚实的人」,也不是「买一个更好的软件」。第 2 章已经说清楚了:现实世界里账本之所以可信,靠的是牌照、审计、监管和司法这一整套外部约束。这一章要问的是,如果这套约束不存在,还有没有别的办法。
思想实验
把村子搬进一个房间。
十个人,每人手里一个本子,没有记账员,没有村长。规则只有一条:你要转账,就站起来大喊一声,比如「我给 3 号转 5 枚」。房间里每个人听到之后,各自在自己本子上记一笔。
理论上,十个本子应该永远一模一样。实践中,麻烦一个接一个来。
第一个麻烦:有人没听清。 4 号刚才在打喷嚏,漏了一笔。半小时后大家发现本子对不上了,但没人说得清是谁的本子错了。
这个还好办:定期停下来互相核对,少数服从多数,按大多数人的版本修正。
第二个麻烦:有人冒充。 7 号压低嗓子喊了一声「我是 3 号,我给 7 号转 50 枚」。大家记了。3 号回来才发现自己少了 50。
这个也能办:每个人事先在墙上贴一个只有自己能复现的暗记,喊话时必须一起出示。喊话本身谁都能听,但这句话是不是本人说的,所有人都能当场验证。
第三个麻烦:有人在房间两头说了两句不同的话。
3 号一共只有 5 枚。他走到房间左边,对着 A、B、C 三个人喊「我给 A 转 5 枚」;同时他的同伴走到右边,对着 D、E、F 喊「我给 F 转 5 枚」。
两句话都带着 3 号的真暗记,两句话单独看都完全合法。左边三个人的本子上,5 枚归了 A;右边三个人的本子上,5 枚归了 F。
这次核对时出现的不是「谁记错了」,而是两个都说得通的版本。少数服从多数也失灵了,因为两边人数一样。
第四个麻烦:人数可以伪造。
有人提议按人数多数决。9 号立刻发现了一件事:他可以戴上不同的帽子,一个人扮演二十个人。房间里没有人能验证「你到底是不是一个新的人」,只能看到又多了一顶帽子。
多数决的前提是「一人一票」,而这个房间里根本没法确认一个人只有一个身份。
到这里,四个麻烦里只有前两个被解决了。停下来想一想:第三个和第四个麻烦,你会怎么办?
你来决定
房间里现在有三份互不相同的本子。大家要定一条规则:按什么标准决定哪一份算数。
观察结果
四条规则看起来在争论不同的事,其实都在解决同一组问题。把一群互不信任的人要共同维护一份记录这件事拆开,只有四层:
| 层 | 它在回答 | 这一层失守会怎样 |
|---|---|---|
| 身份 | 这句话是谁说的 | 任何人都能冒充任何人 |
| 有效性 | 这句话符不符合规则 | 有人能凭空创造余额 |
| 顺序 | 这些话按什么次序生效 | 同一笔钱能被花两次 |
| 终局 | 从哪一刻起不能再改 | 收到的钱随时可能消失 |
前两层是验证:每个人各自就能完成,不需要问任何人的意见。给转账加暗记、检查余额够不够,这些事你在自己的本子上就能做完,得出的结论和别人一模一样。
后两层不是。顺序和终局没有客观答案,只有共同认定。 3 号的两句话没有哪一句在物理上更「先」,是这个房间必须选一句。
这一点值得单独停一下,因为它是整门课最容易被误解的地方:
让一群互不信任的人维护同一份记录,难的不是存数据,是排顺序。
一个普通数据库每秒能处理几万笔写入,快得多,也可靠得多。但它的高效建立在一个前提上:只有一个写入者,而且这个写入者不会撒谎。 顺序问题根本不存在,因为只有一个人在排。
一旦这个前提去掉,吞吐量就不再是主要矛盾了。第三个麻烦里 3 号那两句话,每秒能处理一百万笔的数据库同样无能为力,因为它不知道该选哪一句——这是个立场问题,不是性能问题。
所以,如果一个系统本来就有一个所有人都接受的管理员,它不需要这一章里的任何东西。 直接用数据库,更快更省。这句话请记牢,它是你日后判断「这个项目为什么需要区块链」时最锋利的一把刀。
建立模型
把四层画成一条链。任何一笔交易,都要从左走到右:
- 身份:这是谁说的
- 有效性:合不合规则
- 顺序:谁先谁后
- 终局:到此为止
第二个模型是一把尺子。任何号称「去中心化」的系统,都可以放在这条尺上量一量:你到底还在信任谁。
| 档位 | 你信任的是 | 出事的形态 |
|---|---|---|
| 信任一个人 | 那个记账人的品行和能力 | 他改账、他跑路、他出错 |
| 信任一个机构 | 牌照、审计、监管、司法 | 机构破产、监管失效、跨境无法追索 |
| 信任一组人 | 这组人不会串通,也不会同时被攻破 | 串通、被一起胁迫、名单被人操纵 |
| 信任规则加验证 | 规则写死在代码里,且你能自己验证 | 规则本身有漏洞,或你根本没去验证 |
这把尺子有两个容易被忽略的刻度。
第一,最右边那档不是「不需要信任」。 它是把信任从「某个人的善意」换成了「一套你能亲自检查的规则」。信任没有消失,它换了形态。所以这门课从第 1 章就在反复做同一件事:让你亲手去验证,而不是背结论。
第二,越往右不一定越好。 越往右,效率越低、成本越高、出错之后越没有补救。羽毛球群完全不需要走到最右边——找个大家都信的人记账,就是那个场景下的最优解。
最后一个模型,是关于「能容忍多少坏人」的。这里有一个非常大的差别:
- 如果参与者只会掉线或宕机,不会撒谎,容错门槛比较宽松。
- 如果参与者可能主动说谎、对不同的人说不同的话,门槛会陡然提高:这类系统通常要求作恶方掌握的比例低于三分之一或二分之一(具体数字取决于设计),才能保证所有诚实方最终看到同一份记录。
第二类才是这一章的处境。一个能处理宕机的系统,不一定能处理背叛。 这两件事的工程难度差了一个量级。
它叫什么
现在给前面的现象命名。
所有人共同维护的那份记录在某一刻的全貌:谁有多少、什么东西归谁。
房间里十个本子应该记着同一个状态。一笔交易的作用,就是把状态从一个版本推到下一个版本。
不依赖任何人的说法,自己独立检查一件事是否成立。
检查暗记对不对、余额够不够,都是验证。验证的结果和你信任谁无关,这是它和「听说」最根本的区别。
一条链的价值有一大半来自这里:每个人都可以自己跑一遍,不需要问任何权威。
在无法自己验证的地方,相信某个人或某个机构会按预期行事。
请注意这个定义的重点:凡是你能验证的,就不需要信任;凡是你没验证的,都是在信任。 很多人以为自己在用一个「无需信任」的系统,实际上只是把信任转移给了一个网页、一个数据面板或者一条推文。
让一群互不信任的参与者对「顺序」和「终局」达成一致的那套机制。
它做的不是「找出真相」,因为 3 号那两句话之间没有真相可言。它做的是让所有诚实的参与者最终选中同一句。
参与者不只是出错或掉线,而是主动说谎,甚至对不同的人说不同的话。
第三个麻烦就是它的标准形态。能容忍这种故障的系统叫拜占庭容错系统,公链都属于这一类。
名字来自 1982 年一篇论文里的比喻:几支围城的军队只能靠信使联络,其中可能有叛徒发出矛盾的命令,忠诚的将军们要如何统一行动。
一个人伪造出大量身份,操纵所有按「人数」或「票数」计算的规则。
第四个麻烦就是它。这是所有开放网络的根本难题:任何人都能自由加入,也就意味着任何人都能加入很多次。
解决它只有一条路:让每一个身份都对应某种无法凭空复制的东西。 第 4 章讲的是「算力」,后面会讲到「押上的资产」。
一笔交易从哪一刻起不会再被推翻。
在有些设计里,它是一个逐渐增强的概率——越往后越安全,但永远不是绝对的零风险。在另一些设计里,它是一个明确的时刻——某一轮之后就被锁死。
这两种最终性的区别,是理解不同链之间差异的关键,第 6 章会完整拆开它。
收成一句话:
共识机制不是一种数据库技术,是一套在没有管理员的前提下决定「谁先谁后、到此为止」的规则。
判断任何一条链的起点:去掉它,这件事还能做吗? 如果能,它就不需要链。
动手
这个 Lab 不用电脑。找两个朋友,二十分钟,但它会让这一章从「听懂了」变成「手上有感觉」。
准备。 三个人各拿一张纸,在纸上抄同一份起始状态:
A:10
B:10
C:10约定规则:任何人要转账,就大声说出来,另外两个人各自在自己纸上改。只能口头说,不能看别人的纸。
正常跑五轮。 随便转,比如「A 给 B 转 3」「C 给 A 转 5」。五轮之后停下,三张纸摊开对照。
大概率是一致的。如果不一致,先找出是谁在哪一轮记错了——注意你们是靠什么找出来的,这个过程本身就是答案的一部分。
加入一个作弊者。 指定 C 为作弊者,另外两个人不知道具体手法。C 在某一轮之后,趁人不注意把自己纸上的数字改大 5。
继续跑五轮,再摊开对照。
现在回答:A 和 B 是靠什么发现 C 那张纸不对的? 是靠对照数量,还是靠回溯历史?如果只对照最终数字,能不能确定是 C 改了,而不是 A 和 B 一起记错了?
做最关键的一次实验:让 B 同时对 A 和 C 说两句话。
B 只有 4 枚。他先转身对 A 说「我给 A 转 4」,再转身对 C 说「我给 C 转 4」。两句话都是 B 本人说的,都不超过余额。
现在 A 的纸和 C 的纸对不上,而且谁也没有记错。
三个人一起讨论五分钟:用什么办法能判定哪一句算数?你们会发现任何方案都要先回答同一个问题——谁有资格宣布顺序。
记下你们最后想出的方案,以及它的漏洞。
这张纸请留着。第 4 章你会看到 2008 年有人给出的那个答案,然后可以回来对比:你们想到的方案,和它差在哪里。
AI Lab
分两步走,第二步才是重点。
第一步,让它设计:
设计一套记账方案,要求:参与者可以自由加入和退出,
彼此互不信任,其中任何人都可能说谎,也可能对不同的人说不同的话。
不允许存在任何一个所有人都必须信任的角色。
请写清楚四件事:
1. 一笔转账如何被确认是本人发出的
2. 一笔转账如何被判定有效
3. 互相冲突的两笔转账,按什么规则决定哪一笔生效
4. 一笔转账从哪一刻起不会再被推翻
不要使用「区块链」「共识算法」这些词,用机制本身的描述来回答。第二步,逐个攻击它。 把它的方案原样贴回去,一次只问一个场景:
场景一(双花):某人只有 5 枚,同时向网络的两半各发出一笔 5 枚的转账,
两笔都带合法签名。你的方案里,哪一笔生效?谁来决定?在多久之内决定?
场景二(女巫):某人伪造一万个身份加入网络。
你的方案里,哪一个环节会因此失效?伪造一个身份的成本是什么?
场景三(串谋):参与者中有一部分私下联合起来,一致对外说谎。
你的方案最多能容忍多大比例?超过这个比例会发生什么?
这个比例是怎么算出来的?大多数模型会在第一轮给出一个看起来很完整的方案,然后在场景一或场景二上露馅——最常见的破绽是它悄悄引入了一个中心角色:一个负责排序的节点、一个时间戳服务,或者一个「可信的引导节点」。
找到这个角色,就找到了整个方案真正的信任所在。
把你的三轮攻击和它的回应记下来。这份记录会是你阶段作品里最有分量的一页:它证明你不是记住了共识机制的定义,而是知道它要挡住什么。
AI 说完之后,你必须自己验证
- 双花场景:它的方案有没有真正回答「两句都合法的话,按什么选一句」,还是只说了「网络会拒绝无效交易」——后者是答非所问
- 女巫场景:它有没有依赖「多数节点」「多数投票」,却没说清一个身份的成本是什么。没有成本的身份数量不构成安全性
- 串谋场景:它给出的容忍上限(比如三分之一或二分之一)是它自己推导的,还是套用的现成结论,这个上限对应的是哪一种故障模型
- 它有没有偷偷引入一个中心角色:协调者、排序器、时间戳服务、可信引导节点,都算
- 它讲最终性时,用的是「概率逐渐增强」还是「某一轮之后锁死」,有没有说清自己属于哪一种
- 凡是它写的具体门槛与数字,问它依据是什么;答不出来的,标记为未验证
真实案例
几支军队围着一座城,只能靠信使互相传令,必须统一行动——要么一起进攻,要么一起撤退。麻烦在于将军里可能有叛徒,会对不同的人发出相反的命令。
这篇论文的贡献不是解决了它,而是把「参与者可能主动说谎」变成了一个可以严格讨论的数学问题,并给出了诚实方能达成一致所需要的比例条件。
在此之前,分布式系统主要考虑的是「某台机器坏了」。在此之后,「某台机器在骗你」成了一个必须单独对待的假设。今天所有公链的安全论证,都站在这个假设上。
那十年里出现过多次数字现金尝试,有些在技术上相当精巧,甚至已经解决了匿名支付和防伪造的问题。
它们有一个共同的结构特征:必须有一个中心机构负责发行和清算,也正是这个机构在防止同一笔钱被花两次。
结果也就注定了:公司停止运营,系统随之消失,用户手里的余额同时归零。这不是技术失败,是结构使然——它们解决了验证,没有解决「谁来排顺序」这一层,只好交给一家公司。
这段历史是理解下一章的必要前提:Bitcoin 要解决的,正是这些方案绕开的那一层。
以太坊上一个持有大量资金的合约被人利用漏洞持续提走资产。社区经过激烈辩论后,通过修改客户端软件的方式让链回退到攻击之前的状态,资金得以追回。
一部分参与者拒绝接受这次修改,继续运行原来的规则,链从此分成了两条,各自延续至今。
这件事在本章模型里的位置很清楚:一条链的「不可篡改」从来不是物理定律,而是「足够多的人继续运行同一套规则」这个事实。 当足够多的人决定改,它就能改;而不同意的人可以带着旧规则走自己的路。
这既是去中心化系统最脆弱的地方,也是它最本质的地方。第 24 章会回到这次事件的另一面。
改一个变量
门槛立刻降低一大截。现在只需要处理「消息丢了、有人没听见」,不需要处理「有人对不同的人说不同的话」。
这类系统在工程上成熟得多,也快得多——绝大多数互联网公司的数据库集群跑的就是这一类。
这也解释了为什么「区块链比数据库慢」这个说法没有意义。 它们处理的不是同一个问题:一个假设参与者只会坏掉,另一个假设参与者会骗你。
女巫攻击基本消失了——多冒出来一个人会立刻被发现。多数决重新变得可用,速度可以快很多。
代价是:这四个人一旦串通,或者被同一个外部压力同时施加影响,整个系统就失守了。而且**「谁能进这个房间」本身变成了一项需要有人掌握的权力**。
这就是联盟链的结构。它在很多企业场景里是合适的选择,但要诚实地承认它换掉了什么:它用「我们互相认识」换取效率,而这正是公链刻意不要的那个前提。
这一条看起来很笨,但它精确地击中了女巫攻击:蜡烛是真实消耗的,二十顶帽子不能变出二十根蜡烛。
副作用有三个。第一,正常用户也要烧蜡烛,成本转嫁给了所有人。第二,蜡烛多的人话语权大,财富和影响力开始挂钩。第三,蜡烛可以租——攻击者不需要拥有资源,只需要暂时租用它。
这三个副作用会原封不动地出现在下一章,只是蜡烛换成了电力。
这是四个变量里最反直觉、也最重要的一个。
前面所有方案都在追求「立刻判定」。但如果允许等待,问题会变得简单得多:暂时冲突的两个版本先各自存在,等后续记录不断累积,被抛弃的那个版本就越来越不可能翻盘。
这等于用时间换确定性。 你不再需要在第 0 秒给出百分之百正确的答案,只需要让「错误答案存活下去」变得越来越贵。
代价是,「到底算不算数」从一个是非题变成了一条曲线。第 6 章整章都在讲这条曲线长什么样,以及在什么场合你可以只等一半。
带走的问题
从十八问里挑三问,用在这一章。
这是本章直接回答的那一问,而且答案是一把双刃刀。
判断标准只有一条:这件事里有没有一个所有参与方都愿意接受的管理员。 有,就用数据库,更快更便宜。没有——因为跨国、因为互为竞争对手、因为参与者是陌生人——才轮到共识机制上场。
以后看到任何一个项目,先做这个测试。大多数「区块链 + 某行业」的方案过不了这一关,因为它们的场景里本来就存在一个所有人都接受的中心方。
共识不是免费的。烧掉的蜡烛、跑节点的电费和带宽、等待带来的时间成本,全都是真实支出。
所以要追问:这笔钱由谁支付? 是用户的手续费,是协议的增发,还是某个早期投资人在补贴?三种答案指向三种完全不同的可持续性。第 7 章会把这笔账算清楚。
这一问在这一章有一个特别具体的含义。
在很多设计里,维护共识的人是被代币奖励的,而保证安全所需的成本也是用代币计价的。如果代币价格大幅下跌,攻击这条链的成本会同步下跌,而攻击的收益不一定跟着跌。
所以「代币归零,产品还能不能运行」对一条公链来说不是一个财务问题,是一个安全问题。小链上的真实攻击事件几乎都能追溯到这里,第 4 章会给出具体案例。
本章自测
因为性能的前提不一样。普通数据库很快,是因为只有一个写入者,而且默认这个写入者不撒谎——在这个前提下,顺序问题根本不存在。
区块链面对的是另一个问题:一群互不信任、可能主动说谎的参与者,如何对「谁先谁后」达成一致。 这个问题里没有客观答案可查,只能靠共同认定,所以再快的数据库也答不上来。
推论也很重要:如果你的场景里本来就有一个所有人都接受的管理员,不要用链。
凡是你能自己独立检查出结论的,是验证;凡是你只能接受别人说法的,是信任。
签名对不对、余额够不够、规则有没有被遵守,这些都能自己验证,结论和你信任谁无关。
但要注意一件事:能验证不等于验证过。 大多数人看的是一个网页、一个数据面板、一条推文——那些是信任,不是验证。这门课每一章都有动手环节,就是为了把这条线往验证那边推一点。
因为要验证「你是一个独立的人」,就必须有一个能发身份、能判真假的权威。而一旦引入这个权威,你就回到了第 2 章:这个权威本身成了所有人必须信任的对象,而且它有权决定谁能参与。
开放网络里唯一的出路是换一条路:不去确认身份的真假,而是让每一个身份都对应某种无法凭空复制的东西——花掉的算力、押上的资产、消耗掉的真实资源。
伪造一万个身份很容易,伪造一万份真实成本不容易。
一种是概率型:一笔交易后面累积的记录越多,被推翻的可能性越小,但永远不严格等于零。
另一种是确定型:到某一轮结束时,这一批记录被明确锁死,之后不可能回退,除非系统的安全假设被突破。
这个区别有很实际的后果:同样是「已确认」,两种链上的含义完全不同,你该等多久也完全不同。第 6 章会讲你在什么场合可以少等,第 8 章会讲不同的链为什么做出了不同的选择。
没有标准答案,但检查三件事。
第一,这个群里有没有一个所有人都接受的记账人? 如果有,方案已经存在,不需要换。
第二,如果没有,是因为不信任,还是因为对账麻烦? 如果只是对账麻烦,你需要的是一个共享表格,不是共识机制。
第三,金额和人数是多少? 共识机制的成本是实打实的。为了几百块钱的场地费引入一套复杂系统,是典型的过度工程。
能说出「这里不需要链」,和能说出「这里需要链」同样重要。 第 25 章会把这个判断做成一套三十分钟的流程。
一句话带走
Blockchain 要解决的不是数据库性能,而是没有管理员的状态维护。