測試區塊鏈分叉
我想測試一項服務是否可以管理區塊鏈分叉。然而,沒有辦法讓 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。