[前回] Web3.0検証(5)-Blockchainのプライベートネットワーク
はじめに
前回に続き、Gethを用いたBlockchainプライベートネットワークの構築です。
プライベートネットワークとは
自分自身で管理可能なネットワークで、中央集権的なP2Pシステムを構築可能。
ちょっとしたEthereum動作確認や分散型アプリケーショ(DApp)の開発に便利かも。
基本概念の理解
-
Genesisブロック
- Blockchainにおける最初のブロック(Block番号0)のこと
-
Genesisファイル
- Genesisブロックの情報を記述したjsonファイル
- サンプル: TestGenesis.json
{
"config": {
"chainId": 1234,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0
},
"difficulty": "0x4000",
"gasLimit": "0x8000000",
"alloc": {}
}
-
Gethのデータディレクトリ
- プライベートネットワークの各種データを格納
- ブロック情報
- ノード情報
- 各種ログの出力先
- プライベートネットワークの各種データを格納
-
Gethの実行方法
- Genesisブロックの初期化
- Gethを起動
-
Gethの起動モード
- バックグラウンドモード
- コンソール対話モード
- トランザクションの生成などを対話的に進められる
- consoleサブコマンドを指定し、コンソール立ち上げる
-
gethコマンドの各オプション
- datadir
- データディレクトリ、Genesisブロックの初期化で指定したディレクトリを指定
- networkid
- ネットワークID、Genesisブロックの初期化で指定したchainIdを指定
- 任意の正の整数のIDを指定し、異なるネットワークを立ち上げることも可能
- nodiscover
- プライベートネットワークで未知のノードとの接続を避けるため、自動Peer探索機能を無効に
- Gethはデフォルトで、自動的に同じネットワークIDのEthereumネットワークのノード(Peer)を探し接続を試みる
- datadir
プライベートネットワークの構築開始
検証環境
前回と変わりません。
端末を開きます。
Genesisファイルを作成
ホームディレクトリ直下に作成します。
$ cd
$ mkdir eth_private_net
$ cd eth_private_net
$ vi TestGenesis.json
{
"config": {
"chainId": 1234,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0
},
"difficulty": "0x4000",
"gasLimit": "0x8000000",
"alloc": {}
}
データディレクトリを作成
$ cd
$ mkdir -p eth_private_net/data1
Genesisブロックの初期化
- ブロックチェーン情報をGenesisファイルの内容で初期化
$ geth --datadir $HOME/eth_private_net/data1 init $HOME/eth_private_net/TestGenesis.json
データディレクトリにディレクトリが新しく作成され、
その中にGenesisブロックのブロックチェーン情報が保存される。
Gethを起動
networkidに、TestGenesis.jsonファイルのchainIdの値を指定。
$ geth --networkid 1234 --nodiscover --datadir $HOME/eth_private_net/data1 console 2>> $HOME/eth_private_net/data1/geth_error.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
datadir: /home/zhao/eth_private_net/data1
modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
To exit, press ctrl-d or type exit
コンソールが起動されました。
Gethプロンプトから、ブロック番号"0"を指定し、getBlockコマンド実行、
Genesisブロックの情報を表示します。
> eth.getBlock(0)
{
difficulty: 16384,
extraData: "0x",
gasLimit: 134217728,
gasUsed: 0,
hash: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000000",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 507,
stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
timestamp: 0,
totalDifficulty: 16384,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
TestGenesis.jsonの指定とおり、プライベートネットワークのGenesisブロックが作成されています。
※ difficultyは10進表記に変換されている
Gethプロンプトを終了
> exit
Gethプロセスを停止
$ pkill geth
Gethをバックグラウンドで常時起動しておき、必要に応じてコンソール操作したい
- gethコマンドでconsoleサブコマンドを指定せず、最後に"&"を指定しバックグラウンドで起動。
$ nohup geth --networkid 1234 --nodiscover --datadir $HOME/eth_private_net/data1 2>> $HOME/eth_private_net/data1/geth_error.log &
- 起動済みGethプロセスに対し、コンソールを立ち上げる
ipcに、gethプロセスのデータディレクトリ配下に生成されたソケットファイルgeth.ipcを指定。
$ geth --datadir $HOME/eth_private_net/data1 attach ipc:$HOME/eth_private_net/data1/geth.ipc
これで、コンソール起動できました。
おわりに
Blockchainのプライベートネットワーク環境を構築できました。
といっても、ノード(Peer)一つのみでネットワークとは言えないですね。
次回は、複数ノードを立ち上げ、相互疎通を検証します。
お楽しみに。