先日、etherscanのようなブロックチェーンに記録された取引情報などを確認できるようなシステムをローカルに構築する勉強会に参加してきました。
etherscan自体は、こちらにあります。
Ethereum (ETH) BlockChain Explorer
俗にエクスプローラーと呼ばれる仮想通貨の領域で使用されるシステムです。
私は今のところいくつか仮想通貨を所有していますが、ほぼ放置しています...w
たしか、2017年、年末くらいがすごい盛り上がっていましたよね〜
ブロックチェーンという技術に興味はありますが、仮想通貨自体まだそんなに本腰を入れて模索していません。
ですが、ブロックチェーンの技術的な面であったり、それに付随してくるシステムには関心があるといったところです。
まだまだ、国内では仮想通貨に関する本はありますが、ブロックチェーン技術についてはなかなか(最新の書籍は)ないですよね。
今回は、etherscanシステムの簡易バージョン、
基、ローカル環境で動作するブロックエクスプローラーを構築させます。
では準備から取り掛かっていきましょう。
環境 : macOS
準備
まず、構築で絶対必要なのが、GoとGeth (, 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)
ここでは上から順におってみていきます。
まず、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を実行してから再度起動を試すといいかもしれません。
けっこう起動できない方がいたようです。
まず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: /
起動させ、ブラウザを開いて確認します。
http://localhost:8080/
確認できましたか?
これでローカル環境に簡易版ブロックエクスプローラーを構築できました!
あとは、gethのコマンドで色々とコマンドを試すことができます。
main.goの内部が面白い
toy-block-explorerのプロジェクトルートにあるmain.goを見てみましょう。
コード上部にGetBlockchainInfoがあるかと思います。
他にも、データをweb3(Ethereum JavaScript API)を使用して受け渡していたり...
たくさん勉強になることが多そうです。
シェルが用意されているので、ほとんど自分で考えることがありませんが、
よーく構造を理解していくと面白い分野なので(特に今回扱ったリポジトリなんかは)
一度ローカルに落としてみて、時間をかけて理解してみてもいいかもしれませんね!
以上.