Ethereumを掘ってみた

拝啓
街の中や電車の中でもビットコイン取引の広告を見るようになりました
皆様におかれましては怪しい金融商品のごとく映っておられるかと存じますが
いざ採掘しても混乱されませんようご自愛くださいませ
敬具

2018年のテックブログの幕開けは、iOSバグに阻まれて進展がなかったブロックチェーンです。
今年になってもあちこちで、ビットコイン取引がアツい、モナーコインもありますよ、晴れ着屋さんが夜逃げしたなどなど、相変わらず仮想通貨(暗号通貨)の話題に事欠かない状況が続いています。
非プログラマーが勢いだけで踏み込んで返り討ちに遭うブロックチェーンシリーズ3回目は、いよいよEthereumで採掘を始めます。


1.久しぶりに「Geth」を起動してみる
ずいぶん触っていなかったので思い出しながら、まずはGethを極めたやつの起動です。
コマンドを暗記するほど空き容量がないので、前回のブログからコピペします。

geth --networkid "10" --nodiscover --datadir "/Users/me/ehtereum_private" console 2>> "/Users/me/ehtereum_private/geth_err.log"

2.アカウントを作成してみる
さて、コーヒーを飲みながら新しい一歩を踏み出します。
Ethereumに限らず、なにかしらのサービスを利用する時はまず、アカウントを作るところからですね。

Ethereumには2種類のアカウントがあります。
1つはEOA、もう1つはContractと呼ばれ、それぞれ以下のような役割を持っています。

  • Externally Owned Account:ユーザーが利用するアカウント
  • Contract:自動処理を担う(感じの)アカウント

Ethereumで採掘や送金を行うのはEOAなので、テスト用のEOAを作ります。

> personal.newAccount("ethtest01")
"0x57300bc9d11221af3ef3d820bf64dc75a15e025b"

今の環境はテスト用環境なので、アカウントを1つ作っただけでは完全に孤立状態、いわゆるぼっちです。
ぼっち=寂しい=良くないっていうイメージが定着してますが、別に一人でいることは悪くないと思うんですよね。
でもその寂しいという刷り込みがなくなるとあちこちのビジネスがっていう話はさておき、テスト環境では他に接続する相手も用意する必要があるので、2つ目のアカウントを作ります。

> personal.newAccount("ethtest02")
"0xe4dc34297a83270fd5f7f4e72b800e6aa00061e5"

よく分からない文字がずらり並びました。
これがEthereumにおけるアカウント(20バイトのアドレス)になります。
20バイトのアドレス・・・まぁ、細かいことは脇に置いて進めます。
(良くないところ)

3.口座を開設する
Ethereumに限らず、価値を取り引きする場合はそれを貯めておく場所が必要ですよね。
お財布、銀行口座、タンスの引き出し、絵画の裏、靴の中敷の下などがメジャーなところかと思いますが、Ethereumでは「Etherbase」というものを使います。
先ほど作成したEOAは口座の機能も備えているので、2つのうちどちらかを口座として設定します。

> miner.setEtherbase(eth.accounts[0])
true

trueって返ってきたらOKってことなんだなと理解して、eth.coinbaseと打って確認してみます。

> eth.coinbase
“0x57300bc9d11221af3ef3d820bf64dc75a15e025b”

1つ目のアカウントが表示されればOKです。

4.採掘してみる
さて、いよいよ採掘、広大なネットに広がる金銀財宝を欲望のままに掘り尽くすフェスティバルの始まりです!
採掘の開始は簡単、miner.start()と打てばOKです。

> miner.start()
true
INFO [01-10|19:13:38] Generating DAG in progress  epoch=0 percentage=0 elapsed=504.238ms
INFO [01-10|19:13:38] Generating DAG in progress  epoch=0 percentage=1 elapsed=1.019s
INFO [01-10|19:13:39] Generating DAG in progress  epoch=0 percentage=2 elapsed=1.531s
INFO [01-10|19:13:39] Generating DAG in progress  epoch=0 percentage=3 elapsed=2.040s
INFO [01-10|19:13:40] Generating DAG in progress  epoch=0 percentage=4 elapsed=2.562s
INFO [01-10|19:13:40] Generating DAG in progress  epoch=0 percentage=5 elapsed=3.084s

うわ!なんだこれ!

INFO [01-10|19:13:41] Generating DAG in progress  epoch=0 percentage=6 elapsed=3.603s
INFO [01-10|19:13:41] Generating DAG in progress  epoch=0 percentage=7 elapsed=4.111s
INFO [01-10|19:13:42] Generating DAG in progress  epoch=0 percentage=8 elapsed=4.614s
INFO [01-10|19:13:43] Generating DAG in progress  epoch=0 percentage=9 elapsed=5.123s
INFO [01-10|19:13:43] Generating DAG in progress  epoch=0 percentage=10 elapsed=5.635s
INFO [01-10|19:13:44] Generating DAG in progress  epoch=0 percentage=11 elapsed=6.148s
INFO [01-10|19:13:44] Generating DAG in progress  epoch=0 percentage=12 elapsed=6.655s

なんかすごい勢いで何かが始まった・・・
よく分からないまま始めると、これが何なのか分からなくて戸惑うこと間違いなしです。
さっそくちょっと弱気になったので、いったん止めてみようかな・・・
そんな時にはこれ、小●製薬の miner.stop()!

> miner.stop()
true
INFO [01-10|19:13:57] Generating DAG in progress  epoch=0 percentage=36 elapsed=19.509s
INFO [01-10|19:13:57] Generating DAG in progress  epoch=0 percentage=37 elapsed=20.031s
INFO [01-10|19:13:58] Generating DAG in progress  epoch=0 percentage=38 elapsed=20.555s
INFO [01-10|19:13:58] Generating DAG in progress  epoch=0 percentage=39 elapsed=21.074s
INFO [01-10|19:13:59] Generating DAG in progress  epoch=0 percentage=40 elapsed=21.596s

あれ?止まらない・・・もう一度やってみます。小●製薬のminer.stop()!

> miner.stop()
true
INFO [01-10|19:14:09] Generating DAG in progress  epoch=0 percentage=59 elapsed=31.927s
INFO [01-10|19:14:10] Generating DAG in progress  epoch=0 percentage=60 elapsed=32.466s
INFO [01-10|19:14:10] Generating DAG in progress  epoch=0 percentage=61 elapsed=33.010s
INFO [01-10|19:14:11] Generating DAG in progress  epoch=0 percentage=62 elapsed=33.569s

ちょっともうなんていうか、暴走した初号機くらいの脅威を感じますね。
止まれ!止まれ!止まれ!止まれ!というセリフを思い出しながらリトライを続けてみます。

> miner.stop()
true
INFO [01-10|19:14:11] Generating DAG in progress  epoch=0 percentage=63 elapsed=34.099s
INFO [01-10|19:14:12] Generating DAG in progress  epoch=0 percentage=64 elapsed=34.628s
INFO [01-10|19:14:13] Generating DAG in progress  epoch=0 percentage=65 elapsed=35.151s
INFO [01-10|19:14:13] Generating DAG in progress  epoch=0 percentage=66 elapsed=35.678s
INFO [01-10|19:14:14] Generating DAG in progress  epoch=0 percentage=67 elapsed=36.204s
> miner.stop()
true
INFO [01-10|19:14:14] Generating DAG in progress  epoch=0 percentage=68 elapsed=36.750s
INFO [01-10|19:14:15] Generating DAG in progress  epoch=0 percentage=69 elapsed=37.281s
INFO [01-10|19:14:15] Generating DAG in progress  epoch=0 percentage=70 elapsed=37.802s
INFO [01-10|19:14:16] Generating DAG in progress  epoch=0 percentage=71 elapsed=38.319s
> miner.stop()
true
INFO [01-10|19:14:16] Generating DAG in progress  epoch=0 percentage=72 elapsed=38.839s
INFO [01-10|19:14:17] Generating DAG in progress  epoch=0 percentage=73 elapsed=39.352s
> miner.stop()
true
INFO [01-10|19:14:17] Generating DAG in progress  epoch=0 percentage=74 elapsed=39.875s

お分かりでしょうか、何度miner.stop()してもことごとく止まらないこの暴走感。
どんどん流れてくる謎の文字列に、チキンなハートではなすすべもありません。

5.逃げる
なんなんだこれは・・・こんな時は伝家の宝刀「exit」しかない!

> exit
INFO [01-10|19:15:03] IPC endpoint closed: /Users/4M/Library/Ethereum/geth.ipc 
INFO [01-10|19:15:03] Blockchain manager stopped 
INFO [01-10|19:15:03] Stopping Ethereum protocol 
INFO [01-10|19:15:03] Ethereum protocol stopped 
INFO [01-10|19:15:03] Transaction pool stopped 
INFO [01-10|19:15:03] Database closed

と、このようにとりあえずexitするというのがどれだけよろしくないのか、この先痛感することになります。きっと。

6.エラーにハマって無理やりまとめて終わる
さっきの暴走時のメッセージをよく見ると、Generating DAGしていますっていう内容なんですね。
しっかり見ればパーセンテージまで書かれています。

DAGというのはDirected Acyclic Graphの略語で、日本語にすると有向非循環グラフというものすごい難しそうな漢字の組み合わせになります。
DagCoin、IOTA、ByteBallからGHOST、SPECTREなどなど、DAGとDAGっぽいものにはいくつも種類がありその理論の(略)

そのDAGを生成していますというメッセージに気付かず、パーセンテージも100になる前にexitしてしまったというわけです。
とはいえ前に進むしかないこの企画、理解したところでもう一度採掘を始めてみました。

> miner.start()
null

おおう・・・DAG作成途中でexitしたからとしか思えないこの状況、こんな形で企画が終わると査定に響きかねません。
何とかリカバーするべく調べてみましたが、setEtherbaseでアカウント入れ替えを何度試しても相変わらず、null・・・。

<続く>