第0章 引言
比特币的零确认可以让支付秒到,如果能实现安全的零确认,那对BTC和BCH的用户体验都是质的飞跃。相对来说BTC的粉丝绝大多数是拒绝零确认,而BCH的支持者则热衷于发展零确认的安全性。
本文分析下零确认的安全性。
第1章 什么是双花?
说零确认不安全就是指零确认的交易有被双花的可能性,要讲明白其安全性,首先就是要定义清晰双花这个概念。
因为是数字货币,数据是可复制的,这就使得一笔数字资产可以被重复使用,这就是双花。简单来说双花就是一笔钱花两次,甚至是花多次。要注意“双花”这个概念,重要是在于“花”这个动作,而这个动作是不是能够成功并不是定义“双花”的关键,只要同一笔数字资产被“花”出去了两次或多次,那就是“双花”。之于两次“花”的动作是否都收到了所购买的商品,即是否成功骗到交易对手,那就是另外一回事了,这分为双花成功和双花失败。
下面为了描述方便将发起双花攻击的人称了诈骗者。
以下是典型的双花场景。
诈骗者使用比特币购买数字产品,比如购买一本电子书,价格为0.01BCH,数字产品不需要物流。他先将0.01BCH发给店家,我们称这笔交易为tx1;然后同时又将相同的这0.01BCH发给自己的一个地址,我们称这笔交易为tx2(我们先不要关心他是如何做到的,下面会解释)。店家使用机器侦察到了交易tx1发出后,觉得没问题,就店铺的机器人就直接发货了,给这诈骗者发了电子书。但因为交易tx1和交易tx2是相冲突的,必然只有一笔能被打包,如果交易tx2最终被打包了,交易tx1就会被作废。这种情况下,诈骗者就成功双花了这0.01BCH,因为他即买到了书,却又收回了自己的0.01BCH。
针对零确认双花攻击的策略如下:
第1步,诈骗者使用相同的UTXO构造两笔交易tx1和tx2,tx1支付给商家,而tx2的收款地址是自己的。
第2步,商家侦察到tx1后,在零确认下就发货了,比如无需物流的电子商品。
第3步,诈骗者引诱矿工打包tx2。Tx1就会被作废。这时双花成功,诈骗者即收到了商品,又拿回了他的币。
零确认是时有发生的,无论是在BTC上还是在BCH上都发生过。著名赌博网站SatoshiDICE(中本聪骰子)就因接受零确认交易而被人双花过。
区块链浏览器在侦察到双花交易时,一般会标记出来,如下图。
本质上区块链的发明就是解决了双花难题,比如比特币区块链处理双花交易的结果最终只可能有一笔合法的交易被确认,而另一笔会被抛弃。
第2章 非算力用户双花零确认交易
对零确认的交易发起双花,理论上分为两类,一类是普通用户发起的双花;第二是矿池发起的双花。
先说第一类,一个诈骗可以在网络上物理位置相差很远的两个位置构造两笔相冲突的交易,比如诈骗者刻意把第一笔交易tx1在美国广播,同时将相冲突的交易tx2在中国广播。中美两国网络之间有时间差。诈骗犯使用在美国广播的交易tx1向一个美国店家购买电子书一本,而在中国广播的交易则是发到自己的地址上。商家看到在美国的交易后立刻发货,但没想到,最终在中国广播的那笔交易被打包了,商家就被骗了。
这一类诈骗为了提高成功率,一般会配合手续费策略。比如给商家发的交易tx1给的手续费非常低,交易尺寸非常大,手续费率低于1聪/字节。而诈骗犯自己给自己发的交易tx2手续费则高于市场值。这种情况下矿工就会优先打包tx2,双花成功率就高了。
因为现在BTC/BCH节点都有最低手续费限制,低于1聪/字节的交易在很多节点就不帮你广播了。所以诈骗犯会用的另一个辅助办法来提高成功率,就是使用RBF交易,诈骗会给tx2设定为RBF交易,然后在tx1和tx2都发出后,给tx2再追加一笔更高的手续费,以引诱矿工优先打包tx2。注意BCH无法使用RBF。
这一类双花零确认交易的攻击其实是非常容易防御的。第1个方法就是商店可以设定一个手续低限,比如,低于1聪/字节的交易就拒绝零确认,提高到1确认才认定为安全的。第2个方法就是商家延迟几秒后,至少使用两个区块链浏览器来检测是否存在相冲突的交易,如果发现有冲突的交易就中止交易,等确认。
目前BTC和BCH的生态也都针对这一类双花攻击作了一定的防御,比如区块链浏览器就会收集双花交易,并提示用户注意。大部分节点钱包也会拒绝广播手续费太低的交易,但并不是所有的钱包都会拒绝。
总的来说,非算力用户想针对零确认交易进行双花是很难成功的,只要商家有基本的比特币知识就可以防御。
第3章 算力用户双花零确认交易
第二类针对零确认交易的双花攻击是矿池发起的。诈骗者本身是持有算力的。
针对上述第一类用户发起的双花攻击,关键是有两个,第一是防止商家发现相冲突的交易;第二个是诈骗犯要引诱矿工优先打包tx2。如果是矿池本身就是诈骗犯,是可以轻松做到这两个的。
矿池的双花零确认的过程是这样的,诈骗犯先构造tx1和tx2,tx1的手续费很低。将tx1发给商家买电子书,但tx2是隐藏起来,不广播,只保存中自己的矿池内存池里。因为tx1的手续费太低,所以矿工都不想打包。而tx2被隐藏起来了,所以区块链浏览器是不可能发现有相冲突的交易的,商家也不可能发现。一旦商家发货了,那诈骗者就会在自己挖到的块里打包进tx2,广播这个块。这时全网所有的节点就会发现tx1是非法的了,直接作废掉。商家就收不到币了。
要想防御这一类双花攻击只能依赖于其他矿池的协作。
澳本聪CSW提出了防御这一类双花攻击的办法,因为诈骗构造的tx2交易是不会被广播的,是以直接打包进诈骗矿池挖到的区块才会被其他矿池发现。如果其他矿池如果针对这种包含了延迟出现交易双花(tx2)的区块进行孤立,那这个诈骗矿池的这个块就白挖了,损失12.5BTC/BCH,这是非常惨的事。具体的设定可以是矿池将超出一定时间,比如10秒内,都没有见到的交易(tx2),却包含在最新的区块里,则直接孤立掉这个块,在这个块的前一个高度上挖矿。
如果执行这种孤立政策的算力超过51%,那基本上就没有矿池敢发起这一类隐藏交易(tx2)来攻击零确认交易了。
这种防御办法是逼迫所有的交易都要经过广播,哪怕是算力节点自己构造的交易也需要广播。其次是要求各大矿池都要在全球部署足够多的节点来收集交易。目前的BCH网站肯定是不行的,BTC网络更不行了。我自己暂时不确认这是否是一个好办法。
目前在BCH网络上已经有矿池声明将执行这种办法。
在BTC网络上,则没有矿池声称解决这一类问题,毕竟BTC整个生态并不重视零确认的安全性。
第4章 防御零确认双花攻击服务——Atlantis
BCH网络生态是非常重视零确认安全性的,有这么一个项目,叫Atlantis,这个项目在全球各地部署很多的bitcoin cash节点服务器,用于探测双花交易。也就是探测上面章节描述的相冲突的tx1和tx2。只要探测到了,就会提醒用户此交易有可能被双花。
Atlantis项目提供一个API服务,任何商家都可以通过API获取交易是否存在双花的概率,商家可以在这个项目的保护下可以在3-5秒后就接受零确认支付。
这个防御服务可以杜绝掉第一类双花攻击,但无法杜绝掉算力双花,因为算力双花的tx2交易在被打包前根本就不会被广播,不可能被侦察到。
第5章 提高零确认交易安全性的办法——弱区块
挖矿是使用矿机算一个随机数,当算得的随机数小于系统设定的目标值时,那挖矿成功,挖到一个区块。比如目前的BCH网络系统设计的目标值是前面16个零,如果一个矿工算到了一个17个前置零的随机数,那他就挖到了一个块。现在我们将这种区块定义为“强区块”。
如果将“强区块”的目标值调低,比如降为现在的1/8,即前置2个零即可,如果有矿工计算到的随机值小于这个“1/8目标值”,则定义为挖到一个弱区块。这样一个强区块就包含了8个弱区块。
强区块有区块奖励,12.5个币(BTC/BCH)。但弱区块没有区块奖励,但弱区块可以打包交易,可以将交易手续费拿走。也就是矿工挖弱区块只有手续费拿。
如果所有的矿工都参与于挖弱区块,那就可以提高零确认的安全性。为什么?因为弱区块的设定相当于降低了区块间隔时间,商家可以依据tx1是否被打包进一个弱区块来决定是否发货。只要打包进一个弱区块,那这个交易就得到了承认这个弱区块的矿工的认可,只要这些矿工任何一个挖到一个强区块,那这笔交易都一定会被纳入到这个强区块中。
现在弱区块技术还没有开发出来,只是理论上存在的技术。
第6章 51%攻击和零确认交易攻击的区别
有很多人会将51%攻击和零确认交易双花攻击搞混,其实这完全是两码事。
51%攻击是针对已经确认了的交易进行逆转的攻击,而零确认双花是针对是没有被打包的交易进行逆转攻击。
51%攻击只能是矿工发起的,持有超过51%算力的矿工才能发起的攻击。其攻击原理是这样的:
第1步,诈骗者构造tx1向商家支付,tx1被区块高度x打包,得到1个确认,商家发货。
第2步,诈骗者使用相同的UTXO构造tx2,并且收款地址是自己的。
第3步,诈骗者利用自己的算力在区块高度(x-1)上挖矿,并且将tx2打包进他新挖到的块。而此时,其他算力矿工则在高度x挖矿。
因为诈骗者拥有算力优势,所以他在连续挖出2个块,甚至更多个块后,而其他算力的矿工只挖到0个区块,此时,诈骗者算力所在的链高度为(X-1+2),而其他算力的高度还是x,这时候,其他矿工所挖的链就会被重组,其他矿工的算力会自动切到诈骗者的高度(x-1+2)区块上挖矿,这时打包了tx1的区块就被孤立掉了,tx1作废了,tx2是合法的交易。
因为tx1得到的确认越多,则诈骗者要在(x-1)高度上挖到的块就越多才能成功发起攻击,所以tx1就越安全。而我们认为只要达到了6个确认,则认为这笔交易永远无法被逆转了。比特币白皮书详细描述了51%攻击的可能性,在第11章,结论是成功的概率实在太低。
比特币历史上曾经发生过24个区块被重组的,但那是一个软件bug,并不是51%攻击。
第7章 结束语
安全的零确认交易意义重大,意义有多重大呢?假设BCH网络最终让整个生态接受了零确认是安全的,那哪怕是所有的BCH矿池被同一时间摧毁,对所有用户来说,也无关紧要,交易照发,只是零确认罢了,而且零确认的交易还可以再发给下一家,而确认只需要慢慢等矿工恢复生产就好了。
零确认如果能够真正安全,那就是去中心化的最大胜利,因为这是一个绝对不可摧毁的网络了。