当两个人同时写同一页
想象一间全球新闻编辑室,成千上万的记者共用一本日志,但他们之间的消息以光速传递——很快,却从来不是瞬时的。大多数时候,一位记者写完下一页,其余所有人照抄下来。可每隔一阵子,地球两端的两位记者会在几乎同一秒写完一页有效内容,而彼此都还没听说对方。这下日志就短暂地有了两个一样好的下一页。这种分裂叫做分叉,在一条繁忙的链上,它自然而然、时时刻刻都在发生。
没有裁判来挑出那一页「真正的」内容。取而代之,网络依靠它的共识机制,以及我们之前见过的一条机械规则:在累积工作量最多的分支上继续构建——实际操作中,就是更长的那条链。下一个区块落在哪一边,分叉就在那一刻自己化解。
一次临时分叉,如何收场
我们来看一次完整的过程。区块 1 到 4 是所有人都认可的。然后矿工爱子和阿本几乎在同一瞬间各自找到了一个有效的区块 5。一半网络先听到爱子的区块 5A,另一半先听到阿本的 5B。两条分支此刻并存。当某个矿工找到区块 6 时,平局就被打破——比方说它建在爱子那一边。那条分支现在更长,于是所有人都切换过去,阿本的 5B 被丢弃:
... -> [3] -> [4] -> [5A] -> [6] <- longer: everyone keeps this
\
[5B] <- orphaned: dropped
step 1: 4 agreed, then 5A and 5B appear at once (a fork)
step 2: block 6 builds on 5A (one side grows)
step 3: 5A,6 chain is longer -> network adopts it (fork resolved)软分叉与硬分叉:改变规则
上面那次分裂是偶然的——两个矿工,同一套规则。但人们有时想要改变规则本身:加个功能、修个缺陷、调个上限。那是另一种分叉,根据旧软件还能不能跟得上,分成两类。
软分叉只收紧规则——它让一些原本允许的区块不再算数。没升级的节点仍然把新区块看作有效,因为凡是新的、更严格的规则所接受的,在旧规则下本来就可以接受。新旧留在同一条链上;这种升级是向后兼容的。
硬分叉放宽或改写规则——它让旧软件本会拒绝的区块突然变得有效。如今升级过和没升级的节点彻底各执一词,链可能永久分裂成两种币,共享一段过去、各走各的将来。硬分叉只有在几乎所有人一起升级时才会平稳。
最终性:当过去化为石头
如果分叉能重排链的最顶端,那么一笔交易到底什么时候算真正*完成*?那种「永远定下来」的性质,叫做最终性。在基于工作量的链上,最终性是概率性的:一个区块刚被挖出来时,它仍可能被重组,但每叠上一个新区块,要逆转它的代价就指数级地变贵。等过了几个确认数,逆转的几率就缩向零;再多叠几个,这个区块出于一切实际目的就被当作永久的。
一些较新的设计转而提供绝对最终性:由一组验证者明确投票将某个区块定为最终,此后若不付出巨大的、自我毁灭式的惩罚,就再也无法撤销。无论哪种方式,一个区块被埋得越深,就越接近石头。这也是为什么哪怕有一部分参与者掉线、变慢,或在主动撒谎,链仍能照常运转——工程师把这种韧性称作拜占庭容错,即在部分参与者行为不轨时仍能达成一致的能力。
51% 攻击:能做什么,不能做什么
整套「最长链获胜」的规则都建立在一个假设上:诚实的参与者掌握着大部分算力。那么,如果某个攻击者单独掌握了超过一半呢?这就是著名的 51% 攻击。有了多数,攻击者就能持续跑赢所有人,随心所欲地构建最长链。听起来像是完全掌控了局面——可它的能力其实很窄、很具体,远比人们担心的要小。
攻击者能做的,全都集中在链的顶端附近:通过暗中构建一条更长的链、然后亮出来,逆转他*自己*近期的交易——这就是双花(先付钱给商家,等货发出后再抹掉这笔付款)。他们还可以选择排除或拖延别人的交易,只要还握着多数,就能一直审查它们。
而攻击者不能做的,无论握有多少算力:从不归他控制的钱包里偷币(那需要每位持有者的私钥,再多的哈希运算也变不出来);花别人的钱(交易仍然需要一个有效的签名);凭空铸币或给自己发更大的奖励(每个节点都会拒绝违反发行规则的区块);或者改写远古历史,因为要比世界其余所有人更快地重挖成千上万个深层区块,哪怕坐拥多数也远远做不到。51% 攻击擦伤的是*近期的*顶端;它无法熔掉地基的岩床。
所以一旦把话说精确,这幅图景其实让人安心。分叉是网络能自愈的正常心跳;规则变动以软分叉或硬分叉的形式协商;而深度买来的最终性,哪怕是多数攻击者也无法在表层之下把它解开。有了这一层理解,你明白的就不只是区块链*是*安全的,而是它的安全究竟从*哪里*开始、到*哪里*为止。