第0章 引言
比特幣的零確認(rèn)可以讓支付秒到,如果能實(shí)現(xiàn)安全的零確認(rèn),那對(duì)BTC和BCH的用戶體驗(yàn)都是質(zhì)的飛躍。相對(duì)來說BTC的粉絲絕大多數(shù)是拒絕零確認(rèn),而BCH的支持者則熱衷于發(fā)展零確認(rèn)的安全性。
本文分析下零確認(rèn)的安全性。
第1章 什么是雙花?
說零確認(rèn)不安全就是指零確認(rèn)的交易有被雙花的可能性,要講明白其安全性,首先就是要定義清晰雙花這個(gè)概念。
因?yàn)槭菙?shù)字貨幣,數(shù)據(jù)是可復(fù)制的,這就使得一筆數(shù)字資產(chǎn)可以被重復(fù)使用,這就是雙花。簡(jiǎn)單來說雙花就是一筆錢花兩次,甚至是花多次。要注意“雙花”這個(gè)概念,重要是在于“花”這個(gè)動(dòng)作,而這個(gè)動(dòng)作是不是能夠成功并不是定義“雙花”的關(guān)鍵,只要同一筆數(shù)字資產(chǎn)被“花”出去了兩次或多次,那就是“雙花”。之于兩次“花”的動(dòng)作是否都收到了所購(gòu)買的商品,即是否成功騙到交易對(duì)手,那就是另外一回事了,這分為雙花成功和雙花失敗。
下面為了描述方便將發(fā)起雙花攻擊的人稱了詐騙者。
以下是典型的雙花場(chǎng)景。
詐騙者使用比特幣購(gòu)買數(shù)字產(chǎn)品,比如購(gòu)買一本電子書,價(jià)格為0.01BCH,數(shù)字產(chǎn)品不需要物流。他先將0.01BCH發(fā)給店家,我們稱這筆交易為tx1;然后同時(shí)又將相同的這0.01BCH發(fā)給自己的一個(gè)地址,我們稱這筆交易為tx2(我們先不要關(guān)心他是如何做到的,下面會(huì)解釋)。店家使用機(jī)器偵察到了交易tx1發(fā)出后,覺得沒問題,就店鋪的機(jī)器人就直接發(fā)貨了,給這詐騙者發(fā)了電子書。但因?yàn)榻灰譼x1和交易tx2是相沖突的,必然只有一筆能被打包,如果交易tx2最終被打包了,交易tx1就會(huì)被作廢。這種情況下,詐騙者就成功雙花了這0.01BCH,因?yàn)樗促I到了書,卻又收回了自己的0.01BCH。
針對(duì)零確認(rèn)雙花攻擊的策略如下:
第1步,詐騙者使用相同的UTXO構(gòu)造兩筆交易tx1和tx2,tx1支付給商家,而tx2的收款地址是自己的。
第2步,商家偵察到tx1后,在零確認(rèn)下就發(fā)貨了,比如無需物流的電子商品。
第3步,詐騙者引誘礦工打包tx2。Tx1就會(huì)被作廢。這時(shí)雙花成功,詐騙者即收到了商品,又拿回了他的幣。
零確認(rèn)是時(shí)有發(fā)生的,無論是在BTC上還是在BCH上都發(fā)生過。著名賭博網(wǎng)站SatoshiDICE(中本聰骰子)就因接受零確認(rèn)交易而被人雙花過。
區(qū)塊鏈瀏覽器在偵察到雙花交易時(shí),一般會(huì)標(biāo)記出來,如下圖。
本質(zhì)上區(qū)塊鏈的發(fā)明就是解決了雙花難題,比如比特幣區(qū)塊鏈處理雙花交易的結(jié)果最終只可能有一筆合法的交易被確認(rèn),而另一筆會(huì)被拋棄。
第2章 非算力用戶雙花零確認(rèn)交易
對(duì)零確認(rèn)的交易發(fā)起雙花,理論上分為兩類,一類是普通用戶發(fā)起的雙花;第二是礦池發(fā)起的雙花。
先說第一類,一個(gè)詐騙可以在網(wǎng)絡(luò)上物理位置相差很遠(yuǎn)的兩個(gè)位置構(gòu)造兩筆相沖突的交易,比如詐騙者刻意把第一筆交易tx1在美國(guó)廣播,同時(shí)將相沖突的交易tx2在中國(guó)廣播。中美兩國(guó)網(wǎng)絡(luò)之間有時(shí)間差。詐騙犯使用在美國(guó)廣播的交易tx1向一個(gè)美國(guó)店家購(gòu)買電子書一本,而在中國(guó)廣播的交易則是發(fā)到自己的地址上。商家看到在美國(guó)的交易后立刻發(fā)貨,但沒想到,最終在中國(guó)廣播的那筆交易被打包了,商家就被騙了。
這一類詐騙為了提高成功率,一般會(huì)配合手續(xù)費(fèi)策略。比如給商家發(fā)的交易tx1給的手續(xù)費(fèi)非常低,交易尺寸非常大,手續(xù)費(fèi)率低于1聰/字節(jié)。而詐騙犯自己給自己發(fā)的交易tx2手續(xù)費(fèi)則高于市場(chǎng)值。這種情況下礦工就會(huì)優(yōu)先打包tx2,雙花成功率就高了。
因?yàn)楝F(xiàn)在BTC/BCH節(jié)點(diǎn)都有最低手續(xù)費(fèi)限制,低于1聰/字節(jié)的交易在很多節(jié)點(diǎn)就不幫你廣播了。所以詐騙犯會(huì)用的另一個(gè)輔助辦法來提高成功率,就是使用RBF交易,詐騙會(huì)給tx2設(shè)定為RBF交易,然后在tx1和tx2都發(fā)出后,給tx2再追加一筆更高的手續(xù)費(fèi),以引誘礦工優(yōu)先打包tx2。注意BCH無法使用RBF。
這一類雙花零確認(rèn)交易的攻擊其實(shí)是非常容易防御的。第1個(gè)方法就是商店可以設(shè)定一個(gè)手續(xù)低限,比如,低于1聰/字節(jié)的交易就拒絕零確認(rèn),提高到1確認(rèn)才認(rèn)定為安全的。第2個(gè)方法就是商家延遲幾秒后,至少使用兩個(gè)區(qū)塊鏈瀏覽器來檢測(cè)是否存在相沖突的交易,如果發(fā)現(xiàn)有沖突的交易就中止交易,等確認(rèn)。
目前BTC和BCH的生態(tài)也都針對(duì)這一類雙花攻擊作了一定的防御,比如區(qū)塊鏈瀏覽器就會(huì)收集雙花交易,并提示用戶注意。大部分節(jié)點(diǎn)錢包也會(huì)拒絕廣播手續(xù)費(fèi)太低的交易,但并不是所有的錢包都會(huì)拒絕。
總的來說,非算力用戶想針對(duì)零確認(rèn)交易進(jìn)行雙花是很難成功的,只要商家有基本的比特幣知識(shí)就可以防御。
第3章 算力用戶雙花零確認(rèn)交易
第二類針對(duì)零確認(rèn)交易的雙花攻擊是礦池發(fā)起的。詐騙者本身是持有算力的。
針對(duì)上述第一類用戶發(fā)起的雙花攻擊,關(guān)鍵是有兩個(gè),第一是防止商家發(fā)現(xiàn)相沖突的交易;第二個(gè)是詐騙犯要引誘礦工優(yōu)先打包tx2。如果是礦池本身就是詐騙犯,是可以輕松做到這兩個(gè)的。
礦池的雙花零確認(rèn)的過程是這樣的,詐騙犯先構(gòu)造tx1和tx2,tx1的手續(xù)費(fèi)很低。將tx1發(fā)給商家買電子書,但tx2是隱藏起來,不廣播,只保存中自己的礦池內(nèi)存池里。因?yàn)閠x1的手續(xù)費(fèi)太低,所以礦工都不想打包。而tx2被隱藏起來了,所以區(qū)塊鏈瀏覽器是不可能發(fā)現(xiàn)有相沖突的交易的,商家也不可能發(fā)現(xiàn)。一旦商家發(fā)貨了,那詐騙者就會(huì)在自己挖到的塊里打包進(jìn)tx2,廣播這個(gè)塊。這時(shí)全網(wǎng)所有的節(jié)點(diǎn)就會(huì)發(fā)現(xiàn)tx1是非法的了,直接作廢掉。商家就收不到幣了。
要想防御這一類雙花攻擊只能依賴于其他礦池的協(xié)作。
澳本聰CSW提出了防御這一類雙花攻擊的辦法,因?yàn)樵p騙構(gòu)造的tx2交易是不會(huì)被廣播的,是以直接打包進(jìn)詐騙礦池挖到的區(qū)塊才會(huì)被其他礦池發(fā)現(xiàn)。如果其他礦池如果針對(duì)這種包含了延遲出現(xiàn)交易(tx2)的區(qū)塊進(jìn)行孤立,那這個(gè)詐騙礦池的這個(gè)塊就白挖了,損失12.5BTC/BCH,這是非常慘的事。具體的設(shè)定可以是礦池將超出一定時(shí)間,比如10秒內(nèi),都沒有見到的交易(tx2),卻包含在最新的區(qū)塊里,則直接孤立掉這個(gè)塊,在這個(gè)塊的前一個(gè)高度上挖礦。
如果執(zhí)行這種孤立政策的算力超過51%,那基本上就沒有礦池敢發(fā)起這一類隱藏交易(tx2)來攻擊零確認(rèn)交易了。
這種防御辦法是逼迫所有的交易都要經(jīng)過廣播,哪怕是算力節(jié)點(diǎn)自己構(gòu)造的交易也需要廣播。其次是要求各大礦池都要在全球部署足夠多的節(jié)點(diǎn)來收集交易。目前的BCH網(wǎng)站肯定是不行的,BTC網(wǎng)絡(luò)更不行了。我自己暫時(shí)不確認(rèn)這是否是一個(gè)好辦法。
目前在BCH網(wǎng)絡(luò)上已經(jīng)有礦池聲明將執(zhí)行這種辦法。
在BTC網(wǎng)絡(luò)上,則沒有礦池聲稱解決這一類問題,畢竟BTC整個(gè)生態(tài)并不重視零確認(rèn)的安全性。
第4章 防御零確認(rèn)雙花攻擊服務(wù)——Atlantis
BCH網(wǎng)絡(luò)生態(tài)是非常重視零確認(rèn)安全性的,有這么一個(gè)項(xiàng)目,叫Atlantis,這個(gè)項(xiàng)目在全球各地部署很多的bitcoin cash節(jié)點(diǎn)服務(wù)器,用于探測(cè)雙花交易。也就是探測(cè)上面章節(jié)描述的相沖突的tx1和tx2。只要探測(cè)到了,就會(huì)提醒用戶此交易有可能被雙花。
Atlantis項(xiàng)目提供一個(gè)API服務(wù),任何商家都可以通過API獲取交易是否存在雙花的概率,商家可以在這個(gè)項(xiàng)目的保護(hù)下可以在3-5秒后就接受零確認(rèn)支付。
這個(gè)防御服務(wù)可以杜絕掉第一類雙花攻擊,但無法杜絕掉算力雙花,因?yàn)樗懔﹄p花的tx2交易在被打包前根本就不會(huì)被廣播,不可能被偵察到。
第5章 提高零確認(rèn)交易安全性的辦法——弱區(qū)塊
挖礦是使用礦機(jī)算一個(gè)隨機(jī)數(shù),當(dāng)算得的隨機(jī)數(shù)小于系統(tǒng)設(shè)定的目標(biāo)值時(shí),那挖礦成功,挖到一個(gè)區(qū)塊。比如目前的BCH網(wǎng)絡(luò)系統(tǒng)設(shè)計(jì)的目標(biāo)值是前面16個(gè)零,如果一個(gè)礦工算到了一個(gè)17個(gè)前置零的隨機(jī)數(shù),那他就挖到了一個(gè)塊。現(xiàn)在我們將這種區(qū)塊定義為“強(qiáng)區(qū)塊”。
如果將“強(qiáng)區(qū)塊”的目標(biāo)值調(diào)低,比如降為現(xiàn)在的1/8,即前置2個(gè)零即可,如果有礦工計(jì)算到的隨機(jī)值小于這個(gè)“1/8目標(biāo)值”,則定義為挖到一個(gè)弱區(qū)塊。這樣一個(gè)強(qiáng)區(qū)塊就包含了8個(gè)弱區(qū)塊。
強(qiáng)區(qū)塊有區(qū)塊獎(jiǎng)勵(lì),12.5個(gè)幣(BTC/BCH)。但弱區(qū)塊沒有區(qū)塊獎(jiǎng)勵(lì),但弱區(qū)塊可以打包交易,可以將交易手續(xù)費(fèi)拿走。也就是礦工挖弱區(qū)塊只有手續(xù)費(fèi)拿。
如果所有的礦工都參與于挖弱區(qū)塊,那就可以提高零確認(rèn)的安全性。為什么?因?yàn)槿鯀^(qū)塊的設(shè)定相當(dāng)于降低了區(qū)塊間隔時(shí)間,商家可以依據(jù)tx1是否被打包進(jìn)一個(gè)弱區(qū)塊來決定是否發(fā)貨。只要打包進(jìn)一個(gè)弱區(qū)塊,那這個(gè)交易就得到了承認(rèn)這個(gè)弱區(qū)塊的礦工的認(rèn)可,只要這些礦工任何一個(gè)挖到一個(gè)強(qiáng)區(qū)塊,那這筆交易都一定會(huì)被納入到這個(gè)強(qiáng)區(qū)塊中。
現(xiàn)在弱區(qū)塊技術(shù)還沒有開發(fā)出來,只是理論上存在的技術(shù)。
第6章 51%攻擊和零確認(rèn)交易攻擊的區(qū)別
有很多人會(huì)將51%攻擊和零確認(rèn)交易雙花攻擊搞混,其實(shí)這完全是兩碼事。
51%攻擊是針對(duì)已經(jīng)確認(rèn)了的交易進(jìn)行逆轉(zhuǎn)的攻擊,而零確認(rèn)雙花是針對(duì)是沒有被打包的交易進(jìn)行逆轉(zhuǎn)攻擊。
51%攻擊只能是礦工發(fā)起的,持有超過51%算力的礦工才能發(fā)起的攻擊。其攻擊原理是這樣的:
第1步,詐騙者構(gòu)造tx1向商家支付,tx1被區(qū)塊高度x打包,得到1個(gè)確認(rèn),商家發(fā)貨。
第2步,詐騙者使用相同的UTXO構(gòu)造tx2,并且收款地址是自己的。
第3步,詐騙者利用自己的算力在區(qū)塊高度(x-1)上挖礦,并且將tx2打包進(jìn)他新挖到的塊。而此時(shí),其他算力礦工則在高度x挖礦。
因?yàn)樵p騙者擁有算力優(yōu)勢(shì),所以他在連續(xù)挖出2個(gè)塊,甚至更多個(gè)塊后,而其他算力的礦工只挖到0個(gè)區(qū)塊,此時(shí),詐騙者算力所在的鏈高度為(X-1+2),而其他算力的高度還是x,這時(shí)候,其他礦工所挖的鏈就會(huì)被重組,其他礦工的算力會(huì)自動(dòng)切到詐騙者的高度(x-1+2)區(qū)塊上挖礦,這時(shí)打包了tx1的區(qū)塊就被孤立掉了,tx1作廢了,tx2是合法的交易。
因?yàn)閠x1得到的確認(rèn)越多,則詐騙者要在(x-1)高度上挖到的塊就越多才能成功發(fā)起攻擊,所以tx1就越安全。而我們認(rèn)為只要達(dá)到了6個(gè)確認(rèn),則認(rèn)為這筆交易永遠(yuǎn)無法被逆轉(zhuǎn)了。比特幣白皮書詳細(xì)描述了51%攻擊的可能性,在第11章,結(jié)論是成功的概率實(shí)在太低。
比特幣歷史上曾經(jīng)發(fā)生過24個(gè)區(qū)塊被重組的,但那是一個(gè)軟件bug,并不是51%攻擊。
第7章 結(jié)束語
安全的零確認(rèn)交易意義重大,意義有多重大呢?假設(shè)BCH網(wǎng)絡(luò)最終讓整個(gè)生態(tài)接受了零確認(rèn)是安全的,那哪怕是所有的BCH礦池被同一時(shí)間摧毀,對(duì)所有用戶來說,也無關(guān)緊要,交易照發(fā),只是零確認(rèn)罷了,而且零確認(rèn)的交易還可以再發(fā)給下一家,而確認(rèn)只需要慢慢等礦工恢復(fù)生產(chǎn)就好了。
評(píng)論