Orphaned-Blocks
塊重組是否以這種方式工作?
我需要一位專家來澄清我對阻止重組的理解是否正確。我找不到可以說服我的答案,聽起來只有我不知道什麼是塊重組:(。
假設我的比特幣網路共有 10 個節點,10 個節點中有 10 個都是礦工
假設我已經成功開采了一個區塊#10,那是另一個競爭對手也同時開采了相同高度的區塊,然後我關閉了我的節點。
幾天后,我重新啟動了我的節點,那麼現在我的比特幣程序中會觸發什麼事件?我想可能的步驟是這樣的。下面的“I”指的是我的比特幣節點。
- 我發現我最大的鍊是塊#10,雜湊為 0000123。
- 我向所有同行廣播 getheader 消息,最大查詢塊 = 我的塊高度 + 100 以在我的塊之後獲取接下來的 100 個塊頭。
- 說我的 5 個同齡人返回給我結果。我想知道現在比特幣是否對返回的結果執行 PBFT?說至少有 3 個同行給我同樣的結果,那麼我認為這個結果是正確的。
- 好的,現在從第 3 點返回的結果告訴我,在我的塊雜湊之後不再添加塊,我知道我的塊已被孤立。
- 接下來,我將我的區塊高度降低到 9,然後我再次詢問我的同行,同行回复我是的,即區塊#10,其中雜湊為 0000456,prevhash 與我在區塊#9 中的雜湊相同。
- 在開始下載從雜湊 0000456 開始的所有塊之前,我需要孤立我的塊#10,所以我將它從鏈中刪除並將交易恢復到記憶體池。
- 現在我覺得可以安全地繼續下載,直到遇到大多數連鎖工作塊。
我需要你的澄清。謝謝。
你的理解基本正確。請記住兩件事:
首先,鍊長並不是真正的正確指標,而是累積的鏈工作。對於實際討論,我們現在可以想像它們是同一回事。
第二:比特幣全節點軟體的全部目的是找到累積工作最多的鏈。它生命的全部意義在於發現該鏈並將其數據庫與該鏈同步(具體而言,UTXO 集,即未使用硬幣的列表,即“分類帳”)。
因此,誰開采了哪個區塊並不重要。只要它在執行,全節點就會嘗試通過發送定位消息 (
getheaders
) 並響應新的塊公告來與其對等節點保持同步。當一個全節點收到一個有效的區塊頭,它的鏈比它自己的小費多時,它會嘗試下載驗證該鏈所需的任何區塊。如果這些塊是有效的並且需要“倒回”目前鏈,則節點將迭代地這樣做。
考慮這組鏈提示:
A-B-C-D-E-F \ G-H-I
如果您的節點同步了塊
A
,那麼一段時間後了解了F
塊頭I
,它將首先下載並驗證塊頭,然後如果它們是有效的,則G
下載塊頭。如果這些塊是有效的,節點將與自己的鏈斷開連接,然後斷開連接,然後通過共同祖先連接塊。I``G``I``F``E``G``I``D
要具體解決您的觀點:
- 你並沒有真正“要求 +100 塊”,你所做的只是告訴你的同行你自己的鏈小費,並詢問他們是否知道任何工作量更大的鏈。
- “孤立塊”是沒有父塊的塊,這在比特幣上再也不會發生了。我認為您在這裡的意思是“陳舊的塊”,但是即使對等點沒有以更大的工作鏈響應,您的節點也不做任何事情並假設它位於正確的鏈尖上。
- 除非您按照我上面描述的方式進行重組,否則您永遠不會“降低”您的鏈條。事實上,如果有兩個高度為 10 的塊,你仍然不會做任何事情,直到其中一個鏈擴展到高度 11。然後——你會意識到那裡有一個更大的工作鏈,你的節點將嘗試下載並驗證它。