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

第 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. 身份:这是谁说的
  2. 有效性:合不合规则
  3. 顺序:谁先谁后
  4. 终局:到此为止
前两层每个人自己就能查完,后两层必须整个网络共同认定。区块链的全部难度都在右边两格。

第二个模型是一把尺子。任何号称「去中心化」的系统,都可以放在这条尺上量一量:你到底还在信任谁。

档位你信任的是出事的形态
信任一个人那个记账人的品行和能力他改账、他跑路、他出错
信任一个机构牌照、审计、监管、司法机构破产、监管失效、跨境无法追索
信任一组人这组人不会串通,也不会同时被攻破串通、被一起胁迫、名单被人操纵
信任规则加验证规则写死在代码里,且你能自己验证规则本身有漏洞,或你根本没去验证

这把尺子有两个容易被忽略的刻度。

第一,最右边那档不是「不需要信任」。 它是把信任从「某个人的善意」换成了「一套你能亲自检查的规则」。信任没有消失,它换了形态。所以这门课从第 1 章就在反复做同一件事:让你亲手去验证,而不是背结论。

第二,越往右不一定越好。 越往右,效率越低、成本越高、出错之后越没有补救。羽毛球群完全不需要走到最右边——找个大家都信的人记账,就是那个场景下的最优解。

最后一个模型,是关于「能容忍多少坏人」的。这里有一个非常大的差别:

  • 如果参与者只会掉线或宕机,不会撒谎,容错门槛比较宽松。
  • 如果参与者可能主动说谎、对不同的人说不同的话,门槛会陡然提高:这类系统通常要求作恶方掌握的比例低于三分之一或二分之一(具体数字取决于设计),才能保证所有诚实方最终看到同一份记录。

第二类才是这一章的处境。一个能处理宕机的系统,不一定能处理背叛。 这两件事的工程难度差了一个量级。

它叫什么

现在给前面的现象命名。

状态State

所有人共同维护的那份记录在某一刻的全貌:谁有多少、什么东西归谁。

房间里十个本子应该记着同一个状态。一笔交易的作用,就是把状态从一个版本推到下一个版本。

验证Verification

不依赖任何人的说法,自己独立检查一件事是否成立。

检查暗记对不对、余额够不够,都是验证。验证的结果和你信任谁无关,这是它和「听说」最根本的区别。

一条链的价值有一大半来自这里:每个人都可以自己跑一遍,不需要问任何权威。

信任Trust

在无法自己验证的地方,相信某个人或某个机构会按预期行事。

请注意这个定义的重点:凡是你能验证的,就不需要信任;凡是你没验证的,都是在信任。 很多人以为自己在用一个「无需信任」的系统,实际上只是把信任转移给了一个网页、一个数据面板或者一条推文。

共识Consensus

让一群互不信任的参与者对「顺序」和「终局」达成一致的那套机制。

它做的不是「找出真相」,因为 3 号那两句话之间没有真相可言。它做的是让所有诚实的参与者最终选中同一句。

拜占庭故障Byzantine Fault

参与者不只是出错或掉线,而是主动说谎,甚至对不同的人说不同的话。

第三个麻烦就是它的标准形态。能容忍这种故障的系统叫拜占庭容错系统,公链都属于这一类。

名字来自 1982 年一篇论文里的比喻:几支围城的军队只能靠信使联络,其中可能有叛徒发出矛盾的命令,忠诚的将军们要如何统一行动。

女巫攻击Sybil Attack

一个人伪造出大量身份,操纵所有按「人数」或「票数」计算的规则。

第四个麻烦就是它。这是所有开放网络的根本难题:任何人都能自由加入,也就意味着任何人都能加入很多次。

解决它只有一条路:让每一个身份都对应某种无法凭空复制的东西。 第 4 章讲的是「算力」,后面会讲到「押上的资产」。

最终性Finality

一笔交易从哪一刻起不会再被推翻。

在有些设计里,它是一个逐渐增强的概率——越往后越安全,但永远不是绝对的零风险。在另一些设计里,它是一个明确的时刻——某一轮之后就被锁死。

这两种最终性的区别,是理解不同链之间差异的关键,第 6 章会完整拆开它。

收成一句话:

共识机制不是一种数据库技术,是一套在没有管理员的前提下决定「谁先谁后、到此为止」的规则。

判断任何一条链的起点:去掉它,这件事还能做吗? 如果能,它就不需要链。

动手

动手三个人、三张纸,亲手制造一次记账分歧三个人,三张纸,一支笔0 元,不涉及任何真实资产

这个 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

AI Lab让 AI 设计一套不需要信任记账员的方案,你来攻破它Level 2 · AI Copilot

分两步走,第二步才是重点。

第一步,让它设计:

设计一套记账方案,要求:参与者可以自由加入和退出,
彼此互不信任,其中任何人都可能说谎,也可能对不同的人说不同的话。
不允许存在任何一个所有人都必须信任的角色。

请写清楚四件事:
1. 一笔转账如何被确认是本人发出的
2. 一笔转账如何被判定有效
3. 互相冲突的两笔转账,按什么规则决定哪一笔生效
4. 一笔转账从哪一刻起不会再被推翻

不要使用「区块链」「共识算法」这些词,用机制本身的描述来回答。

第二步,逐个攻击它。 把它的方案原样贴回去,一次只问一个场景:

场景一(双花):某人只有 5 枚,同时向网络的两半各发出一笔 5 枚的转账,
两笔都带合法签名。你的方案里,哪一笔生效?谁来决定?在多久之内决定?

场景二(女巫):某人伪造一万个身份加入网络。
你的方案里,哪一个环节会因此失效?伪造一个身份的成本是什么?

场景三(串谋):参与者中有一部分私下联合起来,一致对外说谎。
你的方案最多能容忍多大比例?超过这个比例会发生什么?
这个比例是怎么算出来的?

大多数模型会在第一轮给出一个看起来很完整的方案,然后在场景一或场景二上露馅——最常见的破绽是它悄悄引入了一个中心角色:一个负责排序的节点、一个时间戳服务,或者一个「可信的引导节点」。

找到这个角色,就找到了整个方案真正的信任所在。

把你的三轮攻击和它的回应记下来。这份记录会是你阶段作品里最有分量的一页:它证明你不是记住了共识机制的定义,而是知道它要挡住什么。

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

  • 双花场景:它的方案有没有真正回答「两句都合法的话,按什么选一句」,还是只说了「网络会拒绝无效交易」——后者是答非所问
  • 女巫场景:它有没有依赖「多数节点」「多数投票」,却没说清一个身份的成本是什么。没有成本的身份数量不构成安全性
  • 串谋场景:它给出的容忍上限(比如三分之一或二分之一)是它自己推导的,还是套用的现成结论,这个上限对应的是哪一种故障模型
  • 它有没有偷偷引入一个中心角色:协调者、排序器、时间戳服务、可信引导节点,都算
  • 它讲最终性时,用的是「概率逐渐增强」还是「某一轮之后锁死」,有没有说清自己属于哪一种
  • 凡是它写的具体门槛与数字,问它依据是什么;答不出来的,标记为未验证

真实案例

给「说谎」建模的那篇论文1982 年

几支军队围着一座城,只能靠信使互相传令,必须统一行动——要么一起进攻,要么一起撤退。麻烦在于将军里可能有叛徒,会对不同的人发出相反的命令。

这篇论文的贡献不是解决了它,而是把「参与者可能主动说谎」变成了一个可以严格讨论的数学问题,并给出了诚实方能达成一致所需要的比例条件。

在此之前,分布式系统主要考虑的是「某台机器坏了」。在此之后,「某台机器在骗你」成了一个必须单独对待的假设。今天所有公链的安全论证,都站在这个假设上。

靠公司存在的数字现金1990 年代多国

那十年里出现过多次数字现金尝试,有些在技术上相当精巧,甚至已经解决了匿名支付和防伪造的问题。

它们有一个共同的结构特征:必须有一个中心机构负责发行和清算,也正是这个机构在防止同一笔钱被花两次。

结果也就注定了:公司停止运营,系统随之消失,用户手里的余额同时归零。这不是技术失败,是结构使然——它们解决了验证,没有解决「谁来排顺序」这一层,只好交给一家公司。

这段历史是理解下一章的必要前提:Bitcoin 要解决的,正是这些方案绕开的那一层。

规则被改写的那一次2016 年

以太坊上一个持有大量资金的合约被人利用漏洞持续提走资产。社区经过激烈辩论后,通过修改客户端软件的方式让链回退到攻击之前的状态,资金得以追回。

一部分参与者拒绝接受这次修改,继续运行原来的规则,链从此分成了两条,各自延续至今。

这件事在本章模型里的位置很清楚:一条链的「不可篡改」从来不是物理定律,而是「足够多的人继续运行同一套规则」这个事实。 当足够多的人决定改,它就能改;而不同意的人可以带着旧规则走自己的路。

这既是去中心化系统最脆弱的地方,也是它最本质的地方。第 24 章会回到这次事件的另一面。

改一个变量

如果房间里的人都诚实,只是偶尔掉线

门槛立刻降低一大截。现在只需要处理「消息丢了、有人没听见」,不需要处理「有人对不同的人说不同的话」。

这类系统在工程上成熟得多,也快得多——绝大多数互联网公司的数据库集群跑的就是这一类。

这也解释了为什么「区块链比数据库慢」这个说法没有意义。 它们处理的不是同一个问题:一个假设参与者只会坏掉,另一个假设参与者会骗你。

如果房间只有四个人,而且互相都认识、都有现实身份

女巫攻击基本消失了——多冒出来一个人会立刻被发现。多数决重新变得可用,速度可以快很多。

代价是:这四个人一旦串通,或者被同一个外部压力同时施加影响,整个系统就失守了。而且**「谁能进这个房间」本身变成了一项需要有人掌握的权力**。

这就是联盟链的结构。它在很多企业场景里是合适的选择,但要诚实地承认它换掉了什么:它用「我们互相认识」换取效率,而这正是公链刻意不要的那个前提。

如果喊话必须先在众人面前烧掉一根蜡烛

这一条看起来很笨,但它精确地击中了女巫攻击:蜡烛是真实消耗的,二十顶帽子不能变出二十根蜡烛。

副作用有三个。第一,正常用户也要烧蜡烛,成本转嫁给了所有人。第二,蜡烛多的人话语权大,财富和影响力开始挂钩。第三,蜡烛可以租——攻击者不需要拥有资源,只需要暂时租用它

这三个副作用会原封不动地出现在下一章,只是蜡烛换成了电力。

如果允许大家「等一会儿再说这笔算数」

这是四个变量里最反直觉、也最重要的一个。

前面所有方案都在追求「立刻判定」。但如果允许等待,问题会变得简单得多:暂时冲突的两个版本先各自存在,等后续记录不断累积,被抛弃的那个版本就越来越不可能翻盘。

这等于用时间换确定性。 你不再需要在第 0 秒给出百分之百正确的答案,只需要让「错误答案存活下去」变得越来越贵。

代价是,「到底算不算数」从一个是非题变成了一条曲线。第 6 章整章都在讲这条曲线长什么样,以及在什么场合你可以只等一半。

带走的问题

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

2
为什么需要 Blockchain?

这是本章直接回答的那一问,而且答案是一把双刃刀。

判断标准只有一条:这件事里有没有一个所有参与方都愿意接受的管理员。 有,就用数据库,更快更便宜。没有——因为跨国、因为互为竞争对手、因为参与者是陌生人——才轮到共识机制上场。

以后看到任何一个项目,先做这个测试。大多数「区块链 + 某行业」的方案过不了这一关,因为它们的场景里本来就存在一个所有人都接受的中心方。

5
谁在支付?

共识不是免费的。烧掉的蜡烛、跑节点的电费和带宽、等待带来的时间成本,全都是真实支出。

所以要追问:这笔钱由谁支付? 是用户的手续费,是协议的增发,还是某个早期投资人在补贴?三种答案指向三种完全不同的可持续性。第 7 章会把这笔账算清楚。

11
如果 Token 价格归零,产品还能运行吗?

这一问在这一章有一个特别具体的含义。

在很多设计里,维护共识的人是被代币奖励的,而保证安全所需的成本也是用代币计价的。如果代币价格大幅下跌,攻击这条链的成本会同步下跌,而攻击的收益不一定跟着跌。

所以「代币归零,产品还能不能运行」对一条公链来说不是一个财务问题,是一个安全问题。小链上的真实攻击事件几乎都能追溯到这里,第 4 章会给出具体案例。

本章自测

一句话带走

Blockchain 要解决的不是数据库性能,而是没有管理员的状态维护。

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

本页目录