Go-Ethereum

如何在同一台電腦上設置 2 個私有挖礦節點?

  • October 31, 2016

我正在嘗試建立一個私有乙太坊網路。我在同一台機器(Windows 7)的兩個不同埠上啟動了兩個節點。

我無法將一個節點添加為另一個節點的對等節點。到目前為止我所做的就是這個。

找到一個節點的節點地址。

> admin.nodeInfo.enode
"enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@0.0.0.0:30303"

將節點添加到其他對等方。

> admin.addPeer("enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@127.0.0.1:30303")

true

但是,如果我檢查第二個對等點的對等點資訊,它表明它沒有任何對等點。

> admin.peers

[]

有誰知道出了什麼問題?

另外,為什麼第一個節點的 IP 顯示為 0.0.0.0?

127.0.0.1 和 0.0.0.0 有什麼區別?

127.0.0.1 和 0.0.0.0 有什麼區別?

  • 127.0.0.1 是環回地址(也稱為 localhost)。
  • 0.0.0.0 是一個不可路由的元地址,用於指定無效、未知或不適用的目標(“無特定地址”佔位符)。

在路由條目的上下文中,它通常表示預設路由。

在伺服器的上下文中,0.0.0.0 表示本地電腦上的所有 IPv4 地址。如果主機有兩個 IP 地址,192.168.1.1 和 10.1.2.1,並且在主機上執行的伺服器偵聽 0.0.0.0,那麼這兩個 IP 都可以訪問它。

您要做的是找到非 127.0.0.1 的機器的 IP 地址,這在 OS/X(和 Linux)上看起來像:

Iota:~ bok$ ifconfig -a
...
inet 127.0.0.1 netmask 0xff000000 
...
inet 192.168.0.11 netmask 0xffffff00 broadcast 192.168.0.255

在 Windows 上,等效命令是ipconfig /all.

192.168.0.11 地址是您要在 enode 字元串中使用的地址,因為這是您網路上的其他電腦可以聯繫到的機器的 IP 地址。

然後,您將需要使用以下命令添加您的對等點:

> admin.addPeer("enode://5d272e8bee6d29dfff6313999a4a2c3d8109ae6f3eb103480f4536c0542549b9fa12a8d8ae5ebee9c4db55cab553693b04eedbc9b29f35bbc0af1956231b42b4@192.168.0.11:30303")

工作範例

這是在 OS/X 下在同一台電腦上執行 2 個礦工的分步範例,礦工相互通信。您應該能夠在 Windows 和 Linux 中複製它。您還應該能夠在超過 2 個節點和不同的電腦上複製它。

更新 2016 年 10 月 31 日 00:00:56 UTC您可能會遇到 DAG 生成問題,因為兩個礦工都會嘗試在同一個文件中同時創建 DAG。在 OS/X(和 Linux)上,DAG 文件儲存在$HOME/.ethash. 這與私有鏈中描述的問題相同,同一台機器上的兩個 geth 礦工,第二個礦工拋出 “panic: ethash_full_new IO or memory error”。解決方法是在第一個礦工完成創建 DAG 後啟動第二個礦工 - 當需要創建初始 DAG 時。需要定期創建一個新的 DAG,這可能會導致您的一個礦工崩潰。

細節:

  • geth version報告1.4.18-stable-c72f5459
  • 這個例子是在目錄中創建的/tmp/Test2Miners,礦工#1的數據目錄是/tmp/Test2Miners/miner1data,礦工#2的數據目錄是/tmp/Test2Miners/miner2data
  • 我創建了/tmp/Test2Miners/genesis.json包含以下內容的文件:
{
   "config": {
           "homesteadBlock": 10
   },
   "nonce": "0",
   "difficulty": "0x400",
   "mixhash": "0x00000000000000000000000000000000000000647572616c65787365646c6578",
   "coinbase": "0x0000000000000000000000000000000000000000",
   "timestamp": "0x00",
   "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
   "extraData": "0x",
   "gasLimit": "0x3B4A1B44",
   "alloc": {}
}
  • 我創建/tmp/Test2Miners/testpassword了以下內容:
aaaargh
  • /tmp/Test2Miners/initMiner1使用以下內容創建,然後使用命令設置可執行位chmod 700 /tmp/Test2Miners/initMiner1
#!/bin/sh

geth --datadir /tmp/Test2Miners/miner1data init /tmp/Test2Miners/genesis.json
geth --datadir /tmp/Test2Miners/miner1data --password /tmp/Test2Miners/testpassword account new
  • /tmp/Test2Miners/initMiner2使用以下內容創建,然後使用命令設置可執行位chmod 700 /tmp/Test2Miners/initMiner2
#!/bin/sh

geth --datadir /tmp/Test2Miners/miner2data init /tmp/Test2Miners/genesis.json
geth --datadir /tmp/Test2Miners/miner2data --password /tmp/Test2Miners/testpassword account new
  • /tmp/Test2Miners/runMiner1使用以下內容創建,然後使用命令設置可執行位chmod 700 /tmp/Test2Miners/runMiner1
#!/bin/sh

geth --datadir /tmp/Test2Miners/miner1data --unlock 0 --password /tmp/Test2Miners/testpassword --mine --minerthreads 1 --port 30301 console
  • /tmp/Test2Miners/runMiner2使用以下內容創建,然後使用命令設置可執行位chmod 700 /tmp/Test2Miners/runMiner2
#!/bin/sh

geth --datadir /tmp/Test2Miners/miner2data --unlock 0 --password /tmp/Test2Miners/testpassword --mine --minerthreads 1 --port 30302 console
  • 我初始化了數據目錄並使用以下命令為兩個礦工創建了第一個帳戶(coinbase):
/tmp/Test2Miners/initMiner1
/tmp/Test2Miners/initMiner2
  • 在終端視窗 #1 中,我使用以下命令啟動了礦工 #1。我已經包含了列印在控制台上的enode資訊,也可以使用admin.nodeInfo命令來確定:
/tmp/Test2Miners/runMiner1
...
enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@[::]:30301
  • 在終端視窗 #2 中,我使用以下命令啟動了礦工 #2:
/tmp/Test2Miners/runMiner2
...
enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@[::]:30302
  • 我已將[::]enode 字元串中的 替換為本地 IP 地址,因此我的admin.addPeer(...)命令如下所示:
admin.addPeer("enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@192.168.1.11:30301")

admin.addPeer("enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@192.168.1.11:30302")
  • 我將admin.addPeer(...)帶有來自礦工#1 的 enode 字元串粘貼到礦工#2 控制台中。
  • 在礦工 #1 控制台中:
> admin.peers
[{
   caps: ["eth/62", "eth/63"],
   id: "b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436",
   name: "Geth/v1.4.18-stable-c72f5459/darwin/go1.7.1",
   network: {
     localAddress: "192.168.1.11:30301",
     remoteAddress: "192.168.1.11:62922"
   },
   protocols: {
     eth: {
       difficulty: 152346260,
       head: "0x8296dbd46fe12cef1415c27cb21f2ad6d70b6ee174977529eaf266c3488e6e2e",
       version: 63
     }
   }
}]

成功!

  • 在礦工 #2 控制台中:
> admin.peers
[{
   caps: ["eth/62", "eth/63"],
   id: "dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d",
   name: "Geth/v1.4.18-stable-c72f5459/darwin/go1.7.1",
   network: {
     localAddress: "192.168.1.11:62922",
     remoteAddress: "192.168.1.11:30301"
   },
   protocols: {
     eth: {
       difficulty: 157293798,
       head: "0xd9b044d4e996407ff94b075c36b845db219078c64e7898e628983496d46067bf",
       version: 63
     }
   }
}]

確認成功!

  • 這是其中一位礦工的控制台日誌:
I1031 00:53:27.604563 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #1447
I1031 00:53:27.605050 miner/worker.go:539] commit new work on block 1453 with 0 txs & 0 uncles. Took 460.253µs
I1031 00:53:29.682117 core/blockchain.go:1001] imported 1 block(s) (0 queued 0 ignored) including 0 txs in 12.081834ms. #1453 [3a94659b / 3a94659b]
I1031 00:53:29.683526 miner/worker.go:539] commit new work on block 1454 with 0 txs & 0 uncles. Took 1.167337ms
I1031 00:53:29.683565 miner/worker.go:435] 🔨 🔗  Mined 5 blocks back: block #1448

第 3 行顯示另一個礦工挖了一個區塊,這個礦工正在導入該區塊。其他行顯示該礦工正在開採區塊。

  • 為了自動化點對點發現,我/tmp/Test2Miners/miner1data/static-nodes.json使用以下資訊創建(參考靜態節點):
[
 "enode://dd57ddfb071ab01bcb1f310601e97b06a07dc97f949e14d73dbffaf8cf60e41455a31cf671d87dc7d256d24c20b8d061296041645ac36872239c48ee74fd587d@192.168.1.11:30301",
 "enode://b47e69bed67be3f9974ce44d08b9232fd5a555a7c6d4adca5402f93406a806c7181a963c02cff991452bcaee1ab7affdbada4153d236a0017f3dd1931b9c4436@192.168.1.11:30302"
]

我將此文件複製到/tmp/Test2Miners/miner2data/static-nodes.json.

  • /tmp/Test2Miners/runMiner1我在單獨的終端視窗中使用and命令重新啟動兩個礦工,並使用/tmp/Test2Miners/runMiner2它們檢查它們是否相互連接admin.peers。成功++。

引用自:https://ethereum.stackexchange.com/questions/9701