某個節點搶到該區塊的打包權(計算哈希值滿足條件),立即將這段時間收集的交易打包成一個區塊,並廣播出去。其它節點一旦收到該區塊並驗證無誤,就會停止該區塊的打包權爭奪(哈希計算),轉而開始爭奪下一區塊的打包權。有個問題,有沒有可能兩個節點同時搶到該區塊的打包權,並廣播出去。這種衝突如何解決呢權?


這是一個非常好的問題。要想了解清楚這個問題,需要明白比特幣挖礦中的實質:到底比特幣挖礦是在幹嘛。

比特幣挖礦,我們可以說是不同的節點(只有挖礦的才是節點)競爭記賬權。通過工作量證明機制,來代替「一人一票,一IP地址一票」,來提供一個具備成本的「多數」表決。挖礦不僅僅是要最快的搶到該區塊的打包權(計算哈希值滿足條件),還要讓更多的其他人認可自己的打包結果,在自己的區塊上進行投票。這不僅包括更早提出區塊,來證明自己背後有足夠多的工作量,更要快速的把區塊傳播給其他的節點,並讓其他節點在自己的區塊上投票。

節點之所以要選擇「先看到的區塊」,是基於一個假設,先看到的區塊往往具備傳播更快的優勢,可以更快的傳播到其他節點。但這未必是真實的情況。實際節點主動選擇應該在哪個區塊上投票,是有更複雜的考量因素的,包括觀察到的其他節點的選擇,這些節點背後可能的算力分布,區塊的交易數量和區塊大小,區塊中的交易是否有雙花,區塊中的數據是否符合法律規定(黑白名單),等等。

所以,如果兩個區塊在相近的時間搶到該區塊的打包權,最終所有的節點,會根據自己的判斷,選擇一個在長期來看更有可能成為最長鏈一部分的那個區塊投票。經過幾輪迭代的競爭,最終會通過算力投票來解決爭端,形成一個壟斷性的算力佔優的區塊並迅速吸引到更大的算力支持,或者暫時分裂成不同的鏈。


會出現這種情況(幾率很小,因為比特幣10分鐘才一個區塊),這就是分叉。

假如A、B兩個礦池可以同時計算出一個新的區塊A1,B1,但他們同步節點的能力不同,如果A礦池同步給其他節點的效率更高,那打包下一個區塊的時候,選擇在A1區塊後追加新區塊的概率就大很多;只要A1區塊後面追加了一個區塊,依據最長鏈原則,B1區塊就會被廢棄。

這就解決短暫分叉問題,最長鏈原則是自帶激勵的演算法,畢竟挖到一個區塊的獎勵有 12.5btc*9000$=11.25萬美元,沒人會跟錢過不去。


有可能,而且發生頻率還不低。

解決方法是,看接下來的礦工承認哪個塊,以最長鏈為準。如果雙方各自都有算力支持,並且長期競爭,那麼就會產生分叉,比如BCH和BSV。


有回答誤以為由此產生的孤塊為「分叉」,特意澄清一下。

這應該是孤塊(orphan blocks),不是分叉。雖然形式上表現為主幹上的一個短分枝。

分叉(fork)指演算法的變更產生兩條互不兼容並各自獨立增長的區塊鏈。分叉通常是程序員主動的行為,或者特定版本的BUG。

孤塊是礦工競爭的必然現象,以此激勵礦工儘快將自己剛生成的塊傳播出去,同時也激勵礦工儘快將其它礦工新生成的塊取到。礦工這兩點做得越好,就越能降低自己生成的塊成為孤塊的概率。這就要求礦工增加帶寬、優化網路連接。

這是中本聰比特幣天才設計的亮點/要點之一。視孤塊為洪水猛獸的,都沒理解比特幣。

只有符合比特幣白皮書的才是比特幣。


有可能。但是曠工為了自己的利益只會基於最長的一條鏈進行區塊驗證和打包新區塊。否者,一些曠工挖出的塊會最終被大多數曠工認為無效。這也會造成分叉


原來沒有想過這個問題,來學習一下。

現在的算力是是統籌式的,等於說只看你的算力貢獻都,每個參與者都會獲得相應的獎勵。


有,會選擇最大難度鏈。


推薦閱讀:
相关文章