在 3 個節點之間同步記憶體池
三個bitcore節點(bitcoind 的版本相當老 - 0.12.1)部署到不同雲平台上的伺服器。
所有實例都有相同的 bitcoin.conf 文件(rpcallowip、rpcuser 和 rpcpassword 除外):
server=1 whitelist=127.0.0.1 txindex=1 addressindex=1 timestampindex=1 spentindex=1 zmqpubrawtx=tcp://127.0.0.1:28332 zmqpubhashblock=tcp://127.0.0.1:28332 rpcthreads=8 rpcworkqueue=32 rpcservertimeout=60 rpcallowip=127.0.0.1 rpcuser=... rpcpassword=... uacomment=bitcore
問題是它們都有相當不同的記憶體池:
- 首先在記憶體池中有33689個 txs
- 第二個有58219 txs
- 第三個節點有39540 txs
- blockchain.info有63598 txs
我知道,記憶體池是特定於節點的,沒有“單一比特幣網路記憶體池”。但是,我至少需要在這三個節點之間進行同步(儘管最好盡可能靠近 blockchain.info)。
如果有交易,存在於 blokchain.info 的記憶體池中,但不存在於所有三個節點的記憶體池中 - 沒關係。但是一旦這筆交易到達這三個節點之一,它應該盡快出現在其他節點上。
我嘗試使用
addnode
選項強制節點相互連接,但沒有幫助。可能是我遺漏了什麼,或者至少有一種方法可以找到 mempool 差異如此之大的原因?
一致的記憶體池的目標。
我們有移動客戶端和應用伺服器,都在研究這些節點(某種負載平衡)。使用者可以在不同的設備上登錄一個帳戶。當伺服器在記憶體池中看到交易時,它應該更新使用者的狀態。
當記憶體池不同時,有可能:
- 使用者會在不同的設備上看到不同的交易,這可能會讓他感到困惑
- 使用者會看到交易,而伺服器會錯過它。在使用者期望的這種情況下,該狀態將被更新,但伺服器不會這樣做
因此,擁有(幾乎)相等的記憶體池會非常好。
迄今為止。
我試過了:
addnode
(連接到特定節點)connect
(僅連接到特定節點),試一試,感謝@whatever此選項在此處、在bitcoin.se和(以及其他可能的 bitcoind 選項)在bitcoin wiki中進行了描述。但是mempool的大小仍然存在很大差異。
您可以通過執行連接到 RPC 埠的腳本強制 mempool 同步,從一個節點的 mempool 獲取事務,並將其發送到其他節點。請注意,因為這使用了 RPC,所以它會相當慢並且仍然會導致一些記憶體池不同步。您可能希望定期執行此腳本。這是 python 中使用
python-bitcoinrpc
.注意:我沒有測試過這個
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException # rpc_user and rpc_password are set in the bitcoin.conf file nodes = [] NODE1_URL = "10.10.10.1:8332" NODE2_URL = "10.10.10.2:8332" NODE3_URL = "10.10.10.3:8332" nodes.append(AuthServiceProxy("http://%s:%s@%s"%(rpc_user, rpc_password, NODE1_URL))) nodes.append(AuthServiceProxy("http://%s:%s@%s"%(rpc_user, rpc_password, NODE2_URL))) nodes.append(AuthServiceProxy("http://%s:%s@%s"%(rpc_user, rpc_password, NODE3_URL))) for node in nodes: txs = node.getrawmempool() for tx in txs: rawtx = node.getrawtransaction(tx) for b_node in nodes: b_node.sendrawtransaction(rawtx)
它的作用是獲取節點記憶體池中的事務 ID 列表。然後它獲取每筆交易並通過其他節點廣播它們。它為每個節點執行此操作。從理論上講,這可以確保所有節點在其記憶體池中都有相同的交易。