可編程貨幣的魅力:比特幣現金零確認安全支付方案和其有效性博弈

第0章 引言

加密數字貨幣是一種可編程的貨幣,可編程就有意思了。本文分享一個特別有意思的零確認解決方案,和其有效性分析。

可編程貨幣的魅力:比特幣現金零確認安全支付方案和其有效性博弈


第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》https://www.yours.org/content/awemany%E2%80%99s-0-conf-solution-05c960d3d60e

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

用戶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防零確認雙花是說不通的。

第4章 結束語

白高興一場。


分享到:


相關文章: