覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Ethereum - Ethereumクライアントのインストールと実行

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の起動とアカウント操作までは試すことができました。



関連エントリ