探討比特幣(包括BTC和BCH)的零確認的安全與否?

比特幣的零確認可以讓支付秒到,如果能實現安全的零確認,那對BTC和BCH的用戶體驗都是質的飛躍。相對來說BTC的粉絲絕大多數是拒絕零確認,而BCH的支持者則熱衷於發展零確認的安全性。本文分析下零確認的安全性。

什麼是雙花?

說零確認不安全就是指零確認的交易有被雙花的可能性,要講明白其安全性,首先就是要定義清晰雙花這個概念。

因為是數字貨幣,數據是可複製的,這就使得一筆數字資產可以被重複使用,這就是雙花。簡單來說雙花就是一筆錢花兩次,甚至是花多次。要注意“雙花”這個概念,重要是在於“花”這個動作,而這個動作是不是能夠成功並不是定義“雙花”的關鍵,只要同一筆數字資產被“花”出去了兩次或多次,那就是“雙花”。之於兩次“花”的動作是否都收到了所購買的商品,即是否成功騙到交易對手,那就是另外一回事了,這分為雙花成功和雙花失敗。

下面為了描述方便將發起雙花攻擊的人稱了詐騙者。

以下是典型的雙花場景。

詐騙者使用比特幣購買數字產品,比如購買一本電子書,價格為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(中本聰骰子)就因接受零確認交易而被人雙花過。

區塊鏈瀏覽器在偵察到雙花交易時,一般會標記出來,如下圖。


探討比特幣(包括BTC和BCH)的零確認的安全與否?


本質上區塊鏈的發明就是解決了雙花難題,比如比特幣區塊鏈處理雙花交易的結果最終只可能有一筆合法的交易被確認,而另一筆會被拋棄。

非算力用戶雙花零確認交易

對零確認的交易發起雙花,理論上分為兩類,一類是普通用戶發起的雙花;第二是礦池發起的雙花。

先說第一類,一個詐騙可以在網絡上物理位置相差很遠的兩個位置構造兩筆相沖突的交易,比如詐騙者刻意把第一筆交易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的生態也都針對這一類雙花攻擊作了一定的防禦,比如區塊鏈瀏覽器就會收集雙花交易,並提示用戶注意。大部分節點錢包也會拒絕廣播手續費太低的交易,但並不是所有的錢包都會拒絕。

總的來說,非算力用戶想針對零確認交易進行雙花是很難成功的,只要商家有基本的比特幣知識就可以防禦。

算力用戶雙花零確認交易

第二類針對零確認交易的雙花攻擊是礦池發起的。詐騙者本身是持有算力的。

針對上述第一類用戶發起的雙花攻擊,關鍵是有兩個,第一是防止商家發現相沖突的交易;第二個是詐騙犯要引誘礦工優先打包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整個生態並不重視零確認的安全性。

防禦零確認雙花攻擊服務——Atlantis

BCH網絡生態是非常重視零確認安全性的,有這麼一個項目,叫Atlantis,這個項目在全球各地部署很多的bitcoin cash節點服務器,用於探測雙花交易。也就是探測上面章節描述的相沖突的tx1和tx2。只要探測到了,就會提醒用戶此交易有可能被雙花。

Atlantis項目提供一個API服務,任何商家都可以通過API獲取交易是否存在雙花的概率,商家可以在這個項目的保護下可以在3-5秒後就接受零確認支付。

這個防禦服務可以杜絕掉第一類雙花攻擊,但無法杜絕掉算力雙花,因為算力雙花的tx2交易在被打包前根本就不會被廣播,不可能被偵察到。

提高零確認交易安全性的辦法——弱區塊

挖礦是使用礦機算一個隨機數,當算得的隨機數小於系統設定的目標值時,那挖礦成功,挖到一個區塊。比如目前的BCH網絡系統設計的目標值是前面16個零,如果一個礦工算到了一個17個前置零的隨機數,那他就挖到了一個塊。現在我們將這種區塊定義為“強區塊”。

如果將“強區塊”的目標值調低,比如降為現在的1/8,即前置2個零即可,如果有礦工計算到的隨機值小於這個“1/8目標值”,則定義為挖到一個弱區塊。這樣一個強區塊就包含了8個弱區塊。

強區塊有區塊獎勵,12.5個幣(BTC/BCH)。但弱區塊沒有區塊獎勵,但弱區塊可以打包交易,可以將交易手續費拿走。也就是礦工挖弱區塊只有手續費拿。

如果所有的礦工都參與於挖弱區塊,那就可以提高零確認的安全性。為什麼?因為弱區塊的設定相當於降低了區塊間隔時間,商家可以依據tx1是否被打包進一個弱區塊來決定是否發貨。只要打包進一個弱區塊,那這個交易就得到了承認這個弱區塊的礦工的認可,只要這些礦工任何一個挖到一個強區塊,那這筆交易都一定會被納入到這個強區塊中。

現在弱區塊技術還沒有開發出來,只是理論上存在的技術。

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%攻擊。

安全的零確認交易意義重大,意義有多重大呢?假設BCH網絡最終讓整個生態接受了零確認是安全的,那哪怕是所有的BCH礦池被同一時間摧毀,對所有用戶來說,也無關緊要,交易照發,只是零確認罷了,而且零確認的交易還可以再發給下一家,而確認只需要慢慢等礦工恢復生產就好了。

零確認如果能夠真正安全,那就是去中心化的最大勝利,因為這是一個絕對不可摧毀的網絡了。


分享到:


相關文章: