Nervos Fans

软分叉其实比较安全

2018-08-09  本文已影响1人  526ba0512193

从比特币核心容量扩增和块大小硬分叉的相关讨论中,能够发现对于软叉安全性依旧是存在相当大的误解。 有鉴于软分叉是升级比特币协议最佳的手段(之一),而且已经成功部署多次,还有这种误解实在让人惋惜。

1. 定义

简言之:

软分叉添加新规则至协议,把先前的有效块变成无效。

硬分叉从协议中删除规则,使先前的无效块变为有效。

2. 部署软分叉

首先看看标准IsSuperMajority()的软分叉是如何部署的,拿BIP65 CHECKLOCKTIMEVERIFY举个例子。 基本上,BIP65增加了两条新规则到比特币协议:

操作码NOP2就是现在的CHECKLOCKTIMEVERIFY,若尝试花费不够老(币龄小)的资金,会失败。

得到95%的区块支持后,视不支持BIP65区块中的区块头版本字段无效。

注:

以下为触发软分叉后的情况:

软分叉开始

软分叉后,仍然会偶尔产生未采用BIP65的矿工区块,每20块出1块的样子。由于95%的算力视这些块为无效,那么无效块不断成为有多数工作量的链中(就是最长链的意思)的孤块。 但是,未采用BIP65的矿工仍视全部区块为有效块,因此矿工的时间基本上一直都在最长链上,就是说不断地在最长链上做添加,而不是在无效区块的基础上做添加。有时候,挖出的无效块里边也会有交易,但是被确认的不会超过一两个。

3. 部署硬分叉

当前比特币没有故意为之的硬分叉,不过软分叉的概念出现之前Satoshi曾在非常早期硬分叉过几次。这里,假设有个块大小的硬分叉,同样由区块头版本触发:

硬分叉开始

这次,未升级矿工视升级矿工的出块为无效,原因是这些区块违反了现有规则。 因此,未升级矿工群体会在彼此的出块上做添加,从而创建出两条独立的链。 旧链能持续多久是没有具体时间限制的;即便被绝大多数算力视为无效,旧链上的交易还是能轻易得到6次以上的确认。 这就有问题了,要知道当前没几个SPV钱包会检查区块版本,那么,这个硬分叉在钱包看来,长成这样:

隐藏的硬分叉

就是根本分辨不出到底是有效块还是无效块。 这就看钱包当时有无连接到升级或未升级的节点了。 当然了,也可以下载新的SPV钱包软件,里边肯定会有硬分叉的检查点。

4. 有关软分叉的常见反对意见

4.1 软分叉会骗旧节点放松安全警惕

所有分叉都影响安全,问题是有多影响?

比特币能正常运行,说到底是因为有用户验证区块并且确保规则被严格遵守;好比任意规则,多数人验证了但是你没验证,就是种可能的攻击。

其次,所有非恶意分叉都会通过变更区块头版本明确的表示正在发生分叉。 好的节点和钱包软分叉使用这个版本变更来提醒用户分叉正在发生,需要采取适当行动。 当然了,也有很多不太靠谱的钱包软件并没有做到这一点,但这属于社区需要解决的问题。 这里边并不涉及任何欺诈,好比用户不想认可自己尚未完全验证的区块,完全可以将钱包软件设置成检测到升级时自动关闭的状态。 这属于配置问题,弄不了的话,直接找开发商。

4.2 BIP66惨败的经验说明:软分叉有危险

BIP66触发部署时,出现了大部分算力进行无验证挖矿的情。 说白了就是有矿工在未验证区块基础上继续挖,那么比起那些老实验证的矿工,明显的抢跑。原因当然跟收益有关,谁挖的快谁赚钱啊。

等多数算力修复完节点并再次开始验证时,无效链已经比有效链多了六个块。 这就意味着SPV客户完全有可能被骗认可了有六次确认的无效交易。

但是,如上所示(隐藏的硬分叉图),即便是一切顺利的硬分叉也会发生这种事。同理,若矿工不进行验证,硬分叉的结果有可能是矿工延长的是无效链,所以这一点上,软硬分叉没区别的。

简言之,软分叉期间,无论软件是否升级,只要绝大多数矿工都在验证,多等2、3个确认总没错。硬分叉中就不是这回事了,得赶紧升级。

4.3 软分叉不美好不说,还把代码库整的乱七八糟的

其实有些变更通过软分叉实现有点不现实,但比特币协议本来就是可升级的。翻看历史代码库,Satoshi似乎在第一次发布软分叉后(注:首次软分叉添加了10个NOP操作码,至今还在用)觉得软分叉还行。 CHECKLOCKTIMEVERIFY搞成软分叉的原因显而易见,它的硬分叉版本仅是个外表改观,用到的正是Satoshi之前添加的NOP。

隔离见证也是个有趣的例子:开始的时候人们觉得SegWit只能通过硬分叉添加,后来发现其实软分叉一样用。 对于比特币核心本身和差不多全部SPV钱包来讲,实施起来都差不多。 仅有些罕见类型的SPV使用中会有点复杂(SegWit本身包含用于未来软叉升级的未使用字段)。

4.4 软分叉不民主

还有个挺有趣的非技术性反对意见,说未采用软分叉的节点和矿工怎么着都会留在主链上,是不是有点多数人挤兑少数的意思。这个问题应该这么看,使不使用某个新功能应该是个人选择。Satoshi满可以把比特币写成‘视未知区块版本为无效’,但人家并没有。

换个角度,若95%以上的算力不同意某协议变更,那么剩余5%的链可能也安全不到哪里去。 若这一小撮人到最后分叉的意愿还是很坚决,那么,肯定也是深思熟虑的结果(说不定还需要的新的PoW算法)。

https://petertodd.org/2016/soft-forks-are-safer-than-hard-forks

上一篇下一篇

猜你喜欢

热点阅读