Mempool

在 3 個節點之間同步記憶體池

  • January 1, 2018

三個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 差異如此之大的原因?


一致的記憶體池的目標。

我們有移動客戶端和應用伺服器,都在研究這些節點(某種負載平衡)。使用者可以在不同的設備上登錄一個帳戶。當伺服器在記憶體池中看到交易時,它應該更新使用者的狀態。

當記憶體池不同時,有可能:

  1. 使用者會在不同的設備上看到不同的交易,這可能會讓他感到困惑
  2. 使用者會看到交易,而伺服器會錯過它。在使用者期望的這種情況下,該狀態將被更新,但伺服器不會這樣做

因此,擁有(幾乎)相等的記憶體池會非常好。


迄今為止。

我試過了:

  • 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 列表。然後它獲取每筆交易並通過其他節點廣播它們。它為每個節點執行此操作。從理論上講,這可以確保所有節點在其記憶體池中都有相同的交易。

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