{"content":{"title":"比特币的另类视角（五）——关于扩容与分叉（上）","body":"本来想写比特币的未来的，但是最近扩容比较火，先说扩容好了——反正这个也是比特币的未来中必须得提的东西。\r\n\r\n最近，扩容这事比较火，咱们先说扩容。\r\n\r\n## **首先，什么是扩容？**\r\n\r\n扩容不是增发比特币，每次看到有人跟风拿这个黑比特币都很心塞。\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/709720743.jpg)\r\n\r\n其实，我每次看到别人黑比特币都心塞。不是因为比特币好，是因为都黑不到点上，一下就被反驳回去了。\r\n\r\n扩容是指增加交易量上限，而为什么要增加交易量上限呢？\r\n\r\n因为交易量不够。\r\n\r\n为什么交易量不够呢？\r\n\r\n简单地说是比特币规定每10分钟（左右）挖出一个大小为1MB的区块，每笔交易平均下来是250字节，于是，每块可以放进4000笔交易，除以600，得出一个著名的数字——每秒7笔交易。\r\n\r\n这是个什么概念？\r\n\r\n其他的交易平台，最差的paypal是每秒100笔量级的，最强的，例如支付宝这种，在双十一的时候可是每秒100000笔量级的。\r\n\r\n比特币和他们一比，根本就没法称之为交易系统。\r\n\r\n于是，随着最近比特币涨价，参与人数增多，就出现了这种状况：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/77244140.png)\r\n\r\n图上可以看出来，最近稍有缓解，但是前几个月多到什么程度呢？大概有20万条交易在池里等待加入链中。而且，从整体来看，这东西是一直呈增长趋势的——不过这正常，毕竟使用人数一直在增加嘛。\r\n\r\n于是呢，比特币就和北京的交通差不多了。\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/988370431.jpg)\r\n\r\n怎么解决拥堵呢？可以多收点交易费嘛。\r\n\r\n于是：\r\n\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/337197357.png)\r\n\r\n交易费翻了一倍。\r\n\r\n但这不是长久之计，至少，并不符合比特币长远的利益——尤其是当比特币还想要更广阔的用户群和更多的功能的时候，提高交易费只会降低比特币的受众。虽然和一些主流交易平台相比比特币的交易费还可以接受，但是有一个问题是竞争——就算是比特币的支持者也不得不承认，比特币作为区块链的开山怪，到现在为止没有进行过哪怕一次技术上的更新（早期做出过一些更新以及修复过一些bug），从技术上相比于其他的区块链已经是非常落后的了。于是，如果未来比特币不扩容，就会导致要么拥堵，要么交易费高。这样，虽然比特币可能现在用户多，安全性高，但是势必有一些对安全性要求没那么高的用户会转投其他交易费低或者不拥堵的数字货币的怀抱，久而久之，比特币的价值就会受限于一个特定的用户群的固定的交易量。\r\n\r\n而按照我之前几篇里提到的公式，现在制约比特币发展的是安全性，但是如果交易量不增加，未来制约比特币发展的就会变成交易量。\r\n\r\n所以，比特币需要扩容，差不多是业界的共识。\r\n\r\n而且，这个共识，已经达成了很多很多年了……\r\n\r\n但是为什么现在才扩呢？\r\n\r\n首先，我们要讲，究竟怎么扩容？\r\n\r\n## **如何扩容？**\r\n\r\n这个问题有两个层面：1，技术上如何实现；2，工程中如何实施。\r\n\r\n而对于比特币，第二点的难度远大于第一点，所以，咱们先说第二点。\r\n\r\n扩容如何实施？\r\n\r\n听起来好像是个很高深的问题。\r\n\r\n那么换个问法：\r\n\r\n软件如何升级？\r\n\r\n这你一定会觉得，不就读个条就好了吗？\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/98626841.png)\r\n\r\n但问题来了——比特币和那些随随便便就读条的妖艳贱货不一样！比特币是分！布！式！系！统！\r\n\r\n分布式系统就是说，比特币没有中心服务器和客户端，不存在服务器升级然后给客户端发个补丁或者升级包大家读个条就都升级好了的情况。\r\n\r\n分布式系统想升级，你得让每个节点都升级才行。\r\n\r\n有人不升级会怎么样？\r\n\r\n会分叉（fork）。\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/755022111.jpg)\r\n\r\n## **那么，什么是分叉？**\r\n\r\n令人非常遗憾的是，在网上看了这么久没找到特别直观和准确的解释分叉的文章，甚至，广泛转载的某一篇根本就是错的。而且，在我看来软分叉和硬分叉这个名字非常有误导性——似乎软分叉就不会分叉而硬分叉就一定会分叉一样，实际上并非如此。软和硬，实际上是站在比特币这个特定场景里，在普通用户（而非矿工）的角度说的，实际上和分不分叉没有必然联系。至于为什么叫这个名字，这种误导造成了什么问题，我们稍后再说。\r\n\r\n先说定义，简单地定义的话，就是：\r\n\r\n软分叉（不分叉）：旧节点接受新区块，新节点也接受旧区块。\r\n\r\n软分叉：旧节点接受新区块，新节点不接受旧区块。\r\n\r\n硬分叉：旧节点不接受新区块。\r\n\r\n我们先来看最简单的情况，也就是：\r\n\r\n* 软分叉（不分叉）：旧节点接受新区块，新节点也接受旧区块，这个时候会发生的情况如下图所示：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/113106497.png)\r\n\r\n也就是说，这种情况并不会导致分叉，因为这种升级并没有改变区块的格式。于是双方都可以如同以前一样愉快滴在对方的区块上挖矿。这种情况压根就不会分叉，之前的P2SH的升级就是这类。但问题是，在很多地方，人们称这种情况也为“软分叉”，导致了很多人认为软分叉就一定是这种情况，于是，这就与真正的“软分叉”，也就是下述情况混淆起来了。\r\n\r\n* 软分叉：旧节点接受新区块，新节点不接受旧区块。\r\n\r\n这个时候，可能会出现两种情况。\r\n\r\n1，如果新节点的算力超过50%，那么会发生下图的情况：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/102004247.png)\r\n\r\n这个时候虽然旧节点会在新区快上挖矿，但是由于新节点不会在旧区块上挖矿，然后新节点的算力较大，那么最终最长的链一定是全部由新区块组成的链。而且，这条最长链是双方都认为合法的一条（所以图里两个小人在同侧）。而旧节点这个时候，出于自身利益的考虑，也会升级成新节点——这就是软分叉的最好结果。\r\n\r\n然而，软分叉并不一定会出现这种结果——如果新节点的算力不够，就会出现下述情况：\r\n\r\n2，如果新节点的的算力不足50%，那么：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/779758039.png)\r\n\r\n在这种情况下，由于新节点不会在旧区块上挖矿，所以即便新节点先挖出了几块矿，但是后面肯定会全都是旧区块。然后，新节点会认为只有新节点的才是合法的，而旧节点虽然认为两条都合法，但是新区块的那条算力不足导致不是最长链，所以它仍旧会选择上面那条。\r\n\r\n出现了这种情况，后续有两种可能的发展，要么：\r\n\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/693869680.png)\r\n\r\n要么：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/462276735.png)\r\n\r\n两者其实没区别，只是一个态度的不同：前者是我们的算力暂时不够但是更多人加入我们之后我们还是要合起来的，后者就是我们算力少我们认了，我们就是要分，合不上也无所谓。打个比方的话，就好比是常公和马娘娘的区别，一个要光复，一个是一中各表咱们小确幸就好了。这里请注意，在两条链合上之前，是真真正正的分叉了。\r\n\r\n那雾岛的玩法是什么呢？那就是硬分叉了：\r\n\r\n* 硬分叉：旧节点不接受新区块。\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/869055734.png)\r\n\r\n这里其实还需要分类讨论一下，如果新节点算力超过50%，那么无论新节点能不能接受旧区块，都会出现上图所示的场景。\r\n\r\n新节点不能接受旧区块的情况很容易理解，链自然而然分裂成两条，即便算力不超过50%也一样，无非是一边用户多一边用户少而已。\r\n\r\n但如果新节点能接受旧区块，我们先考虑算力超过50%：这个时候正好是软分叉的第二种情况反过来——旧节点不接受任何有新区块的链，而新节点虽然接受有新区块的链，但是因为只要有了新区块旧节点就不会在上面挖矿，所以最终会还是会分成两条链，一条只有旧区块，一条只有新区块，和上图所示情况一样。\r\n\r\n但一定要切记：硬分叉不等于分裂！因为硬分叉只代表新旧节点会分成两条链，但是不代表两方的节点永远分道扬镳——双方仍旧可以放弃自己的阵营加入对方，也就是说最后大家仍旧可以一起玩耍，只不过其中的一条链会被废弃，这些区块会变成孤块。这并不可怕——这种暂时性的分叉在比特币的世界，几乎每天都在发生。\r\n\r\n所以说，与其说硬分叉会导致分裂，不如说先有分裂，才会有硬分叉。如果矿工的阵营没有分裂的话，硬分叉根本就不是问题。\r\n\r\n那么，有人会说，还有一种情况没考虑啊！\r\n\r\n如果新节点算力不足50%，而且接受旧区块会怎么样呢？\r\n\r\n会发生这种情况：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/24886213.png)\r\n\r\n这和软分叉的第一种情况正好相反，简单说就是升级失败了。所以，这么明显的失败升级也压根不会被采用——如果铁了心要硬分叉的话，就干脆不兼容旧区块就好了。\r\n\r\n以上，就是分叉了——也就是说，根据升级方式，以及升级节点算力的不同，有可能出现如上所述的几种情况。\r\n\r\n从上面能清楚地看到：软分叉不代表不会分叉，硬分叉也不代表分裂。\r\n\r\n诚然，硬分叉一定会导致分叉，但论起分叉的危险性而言，硬分叉却不一定会超过软分叉——软分叉的背后，其实更加暗藏杀机。\r\n\r\n这一点，圈子里的人都懂，而我会在后面通俗地讲讲这个故事。\r\n\r\n那为什么起软分叉和硬分叉这个名字呢？\r\n\r\n这其实是在比特币这个特定的环境里，站在非矿工的角度说的——对于矿工而言，我以上的那种分类方式更加精确。而对于非矿工而言，软分叉和硬分叉这两个名字更一目了然——\r\n\r\n软分叉：没事，不着急升级软件。\r\n\r\n硬分叉：快点！不升级软件就来不及了。\r\n\r\n但是只以这两类来定义分叉的话显然是不准确的，尤其是软分叉——软分叉其实涵盖了非常多可能的变化，其中有些甚至是比硬分叉还有风险的。\r\n\r\n所以，讲完了分叉，对于升级实施难度有了概念之后，我们终于可以讲扩容的技术方案了——\r\n\r\n比特币扩容最有趣的地方在于，这些技术方案要是实施起来，可能会涵盖上述的所有分叉的可能。\r\n\r\n## **如何实现扩容？**\r\n\r\n我猜直到现在还有很多人觉得扩容只是利益纠纷而非技术问题，我上次看到一个自称区块链专家的人号称一个区块大小改成1GB或者改成1秒钟出一块也没关系，之所以不这么做只是因为会损害到矿工或者核心开发者的利益云云……\r\n\r\n这背后的东西，要比狭义的扩容这件事要复杂多了——这是区块链的可扩展性（scalability）的问题，至今仍旧是一个学术难题。我可以负责任的说，想要达到和目前比特币采用的POW（工作证明，也就是挖矿）完全一致的安全性（注意：不是超过或者相当，而是完全一致）的共识算法，目前只有POW。换言之，对于公有链，理论上来讲可以用别的算法，例如POS，例如基于POW或者POS选举决策层然后再进行BFT，但是第一这些都还是理论，第二它们的安全模型都和比特币有或多或少的区别，而这种区别，是比特币的升级方案承担不起的。\r\n\r\n比特币，已经承载了太多的用户和价值，甚至，还承担了整个数字货币和区块链旗帜的重责。于是，想要完全更改共识算法，冒着不可预测的风险去扩容，无论是投资者，矿工，开发者，还是中本聪的狂信徒都不会答应。不说别的，好不容易给人们解释完了POW说它是世界上最完美最安全最公平甚至最有效率的共识算法，现在你让我换一个？\r\n\r\n所以说，采用新共识算法来扩容的方案，在很早之前就被否定掉了——如果想要新的共识算法，好，你可以自己弄个新币，反正不能在比特币上弄。\r\n\r\n于是，比特币只能用POW。\r\n\r\n那么？我们可以简单地把区块大小改成1GB或者一秒钟出一块吗？\r\n\r\n答案是不行。\r\n\r\n很多人讲的原因是——“啊，那样的话链就太大了，没人存得下”。\r\n\r\n这是错的，储存不是问题所在。\r\n\r\n问题所在是传输。\r\n\r\nPOW的安全的基础，是建立在一个人挖矿速度没法超过全网的50%算力的基础上的。而这又需要一个非常重要的前置条件——你确实得是在和50%的节点公平竞争才行。这就跟考试一样，你们得同时拿到卷子开始写才行。\r\n\r\n而这个，就要求网络是同步的，至少是接近同步的。\r\n\r\n对于比特币稍微了解点的人可能会有异议：“等等！比特币是个异步系统啊！”\r\n\r\n没错，比特币是个异步系统，但其实POW的安全性只有在（接近）同步的情况下才能保证。于是，POW引入了挖矿奖励，来激励矿工们保持同步。所以我们才能看到，为了挖矿，为了让自己挖的区块被网络接收，为了不把算力浪费在不正确的链上，矿工们实际上是和打了鸡血一样地去广播，去接受新的区块——换句话说，去保持矿工网络的同步。\r\n\r\n而矿工网络的同步性，我们可以从产生的孤块时间看出来：\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/587937309.png)\r\n\r\n孤块和最终加入主链的块的时间差了半分钟，也就是说，产生孤块的这个矿工，在挖出这一块的时候，半分钟之前产生的那个块还没有广播到他这里。也就是说，一个新产生的区块，要传遍整个网络，需要至少半分钟。而矿工都是收到一个新块验证无误了之后再在上面挖矿，也就是说，新的区块就像一道新的题目，而传播就好像是发卷。这个卷子发给所有同学需要至少半分钟。\r\n\r\n这不公平，因为这说明每轮挖矿总有人比别的人早半分钟拿到试卷。\r\n\r\n但大家觉得这样也没什么问题——第一，每轮先拿到试卷的人是随机的。第二，反正考试的时间是10分钟，大家觉得这半分钟的延迟可以接受。\r\n\r\n然而，如果考试只有半分钟呢？\r\n\r\n或者，如果卷子特别多发起来特别慢呢？\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/883434855.jpg)\r\n\r\n假设我们为了扩容，把比特币的区块间隔改成半分钟。\r\n\r\n从现象来讲，比特币的网络会出现大量的孤块和分叉，也就是大量的算力被浪费了。\r\n\r\n而本质上来讲，实际上是比特币的安全模型崩塌了——\r\n\r\n我们来考虑自私挖矿或者说是分叉攻击。也就是说，我挖到个区块，但是我不公布，我继续在这个区块下面挖，然后挖出一个，还不公布继续挖，直到我的链比网络里的所有链都长的时候，我再一气公布出来。\r\n\r\n在理想的比特币的模型里，除非我的算力超过50%，否则我这么做的成功率为0。\r\n\r\n但实际上，我所需的算力小于50%，因为我并不是在和其他人公平竞争——他们需要发卷，发卷的时候没收到卷的人没在做题。而我永远都在做题，因为我自己给自己发卷。\r\n\r\n当做题时间为10分钟的时候，这个优势还不明显，但是如果做题时间是半分钟的话，这个优势就很夸张了——\r\n\r\n每一道新题，还没发到全班呢，就有人做出来了，然后重新发题。如果粗略地认为发卷的速度是线性的话，也就是平均每个人只做了15秒的题。也就是说，这个题的难度，如果全班人一起做的话，15秒就做出来了，每道题，其实都只有全班的一半算力在做，剩下的一半，他们做了错误的题目。\r\n\r\n换句话说，我并不需要50%的算力，而只需要33%的算力就够了——因为我只和剩下的算力的一半在竞争。\r\n\r\n而增加区块大小和这个同理。如果把区块大小扩大十倍，传输所需的时间也会相应提高。于是，只要传输速度和区块产生速度相比不可忽略，比特币的安全性就会严重地打折扣。\r\n\r\n在[On scaling decentralized blockchain](http://fc16.ifca.ai/bitcoin/papers/CDE+16.pdf)这篇论文里指出，在现行互联网中，如果十分钟产生一个区块的话，区块大小不能超过4MB。\r\n\r\n于是，为什么不把比特币区块扩大到4MB呢？\r\n\r\n因为比特币规定（并不是一开始规定的，但是后来增加了这条规定），区块大小不能超过1MB。也就是说，如果扩容要更改区块大小或者修改难度的话，一定会产生硬分叉。\r\n\r\n而曾经（注意是曾经），比特币社区对于硬分叉畏若蛇蝎，避之不及。\r\n\r\n那么，有没有能够在不增加区块大小的前提下增加交易容量呢？\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/73182444.jpg)\r\n\r\n这就是隔离见证。\r\n\r\n## **隔离见证**\r\n\r\n我们已经说了，一笔交易大概250字节，但是打开看看这里面都有什么呢？\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/529594045.png)\r\n\r\n为了不把这文章搞得像论文一样我们就不去看代码了。\r\n\r\n总之，每笔交易粗略的说起来有两部分：\r\n\r\n1，谁给了谁多少钱：也就是交易方和交易额（什么UTXO什么地址什么输入输出都只是细节）。\r\n\r\n2，你有权利做这笔交易的证明：也就是说，作为给钱的那方，你得证明你有资格给这笔钱。而这个证明，是一组数字签名。\r\n\r\n而看到这里，有人灵机一动——\r\n\r\n等等！比特币的格式里，好像允许用脚本来替换签名！\r\n\r\n实际上，这个签名是很大的，250字节的交易里，可能有150字节都是签名。粗略估计，签名大概占了交易大小的2/3。\r\n\r\n然后，我们可以把交易里所有的签名改成脚本，然后把所有的签名打包起来丢到后面去，于是，我们剩下了2/3的空间。\r\n\r\n那么采用了隔离见证的节点发出来的新区块长啥样呢？\r\n\r\n首先，每笔交易都被分成了两部分：交易和见证（签名）。交易部分只有100字节左右，于是一个1MB的区块里面能放10000笔交易（原来是4000笔），然后，所有的见证部分，大约1.5-2MB，都被扔到了后面。新节点当然可以接受这种格式，而且也认为见证是链的一部分，而旧节点虽然不认后面的部分，但他们仍旧会认为前面的部分是合法的区块。于是，无论是新节点还是老节点，都可以在对方的区块上挖矿，这岂止是软分叉，这根本就无需分叉，然后提高了一倍多的效率，简直完美！\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/717751731.jpg)\r\n\r\n然而隔离见证的优势还不止这些——隔离见证还修复了一个比特币的被称为“可变性”的缺陷。使得比特币的交易更容易识别，最重要的是，可以更容易地实现一个叫做“闪电网络”的东西。\r\n\r\n闪电网络是什么呢？简单说就是一个在链上提供担保的链下交易机制，实际上就是在比特币上签署一个协议——\r\n\r\n例如你经常给某个人转钱，你不用每次转都把交易上传到比特币的链上了。你们双方可以先在比特币上签署一个协议，交上一笔保证金，然后只要你们转账的总额不超过保证金，接下来你们的转账可以在私下进行，而这个协议保证如果对方耍赖不认可你们私底下做的交易了，你可以凭着转账记录上传到区块链上把属于你的钱拿走，不用再次通过对方授权。\r\n\r\n这东西其实和主链交易没有可比性——它是完全另一种交易形式。\r\n\r\n但是，不管它对于扩大交易量有没有好处，是像乐观派说的能把交易全部转到链下还是悲观派认为的只会增加拥堵毫无作用，它至少提供了另外一种支付手段。\r\n\r\n所以总结起来就是：\r\n\r\n1，隔离见证是软分叉甚至不分叉。\r\n\r\n2，隔离见证理论上来讲可能提高2-3倍的交易量。\r\n\r\n3，隔离见证支持闪电网络，可以将一部分交易挪到链下进行，减轻主链的负担。\r\n\r\n那么，这么好的方案，大家还在等什么呢？\r\n\r\n当然是小钱钱了。\r\n\r\n![](https://img.learnblockchain.cn/2020/04/09_/505340814.jpg)\r\n\r\n我会在下篇，从技术的角度，讲讲比特币扩容的故事和故事中的各方。"},"author":{"user":"https://learnblockchain.cn/people/321","address":null},"history":null,"timestamp":1719645875,"version":1}