区块链设计的前提条件是任何一个节点都是不可信任的,但是系统是具有一定的容错能力的。这个容错的是一个学术名词,用简单的话来说,就是允许多少比例的算力是恶意的,这个算力是指每个恶意节点算力的累加和。毫无疑问,只要恶意节点的总算力超过50%,这个链肯定是不安全的,这就是传说中的51%攻击。
这里简单说明下51%的攻击。所有的区块链,在运行过程都会产生分叉:即有两个节点同时具备了出块条件,考虑到网络传播具有延时,不同的矿工以这两个不同的分叉块为基础继续挖矿,这样过一段时间后全网内就会发现两条链,如下图:
在第N+1个区块上产生了分叉,有些矿工以N+1区块为基础继续挖矿,有些以N+1’为基础进行,过了一段时间全网的数据不断同步交互后,全网就会发现有两个分叉链,这时候该怎么选择呢?看上图,一条出了3个块,另外一条出了4个块;在同样的难度下,算力越高,出块越容易,反之,如果链越长,说明算力越高,因此选择N+4’这条链。
上述的选择方案都是合理,但是如果某个矿工或是矿工联盟占据了超过51%的算力,情况就不一样了:
假设下面N+4’这条链是由某个超过51%算力的矿工得到的,他故意隐藏不拿出来。然后在上面那个链中,向另外一个人(比如交易所)转出比特币,相应地收取人家的法币;而这个转帐不记录在隐藏的链上。等法币到手后,出示自己隐藏的链,矿工们一看,这条链更有效,因此使用N+4’这条链,结果大家能够推论得到了。从概率上来说,恶意矿工即使算力达不到51%,也有有一定的概率这样做,但是要隐藏的链越长,能够隐藏成功的概率越小,中本聪通过计算,6个区块的长度已经足够保障安全了,这个就是比特币6个区块确认的原因。
在无许可(出块节点无需预先认证)的公链方案中,目前主流的共识算法有POW(工作量证明),POS(股权证明)和POST(时空证明),POW从比特币开始,工作了10多年,经过验证安全性良好;POS的假设前提是你在这条链上的投入(股权/币)越多,你越愿意保证这条链的安全性,这个假设值得商榷;而POST通过不断提交你存储的容量证明,虽然牺牲了一些TPS,但是同样可以证明具有安全性。
所有上述的安全性,都是工程安全性:其含义是:当攻击的投入远超出收益时,这个攻击就可以忽略不计了。同样可以反过来理解:如果收益远超攻击的投入;或者虽然收益很低甚至没有,但是攻击的成本如果很低,同样会有人进行攻击,这是人性决定的。不信的话,可以看一下以太坊低层代码里有多少百分比的代码就是为了抗这些损人不利已的攻击的。
因此,如POW这个算法,在单一链的比特币上运行很好,因为任何一个矿工想要保证攻击成功就需要占据全网51%以上的算力,而这个算力目前是数十亿美元的投入,如果成功了,可能能够获得数千万甚至上亿美元,但是一旦被发现,就会让比特币价格归零,让自己的投入血本无归,因此目前没有做这个事。可是如果比特币使用了1000个分片呢?攻击者只需要攻击其中的一个分片,那就只需要千分之一的投入--数百万美元,可以获得数千万甚至上亿美元的收益,这个投资收益比还是可观的。更关键的一点是,能够投入占据全网算力51%的人不多,能够占千分之零点5以上算力的可是大有人在。
POS问题更严重,POS是根据币的质押数量获得算力的,因此只需买币质押,比投入买矿机还简单,更加可怕的是,交易所天然有大量的币存在,不需要买币就可以获得优势,因此更不安全。所以大家可以看到ETH 2.0的方案, 是所谓的分片POS加上主链的POW,V神是同时考虑到了POW分片不安全和POS本身不安全的因素,不得已而为之的。至于宣传的未来全部POS,只是愿景,大家慢慢等就是。
从上述描述可知,分片不安全的本质原因是算力可以被集中到某个节点上,从而在这个节点所在的分片取得优势。要解决分片安全性,就是要寻找一种无法将算力集中到某个节点上的算法,如果能够实现数据链上撮合,POST正好合适:
1. 算力与硬盘容量大小无关,只与实际存储的有效数据有关;
2. 算力是链上撮合的,决定于链上的数据,与机器的CPU/内存/网络有相关性,但是不直接取决;
3. 存储证明与矿工号相关,如果切换了矿工号,原有的存储证明就无效了--这一点决定了矿工不能将有效算力迁移给别人或是其他的分片中的自己的节点。
通过上述描述,我们可以确认,POST是解决分片安全性的一个非常良好的方案。不过这个建立在数据是链上撮合的前提条件下,如果数据是自己封装的无意义数据,那仍旧会存在隐患。
链上撮合有效数据需要高性能TPS,高TPS性能的链只有通过分片才能实现,而具备了链上撮合能力的PoST又正好能够保证分片的安全。所以,这一切也许是巧合,也许是天意。