Ethereum(イーサリアム)用のクライアントをPC(macOS)にインストールして実行してみます
Ethereumクライアントにはいくつか代表的なものが存在しています
go-ethereum
(Golang)cpp-ethereum
(C++)ethreumj
(Java)pyethapp
(Python)parity
(Rust)
今回は一番一般的なGeth
(go-ethreum
)をインストールしてプライベートネットワークで実行してみます。
Geth
の読み方は "ゲース" らしいです。
インストール
今回は、macOSなのでHomebrew
でインストールします。
インストールするコマンドは以下になります
brew tap ethereum/ethereum brew install ethereum
インストール後の確認
geth
コマンドが実行できることを確認します。
今回は以下コマンド実行でバージョン情報を表示して確認します。
geth version
実行例
$ geth version Geth Version: 1.8.10-stable Architecture: amd64 Protocol Versions: [63 62] Network Id: 1 Go Version: go1.10.2 Operating System: darwin GOPATH=/Users/tanuki/go GOROOT=/usr/local/opt/go/libexec
プライベートネットでの実行
プライベートネットワークで動作させるために、ローカル環境に初めのブロックを作成します。
最初のブロックはGenesisブロックと呼ばれます。
Genesisブロックの定義を記述したGenesisファイル(以下に出てくる genesis.json)を用意します。
(実は、--dev
のオプションを使うとこんな作業なしで楽できるみたいですが、今回はGenesisファイル用意してやってみます。)
ブロック保存ディレクトリを用意します。今回は private_eth
という名称にします。適当な場所に作成します
genesis.json
を 以下の内容として記述して、private_eth
に保管します。
{ "config": { "chainId": 77, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "nonce": "0x0000000000000042", "timestamp": "0x0", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0x8000000", "difficulty": "0x100", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x3333333333333333333333333333333333333333", "alloc": {} }
genesisブロックの初期化
以下コマンドを実行してGethの初期化処理を実行します
eth --datadir {ブロック保存ディレクトリのパス} init {Genesisファイルのパス}
実行例
$ geth --datadir /Users/yuki/work/private_eth init /Users/yuki/work/private_eth/genesis.json INFO [08-11|16:33:59] Maximum peer count ETH=25 LES=0 total=25 INFO [08-11|16:33:59] Allocated cache and file handles database=/Users/yuki/work/private_eth/geth/chaindata cache=16 handles=16 INFO [08-11|16:33:59] Writing custom genesis block INFO [08-11|16:33:59] Persisted trie from memory database nodes=0 size=0.00B time=6.638µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [08-11|16:33:59] Successfully wrote genesis state database=chaindata hash=83b885…a305f3 INFO [08-11|16:33:59] Allocated cache and file handles database=/Users/yuki/work/private_eth/geth/lightchaindata cache=16 handles=16 INFO [08-11|16:33:59] Writing custom genesis block INFO [08-11|16:33:59] Persisted trie from memory database nodes=0 size=0.00B time=2.258µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [08-11|16:33:59] Successfully wrote genesis state database=lightchaindata hash=83b885…a305f3
以下の文字列が出力されれば成功です
INFO [YY-DD|HH:MM:SS] Successfully wrote genesis state
Gethの起動
初期化完了後に以下コマンドでGethを起動します
$ geth --networkid "10" --nodiscover --datadir {ブロック保存ディレクトリのパス} --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" console 2>> {エラーログの出力先のパス}
実行例
$ geth --networkid "10" --nodiscover --datadir /Users/yuki/work/private_eth --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" console 2>> /Users/yuki/work/private_eth/error.log Welcome to the Geth JavaScript console! instance: Geth/v1.8.10-stable/darwin-amd64/go1.10.2 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
”Welcome to the Geth JavaScript console!” の文字列が出力されればGethの起動成功です
Geth起動後の操作
Geth起動後に、Gethコンソールでいくつかのアカウント操作を実行してみます
アカウントの作成
personal.newAccount
を実行してアカウントを作成します(以下の "password123" の部分がパスワードで、任意の値を指定してください
> personal.newAccount("password123") "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e"
コマンドの実行結果として外部アカウントのアドレスが出力されます。この値は環境によって異なる値が出力されます。
パスワードの文字列はアカウントロックを解除するためのパスワードとなります。忘れないようにする必要があります。
試しに、後3アカウント作成してみます
> personal.newAccount("password123") "0xbaa4290b7c18afe9905060e35b44ddd2a41b34e9" > personal.newAccount("password123") "0x559a14163bef0d310f489042707e4c73461e651a" > personal.newAccount("password123") "0x0e41e2a7b939ffa1b3d495ab43cda793939e41e5"
アカウントの確認
eth.accounts
実行で作成したアカウントを確認できます
> eth.accounts ["0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e", "0xbaa4290b7c18afe9905060e35b44ddd2a41b34e9", "0x559a14163bef0d310f489042707e4c73461e651a", "0x0e41e2a7b939ffa1b3d495ab43cda793939e41e5"]
作成したアカウントのアドレスが配列で表示されます。出力される配列のアドレスの個数は作成したアカウントの数と一致します。
インデックス指定でのアカウントの確認
eth.accounts
でインデックス指定すると対象アカウントのアドレスを確認できます。インデックス0を指定して実行すると以下のようになります
> eth.accounts[0] "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e"
コインベースアカウントの確認
eth.coinbase
実行でコインベースアカウントを確認します。
コインベースアカウントとはブロック生成のマイニング報酬を受け取るアカウントです。
デフォルトではインデックス0のアカウントがコインベースアカウントになっています。
> eth.coinbase "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e"
結果がインデックス0のアカウントのアドレスと一致していることが分かります。
コインベースアカウントの変更
miner.setEtherbase
でコインベースアカウントを変更できます。
今回は、インデックス2のアカウントに変更して eth.coinbase
で変更後の内容を確認してみます
> miner.setEtherbase(eth.accounts[2]) true > eth.coinbase "0x559a14163bef0d310f489042707e4c73461e651a"
結果がインデックス2のアカウントのアドレスと一致していることが分かります。
コインベースアカウントをaccounts[0]に変更
一応、最後にコインベースアカウントをインデックス0のアカウントに戻しておきます。
やることは上記でやったことと基本的に同じです
> miner.setEtherbase(eth.accounts[0]) true > eth.coinbase "0xf7c80f38982e23707cad8a0ed0f78b0b65c5134e"
コインベースアカウントが、インデックス0のアカウントに戻ったことがわかります
Gethの終了
Gethコンソールで ext
を実行することがGethを終了させることができます
> exit $
まとめ
というわけでGethの起動とアカウント操作までは試すことができました。