【Go】go-ethereumを使用して簡易ブロックエクスプローラーを構築!
先日、etherscanのようなブロックチェーンに記録された取引情報などを確認できるようなシステムをローカルに構築する勉強会に参加してきました。
etherscan自体は、こちらにあります。
Ethereum (ETH) BlockChain Explorer
俗にエクスプローラーと呼ばれる仮想通貨の領域で使用されるシステムです。
私は今のところいくつか仮想通貨を所有していますが、ほぼ放置しています...w たしか、2017年、年末くらいがすごい盛り上がっていましたよね〜 ブロックチェーンという技術に興味はありますが、仮想通貨自体まだそんなに本腰を入れて模索していません。
ですが、ブロックチェーンの技術的な面であったり、それに付随してくるシステムには関心があるといったところです。
まだまだ、国内では仮想通貨に関する本はありますが、ブロックチェーン技術についてはなかなか(最新の書籍は)ないですよね。
今回は、etherscanシステムの簡易バージョン、 基、ローカル環境で動作するブロックエクスプローラーを構築させます。
では準備から取り掛かっていきましょう。
環境 : macOS
準備
まず、構築で絶対必要なのが、GoとGeth (, Git)です。
Golangのインストールやプロジェクト構成については、過去記事があるので そちらを参考にしてみて下さい!
そして、Gethなのですが、Go Ethereumの略でEthereumが提供しているクライアントソフトです。
golangで開発されていて、Ethereumをコマンドラインで操作する目的のソフトというかんじ。
このGethをインストールするのは簡単です。
$ brew tap ethereum/ethereum $ brew install ethereum
インストールが完了したら、確認してみます。(helpオプション)
$ geth --h NAME: geth - the go-ethereum command line interface Copyright 2013-2018 The go-ethereum Authors USAGE: geth [options] command [command options] [arguments...] VERSION: 1.8.10-stable COMMANDS: account Manage accounts attach Start an interactive JavaScript environment (connect to node) bug opens a window to report a bug on the geth repo ・ ・ ・ ・
こんなかんじでヘルプ内容がどっしり出力されたらOKです。
本来であれば既にGethがインストールできているので、色々コマンドを実行できるのですが、 今回はさらに環境を整えます。
ちなみに以下のような手順書もあるので、ここからは合わせて参考にするといいかもしれません。
まずは Ethereum に触れてみる · Ethereum入門
ブロックエクスプローラーを構築
さて、ここからは以下のリポジトリを使用します。
このGoコードで、自分のブラウザでEthereumの情報が確認できるようにします。
基本的にREADMEを実行していけば大丈夫なのですが、 順番を間違えたりして詰まるとモチベーションが落ちるので(www) ここでは上から順におってみていきます。
1. リポジトリをおとしてくる
まず、toy-block-explorerのリポジトリをおとしてきます。
おとしてくるくるときは、zipでもgit cloneでも構いませんが、
step-final
ブランチを指定して下さい。
まず、任意のディレクトリに移動してクローンします。
$ git clone https://github.com/curvegrid/toy-block-explorer.git
クローンが完了すると、toy-block-explorerというディレクトリが確認できるかと思いますので、移動し以下を実行します。
$ cd toy-block-explorer $ git submodule init $ git submodule update --recursive
.gitmodulesファイルが存在するかと思います。
こちらのファイルを元に、git submodule
をしましたので、
toy-block-explorer/geth/
配下にeasy-geth-dev-modeというリポジトリを生成しました。
easy-geth-dev-mode自体のリポジトリは、こちらにあります。
今は無事にコマンドが実行できたらOKです。
現状はこんな構成になっているかと思います。
toy-block-explorer/ ├── LICENSE ├── README.md ├── build.sh ├── erc20.go ├── geth │ ├── easy-geth-dev-mode │ └── sample-chaindata ├── main.go ├── screenshot.png ├── templates │ ├── footer.tmpl │ └── header.tmpl ├── toy-block-explorer └── www ├── css ├── images ├── index.html └── js
2. サンプルデータを作成
仮想通貨をある程度知り尽くしていたらいいのですが、いきなり本番のデータを扱うのは怖すぎるので(この記事では本番のデータ操作については割愛)、 ローカルで動作させるためのデータを作成します。
プロジェクトルートで以下を実行します。
$ cp -R geth/sample-chaindata geth/easy-geth-dev-mode/chaindata
3. Gethを起動させる
先程、git submoduleしてきたeasy-geth-dev-modeディレクトリに移動します。
easy-geth-dev-mode/ ├── README.md ├── attach43.sh ├── chaindata │ ├── geth │ ├── history │ ├── keystore │ ├── log │ └── sample-chaindata ├── js │ ├── base-geth-snippets.js │ ├── start-rpc.js │ └── useful-geth-snippets.js ├── launch43.sh ├── net43 │ ├── README.md │ ├── attach43.sh │ ├── chaindata │ ├── js │ ├── launch43.sh │ └── stop43.sh └── stop43.sh
そしてlaunch43.sh を実行します。
$ cd geth/easy-geth-dev-mode $ ./launch43.sh --ipcdisable --startrpc
launch43.shでgethコマンドを実行しています。 データが格納されているディレクトリを指定し、dev modeで、データをjsに渡すようにオプションが付与されています。
起動できると以下のようになるかと思います。
$ ./launch43.sh --ipcdisable --startrpc == Disabling IPC == Enabling RPC == Attaching via RPC Welcome to the Geth JavaScript console! instance: Geth/v1.8.10-stable/darwin-amd64/go1.10.2 coinbase: 0x5e4d047cd9173fd13c220a0bf756c7e25c00f587 at block: 3 (Sat, 09 Jun 2018 15:41:28 JST) datadir: /Users/user-name/path/to/toy-block-explorer/geth/easy-geth-dev-mode/chaindata modules: admin:1.0 debug:1.0 eth:1.0 net:1.0 personal:1.0 rpc:1.0 web3:1.0 > > >
これでGethが起動できました。 このGethを停止する場合は、./stop43.shを実行しましょう。
一旦、ブラウザで確認できるまで起動させたままで構いません。
また、何度か試していると、
geth net43 testnet appears to be running or zombie pid file remains at './chaindata/log/geth.pid' Try running 'stop43.sh' to make it exit.
このようなメッセージが出力されるかと思います。 同様にstop43.shを実行してから再度起動を試すといいかもしれません。
3-1. トラブルシューティング
- Gethが実行できない
けっこう起動できない方がいたようです。 まずgethが起動しているのか、プロセスから調べてみます。
$ ps -ef | grep geth
数件gethでヒットしていたら起動はできているかもしれません。
- それでも起動がうまくいかない
$ geth --dev --datadir ./chaindata --rpc console
rpc : gethのRPCサーバとしてのAPIを有効化
4.
ここまでGethを起動できたので、すでにgethのコンソールからコマンドを実行できる状態ではあります。 ですが、まだブラウザでは何も確認できないので、portを開けて確認できるようにしましょう。
コマンドライン(ターミナル)の新しいウィンドウなりタブを開いて、 toy-block-explorerのプロジェクトルートに移動します。 ここにbuild.shというファイルがあるかと思います。 こちらを実行します。
$ ./build.sh
build.shの中では、go-ethereumをgo get
で取得し、
アプリtoy-block-explorerをbuildさせています。
無事ビルドできたら、toy-block-explorerを実行します。
$ ./toy-block-explorer 2018/06/09 16:04:10 Connecting to Ethereum node at http://localhost:8545 2018/06/09 16:04:10 Web server started on :8080 2018/06/09 16:04:16 Request from [::1]:64800: / 2018/06/09 16:04:17 Request from [::1]:64800: /
起動させ、ブラウザを開いて確認します。
確認できましたか?
これでローカル環境に簡易版ブロックエクスプローラーを構築できました!
あとは、gethのコマンドで色々とコマンドを試すことができます。
main.goの内部が面白い
toy-block-explorerのプロジェクトルートにあるmain.goを見てみましょう。
コード上部にGetBlockchainInfoがあるかと思います。 他にも、データをweb3(Ethereum JavaScript API)を使用して受け渡していたり...
たくさん勉強になることが多そうです。 シェルが用意されているので、ほとんど自分で考えることがありませんが、 よーく構造を理解していくと面白い分野なので(特に今回扱ったリポジトリなんかは) 一度ローカルに落としてみて、時間をかけて理解してみてもいいかもしれませんね!
以上.