礦工花費多少時間進行驗證?
在挖礦之前,礦工必須驗證記憶體池中存在的先前區塊和交易。然後,他們從池中提取一些經過驗證的交易,並使用其雜湊在經過驗證的塊之上開始探勘。
但是,他們正在相互競爭,我猜他們真的很忙。這是我的問題。礦工一般會花多少時間進行驗證並開始挖礦?
但是,他們正在相互競爭,我猜他們真的很忙。這是我的問題。礦工一般會花多少時間進行驗證並開始挖礦?
一個都沒有。在驗證新資訊的同時,他們將繼續根據舊資訊建構塊。礦工沒有任何理由等待開始挖礦,除非在他們最初的啟動時。但是一旦他們開始運作,他們就不會停下來核實資訊。
首先,讓我們消除一些誤解:
我猜礦工需要手動驗證。就像,去 Blockchain.com 並檢查最後一個區塊和未確認的交易,然後手動檢查。所以,我想像他們需要 3 或 4 分鐘。
不,礦工執行全節點軟體,就像你自己執行一樣,他們會查詢這個全節點來尋找要探勘的候選區塊。如果挖礦涉及到一個集中的網站,我們可以完全擺脫挖礦,讓blockchain.com決定下一個區塊是什麼。重點是永遠不要信任任何其他方,而是能夠自己執行驗證。blockchain.com 是第三方網站,由私人企業運營,在比特幣協議或其運營中沒有任何特殊地位。將網站用於除調試目的之外的任何用途意味著信任他們對鏈中正在發生的事情的解釋。任何人都可以執行這樣的網站(事實上,存在許多競爭對手,例如mempool.space、blockstream.info(免責聲明:我的前雇主),blockchair.com,blockcypher.com,…)。
所以這也意味著:決定下一個候選區塊不是由採礦硬體完成,而是由軟體完成。這意味著一個不會干擾另一個 - 它們並行發生。硬體總是在探勘某些東西,而軟體總是在新交易/區塊進入時驗證它們。軟體會不時地根據自己對什麼是區塊的最佳理解,向硬體提供更新的區塊候選者交易可用。
現在,在驗證區塊和交易上花費了多少時間?大量的時間,但重要的是要指出,其中大部分時間實際上並不在建構新塊的關鍵路徑上。理論上,該過程大致如下:
- 礦工節點不斷收到新交易。這些交易被即時驗證,並儲存在記憶體池中(未確認交易的地方;每個完整節點都有自己獨立的節點)。典型的交易需要不到一毫秒的時間來驗證,但更大/更複雜的交易可能會超過這個時間。當然,它還很大程度上取決於所使用的硬體。
- 在每個時間點,記憶體池都與節點知道的最佳塊保持一致。這意味著創建一個新的塊模板非常快:只需從記憶體池中取出頂部交易(通常,出於經濟原因,每字節費用最高的交易),盡可能多的塊(在 BIP141 之前為 100 萬字節) ; 400 萬重量以來)。這些交易已經過驗證,因此不需要在候選區塊生產時再次驗證。
- 不時會收到一個新的塊。通常,該塊中的所有或幾乎所有交易在收到時都已經在記憶體池中。P2P 協議甚至為此進行了優化(參見 BIP152 緊湊塊),避免了在傳輸塊時甚至需要重複這些事務。由於這種記憶體,塊接受非常快,但如果塊中包含大量未知交易,無論出於何種原因,它有時可能會很慢。在這種情況下,驗證一個塊需要 100 毫秒,甚至在較慢的硬體上需要幾秒鐘。
- 當收到並驗證了一個新塊時,必須盡快通知硬體在此之上有一個新的候選者。在此之前的每一毫秒都意味著浪費硬體資源:它正在處理前一個塊之上的候選者,這不太可能被網路接受(節點通常只接受兩個競爭塊中較早的一個,除非後面的一個首先擴展)。為了加快速度,一些礦工實際上會讓他們的硬體切換到在一個空的在新收到的塊到達之後,在等待它被驗證之前,在新收到的塊之上進行塊。這是有風險的:因為他們還不知道收到的區塊是否有效,這可能意味著切換到建構在無效區塊之上的候選者,這本身就是浪費時間。大約在 BIP66 啟動的時候,這導致了整個無效區塊鏈的建構,因為礦工們開始在未升級的其他礦工生產的區塊之上建構,而不知道它是無效的。
每個節點的大部分內容都相同。非礦工顯然不會花時間建構候選區塊,但除此之外,對於執行完全驗證節點的每個人來說,驗證區塊和交易所花費的精力是相同的,無論是礦工還是非礦工。