Solidityを100時間かけて学んだおっさんの話
インドの寿司屋が語るメタップス新人研修録
6月の中旬から勝手に始めたこの研修シリーズですが、実は七月末日にウェブサイトの実装が終わりまして、Solidityの学び方を解説する本記事と、最終的に完成したサイトを紹介する記事の二つでこのシリーズは完結予定です。
この話は題名の通り、インドで寿司屋をしていたおっさんが、Solidityを100時間かけて勉強した話です。
私は三ヶ月前までインドでアボカド巻きを売っていた(今も)おっさんです。アボカドの目利きには多少の自信がありますが、プログラミングはさっぱりで、つい二ヶ月前までコンパイルの意味すら知りませんでした。
この記事ではSolidityに関する解説はしません。
私の浅い知識から書かれたブログ記事に何の価値があるとも思えませんし、むしろ、間違えた知識を拡散させる弊害すらあります。
DAPPを作り上げるまでのプロセスで、とにかくSolidityのコードを書く所が非常に辛かった。。。
どうやって開発環境を構築すればよいのか、どのチュートリアルを進めればいいのかが全く分からず、トライ&エラーを繰り返したため、恐ろしく時間がかかりました…
そのため、この記事は、
私がなんとかSolidityのコードを書き上げるまでに辿った道、犯した過ちをできる限り正確に皆さんにシェアすることを目標として書かれています。
この記事は大きく分けて以下の3部に分けて書かれています。
1. 100時間でやったこと、苦労したハマった場所2. 公式教材のみでERC721トークンを完成させる最短コース3. 僕が作ったコード、ウェブサイトの紹介
….
実はSolidityのコーディングについて事前にボスから大ヒントをいただいておりまして。。。
それがこれ!!
…
……
………..
Truffle Solidity Ganache Ropsten??
トリュフ、ソリディティ、ガナッシュ、ロプステンという、あまりにポケモン感溢れる単語だったので、
「これどういう意味ですか?」
と聞いたところ
「トリュフとガナッシュでソリディティのコードを書いてロプステンにERC721をデプロイしてください。」
と言う、全く持って意味の分からない回答が来たため、結局自分でググりました。
その結果、ホワイトボードに書かれていたヒントは
トリュフという開発環境で、Solidity(イーサリアム)のコードを書き、ガナッシュというアプリでローカルでブロックチェーンを動かして開発を進めた後、最後にロプステンにデプロイしてくださいという意味だということがわかりました。
(この黒板からそれを読み解くのは至難の技ですが、弊社ではこのような環境を自主性が尊重される職場と呼びます。ただ、OpenZeppelinは事前に教えて欲しかった… )
ちなみに、ガナッシュと聞くとどうしてもインドの神様のガネーシャとか、知り合いのインド人のガナッシュ・グーラブさんを思い浮かべるのですが、フランス語でココアと生チョコの中間みたいなお菓子の名前らしいです。
僕はソリディティを触り出して数十時間たつまで、コーディング、コンパイル、デプロイの具体的な意味を理解していませんでしたが、そこまで難しい概念ではないので、読者の皆さんは最初にきっちり理解しておいてください。
なお、このブログでは、”DRY”の原則(作者の怠慢)から、これ以降用語解説をしません。わからない単語があれば、自分でググってください。
0時間目
ガナッシュをインストールして実行したところGUIで何回かクリックしただけで、ローカルでイーサリアムブロックチェーンを稼働させる事ができました。思い通りに100ethを動かして富豪気分を堪能しました。
1時間経過
ボスが「トリュフを使え!」と言ってたので、ERC721のトークンを発行するコードをトリュフで開発するチュートリアルを始めました。コンパイルとかミグレーションとか、知識がゼロだったので、いちいちググって死ぬほど時間がかかりました。
確か2割くらい進めた段階でエラーで先に進めなくなりました。なんのエラーか覚えてないのですが、数時間頑張った後で、諦めて別のチュートリアルをはじめました。
15時間経過
次のチュートリアルは半分くらいで止まりました。相変わらずググりまくってたんで恐ろしく時間がかかりました、どう頑張ってもコンパイルできませんでした。
25時間経過
次のチュートリアルもずーっとコンパイルが通りませんでした。。。
35時間経過
その次のチュートリアルはコンパイルが通っているのに、デプロイできませんでした。動かないチュートリアルを動かすために、スタックオーバーフローを数十時間検索したおかげで、コンパイルまではスムーズに進められましたがデプロイができませんでした。
今考えると、コンパイルが通っているということはコードは問題なかったはずなので、なぜデプロイできなかったのか、いまだに謎です。
37時間経過
ついに5個目のチュートリアルで、コンパイルに成功し、ローカルのブロックチェーンにコードをデプロイすることに成功しました!!
ここで大きな問題にぶつかりました。
デプロイした、コードをどうやって使うのかわからない…
前回VueJsで作ったようなアプリを作ってコマンドを投げようかとも思ったんですが、それだけで数時間はかかりそうなのでやめました。ちなみに前回作ったシステムも50時間はかかっています…
Truffleの公式ページを見ても、テストコードの書き方しか書いてないし、そもそも公式のコードのSolidityのバージョン低すぎて、コピペしても動きませんでした。
ググること数時間、ようやく、コンソールでweb3jsのコードを入力して、コントラクトのファンクションを実行することができました。
50時間経過…
その後、ロプステンにデータをデプロイしようと、何かのパラメーターを書き換えたところ、メタップス社より支給されたMacBook Air 2018年モデルの500GBのSSDのどこかに保存されている何かが書き換わり、永久にローカルのブロックチェーンに接続することができなくなりました…
(-∧-)合掌・・・
55時間経過
数時間格闘したのですが、結局、動くようになりませんでした。
鬱々とした気分でコアラのマーチを一気喰いしていたところ、向かいの席のプログラマーの人が、Remix使わないんすか?と言いだしました…
プログラマーA氏に言われた通りに、リミックスのページにアクセスして、どこかのページからコピペしてきたSolidityのコードをコピペしてコンパイルボタンを押したところ…
秒でコンパイルが完了し、ワンクリックでロプステンにデプロイされました…
しかもGUIでデプロイしたコードのテストができる…
あまりの簡単さに涙が出ました…
僕の50時間はなんだったんだろうか…
っていうか早く教えろやあrあkfわオジおfウェj..
教訓: 初心者はTruffle、Ganachには手を出さない。Truffleはミグレーションの概念を理解する必要がある点、デプロイしたコントラクトをテストするためにweb3でコードを書く必要がある点から、初心者が使うには非常に敷居が高いです。また、ドキュメントもJavascriptでの開発に慣れている人向けなので、僕にはいまいち理解できませんでした。ガナッシュの方はGUIだし、難易度は高くないけれど、何かのパラメーターを書き換えたら正しく動かなくなったので、初心者向けではないと思います。
55時間経過
55時間経ってようやくコーディングをする環境が整いました。
プログラミングの環境構築が終わったら仕事が終わったも同然とはよく言ったもので、あとはサクッとコーディング書いて終わりだなーなんて思っていましたが、そうは問屋がおろしませんでした…
まずは基本的なERC721のトークンを作ってみたいと思い、ERC721のコードを作るチュートリアルを片っ端から試していった結果、ネット上に存在するほとんどのチュートリアルのSolidityコードはコンパイルを通らない学びがありました。
Solidityコードは動かないながらも、沢山のチュートリアルをこなした結果、ERC721トークンを作るチュートリアルはほぼ全てが、OpenZeppelinという名前のSolidityコードを継承して作られていることがわかりました。
ただ、サクッとOpenZeppelinを継承したコードがかけた訳ではなく…
その後、継承とは何か、リミックス上でOpenZeppelinをインポート(継承)する方法を理解するまでに、また数時間かかりました。ちなみにやり方は ”import openzeppelin remix”でググるとすぐ出てきます。
こういうのって手順はすぐわかるんですが、実際にインポートしたコードのコマンドをどうやって使うのかとか、調べだすと軽く数時間立ってしまうんですよね。
65時間経過
なんとかOpenZeppelinのERC721チュートリアルのコードをコンパイルに成功したのですが、コードの書き方もよくわからず、どうやって自分のイメージ通りのコントラクトを作ればいいのかわからないことに気づきました。
そして、ネットサーフィンをひたすら続けていたところ、恐ろしくわかりやすいウェブサイトを発見!!
Solidityの公式サイトです。
英語で書かれてるんですが、めちゃんこ内容が簡潔でわかりやすい上に全てのコードがバッチリ動くというまさに神サイト。
公式なら動くのは当たり前と思われるかもしれませんが、ブロックチェーン関連プロジェクトのドキュメントは基本書かれた通りに動きません。ちなみに、僕が試した限り、ブロックチェーン界隈でコピペでちゃんとチュートリアルが動いたウェブサイトは、SolidityとLIBRAだけです。
教訓: 初心者は公式サイトだけを読む、公式サイト以外読まない。ブロックチェーンの技術は日進月歩、日々進化を続けているため、半年前に書かれたチュートリアルが最新版では動かないというのは日常です。初心者が何かを作るのに必要な手順は全て公式サイトに書かれています。また、公式サイトはコピペで動くコードが記載されている可能性がとても高い。公式サイトを読みましょう、そして公式サイト以外読まないでください。特にSolidity!ブログ記事は私のようなへっぽこプログラマーが書いたものから、レイヤー1のガチ技術者様が書かれたものまで様々です。そして、ライティング力とコーディング力は正比例しないため、文章を読むだけではチュートリアルの正しさを見極めることが不可能に近い。また、ブロックチェーン界隈のプロジェクトは英語のドキュメントしか存在しないことが多いです。グーグル翻訳を活用して読みましょう。不自然ではありますが、大体意味がわかる英語に翻訳してくれます。不自然な日本語 & 動くコード >>>>>>>>> 美しい日本語 & 動かないコード です。公式 読め 絶対
70時間経過
公式サイトを熟読することでevent, mapping, require, msg.sender, structなど、Solidityならではの用語と使い方を把握。公式ページの素晴らしいところは、解説が簡潔な代わりにチュートリアルのコードの全ての行にその行で実行されているプログラムの解説が書いてある点です。たったの5時間でSolidityの基本を理解することができました。まさに神サイト…
75時間経過
公式サイトに書いてあるチュートリアルを全て完成させた後、自分が想定しているSolidityのコードを書き始めました。Rimix からガナッシュのブロックチェーンに接続する方法もあったのですが、嫌な思い出があったため、ロプステンのみを使うことにしました。
ロプステンで開発を進めると、ローカルと比べて ①イーサをどこかから取得してこなければならない点、②コードのデプロイに時間がかかる点がマイナス点ではありますが…
①に関しては一回イーサをもらえばそれで終わりなので大した問題でなく、②に関しては動作速度が遅い=本番と同じ環境で開発できるというメリットもあります。
というのも、ローカルで0.1秒で終わっている処理がロプステンで実行すると10秒かかるみたいなことがよくあったので、ローカルで開発を進めても、ロプステンにデプロイしたら動かないみたいなケースもあるんじゃないかと思います。
80時間後
だいたい想定していた通りに、動くSolidityのコードができあがりました。ここから先は、VuejsとSolidityのコードをつなぎ合わせるプロセスで、VuejsのコードをSolidityに合わせて修正しながら、事前に自分が想定していたのと異なった部分に関しては、Solidityのコードの修正をかけていきました。
時間がかかった部分は、メタデータを外部サーバーに保管しておく部分のコーディングです。当初はメタデータの保管URLをチェーン上に保存していなかったのですが、チェーン上から直接urlが取れた方がフロントの実装が簡単だったので、途中でSolidity側のコードを変更しました。
自分で全てコードを書いているので、こういう軽微な仕様変更がサクサクできるのは良かったです。
完成するまでだいぶ時間はかかりましたが、環境構築で悩んでいる時と違い、ゴールが見えているので、非常に楽しかった。
100時間後
ついにVuejsと繋いで動くSolidityのコードが完成、100時間と書いたんですが、よく考えたら土・日10時間、平日5時間くらいやってたので、120時間くらい使ってる気もします。
ここからは、僕が二ヶ月前に知りたかった、プログラミング初心者向けのSolidity最短学習法をご説明します。既に、他のプログラミング言語をかなりやっている方にはあまり参考にならないと思います。
公式のみでERC721トークンを作る最短シナリオ
既に何度も書いていますが、以下の3項目を必ず守ってください。
Solidity学習の最重要ポイント1. プロダクトの公式ページだけを読む、そして公式ページ以外は読まない。2. Rimixを使う、Truffleには手を出さない。3. Ropstenを使う、Ganacheは使わない。
それでは、最短コースでERC 721トークンを発行するコントラクトを書くステップを解説します。
コードの各行を読んだ瞬間に書かれた行の意味がわかるようになるまで、次のステップには進まないでください。
学習環境は以下の通りです。
言語: Solidity
ネットワーク: Ropsten
開発環境: Remix
利用モジュール: OpenZeppelin
1. Solidityの基礎を学ぶ。
Solidity公式ページのBlock Chain BasicとEthereum Virtual Machineを理解できるまで読む。
2. Solidity公式のサンプルをRemixにコピペしてコンパイル
Solidity公式の最初のチュートリアル、A simple smart contract をRemixのエディターに打ち込みコンパイルする。
Remixの使い方は、公式サイトを読み込む。
3. コンパイルしたコードをRopstenにデプロイ
Deploy時の環境はweb3 injectionを選択、メタマスクのネットワークをRopstenに変えてコンパイル済みのコードをRopstenにデプロイする。なお、Ropstenを使う際は事前にガス代のイーサを取ってくるのをお忘れなく。https://faucet.ropsten.be/から無料でもらえる。
4. デプロイしたコントラクトをEtherscan でチェック
Etherscanでデプロイしたコントラクトを探す。デプロイしたコントラクトがイーサスキャンで見えると達成感あります。https://ropsten.etherscan.io/
5.デプロイしたコントラクトを使ってみる。
デプロイしたらそれで満足せず、自分が作った全ての関数をRemix上で試しましょう。Interacting with an instance.を読むと試し方がわかります。
ここまでたどり着くのにとても時間がかかると思いますが、諦めず頑張りましょう。
あなたがわからない点は公式ページのどこかに書いてあります。公式サイトの検索欄とGoogle翻訳をフル活用して解決策を探りましょう。
最初のコードをコンパイル、デプロイして実際に使うところまで終える事が出来れば、後はコーディング作業に集中できます。
コーディングじゃなくて、環境構築までを手伝ってくれるイベントとか体験会があったらむちゃくちゃいいのになーと思います。
環境構築で失敗してコードを書くところまで至らないケース多いし、環境構築ってデフォルトの流れで失敗すると初心者には絶対直せないんですよね…
6.Solidity公式の全チュートリアルをRopstenにデプロイする。
公式のチュートリアルをRemixでRopstenにデプロイし実行しましょう。
公式のチュートリアルは、コメントでコードの各行に解説が乗っているため、非常にわかりやすいです。
コピペじゃダメだ、写経しろという話をよく聞きますが、写経しても僕の場合あまり理解が深まりませんでした。
逆に、コピペして、デプロイして、実際に動かした後で、自分でちょこちょこ書き換えながら動作がどう変わるかを実験するのが僕がやった中では一番理解が深まりました。
ここは、人によって合う合わないがあると思いますが、それぞれの行で何をしているのかを完全に理解してから次のチュートリアルに進むのが非常に重要です。
以下、公式のページにあるサンプルコードのリストです。最低でもBlind Auctionまで、もし可能であればMulti payment channelまでデプロイして実際に使ってみましょう。
7.OpenZeppelinのERC721のサンプルコードをRopstenにデプロイする。
OpenZeppelin公式のERC721の解説ページに記載されているコードをデプロイして、使ってみた後で、トークンの名前や、発行のロジックなどを自分で変えて再度デプロイしてみる。
ここまで終わると、Solidityでどのようなものが作れるか、ERC721にはどのような機能が実装できるかがだいたいわかるようになると思います。
この段階から実際に作るコードの仕様を決めていきましょう。最初から仕様を考えても、そもそもSolidityで何ができて、何をWebでやらなければならないかがわからないので、手戻りが大きいです。(これも経験談ww)
8.具体的に作りたいものとその仕様を決めてひたすら、コーディングとデプロイを繰り返す
あとは気合いです。ただ、ロジックを考えたりするコーディングの作業は楽しいので、そのうち何かが完成すると思います。
最後に…
公式ページは簡素で分かりづらく見えます。
僕も最初はブログ記事の方が分かり易いなーと考えていたのですが、美しい記事と動かないコードのコンボが如何に初心者を惑わせるか身を以て体感しました。
公式のページは仕様変更ごとにドキュメントのアップデートを細かく行うため、わざと画像を極力排除したページ構成にしているのだということにも気づきました。
僕が知る限り、経験豊富なプログラマーの人は公式の仕様書をまず参照しながらコーディングを進めているように思います。
初心者の皆さん、公式を読みましょう。
公式のコードは動く(可能性がもっとも高い)、この事実がとても重要です。動かないコードを初心者は修正できません。
イエスキリスト、山上の説教より「狭い門から入りなさい。滅びに通じる門は広く、その道も広々として、そこから入る者が多い。しかし、命に通じる門はなんと狭く、その道も細いことか。それを見いだす者は少ない。」
マタイによる福音書13,14節
100時間かけてSolidityを学んだおっさんの話は以上です。
こんなくだらないブログをここまで読んだあなたなら、絶対にコードを書き上げられます。
あなたのSolidityコードがうまくデプロイする事を祈っています。
徳地
P.S. 僕が作ったコントラクトの解説
僕が作ったコードは一応動くだけで、記法・用法が間違っていると思うので、初心者の皆さんは公式のチュートリアルを進めてくださいwww
ただ、もし、凄腕プログラマーの方がいらっしゃったら、是非コードをチェックしてダメ出ししていただけると、ありがたき幸せです!!(twitter_id:tokchinまで、是非!!)
なお、公式のSolidityページに合わせて、コード全行に日本語訳をつけました。
Cripponとは?
今回私が作成したコントラクトは、CripponというDAPPサイトでクーポン発行に利用するものです。
完成したウェブサイトはfirebaseにデプロイしているので、試したい方は以下リンクにてお願いします。なお、Ropstenに接続されているウォレットで認証しないと何も表示されないので、ご注意ください。
このサイトは寿司屋のクーポンを購入できるWEBサイトで、コントラクトをデプロイしたアドレスでログインすると、新しい種類のクーポンが登録でき、一般ユーザーのアカウントでログインすると、クーポンが購入可能です。
オーナー画面やシステム、コードの詳細は次回の記事にてご説明いたします。
今回紹介するSolidityコードの機能
一つ一つのクーポンはERC721トークン(NFT)で表現され、コントラクトのオーナーのみが雛形となるクーポンタイプを決める事ができます。オーナーが雛形のクーポンを登録し、クーポンのNFTをオーナーが発行すると、そのクーポンをユーザーは購入する事が可能です。
コード全文は以下の通りです。
最後までみていただき、本当にありがとうございます。
次回のDAPPの説明記事にて、「インドの寿司屋DAPPプログラマーになる」の完結編とさせていただきます。
ではでは、また、気分が乗ったら書きます。
ごきげんよう
徳地