區塊驗證需要多長時間?
假設礦工從連接的對等方接收到一個新塊。如果我錯了,請糾正我:礦工在自己使用新收到的塊並將其發送給其他連接的對等方之前驗證它。我聽說了,但在我看來,已經使用區塊在其上進行探勘會是一個更好的策略,因為區塊頭和與之相關的工作證明非常容易驗證,而且不太可能有人製作帶有小散列的塊頭,用於無效塊。那麼為什麼要在前一個區塊之上繼續探勘呢?
這個過程通常需要多長時間?它取決於什麼?它是在專門的挖礦硬體上還是在通用 CPU 上完成的?
區塊驗證所花費的時間與區塊的 + 見證人的大小成線性關係是否正確?
另外:一個塊通過網路傳播平均需要多長時間?如果這個平均值是根據接收礦工的雜湊算力加權的,那就太好了。
這裡有幾個問題。
如果我錯了,請糾正我:礦工在自己使用新收到的塊並將其發送給其他連接的對等方之前驗證它。
是和不是。請注意,礦工指的是自己建構區塊的人——包括獨立礦工、礦池運營商和 p2pool 使用者。僅連接到池並執行工作的雜湊器不屬於該組。
礦工可以 - 有時會 - 在他們完全處理前一個區塊之前建構一個新區塊(即使它是他們自己的),以避免時間不挖礦。不幸的是,由於他們還不知道在剛剛收到的區塊中花費了哪些 UTXO,他們不知道哪些後續交易是有效的,因此無法包含任何新交易。因此,除了 coinbase 之外,這些區塊將是空的。
在實踐中,這些礦工將有兩種機制來更新他們的雜湊器正在研究的提議區塊:
- 在他們自己的網路中宣布一個新的最佳區塊雜湊(或在另一個礦池的網路上檢測到 - 例如通過監聽他們的礦池介面,或通過相互發送資訊的協議)。發生這種情況時,所有雜湊器都被告知開始在一個空塊上工作。
- 通過它們
bitcoind
(通過 P2P 協議、通過submitblock
其塊的 RPC 命令或通過單獨的中繼網路,如FIBER)接收新塊。bitcoind
然後在頂部建構一組新的有效交易(通過getblocktemplate
RPC),他們更新他們的雜湊器以開始使用這些塊處理一個塊。假設當 (1) 發生時,同一個塊將很快通過 (2),我們將從處理頂部的空塊切換到頂部的普通塊。曾經有一個事件沒有發生。
當 BIP66 啟動時,一些執行支持 BIP66 的
bitcoind
版本的礦工正在監聽由 pre-BIP66 池發送的塊。一個 BIP66 之前的礦工生產了一個不符合 BIP66 標準的區塊(錯誤的版本號),支持 BIP66 的礦工監聽並開始在頂部生產空區塊。當然,他們bitcoind
從未接受完整的區塊,因為根據新規則(礦工自己同意的規則)它是無效的。結果是頂部有許多空塊的序列,許多礦工在之前的無效塊之上建構,所有這些都沒有被網路接受。所以回答你的問題:
那麼為什麼要在前一個區塊之上繼續探勘呢?
因為新的可能無效。由於探勘無效塊的成本,它不太可能故意發生,但它可能由於軟體或手動錯誤而發生。此外,我們不應該建立依賴於這種不發生的基礎設施——因為隨著時間的推移,這樣做可能會使此類攻擊變得更便宜。
這個過程通常需要多長時間?它取決於什麼?
在您的過程中,您只計算塊驗證。但整個過程包括 (A) 在網路上創建有效塊和 (B) 雜湊器切換到在其上建構塊之間的所有內容。這包括:
- 前一個區塊創建者將區塊發佈到網路。這裡可能存在無意的延遲,甚至是故意的延遲(如自私挖礦攻擊)。
- 塊需要通過網路傳播。普通
bitcoind
節點僅在完全驗證後才會傳播,並且需要突發高頻寬來傳輸所有塊。諸如 Compact Blocks (BIP152) 和 FIBER 等最新技術可以避免完全重新送出,甚至可以等到驗證完成。- 需要驗證塊。
- 必須在頂部創建一組新的有效交易。
驗證取決於許多因素:
- 軟體版本。驗證速度不斷提高。
- UTXO 記憶體大小。記憶體越大,檢索有關正在使用的輸出的資訊所需的數據庫訪問就越少。因此,僅獲取輸入可能需要幾毫秒到幾秒鐘的時間。
- 簽名記憶體大小和 CPU 速度。記憶體越大,可以避免的簽名驗證越多。這些驗證 - 取決於軟體版本和硬體範,每個簽名從 0.01 毫秒到 0.6 毫秒不等(一個塊為 45 毫秒到 2.7 秒)。
- 記憶體池和新塊之間的相關性。如果一個塊包含一個節點以前沒有見過的交易,那麼它的輸入和簽名就不太可能被記憶體。
- 頻寬。在比特幣核心 0.13 之前,區塊總是在對等方之間完整送出,這可能會在宣布新區塊時導致大幅飆升。
- 網路延遲。在世界上更偏遠的地區,即使有良好的頻寬,網路數據包到達外部世界所需的時間也可能很長。根據協議,發送一個塊需要 1 到 3 次往返。如果兩個對等點之間的延遲是 200 毫秒,那已經意味著來回浪費了 1.2 秒。
- 連接數。如果一個節點有很多連接,它會嘗試同時向所有人廣播一個新塊,從而導致網路活動的工作量激增。這對於 CPU 或網路硬體或頻寬來說可能太多,無法處理,當存在許多連接時會導致速度變慢。
建構新區塊的時間主要取決於軟體版本。在舊版本中,它長達幾秒鐘,但最近已減少到幾十毫秒。
它是在專門的挖礦硬體上還是在通用 CPU 上完成的?
據我所知,不存在用於塊驗證或塊構造的定制硬體。
區塊驗證所花費的時間與區塊的 + 見證人的大小成線性關係是否正確?
大多。目前簽名散列算法存在效率低下的問題,交易規模可能為 O(n^2)。這可能導致單個事務需要幾分鐘來計算簽名雜湊。這在 BIP144 中得到了修復,它始終在 SegWit 交易輸入中使用,使其在最壞的情況下為 O(n)(在普通硬體上的最壞情況下,一個塊小於 10 毫秒)。
從長遠來看,還有其他因素在起作用,比如 UTXO 集的大小。如果這將增長到數 GB,並且不適合典型的記憶體記憶體,則用於驗證的 UTXO 獲取時間可能會顯著增加。
另外:一個塊通過網路傳播平均需要多長時間?如果這個平均值是根據接收礦工的雜湊算力加權的,那就太好了。
這很複雜。它當然與散列速度不成正比,而與網路拓撲和使用的技術更相關。FIBER 網站有一些統計數據,但通常比全球最小理論網路延遲(長連接的光速)多不到 20 毫秒。這只有通過假設其參與者不會在網路上進行 DoS 攻擊的私有網路才能實現。公共網路更加健壯,但通常需要幾秒鐘才能將塊傳播到大部分節點,並且需要幾十秒鐘才能到達連接較少的節點。