「試して学ぶ スマートコントラクト開発」を読みながら

良い本なのは間違いないです。
ただ、途中で行き詰まってしまったので、最後までガッツリとは作りきれませんでした。

試して学ぶ スマートコントラクト開発

新品価格
¥3,839から
(2020/3/22 14:57時点)

きっかけ

最近、ふとブロックチェーンの勉強をしてみようと思い立ち、CryptoZombieshttps://cryptozombies.io/jp/をやってみて、分かったような分からないような気分だったので、もう少しちゃんと勉強しようと調べてみました。で、当然色々なサイトがありますが、何も基礎がない状態だと、もう少ししっかり書かれているものがないかなと言う気持ちになり、この本に出会いました。

この本はQUESTというアプリを作った経験を踏まえて書かれているようです。
で、残念ながらQUESTは現在動いていないよう(単に証明書入れていないだけ?)なのですが、こちらでその概要が分かります。
https://speakerdeck.com/norinity1103/quest-tutorial
すなわち、セミナーとか講座とかで、質問してくれた人に仮想通貨で報酬を与えることで、場を活性化させるみたいなことを狙っているようです。
この内容が自分の関心があるところでもあり、これの簡易版でも作れたら良いなと思いながら始めました。

本の序盤

そもそも仮想通貨の購入等もしたことがない状態からのスタートですので、この本でも最初の基礎情報と、METAMASKウォーレット作成から始まる構成は大変助かりました。
なお、テストネットでEther取得を行いますが、最初Ropstenの取得に失敗しました。今改めてやってみたらできたので、何かやらかしたかもしれません。

本の中でも、CryptoZombies をやってみる章があります。
これは、本当は、CryptoZombies のWeb環境ではなく、自分の環境でやってみたいと思うのですが。もう少し理解が進んだらできるようになるのでしょうか。
そんなこんなで、Solidityという言語と、スマートコントラクトと言うものを学びます。が、正直、現段階でも、要はこう言うこと、という腹落ちした状態にはなっていません・・・

また、Remix という、イーサリアム開発用のWeb IDE が紹介されます。
これも良いなと思ったのですが、その後の開発は必ずしもそれを使用するわけではないので、まあ、参考情報という感じです。ちょっと見た目も変わっていて、Compileタブどこ?となります。

その次は、プロダクトデザインの考え方(UX)の章になります。
ジャーニーマップとか、ユーザテストとかの考え方が、丁寧に書かれています。

開発環境

Chapter 4 あたりからが本題。
開発環境として書かれているのが、
・Docker
・Geth
・Ganache
・Node.js
・Truffle
・Git
・VSCode
実践型の環境と感じられます。

そして、開発用ブロックチェーンをプライベートネットとして構築します。
これをやっているときに一つエラーが発生。

geth --datadir ~/private-net --nodiscover --maxpeers 0 init ~/private-net/genesis.json

とやると

INFO ・・・
Fatal: Failed to write genesis block: unsupported fork ordering: eip150Block not enabled, but eip155Block enabled at 0

https://ethereum.stackexchange.com/questions/77453/fatal-failed-to-write-genesis-block-unsupported-fork-ordering-eip150block-not
を参照。
内容は単純で、genesis.jsonに
“eip150Block”: 0,
を追加でOK。

次に、プライベートネット起動する際に

geth --datadir ~/private-net --networkid 15 \
--nodiscover --maxpeers 0 --mine --minerthreads 1 \
--rpc --rpcaddr "0.0.0.0" --rpccorsdomain "*" \
--rpcvhosts "*" --rpcapi "eth,web3,personal,net" \
--ipcpath ~/private-net/geth.ipc --ws --wsaddr "0.0.0.0" \
--wsapi "eth,web3,personal,net" --wsorigins "*" \
--unlock 0,1,2,3,4 --password ~/private-net/password

とやると

INFO ・・・
Fatal: Account unlock with HTTP access is forbidden!

これは、
https://qiita.com/katsuomi/items/8b6413156189c44b8516
を参照。
最後に

--unlock 0,1,2,3,4 --password ~/private-net/password --allow-insecure-unlock

という感じでパラメタを追加することでOKとなりました。

続いて書籍では、gethoというサービスを使用していきますが、このサービスは終了してしまったようで使用できませんでした。
なので、5-1の残りは飛ばします。

GKE環境の構築

次に書籍では、GKE(Google Kubernetes Engine)に環境を作っていきます。
Google Cloud Platformの登録から始まりますが、既存プロジェクトがあったのでそれを使います。
そして、特に問題なく進んでいき、geth attachまでできる子をと確認して次の章に進みます。
ところが、ここで、課金が始まっていました。
このタイミングでちょっと忙しくなり中断したことも間が悪く、ちょっと放置していたら、1日約500円弱、計6236円の請求となってしまいました。
そこは、ちょっと警告しておいて欲しかったなと思います。

この後、5-3で複数のクライアントを動かして接続するということをするわけですが、最初はそこを飛ばしてしまったようです。
この辺でちょっと訳が分からなくなり始めた気もします。

スマートコントラクトの設計

ここから、truffle、OpenZeppelin を使って、コーディングをしていきます。
truffleは序盤でインストールして記憶が薄れてしまっていました。

truffle migrate --network ganache
Could not connect to your Ethereum client. Please check that your Ethereum client:
    - is running
    - is accepting RPC connections (i.e., "--rpc" option is used in geth)
    - is accessible over the network
    - is properly configured in your Truffle configuration file (truffle.js)

使用するには、インストールするだけでなく、起動しておかないといけないのですね。軽い盲点。

で、一番分からなかったのが、6.5.1.4で
miner.stop()
をするというところ。
そこまではシェルコマンドで叩いていたのが、ここは「> 」表記になっており、おそらく、truffleのコンソールで叩くということだと思うのですが、
ReferenceError: miner is not defined

というエラーになってしまいます。
色々試してみましたが、これは解消できず、結局飛ばしてしまいました。
var roomFactory = eth.contract(ABI).at(‘0xa02cc8b9dec22998f0c93bec498c7090a9d8c4cf’)
もだめで下記エラーです。
ReferenceError: eth is not defined

この辺が残念なところです。

さらに、Chapter 7 では、テスト手法に入ります。
先ほど実行には失敗しているのですが、
$ truffle develop

test
一応成功しています。

ですが、さらに進めると、
truffle test
に失敗しており、

Step #1: Could not connect to your Ethereum client. Please check that your Ethereum client:
Step #1:     - is running
Step #1:     - is accepting RPC connections (i.e., "--rpc" option is used in geth)
Step #1:     - is accessible over the network
Step #1:     - is properly configured in your Truffle configuration file (truffle.js)
Step #1: 
Step #1: npm ERR!
Step #1:  Test failed.  See above for more details.

という感じ。

githubでGoogle Cloud Build連携も、設定はできるが、cloud build の結果を見ると失敗している。

この辺で、動かすことが目的というよりは、完走することが目的となってきました。

Webアプリケーション

本書の構成としては、DAppsだけでなく、一般的なWebアプリケーション構成を融合させたものということで、興味深いものでした。
フロントエンドはReact。これはすんなり起動して、よいなと。
ところが、ブロックチェーンノードとブラウザ間で通信させるためのライブラリ、Web3.jsは、インストールすると、web3.jsが作成されるようなのですがこれができない。
ここで結局やめてしまいました。

今後

結局、Docker環境を使っているような、使っていないような、という感触のまま、途中で進まなくなってしまったので、環境が綺麗に戻せるかも不安だったり。
ブロックチェーン関連で、もう一冊くらい何か試してみようかなとも思っています。