比特幣被雙花了嗎?

7號比特幣在高度788686發生了一次2個區塊的臨時分叉。

競爭發生在Foundry USA和AntPool兩個礦池之間。

根據ForkMonitor的監測,Foundry USA在AntPool之後報告了分叉的區塊。

在討論比特幣出塊問題時,我們要格外注意『時間』概念。

比如,上面的話裡,所謂的『之後』就是一個時間概念。

說Foundry USA在AntPool之後報告,隻是ForkMonitor收到他們雙方發出的區塊數據的時間先後。

收到來自Foundry USA的區塊的時間是20:47:33,收到來自AntPool的區塊的時間是20:45:24。

但是這並不意味著,全世界其他地方的節點,都是先收到AntPool的數據,後收到Foundry USA的數據。

這可能受到互聯網聯網環境的諸多影響。

因此,我們並不能根據接收到區塊數據的先後來決定采用誰的區塊。

因為,這個『先後』是沒有共識的。

有人看到Foundry USA在先,有人看到AntPool在先。

那怎麼辦呢?有讀者可能會說,那我們看一下他們各自報告的區塊裡記錄的出塊時間戳呢?讓我們來看看。

有趣的事情來了。

雖然Foundry USA後報告了區塊,但是它報告的區塊時間戳卻比AntPool的早。

Foundry USA的區塊時間戳是20:45:10,而AntPool的是20:45:13。

甚至我們用主動語態來描述這個事情也扭曲了客觀事實,因為『Foundry USA報告的區塊』《the block Foundry USA reported》這樣一種表達暗含了Foundry USA有意為之的意思,而這一層意思屬於主觀觀點,並非客觀事實。

思考難免要借助於語言,而語言會反過來讓思考陷入誤區。

能夠始終準確分辨主觀觀點和客觀事實,是很重要的,有時候也是困難的。

此處,用被動語態表達可能會更準確,即表述為『從Foundry USA收到的區塊』《the block received from Foundry USA》。

好了,來自Foundry USA的區塊時間戳比AntPool的早3秒鐘,但是到達的時間卻晚了2分多鐘!

那麼我們是否可以按照它們各自報告的區塊時間戳的早晚來決定采用誰的區塊呢?顯然也不能。

因為區塊時間戳是出塊的礦池可以在代碼約定的范圍內隨意設置的,那麼也就是不完全可信的。

這也不是共識。

我們的意思並不是誰在故意篡改時間戳,我們隻是說這是很容易做到的。

比如Foundry USA在20:47:00產生了區塊,但是卻把區塊時間戳寫成20:45:10,這是可以做到的事情,沒有誰能夠阻止。

所以,我們並不能盡信產生區塊的礦工記錄的區塊時間戳。

中本聰告訴我們,在去中心化的情況下,我們唯一可以相信的,是投入算力計算出來的工作量證明《Proof-of-Work》。

這就是比特幣所采用的最大工作量證明鏈共識原則,或者簡稱為最長鏈原則。

在上面的案例中,最終AntPool的分叉打敗了Foundry USA的分叉,獲得了全網算力的支持,快速超越Foundry USA分叉的長度,淘汰了後者產出的2個區塊。

比特幣被雙花了嗎?

圖:分叉

當然,被Foundry USA打包在這兩個區塊中而未被AntPool分叉所包含的交易,就會被退回到待打包交易池中,重新等待打包。

隻需要再等待一段時間,總會有礦工將其打包到區塊鏈中的。

整個過程沒有任何問題,完全符合比特幣的工作原理。

唯一有問題的,可能是不懂這個工作原理,而把交易出現在兩個臨時分叉中誤稱為『雙花』《雙重花費,double-spending》。

這實在是對於這個概念的誤解。

真正的『雙花』,是付款方發出兩個交易,花費同一筆比特幣《同一個UTXO》。

一個交易把比特幣UTXO付給收款方,另一筆交易把同一個UTXO付給自己。

讓第一筆交易進入Foundry USA的分叉,另一筆交易進入AntPool的分叉。

待Foundry USA的分叉出現了一個區塊確認後,告訴收款方,『嘿老兄,幣已付』。

然後坐等Foundry USA的分叉被淘汰,AntPool的分叉勝出,從而實現撤銷掉給付款方的支付,而把幣回收到自己的口袋裡的效果。

一看便知,這是很不容易做到的。

至於有交易所采用極少區塊確認就給充值用戶上賬,而且也不檢查UTXO,看到一次鏈上充值交易就上一次賬,從而導致多給用戶記了餘額,那純粹是自己找抽,怪不得比特幣。

感謝閱讀,歡迎關注,每天免費分享幣圈最新消息,潛力幣種,公眾號:Crypto晴天