可编程货币的魅力:比特币现金零确认安全支付方案和其有效性博弈

加密数字货币是一种可编程的货币,可编程就有意思了。本文分享一个特别有意思的零确认解决方案,和其有效性分析。

第1章 零确认交易的安全性分析

我曾经写过一篇文章讨论比特币现金的零确认安全性,在这里《比特币(包括BTC和BCH)的零确认到底安不安全?》。想深入学习可编程货币魅力的,还请读完这篇文章。

为了叙述方便,这一章简单描述下对零确认交易的双花过程。

用户A对商家B发起一笔支付,交易记为tx1,我们假定这笔交易是一个Input,一个output,一个找零地址。

在tx1还没有被打包进区块时,商家B出于对零确认的安全信任,直接给用户A发货了(假定是不需要物流的商品,比如电子书)。因为比特币现金平均一个确认需要10分钟,对于很多支付场景来说,10分钟的等待时间有点长。

用户A收到货后,又用相同的input构造了一笔和tx1相冲突的交易tx2,output设定为他自己的地址。并且广播出去。

如果矿池优先打包了tx2,那tx1就作废了,这时,双花就成功了。用户A即得了货,又拿回来自己的币。

而如果矿池优先打包了tx1,则用户A双花失败。但这对用户A来说也没有损失,只是没占到便宜。

这里的关键就是用户A发起双花交易是没有成本的,哪怕是双花了,用户A不会受到任何惩罚。下面讨论一种让用户A发起双花交易tx2就会有成本的办法。

第2章 使用新操作码OP_CHECKDATASIG构建带保证金的交易

BitcoinABC开发组在下一个版本中设计了两个新的操作码,OP_CHECKDATASIG(CDS)和OP_CHECKDATASIGVERIFY(DSV)。使用这两个操作码,可以设计一种特殊的交易,让发起双花交易tx2有成本。

老外Jonald_Fyookball写了一篇文章介绍这种方法,《Awemany’s 0-Conf Solution链接

具体的原理我通俗地描述如下:

用户A对商家B发起一笔支付,交易记为tx1,这笔交易的构成如下:一个input1,一个商家的output1,一个用户自己的找零output2,还有一个属于用户的“保证金output3”。特殊就在于这个output3。

这个“保证金output3”是使用操作码CDS构建的锁定脚本,锁定脚本里压入了“交易1的input1作为数据(记为data1)”。这种锁定脚本的解锁操作方法有两种,第一种是普通的用户A使用私钥签名进行解锁脚本。第二种就是,提供“data1的签名,data1,output3”,即可解锁。

而如果用户A发起双花交易tx2,tx2的构成是:一个Input1,一个用户A的地址,一个用户A的找零地址。这个tx2必然包含一个对“data1的签名”。

只要用户敢广播tx2,就相当于广播了”data1的签名”,那任何人都可以拿到这个签名然后将tx1里的“保证金output3”花掉。

一般情况下,矿工会优先拿到这个签名,并尝试构建花费output3的UTXO。矿工使用上述第二种解锁“保证金output3”的赎回办法,发起交易tx3去花掉。发起tx3,必然要打包tx1和tx3,并且忽略掉tx2。因为tx1是tx3的父交易。

这样用户A发起tx2就得不到矿工的打包。相当于tx1的零确认是安全的。

第3章 防止不了矿工的零确认双花

通过CDS操作码来构建带保证金的交易的方式,来获得零确认的安全保证,关键在于用户A广播双花交易tx2后会被矿工花掉保证金。但如果用户A根本就不广播tx2呢?

如果用户A是一个矿池,矿池可以不广播tx2,而直接在自己挖到的块里打包进tx2,就可以完美双花成功。一旦tx2被打包,那tx1就作废了,也就不存在“保证金output3”了。

事实上,非算力用户发起的比特币现金的零确认交易安全性非常高,普通用户要双花零确认交易实在是太难。真正有能力对零确认交易发起双花的是矿池用户。这我在文章《比特币(包括BTC和BCH)的零确认到底安不安全?》的第3章有描述。

所以我认为使用CDS防零确认双花是说不通的。