- Ethereumでプライベート・ブロックチェーンを作る手順
- 主に開発用を念頭においています
- ここでは、gethを使ったプライベート・ネットワークを作ります
事前準備
gethをインストールしておく
始める
genesis.jsonを作る
Setup a Local Test Blockchain []
genesis.jsonファイルを作成
{
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "0x4000",
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "Custem Ethereum Genesis Block",
"gasLimit": "0xffffffff"
}
ジェネシスブロックの作成
ジェネシス・ブロックとは、一番初めのブロックのことです。
1.4.xから以下の様に作成するようです。
geth init ./genesis.json
開発用でgethを立ち上げたい場合は、–devオプションをつけるとデカイファイルのDAGを作成しなくて良かったりして、楽です。
geth --dev --datadir ./data init genesis.json
アドレスを生成するため、初回のgeth実行
gethを起動する。
注意) geth 1.4.0以降 –genesisオプションが非推奨になり、エラーなります。
1.3.x 以前: geth –genesis genesis.json
1.4.x 以降: geth init genesis.json で初期化後、geth + オプション で起動。
$ geth --genesis --datadir --networkid 123 --nodiscover --maxpeers 0 console
例:
geth --genesis ./genesis.json --datadir ./data --networkid 123 --nodiscover --maxpeers 0 console
上記実行してから、以下でアカウントを作成
> personal.newAccount();
Passphrase:
Repeat passphrase:
"0xcd65f280ca5460398e95c2ae98dd00585de607cb"
作ったら、exitとうって、gethを停止する。
これで、etherを取得するためのアドレスが作成された。
余計なファイル(ブロックチェーンデータ)の削除
keystore以外の余計なファイルを消す。
$ cd
$ rm -rf `ls | grep -v keystore`
10 etherを取得する
以下のように、CustomGenesis.jsonに自分のアドレスを設定
"alloc": {
"": {
"balance": "10000000000000000000"
}
}
再度gethを起動
geth --genesis ./CustomGenesis.json --datadir ./data --networkid 123 --nodiscover --maxpeers 0 console
作成したアドレスに10 etherがあることを確認
primary = eth.accounts[0];
"0xcd65f280ca5460398e95c2ae98dd00585de607cb"
balance = web3.fromWei(eth.getBalance(primary), "ether");
10
参考コマンド
コネクションをチェック
> net.listening
true
> net.peerCount
4
接続ピアを表示
> admin.peers
[{
ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b',
Name: 'Geth/v0.9.14/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '5.9.150.40:30301',
LocalAddress: '192.168.0.28:39219'
}, {
ID: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c',
Name: 'Geth/v0.9.15/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '52.16.188.185:30303',
LocalAddress: '192.168.0.28:50995'
}, {
ID: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba36376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172',
Name: 'pyethapp_dd52/v0.9.13/linux2/py2.7.9',
Caps: 'eth/60, p2p/3',
RemoteAddress: '144.76.62.101:30303',
LocalAddress: '192.168.0.28:40454'
}, {
ID: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0',
Name: '++eth/Zeppelin/Rascal/v0.9.14/Release/Darwin/clang/int',
Caps: 'eth/60, shh/2',
RemoteAddress: '129.16.191.64:30303',
LocalAddress: '192.168.0.28:39705'
} ]
NodeUrlを取得する
> admin.nodeInfo
> admin.nodeInfo.NodeUrl
グローバルIP addressに変更することを忘れずに
開始時にノードを指定して起動する
geth --bootnodes "enode://pubkey1@ip1:port1 enode://pubkey2@ip2:port2 enode://pubkey3@ip3:port3"
ノードを追加する
admin.addPeer(enodeUrlOfFirstInstance)
マイニングを開始
miner.start()
その他、プライベート・ブロックチェーンを作る方法
eth-utils
eth-utilsを使う方法もある
ethersphere/eth-utils: ethereum utilities, dev tools, scripts, etc
Eris
Erisを使う。
ドキュメントが微妙でセットアップが意外に大変
HydraChain
鍵とか生成せず、コマンド一つで立ち上げられるので、楽
コマンド例
hydrachain -d datadir runmultiple --num_validators=3 --seed=42
HydraChain/hydrachain: Permissioned Distributed Ledger based on Ethereum
geth-private
プライベートEthereumブロックチェーンをセットアップするツール。
geth-private – easily setup private Ethereum blockchains from the command-line and Node
gethdev
使ったことはないが、こんなのもある。
参考
プライベートチェーン
- ローカル・プライベート・テストネットの作成方法
- Creating a Private Chain/Testnet | Ethereum Tutorials and Tips by Hudson
- How To Create A Private Ethereum Chain
- Setting up private network or local cluster · ethereum/go-ethereum Wiki
- How to Run Multiple Geth Instances on a Private Ethereum Blockchain | CoinFabrik Blog