如何破解比特幣雙重支付難題?

tomatocc發表於2015-05-30

how 在本文中,我將通過幾個真實案例來進行討論,並且闡述了幾種方案。我也說過,這個比特幣專案計劃正在實施當中。

本文主要對比特幣錢包開發商和付款系統進行研究。

首先,雙重支付有多嚴重?

現實生活中存在的雙重支付

有幾種方法可以做到比特幣的雙重支付。一種是讓礦工來幫實現,另一種就是成為一個礦工。2013年11月在 GHash.io 礦池就發現博彩網站BetCoin存在雙重支付詐騙,網站使用的每一次交易都不需要等待確認就可以進行。

GHash.io 稱:他們通過調查發現:那個在公司通過做雙重支付來詐騙的員工已經被解僱了,但是卻沒有確切的證據證明解僱的那個人是詐騙犯,這件事也就成為了雲裡霧裡。無論如何,這件事沒有對市場造成很大的衝擊,大部分的礦工幾乎都沒有聽說過這件事。

Eligius礦池實現了一個在正常交易上面做的臭名朝著的交易確認。這個臭名昭著的交易被礦池所有者 (Luke Dashjr) 稱為“非交易垃圾資料”(non-transactional data spam)。這個地址可以在這裡找到。這筆交易直接被忽略掉了,就像這筆交易沒有被廣播出去:這意味著一個人通過製造一筆交易,然後被分成兩個地址。就使得,記憶體池在 Eligius礦池和其他人之間變得不一致,這樣一個雙重支付就在Eligius裡進行了,如果誰發現了這一個區塊,那麼這個區塊上原來的交易將被取消。

該漏洞已經被用來從事一種準交易服務的雙重支付。經過對這個臭名昭著的交易進行檢查,一個詐騙者試圖幾次攻擊之後就放棄了。

Eligius礦池運營商不希望看到犯罪分子犯下這樣的罪行。事實上,他們對交易方式增加了一些補丁。Luke Dashjr告訴我說,他會解決這個程式碼的問題,但是他自己解決不了,這不像大多數礦池那樣。Eligius和Luke是去中心化的,在(GBT)挖礦協議上工作,它可以讓礦池變得更穩定。因此,除非 Eligius的礦工決定集體工作,這樣才可能會讓礦池變得不穩。

以上這兩種是我最為熟悉的。不過在有關方面的要求之下,第二個省略了細節。可能有關雙重支付沒有進行過公開討論,但是在2015年三月末沒有過這樣的討論。我檢查支付處理器和雙重支付系統:他們告訴我這不是他們的問題。

有很多的雙重支付發生在比特幣網路上。

讓我們假設雙重支付變得很糟糕, 並且提出一系列關於雙重支付問題的解決辦法。

分析交易風險 支付渠道 由受信任的第三方簽名 遠端認證 ID驗證 等待確認 處罰雙重支付的區塊

協議的風險分析

值得一提的是,Eligius 採用的是雙重支付的第二種情況,是基於一個協議的漏洞: Eligius用的不是相同程式碼的記憶體池,不過它的使用規則是公開度,並且很容易進行檢查。

這裡有兩個錯誤:

交易A鏈是在底部進行的自由交易。這保證了Eligius有足夠多的時間找到新的區塊。 給這個臭名昭著的骰子地址進行交易。 這兩個的程式碼都很簡單,這就是為什麼是商家能夠如此迅速的作出檢查的原因。

礦工所在大多數記憶體池的差異是由於版本的差別所致。比特幣核心開發者公佈了新版後,總有一些礦工能夠快速的進行升級,同時也有升級慢的。但是區別基本上都是不容易觀察到的細節問題。正在進行更新的錢包可以檢測到那些被改變了的交易,並且將其標記為待確認。

鑑於,今天要做一個雙重支付的報告,我認為個協議風險分析會涉及很多

雙重支付交易的廣播

瞭解雙重支付最好的方法就是自己嘗試,如果你感覺他的速度不夠快,你可以在交易完成之前的任何時候終止交易。

這就是為什麼加文•安德森( Gavin Andresen)和湯姆•哈丁(Tom Harding)已經自己實現了。

無論是比特幣核心錢包,還是下一個BitcoinJ 軟體的錢包,都可以對未確認的交易進行通知。當一個交易沒有被確認而通過雙重支付交易得到了確認,這個時候BitcoinJ軟體便會通知你。

比特幣的核心繫統沒有雙重支付交易的廣播,因為關於打破雙重支付那些無休止的爭論是毫無意義的,但是我將它收錄到我的Bitcoin XT補丁之中,以便幫助其他人使用XT。

Bitcoin XT是一個新軟體,我沒有做過任何形式的推廣。不過它的程式碼適用於Windows,Mac和Linux。系統之間可以共享資料目錄。所以如果你要使用的話,可以很輕鬆的進行來回的切換,而不需要重新下載資料。

Bitcoinj的風險分析

大多數的錢包如今已經不做協議風險分析了。而BitcoinJ卻可以做到,只不過一些程式碼還不太詳細。例如,它檢查不到Eligius。

使用這個框架來建立一個交易風險分析,並通過HTTP將結果匯出(使用JSON-RPC,protobufs或二者相結合)。如果對建立在Bitcoinj之上的熱錢包和SPV錢包客戶端進行相同程式碼的風險分析的話,那將會有效的多。

支付渠道

我在2011年描述的結構協議合同中有提到過支付渠道的使用,後來與傑瑞米•斯皮爾曼(Jeremy Spilman)進行了合同協議的調整。最初的描述沒用到支付渠道術語:當我和馬修•科拉羅(Matt Corallo)開始實施Bitcoinj.計劃後,在開始使用的時候才會用得上。

簡單的說,我認為的支付渠道是:你和賣家同時在SIG上鎖定了價值,然後在進行交易。這一步會涉及到在比特幣的網路上進行廣播。然後便開始進行交易(給賣方),但是不通過P2P網路。其中最典型的就是微額支付:每次你用這種微服務或者你給他們一筆交易,這樣都比以前快很多。最後買家和賣家進行確認在P2P網上進行結算:最終這筆資訊將被廣播出去並且通道被關閉。

根據觀察這個方案早在一箇中心分支系統中被應用,以實現商家付款處理器的支付渠道網路。而並不需要觸發區塊。這裡可以很容易的看到,如果在之前你已經過有一個支付渠道被開啟,那麼你就不能再通過該渠道進行雙重支付確認交易。

我是微額支付的狂熱粉絲並且用微額支付進行過檔案下載。我不太喜歡使用這種方法來抵制雙重支付的原因如下:

支付渠道的協議是很複雜的,製作後想要實現的話是很槽糕的,但它處所有的邊界情況還是很好的。在Bitcoinj的程式碼處理當中,如果一方關閉了該通道,序列化的資料將儲存到磁碟當中,因此在一方當事人消失之後,該應用程式將會重新啟動。到目前為止,我認為只有Bitcoinj才擁有這種支付渠道。如果要求所有的錢包來實現這個協議似乎很極端:錢包開發者最大限度的開發比特幣協議,更不用說在協議合同上的眾多複雜步驟了。 更糟糕的是:即使針對協議的所有邊緣情況進行處理,使用者也不願意去知道他們是如何去支付的更多細節。因此建立、使用說明和渠道損毀都必須在使用者介面中進行公開。這樣也就變得更復雜。 如果只有一部分錢包實現了這個功能,那麼商家還是願意去接受以前的那種廣播模式。因此,騙子們也是盡力的聲稱不建議使用該錢包,並說它也沒有什麼意義。 如果您沒有與商家建立支付方式,或者通過中心分散網路的途徑。 那麼你就必須要組建這樣一個渠道。在應用的時候,需要我們等待一個確認,使用者有時候會一直的在等著。而避免這種情況的發生就是接受沒有確認的交易。 很清楚的可以看到,這種支付渠道的方式佔用了使用者的資金。如果你有錢去做一個通道,然後你想用它在商家那裡沒有這種通道買東西,你就必須關閉通道,並要求他們為你關閉通道。但是如果他們沒有這樣做,或者做的很慢,那你就必須要等到這個通道到期才可以使用。在這種情況下你去向使用者解釋的話,那是很難的。 另外值得一提的是,這種支付渠道受到了攻擊延展性。但是固定的交易延展性仍在工作:因為支付渠道是如此複雜,任何試圖去執行它的時候沒我覺得它已經完成了它的工作。

信任的第三方簽名

GreenAddress.提出了一個方案,其中多重簽名的幣被使用者和可信任的錢包伺服器所擁有。錢包服務發出付款通知的時候,它將不會出現雙重支付。

實際上,這意味著將在可信任的第三方 (TTP)那裡簽名BIP70的付款資訊;這個PKI可以很好的做到這一點。

雖然這個技術工作起來很簡單,不過它將改掉傳統銀行的一些缺點:

使用者使用 TTP的話會很倒黴的 這個幣是 2-of-2,因為使用者可以自己控制進行簽名,其他的保護是行不通的。 GreenAddress 可以通過來鎖定交易時間,這樣如果對方離開的話或者拉黑你,你的幣最終會被返回。這是一個完美的解決方案。但是目前沒有任何商家使用,因此我不知道這個工具怎麼樣。 商家不得不瞭解和評價這個TTPs,然後他們必須去配置他們的系統來識別那些TTP。然後比特幣使用者還必須找到一個TTP,並對其進行評估,選擇一個幣進行配置。這種不靈活的工作給在職人員提供了優勢。 理想情況下 如果該TTP違反規定的話,是會有一個自動的系統來保留證據的。但這不是specced. 這個方法在某些方面像是不匿名的礦工網路系統,他們使用一般的簽名,而不是POW形式的”signatures of effort“(Blockstream 稱其為動態多重簽名)。但是目前比特幣框架具有相當多的優勢,即市場流動性很強。在通常情況下,我們會盡最大努力來維持市場的平衡。

遠端認證

在GreenAddress方案裡有一個轉變就是利用一個可信計算機進行遠端認證,而不是通過一個值得信賴的錢包公司。

可信計算機的一個特性就是現代晶片組。CPU或TPM晶片的一份宣告中顯示:“我是一個真正通過X製造的硬體,我在Y上面執行軟體”。遠端認證是一個很複雜的技術,我隱藏了很多細節問題,但總的來說——這將通過你的電腦來證明這不是雙重支付。

實際上,你的計算機成為可信賴的第三方,除非不知道該怎麼做,因為整個過程無需在本地的任何伺服器上執行。

和TC有關的問題是,執行AMD,英特爾和ARM的計算機都可以建立遠端證明系統。這項技術盡在伺服器市場就被很好的利用了。

即使執行該方案也是有同樣的問題:如果不是所有使用者都可以做到這一點,那麼騙子就不會在假裝他們沒有收到正確的交易以及以前交易多雙重支付問題。除非所有的交易都會簽名,並且不限制以前的交易。

ID驗證

一個解決雙重支付非常簡單的方法那些信用卡受理商已經在做了:買家進行ID驗證來解決詐騙問題。例如,使用Javascript,evercookies等一些付款處理器,在信用卡的空間裡使用IP地址分析,計費/交易地址匹配,來抓住騙子的資訊。在極端的情況之下,使用者完全可以阻止交易發生或者提交檔案進行稽核。

這種方法既簡單又行之有效,但是額度較高的交易卻是不方便的。不過先進的技術可以把這個問題給解決,但是我們希望這不會發生,因為這樣的話會影響正常的交易。

等待確認

這一個看起來會明白很多了。理想狀態下,如果你能等待交易的確認,但是商家卻不會這樣做,甚至你可以把這個事兒想象成從一個倉庫裡運物品一樣,那是不可能的事情。

我懷疑它的主要原因是現有的基於付款的這個流程主需要幾秒鐘的時間,雙重支付的發現是在幾個星期或者幾個月。這是信用卡的使用模式。先前4、5個月的扣款資訊被回滾也不是前所未有的。延遲幾個星期的時間,是因為人們需要一段時間來獲取和檢查資訊。所以除了像節假日和預訂機票外,大部分商家就必須接受信用卡雙重支付並承擔商業風險和它的價格:他們通常不能在商品或者做服務之前撤銷,是因為信用卡實在是太慢了。

因此很矛盾的一點是即使比特幣的雙重支付可以在幾分鐘內被洩漏出去,但是商家也不能用該資訊,因為他們沒有一個核實的工具或者程式來進行執行。商家在決定付款的時候區塊鏈變做出 反映,資料庫也開始更新,資料被分到指定位置,電子郵件也被髮送出去。如果他們不想繼續進行交易,就需要購買一個軟體或者程式來取消。

商家可以通過使用者的發票來進行修改,但會暫時中斷使用者的流量,可能也會讓你覺得比特幣的交易比信用卡還慢的多,但是在某種意義上來說,它比信用卡是快很多的。因此他們只接受BitPay和Coinbase的交易,目前還沒有遇到過雙重支付。

處罰雙重支付的區塊

挖礦的時候通過記錄儘可能準確的事件資訊,是為了防止雙重支付的發生。然而礦工芬尼(Finney)沒有這樣做,他們集體給比特幣社群傳送服務,但是實際上是並沒有提供挖礦補貼。

通常,當你收到一個東西都時候然後卻不付款那是有後果。礦工同分叉的鏈和撤銷交易的後果是失去他們的電費(即金錢),這樣就能起到一個很好的激勵作用。對於芬尼攻擊而言。

Tom Harding 一直從事於研究 Finney攻擊,使其產生輕微的波動儘可能的瞭解到更多的原理。當然了對於這種輕微的變化也不能忽視,這一切對於比特幣的穩定執行至關重要。他寫了一篇關於這些原理的分析文章並且針對此提出了很多建議。他的目的想讓交易發生的30秒後變得更加穩定。

打破“0確認”交易

任何事情都無法做到完美,也許它就不應該全部都做到最好。

產生這種思維的原因之一是雙重支付還沒有整合到比特幣的核心裡去,必須要通過比特幣XT來代替。

問題是在貨幣發展歷史中沒有出現過未欺詐的支付系統。銀行電匯作假、信用卡回收、票據偽造、假幣和重複區塊。如果人們經常“保護”那些不太完善的支付系統,他們將不會在交易所裡得到任何東西。因此在實際的交易中就會存在雙重支付風險,企業就必須要虛如何管理和學習自己承受範圍內的風險知識。

比特幣沒有什麼與眾不同的:只不過它涉及到很多不同的風險和管理技術。 截至2015年,許多商家都開始理解風險意識: 即接收沒有被確認的交易是值得的。因此他們試圖打破這個模式來保護人民財產的安全,使盡可能多的印製美元。不過這樣的邏輯不僅荒謬,同時也會傷及無辜的人,並且也是違法的。

這個觀點行不通的另一個原因是,儘管這個處理潛在為題的功能是誘人的,但是這不適合比特幣的模式。

如今,幾乎所有的商家都接受這種交易,並把BitPay,Coinbase,Coinify和其他付款處理器設定為預設交易。 實體店需要他們 新的應用程式總是不會被人們所看到,其實它最終還是要給使用者來用的。 根據我自己用比特幣來買東西和買東西的銷售經驗來看。 不管我們喜歡還是不喜歡,區塊鏈演算法是不是解決了所有的支付問題,我們也不會從市場中得到任何東西。我們會盡最大的努力去優化現有的系統,相信人們也會支援我們的這一努力。 ---- 原文:https://medium.com/@octskyward/double-spending-in-bitcoin-be0f1d1e8008 作者:Mike Hearn 譯者:tomatocc 譯者btc地址:1BQpsoxUq7N5Hv57QCnzLBbZSHGtqafaFy

相關文章