節點如何知道共識並調和差異?
有很多類似的問題,但我找不到針對我的問題的滿意答案。
1.單純從單個節點的角度來看,它如何知道它收到的區塊是大多數共識選擇的區塊,因為它只知道直接相鄰節點的存在?在這個區塊上同意的 10,000 個節點中沒有 6000 個。
假設
Node A
從其相鄰節點接收以下塊作為最新塊(都具有相同的塊號):因此,總共
Node A
收到 2 個Block 1
、1 個Block 2
和 1 個Block 3
。是否Node A
繼續並確定這Block 1
是大多數?是否Block 2
都Block 3
成為 Ommer 塊?2.節點之間是否會出現差異,比如
Node B
收到 3 個Block 2
而不是 1 個?如果是這樣,他們是如何和解的?節點是否使用 CRDT(無衝突複製數據類型)?
純粹從單個節點的角度來看,它如何知道它收到的區塊是大多數共識選擇的區塊,因為它只知道直接相鄰節點的存在?
它沒有。PoW 是一種機率共識,節點可能無法接收到某些資訊,從而與網路的大多數部分不同步。節點將根據他們對區塊鏈的本地視圖簡單地探勘符合共識規則的內容。區塊鏈的集體觀點只是許多個人觀點的聚合。
此外,區塊和交易傳播是在 P2P 網路中盡最大努力進行的。您直接與您的直接鄰居(對等點)進行互動,但他們的對等點集與您的不同,這意味著每個節點都直接或間接連接到任何其他節點。網路是資訊傳播的媒介,最終到達您的對等點之一,該對等點會將其轉發給包括您在內的其餘對等點。
對於您所描述的情況,假設塊 1、2 和 3 共享一個共同的父塊 0,這是一種分叉情況。它的解決方式與您收到該塊的次數無關。從技術上講,一個塊只被完全接收一次,當一個節點用一個未知的塊頭做廣告時,它會請求一個未知的塊。
鏈實際上看起來像這樣(再次假設它們共享相同的父塊):
**這些區塊中的每一個(1、2 和 3)都是作為鏈頭的有效候選者。**雖然您可能會根據塊難度應用一些選擇規則,但讓我們假設它們也具有相同的難度,以了解最終如何解決不一致的狀態。
礦工將隨機選擇其中一個區塊並開始對其進行探勘。在某個時候,將創建一個新塊(塊 4)並通過網路傳播。該區塊是否擴展了區塊 1、2 或 3 無關緊要。按照最長/最重的鏈規則選擇,其他礦工將加入並繼續在其之上開採。
在這種情況下,頭塊的選擇將是隨機的,這三個塊中的任何一個都有大約 33% 的機會最終進入主鏈,因為 100% 的計算能力被均勻地分配在這些塊中。
當新塊被傳播時,最終導致回到一個一致的狀態,比如這個:
這與你收到 Block X 的次數無關。Block 1 和 Block 2 進入主鏈的機會相同,這裡恰好是 Block 2。
如果您的範例沒有暗示它們都共享一個共同的父級,那麼在大多數計算能力將任何塊視為頭部的任何塊都具有成為主鏈一部分的可能性最大的意義上,這是相似的,因為大多數將專注於在它之上進行探勘,因為這符合他們對區塊鏈的本地看法。
2.節點之間是否會出現差異?
是的,這種情況經常發生……網路可能不可靠、延遲消息或丟棄其他消息,而且您必須承認存在故障/惡意節點的可能性。請記住,解決這個問題的方式與你收到一個塊的次數無關,一切都與遵循鏈選擇規則(如果適用)以及跨時間分配計算能力的方式無關。PoW 確保這種情況最終會得到解決。
我特意簡化了幾點,但我想這足以理解這個想法。
我希望這能回答你的問題。