对于分叉的再详解

Unknown view 31 2016-2-14 02:17
share to
Scan QR code with WeChat

大多数人对分叉是没有明确的概念的,只是听说和想象。其实就算我在比特币行业呆了5年了,也不敢说彻底搞清楚了。看似一个简单的概念,里面涉及的逻辑关系相当复杂,在这里我再重新理一下思路

什么是分叉?

首先重温下比特币的基本工作原理,前一阵那个账簿的例子非常好,借用一下

矿工挖矿就是大家抢着算一道题,谁先算出来谁就获得记账权,并在一页新的记账纸上记入第一笔交易,给自己的地址发25个币,然后把十分钟内网络上传播的其他交易都依次写到这页记账纸(区块)上,然后通过传真发给大家,大家都收到这页纸以后,用规则验证,合格后钉到每个人的账簿上(区块链)成为最新的一页

每一页记账纸必须遵循一定的规则,比如说矿工不能收入超过25个币,总共不能超过一千行等等。这些规则由各人手中的规章制度(客户端)来保证。不符合这些要求的记账纸就被扔掉了,不会被钉到账簿里去,只要大家都运行同样的客户端,有同样的规则,那么所有人手里的账簿就基本都是一样的

为什么说“基本”?因为网络上信息的传输需要被一个个节点不断转发,转发需要时间,在不同的地方就会有不同的“真相”,这就引出了分叉的概念

规则相同时的分叉 - 孤立块

当矿工甲算出了答案,写了一页记账单A,并广播到网络中,几乎同时在离他很远处的另一个矿工乙也算出了符合要求的答案(符合要求的答案不止一个),写了一页记帐单B,向网络中发送。这时因为发送信息需要时间,靠甲近的人,账簿最新的一页就是甲的记账单A,而靠乙近的人的账簿最新一页就是乙的记账单B

这个时候,比特币网络就已经分叉了,因为对两部分人来说,有着不同的账簿,也即不同的真相,分叉就是说网络的各个部分传播着不同的真相。但这种分叉是暂时的,因为大家在钉账簿的时候,有一条规则是只认最多页数的账簿(最长的链),迟早有一个链会变成最长的

如果靠甲近的那一侧的人过一会儿又算出了一道题,并添加了一页新的记账单C,而靠乙近这一侧的人没有同时再解出一道题,那么不到1分钟甲那边两个新的记账单A和C就都发到乙这一侧来了,这时候乙这一侧所有的人就都会认同甲那一侧的记账单(因为比乙这一侧的多),从而把乙这一侧的记账单B从他们原有的账簿上撕掉,而把AC两张记账单装订进账簿,在AC的基础上继续添加记账单。这就是孤立块,乙那道题白算了,他写的记账单B被孤立了而无效,他只能在AC的基础上继续添加记账单

这种分叉偶尔会出现,但最终会以撕掉某张记账单而统一起来,所有人最终仍然持有一样的账簿。这就是说,如果大家的客户端规则都相同,那么分叉仅仅会导致孤立块,最终会消失

通常比特币网络中,经常存在多种不同版本的客户端,当甲和乙使用的客户端不同,也即甲和乙验证账簿的规则不同时,发生的情况就复杂的多了,又根据新规则的不同而产生不同的后果

规则不同时的分叉 -  硬分叉 和 软分叉

硬分叉是指原来的规则被放宽了

继续之前的AC账簿。比方说记账单原来最多可以记录1000笔交易,但现在甲和他的朋友们升级了软件,使用了一套新规则,最多可以记录2000笔交易。这时甲算出了一道题获得记账权,他写了一页新记账单D,里面有1200笔交易,并发送给其他人。甲的朋友们因为都升级了新客户端,都接受这张记账单,并在这个基础上继续添加新的记账单,他们的账簿都是ACD

但乙和他的朋友们仍然运行着老的软件,认为这个记账单记录了超过1000笔交易,是无效的,所以他们就扔掉这张而继续在原来的基础上添加记账单,写了一个记账单E,里面有800笔交易,他的账簿是ACE

表面上看起来这个分叉和之前一样,也是两边有着不同的真相,那是否随着甲再次胜出,乙的E记账单会被孤立呢?

假设分叉后甲那边算力强,又算出一笔记账单F,包含500笔交易,于是甲一侧就成了ACDF,然后发到乙这一侧。乙这一侧一看,甲那边的账簿页数多,应该转过去。但仔细一看,里面的D含有1200笔交易,按乙的规则来说是非法的,所以乙仍然拒绝F记账单,在自己ACD的基础上算下一个账单G。自此,甲那一侧的账簿因为包含了一个对乙来说非法的页,此后甲挖的块就永远不会被乙一侧承认了,网络就永远分叉了

假设分叉后乙这边算力强,先算出一笔记账单G,包含500笔交易,于是乙一侧就成了ACEG,然后发到甲那一侧。而甲一侧的账簿此时只有ACD,乙这边的账簿页数多,应该转过去,仔细一看,里面的E和G都是符合自己的新规则的,含有不到2000笔交易,因此甲一侧就撕掉了自己的D记账单,改为在ACEG的基础上挖矿

可见,对于一个规则放宽的变化(也即硬分叉)来说,如果升级方有大多数算力支持,结果就是分为两个互不兼容的链各自延长。而如果升级方没有大多数算力支持,结果就是挖出来的每个不符合原来规则的块都被孤立掉了,不会产生两条链

软分叉则是指原来的规则被收紧了

回到之前的AC账簿。比方说记账单原来最多可以记录1000笔交易,但现在甲和他的朋友们升级了软件,使用了一套新规则,最多只能记录500笔交易。这时乙算出了一道题获得记账权,他写了一页新记账单D,里面有400笔交易,并发送给其他人。甲的朋友们因为都升级了新客户端,都接受这张记账单,并在这个基础上继续添加新的记账单,他们的账簿都是ACD

乙和他的朋友们因为这个记账单里记录了小于1000笔交易,也是有效的,所以他们就装订这张记账单,并在ACD的基础上添加记账单,两侧一致

随后乙一侧成功写了一个800笔交易的记账单E,发送到网络中,这时甲一侧一看,E是不符合自己要求的,就扔掉了,仍然在ACD基础上添加下一个记账单F。网络分叉了,甲一侧是ACDF,乙一侧是ACDE

假设分叉后甲那边算力强,又算出一笔记账单G,包含500笔交易,于是甲一侧就成了ACDFG,然后发到乙这一侧。乙这一侧一看,甲那边的账簿页数多,而且都符合要求,就把自己的记账单E撕掉了,账簿改为ACDFG。

假设分叉后乙这边算力强,先算出一笔记账单H,包含400笔交易,于是乙一侧就成了ACDEH,然后发到甲那一侧。而甲一侧的账簿此时是ACDF,乙这边的账簿页数多,应该转过去,但仔细一看,里面的E是不符合自己的新规则的,含有超过500笔交易,因此甲那侧就拒绝接受记账单H,继续在ACDF的基础上挖矿

可见,对于一个规则收紧的变化(也即软分叉)来说,如果升级方算力强,则算力较少的一方所挖的块会被孤立,而不会导致产生两个链;如果升级方只有少数算力,网络就会分为两个互不兼容的链各自延长

这里只是说了两个最简单的规则放宽和规则收紧的情况,还有其他更复杂的情况暂不分析。因为规则放宽(硬分叉)和规则收紧(软分叉)都可能在某种条件下产生互不兼容的链各自延长,所以还不如不要谈这两个容易引起误解的定义,而直接讨论互不兼容的链在哪些情况下是危险的

看了这个分析就会明白7月4号那次互不兼容的链正是通过软分叉触发的,因为软分叉升级方以为自己有多数算力,但实际上因为SPV挖矿导致只有少数算力,结果占有大多数算力的未升级方产生了互不兼容的链。但那次事故并没产生很大危险,因为网络的共识是在升级一方的。发现事故后,算力主动切换到升级一方去就让那个不兼容的链自己死掉了(没有足够算力支持的链能挖出一个块的时间恐怕要以年计)

可见最关键的还是在于共识,只要网络有共识,就算出现互不兼容的链,也不会有什么大问题。其实算上其他各种情形,网络上会突然出现不兼容的两条链的可能太多了,在这种情况下都是依靠多数人的共识来决定矿池算力会最终支持哪个链,而不是软分叉或硬分叉之类定义,归根到底是人在做决策

btcfans公众号

Scan QR code with WeChat

From the Internet
Disclaimer:

Previous: SEC要求缺席判决的GAW Miners赔偿1000万美元 Next: 为何比特币和区块链仅处于起步阶段

Related