[前回] Web3.0検証(6)-Blockchainのプライベートネットワーク
はじめに
前回は、1ノード(Peer)しか存在しないBlockchainプライベートネットワークを構築しました。
今回は、ノードを一つ追加します。
端末を二つ用意します。
- 端末1: ノード1操作用(前回作成済み)
- 端末2: ノード2操作用(今回作成予定)
端末1で、ノード1の新しいアカウントを作成
- ノード1にアタッチ
$ geth attach $HOME/eth_private_net/data1/geth.ipc
- 新しいアカウントを作成
コンソールから、MYPASSPHRASEをご自分の内容に書き換えた上、newAccount
コマンド実行
> personal.newAccount("MYPASSPHRASE")
"0x92aad50ffefa0cf6a15ad9b924c98abd3296e05a"
- ノード1の接続情報を確認
コンソールから、ノード1のenodeアドレスを取得。
> admin.nodeInfo.enode
"enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303?discport=0"
ノード1のenodeアドレスで、末尾のdiscport=0
を除いた文字列が接続情報となります(IPv6の[::]などはIPv4に置き換え)。
"enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303"
端末2で、ノード2を作成しノード1と接続
- データディレクトリを作成
$ cd
$ mkdir -p eth_private_net/data2
- Gethの初期化
$ geth --datadir $HOME/eth_private_net/data2 init $HOME/eth_private_net/TestGenesis.json
- Gethをコンソールモードで起動
$ geth --networkid 1234 --port 30304 --nodiscover --datadir $HOME/eth_private_net/data2 console 2>> $HOME/eth_private_net/data2/geth_error.log
※ 注意: portオプションを指定しないと、すでに起動中のノード1と衝突し起動失敗します。
Fatal: Error starting protocol stack: listen tcp :30303: bind: address already in use
- 新しいアカウントを作成
コンソールから、MYPASSPHRASEをご自分のものに書き換えた上、newAccount
コマンドを実行
> personal.newAccount("MYPASSPHRASE")
"0x5dcb4eca88e578495857d383be55bc6659dd2317"
- ノード2からノード1へ直接接続してみる(一時的)
コンソールから、上述のノード1の接続情報を指定し、addPeerコマンドを実行。
> admin.addPeer("enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303")
成功するとtrue
が表示されます。
- ノード2とノード1の疎通確認
コンソールから、peersコマンドを実行。
> admin.peers
[{
caps: ["eth/66", "snap/1"],
enode: "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:40116",
id: "234e8b4a6f8b846c11eaaee3c727bdcabf306f02e75386f7370fe24dbf0cbe9f",
name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
network: {
inbound: true,
localAddress: "127.0.0.1:30304",
remoteAddress: "127.0.0.1:40116",
static: false,
trusted: false
},
protocols: {
eth: {
difficulty: 16384,
head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
version: 66
},
snap: {
version: 1
}
}
}]
疎通確認できました。
- ノード2のGethを停止
> exit
- static-nodes.jsonを使って、ノード接続情報を保持
Gethが停止すると、上記の一時的接続情報はリセットされます。
static-nodes.jsonに接続情報を保存することで、ノードにアタッチ後に自動的にノード間接続が確立されるようになります。
- ノード2のデータディレクトリに、static-nodes.jsonを作成
接続先ノードの接続情報をstatic-nodes.jsonへ記載。
ここでは、ノード2からノード1に接続したいので、ノード1の接続情報を記載。
$vi $HOME/eth_private_net/data2/static-nodes.json
[
"enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303"
]
- ノード2をバックグラウンドで起動
$ nohup geth --networkid 1234 --port 30304 --nodiscover --datadir $HOME/eth_private_net/data2 2>> $HOME/eth_private_net/data2/geth_error.log &
- ノード2にアタッチ
$ geth attach $HOME/eth_private_net/data2/geth.ipc
- ノード2とノード1の疎通確認
> admin.peers
[{
caps: ["eth/66", "snap/1"],
enode: "enode://f15f3be7ee06e09da37a417a4123f40fabf7eb9bcfbc3047d11555a62ff2313d4cda79809555a85a6758be3cd591f71b7f8e92f250f1a6a6459661aee6f16b64@127.0.0.1:30303",
id: "234e8b4a6f8b846c11eaaee3c727bdcabf306f02e75386f7370fe24dbf0cbe9f",
name: "Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1",
network: {
inbound: false,
localAddress: "127.0.0.1:45646",
remoteAddress: "127.0.0.1:30303",
static: true,
trusted: false
},
protocols: {
eth: {
difficulty: 16384,
head: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
version: 66
},
snap: {
version: 1
}
}
}]
疎通確認できました。
Peer Countを確認
> net
{
listening: true,
peerCount: 1,
version: "1234",
getListening: function(callback),
getPeerCount: function(callback),
getVersion: function(callback)
}
二つのノード間の接続のみで、peerCountは1となっています。
ネットワークとしては、寂しいですね。
おわりに
Blockchainプライベートネットワーク環境を構築できました。
次回は、さらにノード追加し、いろいろ検証してみます。
お楽しみに。