Go Etherium 環境の構築が済んだところで、開発を行うためのプライベートネット環境を整えていきます。
Etheriumでのネットワークは、プライベートネットとメインネット(ライブネットとも呼ばれる)の2つがあります。複数のノードが接続されるP2Pネットワークのメインネットと、独自のネットワークを形成できるプライベートがあります。
プライベートネットでは、独自のチェーンを扱うため、ブロックチェーンとして扱うための最初のブロックを生成する必要があります。初期のブロック(genesisブロック)の設定を記述したgenesis.jsonを作成した上で、コマンドで初期化、起動という流れになります。
Genesisブロックの初期化の為のファイル作成
genesis.json ファイルとは、genesisブロックを生成するためのGeth用の設定ファイルです。ファイル名はなんでも構いません。
プライベートチェーンを初期化するため、どのように最初のブロック(genesisブロック)が構成されるかが設定されます。
{
"coinbase": "0x0000000000000000000000000000000000000001",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x80000000",
"nonce": "0x0000000000000042",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00",
"alloc": {},
"config": {
"chainid": 2000,
"homesteadblock": 0,
"eip155block": 0,
"eip158Block": 0
}
}
各パラメーターの簡単な説明になります。chainidは、1以外ならなんでもよいのですが、ここでは2000を設定しています。
conibase: マイニングから収集されたすべての報酬が転送される160ビットのアドレス。
difficulty: この数値が高いほど、マイナーは有効なブロックを発見するために多くの計算をする必要があります。
extraData: バイト文字である必要があるようですが、ここでは空白に設定しています。
gasLimit: 取引を行う際にGasをマイナーに支払いますが、その際の上限値です。
nonce: ブロックで十分な量の計算が実行されたことを証明する64ビットのハッシュ。Proof-of-Work(PoW)
parentHash: 親ブロックへのポインタ。
mixhash: ブロックで十分な量の計算が実行されたことを証明する256ビットのハッシュ。Proof-of-Work(PoW)
timestamp: ブロックが生成された時間。
alloc: 事前に割り当てたれたウォレットのリストを定義できます。
config: 新しく定義されたパラメータです。
chainid: 「1」はメインネットを表すので、それ以外を設定します。
homesteadblock: ライベートチェーンを扱うため、homesteadに切り替えることはないので、0に設定します。
eip155block: プライベートチェーンを扱うため、ハードフォークするわけではありません。0に設定します。
eip158block: プライベートチェーンを扱うため、ハードフォークするわけではありません。0に設定します。
Genesisiブロックを初期化する前に、以下のコマンドを打ち込んでみます。
vagrant@vagrant:~$ ls -lha
total 40K
drwxr-xr-x 6 vagrant vagrant 4.0K Nov 7 01:22 .
drwxr-xr-x 3 root root 4.0K Apr 21 2016 ..
-rw-r--r-- 1 root root 0 Apr 21 2016 .bash_history
-rw-r--r-- 1 vagrant vagrant 220 Apr 21 2016 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3.7K Apr 21 2016 .bashrc
drwx------ 2 vagrant vagrant 4.0K Apr 21 2016 .cache
drwx------ 4 vagrant vagrant 4.0K Nov 6 03:44 .ethereum
-rw-r--r-- 1 vagrant vagrant 675 Apr 21 2016 .profile
drwx------ 2 vagrant root 4.0K Nov 6 02:47 .ssh
-rw-r--r-- 1 vagrant vagrant 0 Apr 21 2016 .sudo_as_admin_successful
-rw------- 1 vagrant vagrant 673 Nov 7 01:21 .viminfo
今回、ホームディレクトリにGethをインストールしました。「.ethereum」の隠しフォルダが作成されていますが、これは「.ethereum」がメインネットのデータディレクトリとなっていることを意味します。
Genesisブロックの初期化
プライベートネットワークで開発作業を行いたいため、メインネットとは別のディレクトリを構成したほうが管理がしやすいのでフォルダを作成します。作成したプライベートチェーン用のフォルダと同じディレクトリにgenesis.json ファイルを作成し、さらにデータディレクトリを作成します。以下のようなディレクトリ構成で配置しました。
vagrant@vagrant:~$ tree
.
└── blockchain
├── blockchaindata
└── genesis.json
※ treeのインストールは、
sudo apt-get install tree でインストールしてください。
blockchainディレクトリ配下に進んでください。
vagrant@vagrant:~$ cd blockchain
vagrant@vagrant:~/blockchain$
以下のコマンドで、genesisブロックを初期化します。
$ geth --datadir=./blockchaindata/ init ./genesis.json
WARN [11-07|02:02:44] No etherbase set and no accounts found as default
INFO [11-07|02:02:44] Allocated cache and file handles database=/home/vagrant/blockchain/blockchaindata/geth/chaindata cache=16 handles=16
INFO [11-07|02:02:44] Writing custom genesis block
INFO [11-07|02:02:44] Successfully wrote genesis state database=chaindata hash=b40047…23dbf5
INFO [11-07|02:02:44] Allocated cache and file handles database=/home/vagrant/blockchain/blockchaindata/geth/lightchaindata cache=16 handles=16
INFO [11-07|02:02:44] Writing custom genesis block
INFO [11-07|02:02:44] Successfully wrote genesis state database=lightchaindata
genesisブロックが正常に初期化されました。
プライベートネットの起動
プライベートネットを起動するコマンドです。ここでは新たにチェーンを初期化されることはありません。
$ geth --datadir=./blockchaindata
WARN [11-07|05:03:24] No etherbase set and no accounts found as default
INFO [11-07|05:03:24] Starting peer-to-peer node instance=Geth/v1.7.2-stable-1db4ecdc/linux-amd64/go1.9
INFO [11-07|05:03:24] Allocated cache and file handles database=/home/vagrant/blockchain/blockchaindata/geth/chaindata cache=128 handles=1024
WARN [11-07|05:03:24] Upgrading database to use lookup entries
INFO [11-07|05:03:24] Database deduplication successful deduped=0
INFO [11-07|05:03:24] Initialised chain configuration config="{ChainID: 2000 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}"
INFO [11-07|05:03:24] Disk storage enabled for ethash caches dir=/home/vagrant/blockchain/blockchaindata/geth/ethash count=3
INFO [11-07|05:03:24] Disk storage enabled for ethash DAGs dir=/home/vagrant/.ethash count=2
INFO [11-07|05:03:24] Initialising Ethereum protocol versions="[63 62]" network=1
INFO [11-07|05:03:24] Loaded most recent local header number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Loaded most recent local full block number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Loaded most recent local fast block number=0 hash=b40047…23dbf5 td=131072
INFO [11-07|05:03:24] Regenerated local transaction journal transactions=0 accounts=0
INFO [11-07|05:03:24] Starting P2P networking
INFO [11-07|05:03:26] UDP listener up self=enode://********c748d8b33e7090939fd031caa119f9d49b091ca42665be57d2417ee2e34f2@[::]:30303
INFO [11-07|05:03:26] RLPx listener up self=enode://********c748d8b33e7090939fd031caa119f9d49b091ca42665be57d2417ee2e34f2@[::]:30303
INFO [11-07|05:03:26] IPC endpoint opened: /home/vagrant/blockchain/blockchaindata/geth.ipc
今後はこのプラベートネットをつかって開発をしていきます。今回は、プライベートネットワークを作成する方法を紹介しました。