プライベート・ネットワークに接続する
Ethereumでは以下の3つの形態のP2Pネットワークを構築しブロックチェーンを運用していくことが可能です。
・パブリック・ネットワーク:不特定多数のノードのノードが参加し、かつその参加に制限が全くないネットワークです。参加ノードはそのネットワーク上で共有管理されたブロックチェーンに対して自由に、読み取り、トランザクションの発行、マイニングが可能です。仮想通貨としてのEthereumや、多くのパブリックなDappはこのパブリックネットワーク上で運用されています。
・コンソーシアム・ネットワーク:あらかじめ参加を許可されたノードのみが参加することが可能なネットワークです。参加を許されるノードは一つの組織のみに管理されたものとは限らず、複数の利害関係が一致しない組織がそれぞれのノードを管理することが通常です。例えば国際送金の管理を行うブロックチェーンを構築したい場合、予め参加を許された複数の金融企業がそれぞれ管理するノードをこのP2Pのネットワークに参加することで、一つの企業にのみ管理されたシステムではない半非中央集権なシステムが構築可能になります。
・プライベート・ネットワーク:一つの組織のみに管理されたノードのみが参加す
ることが可能なネットワークです。ネットワークは自身の管理下に置くことが可能になり、中央集権的なP2Pシステムが可能になります。
ここでプライベート・ネットワークは、自分自身のみのネットワークなので容易にEtherの採掘が可能で、安全性も高いネットワークです。そのため、Ethereumの動作を調べたり、分散型アプリケーション(Dapp)の開発作業など個人的な作業を行うには、プライベート・ネットワークを立ち上げてそこでいろいろと動かしてみると便利です。
1. Genesisファイルを作成する
Genesisファイルとは、ネットワークでやり取りされるブロックチェーンの最初(Block番号 "0")のブロックであるGenesisブロックの情報を記述したファイルです。プライベート・ネットでは独自のブロックチェーンをやり取りしていくため、独自のGenesisブロックを定義したGenesisファイルを用意して利用します。
まず任意の場所にプライベート・ネットのブロック情報やノード情報など各種データを格納するディレクトリ(データ・ディレクトリ)を作成します。
$ mkdir eth_private_net
次に上記ディレクトリ内にjson形式の下記の内容を記述したmyGenesis.jsonファイルを作成します。
{
"config": {
"chainId": 15
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}
#2. genesisブロックの初期化
以下のコマンドを実行しブロックチェーン情報をgenesisファイルの内容で初期化します。
$ geth --datadir eth_private_net init myGenesis.json
本コマンドを実行すると、--datadirで指定したディレクトリ以下にディレクトリが新しく作成されて、その中にgenesisブロックのブロックチェーン情報が保存されます。ここで実行時に
WARN [02-04|09:03:55] No etherbase set and no accounts found as default
という警告が表示されるかもしれませんが、このノード(geth)でのデフォルトのウォレットのアドレスを作成していないために表示されるものです。後で、アドレスを作成する現時点では無視して大丈夫です。
3. gethの起動
次に以下のコマンドを実行することでGethを起動します。
$ geth console
Welcome to the Geth JavaScript console!
instance: Geth/v1.8.14-stable/darwin-amd64/go1.10.3
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
上記でも起動しますがオプションをつけることができます。
今回はこちらを実行していきます。
$ geth --networkid "15" --nodiscover console
ここで各オプションの意味は以下の通りです。
・--datadir :本オプションはgethの動作時のブロックチェーンデータや各種ログの出力先を指定します。genesisブロックの初期化で指定したディレクトリと同一のものを指定してください。
・--networkid "15" :本オプションで任意の正の整数のIDを指定することで、ライブ・ネットとは異なるネットワークを立ち上げることが可能です(ここでは15を指定)。genesisブロックの初期化で指定したchainidと同一の値を指定する必要があります。
・--nodiscover :Gethはデフォルトで自動的に(同じネットワークID)のEthereumネットワークのノード(Peer)を探し接続を試みます。プライベート・ネットでは未知のノードとの接続を避けるため、このオプションで自動Peer探索機能を無効にします。
・console:Gethには採掘やトランザクションの生成などを対話的に進めることができるコンソールが用意されています。consoleサブ・コマンドを指定することで、Gethの起動時に同時にコンソール立ち上げることが可能です。なお、consoleサブ・コマンドを付加せずに、Gethのプロセスをバックグラウンドで起動させておき、後からそのプロセスのコンソールを起動する事も可能です(下記補足参照)。
補足
後Gethを使用していくなかで、採掘等のためにGethをバックグラウンドで常時起動しておき、必要に応じてそのGethプロセスに対してコンソールを用いて対話的に操作をしたいといった場合が発生します。その際は、下記のようにattachサブ・コマンドを利用することで、既に起動されたGethプロセスのコンソールを起動することが可能です。
gethプロセスをconsoleサブ・コマンドを付加せず、かつ最後に"&"を付加することで、バックグラウンドで起動します。
この場合、起動時にはコンソールは立ち上がりません。
$ geth --networkid "15" --nodiscover console &
attachサブ・コマンドを用いて先に立ち上げたプロセスのコンソールを立ち上げます。
ここで、ipc:以降に先に立ち上げたgethプロセスのデータ用ディレクトリ以下のgeth.ipcファイル(実際はソケット)のパスを指定します。
$ geth --datadir "/home/ubuntu/eth_private_net" attach ipc:/home/ubuntu/eth_data/geth.ipc
instance: Geth/v1.3.5/linux/go1.5.1
(実行結果 中略)
modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0
gethの様々な内部コマンドを利用してEthereumの動作を見ていきますが、内部コマンドの一覧と用途についてはEthreumのJavascript APIであるweb3APIであるweb3.jsのリファレンスサイトが参考になります。
# 確認
今回立ち上げたプライベート・ネットのGenesisブロックが`myGenesis.json`に記載されたものになっているのかを確認してみます。
```go
> eth.getBlock(0)
{
difficulty: 17179869184,
extraData: "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
gasLimit: 5000,
gasUsed: 0,
hash: "0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x0000000000000000000000000000000000000000",
mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
nonce: "0x0000000000000042",
number: 0,
parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 540,
stateRoot: "0xd7f8974fb5ac78d9ac099b9ad5018bedc2ce0a72dad1827a1709da30580f0544",
timestamp: 0,
totalDifficulty: 17179869184,
transactions: [],
transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
uncles: []
}
上記のようになっていれば完了です。
4. gethの終了
> exit
で終了することができます。