算力战到底怎么打?——POW算力是如何决定协议升级的



  • 原创: 闪电 黄世亮 闪电HSL
    原文链接 https://mp.weixin.qq.com/s/isgDBDn6jEm3k8Hk1LxURA

    第0章 引言

    比特币现金社区因为11月15日的升级出现分歧,算力是决定BCH走哪个方向的关键,这就是pow链上治理方式。算力到底是如何决定比特币协议改进方向的?

    第1章 算力投票

    如果全网面临协议更改,算力分成愿意升和不愿意升两类,如果冲突不严重,直接使用算力投票的方式就可以决定。

    比特币协议集里有一整套投票方法,用的最广泛的就是BIP9。矿工通过在coinbase交易的input字段里打出标记来声明自己是不是支持某种协议。

    BIP9一般是通过统计最新的1000个块的支持率。需要升级的协议可以捕捉支持率,比如设定好超过75%的块支持,就锁定协议升级。

    锁定协议升级后,那些不支持的算力就必须升级了,否则就会被大多数社区孤立掉,变成一种分叉币。

    如果投票始终达不到设定好的支持率,并且过了投票周期,那一般就认定为放弃此升级了。

    第2章 什么是算力战

    如果出现算力分成完全对立的两方,并且至少有一方不愿意分裂,并且执意要求对方同意自己的路线,那就会出现算力战。

    但算力战到底怎么打,其实没有真实案例可借鉴。我们从逻辑上判断,一步一步解析出算力战的打法。

    算力战的目的是什么?是为了自己的一协议版本继承整个经济生态,阻止生态分裂。

    算力战的敌人是谁?算力战的参战方应该集中在生产区块的各方,就是带算力的完整节点full node。更具体的说是“矿工+矿池构成的完整节点”。运行不兼容的协议的“矿工+矿池完整节点”之间互为敌人。

    算力战中,用户不是敌人。包括交易所、钱包、和dapp等生态节点的一切成员,我们可以将这些视为平民。平民不参与战争,也不应该被卷战争。

    算力战的武器是什么?51%攻击,配合最长链是有效链规则。

    算力战中牺牲的士兵是什么?是无效的区块。

    算力战最后如何评判胜负?一方“矿工+矿池完整节点”不再打包和对方不兼容的协议的区块,要么要退出这条链,要么服从对立方的协议。

    那算力战到底怎么打?

    第3章 两个战场的算力战

    算力战的一种打法是,对立的双方先各自挖出一条链,先分裂,然后双方各自派部分算力在自己的链上挖(防守),同时派部分算力到对方链上去挖(进攻)。有可能出现一方无意进攻,只专注防守,也有可能出现双方都有攻守。

    进攻的方式就是通过51%攻击(或叫藏块攻击),配合最长链为有效链原则,重组作废掉对方的区块。

    在决战结束前,就是分裂成了两条链,两个币。对所有用户来说,都是两条链,两个币。在决战结束后,会回到一条链,一种币。

    藏块攻击是自己挖到块后不广播,而是连续挖到多个块(超过对方挖的块数)后一下子广播出去,让自己这些块处在最长链上,从而孤立掉对方挖出来的块。

    一般想要成功发起这样的攻击,至少需要75%的算力优势才可以稳赢。只有75%的优势算力才有机会不停孤立掉25%的算力出的块。因为运气成份在。

    假设运气双方五五开,75%的算力在最倒霉的情况下的实际算力是 75%*50%=37.5% ,而25%的算力在运气最佳的时候实际算力是 25%*150%=37.5% 。双方持平。所以想要稳赢,进攻方需要保持75%的算力优势。如果做不到这样的优势,那双方只能是互有损失。

    用户是平民,所以算力战双方都守规则的话,用户发的绝大多数交易都会被重放到两条链上都成立。

    最理想的情况下,进攻方有绝对的优势,75%的优势,而且进攻方的藏块里是不会打包交易的,这样让用户发的交易在这条链上是永远得不到确认,但用户在另一条链上是可以得到确认的。这样对用户来说,相当于只有一条链存在。

    但如果不存在绝对的算力优势,两个战场都是只有相对优势,那对用户来说就是灾难性的。因为交易会在得到确认后,突然又因为区块被重组而确认数成新变成零确认;有时候交易会在一条链上得到确认,有时候又可能在两条链都得到确认。本质上,这种情况下,链是无法使用。

    另外一种情况是,因为有新协议更新,用户发的交易可能会包含一些新的协议规则,这样就可能在其中一条链上是无效的,永远不会在这条链上得到确认。这样就会更复杂。

    基本上,如果出现这样的傻逼算力战,用户最好的选择就是暂停使用。

    第4章 同一个战场的打法

    另外一种打法是,从开打,到结束,都始终只有一条链,一个币,从未分裂。**

    我们把这种打法对立的双方分成进攻方和防守方。进攻的一方为了不被分裂出去,始终兼容防守的一方的协议。即进攻方广播出来的区块100%符合防守方的协议,这样只要有进攻方的区块被广播,防守方就依据处在最长链的块为有效的原则进行挖矿。进攻方的区块绝对不会打包在协议规则上会被防守方拒绝的区块。

    进攻方只是趁机使用51%攻击(或叫藏块攻击),孤立掉防守方的区块。

    这种情况下,对所有的用户来说,只存在一条链,一个币。但用户发出去的交易,哪怕是得到了防守方的区块确认,也有可能会因为防守方的区块被重组而退回到零确认,或者突然变成进攻方的区块确认。也就是说,用户发出去的交易是安全的,但可能会前后出现在不同的区块高度上。

    这种打法,对于进攻方来说,是可以临时性忍受链上存在自己不想要的一些协议规则的,但发誓要修改掉它。

    只要打完了之后,再来拒绝这些规则。

    这种打法,对防守方来说,可以通过改变协议来躲避进攻方,让进攻方不再兼容自己的协议。但因为比特币都是开源的,只要防守方改协议,进攻方都知道,始终追着防守方屁股进行打,这是躲不掉的。除非搞成不开源的升级,但这是不可接受的。

    这种打法,对于用户来说,可以放心大胆地使用防守方的协议,只要得到进攻方的区块的确认,那就是安全的确认,但得到防守方的区块确认,就还要考虑会不会被重组。

    第5章 精神病打法

    其实还有一种打法,对整个生态来说,绝对是大好事,受损的只有对立的算力双方,那就是烧币打法。这是老 刘脑洞大开想出来的。

    既然打算力战本质上就是烧钱,打掉一个区块,就最少浪费掉12.5个币。那大家干脆不要真打,就直接烧币好了。

    双方各自生成一个黑洞地址,为了安全起见,干脆使用OP_False脚本。对立的双方就往对方黑洞地址里打币,一笔12.5币起。最后谁打的多,谁胜,然后算力统一运行获胜方的协议。

    2333max,各位,这只是一个玩笑,别当真。

    第6章 结束语

    真好玩,大家快来看热闹。