Bitcoind

測試區塊鏈分叉

  • April 9, 2015

我想測試一項服務是否可以管理區塊鏈分叉。然而,沒有辦法讓 bitcoind 在 regtest 模式下創建測試分叉。我嘗試修改它以生成具有任意 prevblock 雜湊的塊,但由於程式碼複雜性高,這並不容易。我已經設法讓它在較早的區塊上創建分叉,但是,我無法讓它為衝突的交易(雙花和延展性更改)生成區塊,這主要是由於所有的“修剪”程式碼. 肯定有人已經提出了解決方案,因為這是一項至關重要的測試?我在網上找不到任何東西來幫助測試分叉場景。

我在想也許我應該使用另一種技術?我應該執行 3 個 bitcoind regtest 節點並將它們隔離,以便我可以創建多個區塊鏈。其中 2 個生成競爭鏈,以及其他與應用程序的介面。我可以用前兩個節點生成分叉場景,將其中一個節點同步到第三個節點,然後同步另一個節點以生成分叉?我需要結合使用 addnode 和 tcpkill (?) 來同步然後重新隔離節點。

測試如此簡單的事情似乎是一件荒謬的事情,那麼有更好的方法嗎?

我設法通過創建 3 個 reg 測試節點來測試分叉。一個節點用於與我的軟體互動,另外兩個節點用於保存競爭區塊鏈。regtest 模式啟動每個節點時都沒有連接,因此它們是完全隔離的。我可以在這些孤立的節點上使用“sendrawtransaction”和“setgenerate”來創建競爭鏈。但是,節點需要同步以測試分叉場景。

事實證明,同步節點很容易。我借助 RPC 命令“disconnectpeer”將競爭節點與介面節點同步,您可以在此處找到該命令。我的同步程式碼虛擬碼如下:

function sync (node1, node2)

   if node2.height < node1.height then
       sync(node2, node1)
       return

   node1.rpc("addnode", "localhost:" + node2.port, "onetry")

   wait while node1.rpc("get_info")["blocks"] is not node1.height

   node1.height = node2.height
   node1.rpc("disconnectpeer", node1.rpc("getpeerinfo")[0]["id"])

功能完成後,節點將再次保持隔離,以便您可以創建新的競爭鏈。

您可以使用 invalidateblock RPC 命令來創建區塊鏈分叉。

invalidateblock hash告訴節點認為散列無效,因此只需生成一堆塊,使鏈中某個 regtest 節點上的某個位置無效,然後讓該節點生成更多塊以創建分叉。

有關 python 範例,請參閱比特幣核心樹中的 qa/rpc-tests/mempool_resurrect_test.py。

引用自:https://bitcoin.stackexchange.com/questions/36649