helloworlds

not a noun, it's a verb

【Go】go-ethereumを使用して簡易ブロックエクスプローラーを構築!

先日、etherscanのようなブロックチェーンに記録された取引情報などを確認できるようなシステムをローカルに構築する勉強会に参加してきました。

etherscan自体は、こちらにあります。

Ethereum (ETH) BlockChain Explorer

俗にエクスプローラと呼ばれる仮想通貨の領域で使用されるシステムです。

私は今のところいくつか仮想通貨を所有していますが、ほぼ放置しています...w たしか、2017年、年末くらいがすごい盛り上がっていましたよね〜 ブロックチェーンという技術に興味はありますが、仮想通貨自体まだそんなに本腰を入れて模索していません。

ですが、ブロックチェーンの技術的な面であったり、それに付随してくるシステムには関心があるといったところです。

まだまだ、国内では仮想通貨に関する本はありますが、ブロックチェーン技術についてはなかなか(最新の書籍は)ないですよね。

今回は、etherscanシステムの簡易バージョン、 基、ローカル環境で動作するブロックエクスプローラを構築させます。

では準備から取り掛かっていきましょう。

環境 : macOS

準備

まず、構築で絶対必要なのが、GoGeth (, Git)です。

Golangのインストールやプロジェクト構成については、過去記事があるので そちらを参考にしてみて下さい!

o21o21.hatenablog.jp

そして、Gethなのですが、Go Ethereumの略でEthereumが提供しているクライアントソフトです。

golangで開発されていて、Ethereumをコマンドラインで操作する目的のソフトというかんじ。

github.com

この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入門

Gethをインストールする · Ethereum入門

ブロックエクスプローラーを構築

さて、ここからは以下のリポジトリを使用します。

GitHub - curvegrid/toy-block-explorer: A blockchain explorer written in Go to learn about building server-side applications that work with the Ethereum blockchain.

この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-ethereumgo 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: /

起動させ、ブラウザを開いて確認します。

http://localhost:8080/

確認できましたか?

f:id:o21o21:20180620185220p:plain

これでローカル環境に簡易版ブロックエクスプローラーを構築できました!

あとは、gethのコマンドで色々とコマンドを試すことができます。

main.goの内部が面白い

toy-block-explorerのプロジェクトルートにあるmain.goを見てみましょう。

コード上部にGetBlockchainInfoがあるかと思います。 他にも、データをweb3(Ethereum JavaScript API)を使用して受け渡していたり...

たくさん勉強になることが多そうです。 シェルが用意されているので、ほとんど自分で考えることがありませんが、 よーく構造を理解していくと面白い分野なので(特に今回扱ったリポジトリなんかは) 一度ローカルに落としてみて、時間をかけて理解してみてもいいかもしれませんね!

以上.