はじめに
今回はスマートコントラクト入門ということで、分散型プラットフォームであるEthereumをローカル環境で構築します。
実はEthereumとはスマートコントラクトを実行する基盤であり、特定の実装ではありません。
Ethereumを構成する分散ネットワークは、それぞれEthereum用のクライントがインストールされたノード(サーバ)で構成されています。
Ethereumクライントはいくつかのプログラミング言語で実装されていますが、ここではGoで実装されているGethというクライアントをインストールします。
動作環境
- Mac Sierra Version: 10.12.6
- Geth Version: 1.6.7-stable
Ethereumクライント(Geth)のインストール
Mac環境ならmacOS用のパッケージマネージャーのHomebrewを使ってGethをインストールすることができます。
https://github.com/ethereum/homebrew-ethereum
もしHomebrewがインストールされていなければ、本家からダウンロードしてください。
$ brew tap ethereum/ethereum
$ brew install ethereum
インストールが完了したらパスが通っていることを確認します。
$ which geth
/usr/local/bin/geth
インストールされたバージョンを確認します。
$ geth version
Geth
Version: 1.6.7-stable
Git Commit: ab5646c532292b51e319f290afccf6a44f874372
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.9
Operating System: darwin
GOPATH=
GOROOT=/usr/local/Cellar/go/1.9/libexec
テストネットワークに接続する
Ethereumには全世界で共通に使われているライブネットワークと、クローズドで実行できるテストネットワークが存在します。
今回は開発用ということで、ローカル環境にテストネットワークを作成してみます。
データディレクトリの作成
テストネットワーク用のデータ格納ディレクトリを任意の場所に作成します。
省略することも出来ますが、デフォルトだと~/Library/Ethereum
配下に出来ます。
$ mkdir ~/ethereum/eth_test
$ cd ~/ethereum/eth_test
Genesisファイル作成
Genesisファイルはブロックの0番目を記述したjsonファイルです。
同じネットワークに参加するノードで共有されます。
テストネットワークで実行する場合は最初にGenesisファイルを作成する必要があります。
$ vi genesis.json
{
"config": {
"chainId": 1000,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x20000",
"extraData" : "",
"gasLimit" : "0x2fefd8",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
genesisファイルのテンプレートはGethのバージョンによって変更される可能性があるので動かなかったら最新バージョンをチェックしてください。
Gethの初期化
作成したgenesis.jsonファイルを元にGethを初期化します。
$ geth --datadir ~/ethereum/eth_test init ~/ethereum/eth_test/genesis.json
するとデータディレクトリ以下にブロック情報やアカウント情報が生成されます。
ちなみにchaindataにブロックに関する情報、keystoreにアカウント情報が格納されています。
.
├── genesis.json
├── geth
│ ├── chaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── lightchaindata
│ ├── 000001.log
│ ├── CURRENT
│ ├── LOCK
│ ├── LOG
│ └── MANIFEST-000000
└── keystore
Gethの起動
Gethの初期化が完了したので、テストネットワークで起動しましょう。
$ geth --datadir ~/ethereum/eth_test --networkid 1000 --nodiscover console 2>> ~/ethereum/eth_test/geth.log
–datadirでデータディレクトリを指定します。
–networkidはネットワークIDを示しています。0~3は予約語となっていますが、それ以外の値ならば問題ありません。また、networkidはgenesis.jsonで定義したchainIdと同じである必要があるため注意して下さい。
–nodiscoverを指定すると他のノードから検出されなくなります。ローカルで実行する場合はほとんど問題になりませんが、意図しない接続を許可しないように設定しておきましょう。
consoleオプションでコンソールを起動します。
2>> ~/ethereum/eth_test/geth.logでエラーをログファイルに出力します。
上記コマンドを実行するとコンソールが起動します。
Welcome to the Geth JavaScript console!
instance: Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.9
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
>
テストネットワークでGethが起動しました。
最後に
ローカルでEthereumの実行環境を準備しました。
次は起動したテストネットワーク上で送金してみましょう。