もふもふ技術部

IT技術系mofmofメディア

ゼロからEthereum(Solidity)でNFT個人開発サービスをリリースするためにやった8つのこと

Web3と呼ばれたりする、ブロックチェーンを用いた分散型の技術が盛り上がってきています。 自分も前々からなんかすごそうだなと思いつつ、まだ実用には遠そうだなと思ったりして手を出していませんでした。

最近はそんな中でも特に盛り上がっているように見えました。Web3がバズワードとなり、急速に発展しているように見えます。

今回は、そんなWeb3を使ったWebアプリケーションを作ってみたので、最初の学び方の一例としてやったことを紹介します。

なぜいまやろうと思ったのか

Web3やNFTと言った界隈はエンジニアからすると、とても気になる存在だと思います。 少なからず調べたり試したりしている人も多いのではないかと思います。

自分もずっと気になっていたんですが、手を出せずにいました。 理由は、ウォレットとかミントとか専門用語や知らない概念が多く、導入のハードルが高そう。だとか、ウォレット使わないといけないのでユーザビリティが悪くて、広まらない気がした。などでした。

ただ、身近にブロックチェーンで仕事をしている人もいたりで、ずっと片隅で気になっていた感じです。

で、今なぜやろうと思ったかというとなんか勢いあるなーって感じたからです(浅) 腰が重いけど、触っておくべきかなーという圧を感じました。

やろうと思っていたんですがずっと手つかずでした。 どうやって実際に、着手したかはこの記事で書いていきます。

何を作ったのか

https://anniverse.shwld.app/

NFTで祝日を売買できるカレンダーを作りました。 祝日の名前と、内容をNFTとして保存して自分だけの祝日を作る事ができます。

anniverse上の祝日は世界に一つだけなので、anniverseが広まるほどに祝日の価値は高まります。

リリースしたとタイトルにありますが、テスト用のEthereumネットワークへリリースしました。実際のお金は動きません。

作ってみてどうだったか

作るの自体は難しくありませんでした。 ただ実際にサービスにするにはまだ結構な壁を感じると同時に面白さも感じました。

壁1. 価値の設計が難しいが、価値を考えるきっかけになる

祝日に価値をつけられるというのを実現できました。 NFTの設計としては実現しているのですが、実際の価値を持たせるためには、有名な人に買ってもらって価値を上げるとか、コミュニティの共通カレンダーにするとか、そういったシステム設計以外の環境を含めて設計する必要が出てきます。

ここが、Web3の最も面白いところであり、難しいところだと感じます。 機能や体験が価値を持つというのは既存のサービスでも同様だと思いますが(サービスの体験にお金を払うサブスクリプションモデルなど)Web3は更に1歩先の、個々の体験自体が金銭的価値を生むという新しい世界を感じることができました。

体験に金銭的価値を与えるということは、サービスの価値提供をシビアに意識する訓練として有用な気がするなーとぼんやり感じたりします。

壁2. 「たぶん動くと思うからリリースしようぜ」しづらい

今回この壁を乗り越えられず、サービスを本番公開していません。 具体的に何を乗り越えられなかったを書きます。

  1. 本番デプロイするのに1万円くらいかかる
  2. 祝日を作るたびに、利用者は1600円くらい払わないといけない
  3. 本番デプロイすると、以後ソースコードの変更ができない

デプロイはできるんですが、1万円払うために頑張るモチベーションはありませんでした。 でもこれって普通のサービスも同じで、1万円払う価値のあるサービスを作らないとリリースできないを強制されるのは訓練になるなーと感じ...

参考:テストを実行すると金額を見積もってくれます。

·---------------------------------------|---------------------------|-------------|-----------------------------·
|          Solc version: 0.8.9          ·  Optimizer enabled: true  ·  Runs: 200  ·  Block limit: 30000000 gas  │
········································|···························|·············|······························
|  Methods                              ·               22 gwei/gas               ·      175265.99 jpy/eth      │
·····················|··················|·············|·············|·············|···············|··············
|  Contract          ·  Method          ·  Min        ·  Max        ·  Avg        ·  # calls      ·  jpy (avg)  │
·····················|··················|·············|·············|·············|···············|··············
|  AnniversaryToken  ·  burn            ·          -  ·          -  ·      57840  ·            2  ·     223.02  │
·····················|··················|·············|·············|·············|···············|··············
|  AnniversaryToken  ·  mint            ·     155700  ·     173847  ·     160973  ·          390  ·     620.69  │
·····················|··················|·············|·············|·············|···············|··············
|  AnniversaryToken  ·  setAnniversary  ·     149089  ·     518536  ·     302919  ·            6  ·    1168.01  │
·····················|··················|·············|·············|·············|···············|··············
|  AnniversaryToken  ·  setBaseURI      ·          -  ·          -  ·      32246  ·            1  ·     124.34  │
·····················|··················|·············|·············|·············|···············|··············
|  AnniversaryToken  ·  transferFrom    ·      85742  ·      88554  ·      87992  ·            5  ·     339.28  │
·····················|··················|·············|·············|·············|···············|··············
|  Deployments                          ·                                         ·  % of limit   ·             │
········································|·············|·············|·············|···············|··············
|  AnniversaryToken                     ·          -  ·          -  ·    3407243  ·       11.4 %  ·   13137.82  │
·---------------------------------------|-------------|-------------|-------------|---------------|-------------·

壁3. 学ぶことたくさん

上記、「祝日を作るたびに、利用者は1600円くらい払わないといけない」のような問題はなんか解決策がいろんなところで提案されたりしているようです。 デプロイ後にどうやって改善していくかなどもノウハウが色々ありそうです。

Web3の世界は進歩が早いとよく聞きます。 今回、Solidityを使ってサービスを作るというところは比較的簡単に実現できたのですが、実用面を追求すると、まだまだ学ぶべき項目が大量にあるなと感じました。

また、既存の知見はあまり使えないことが多いです。Web3として新たに学ぶべきことは多く、参入障壁は高いと感じます。逆に今のうちに参入すべきなのかもしれませんが。

どうやって学んだか

新しいことを学ぶときは個人開発駆動開発が良いです。 自分は学ぶのが苦手です。 これは弱みだよなーと思いますが、そこを気にしてモチベーションを下げるよりは、あるポイントまではとりあえず動くから出してみようぜしたほうがテンション上がります。

また、とりあえずリリースまでできたら、その時点で対象技術の周辺要素を俯瞰して見れる様になっているので、そこから細かいところを学ぶほうが自分には合っています。

実際にリリースできるところまでを体験することで、プロダクション品質に何が必要か、どんなところに気をつけるポイントが有るか、など実践的なノウハウを得られます。

以下のような流れで進めました。

  1. ずっとWeb3, NFT触りたいなーと心の片隅においておく
  2. 個人開発アワードをきっかけに学ぼうと決意する
  3. 中島聡さんのAssetStoreのコードを読む
  4. プロダクトを企画する
  5. 実装を始める
  6. CryptoZombiesをつまみ食いしながらやる
  7. Openzeppelinの実装を読む
  8. 仕組みを有識者に聞く

1. ずっとWeb3, NFT触りたいなーと心の片隅においておく

やりたいなーと日頃から情報をちょっとずつ仕入れる。

とは言ってもあんまり積極的にはやっておらず、中島聡さんのVoicyとかをたまに聞いたりするくらいでした。

2. 個人開発アワードをきっかけに学ぼうと決意する

mofmofには個人開発アワードというイベントがあります。決まって、長期休みなどのあとに開催され、みんなの個人開発を称え合います。

このイベントなにか出してみようと考えたときにNFTやってみるか。と思いました。

個人開発アワード駆動開発

3. 中島聡さんのAssetStoreのコードを読む

NFT何もわからんので、とりあえず既存の動いてるサービスとコードを読んでみました。

AssetStore https://assetstore.wtf/

なんとなく何ができるのかがわかってきた気がします。

4. プロダクトを企画する

Obsidianに1ページ作って、

  • サービス名
  • エレベーターピッチ的な文章
  • 実現するための機能
  • 実現にあたっての不明点

あたりをノートに書きました。

5. 実装を始める

企画ができたのでとりあえず雑に手を動かし始めます。 手を動かしいながら不明点を調べていきます。

6. CryptoZombiesをつまみ食いしながらやる

実装ですぐに詰まりました。 デプロイや開発環境はhardhatというツールで大体できてしまうのでそこまで困りませんでしたが、Solidityの書き方がわからない。 そこで、CryptoZombiesという素晴らしいコンテンツが有ることを知り、これをやってみることにしました。

最初にざっと

  • ゾンビファクトリーの作成
  • ゾンビが人間を襲う
  • Solidityの高度なコンセプト

の3つをクリアしました。 そこで開発に戻って、都度並行でCryptoZombiesに戻りながら学習を進めました。

7. OpenZeppelinの実装を読む

NFTを実装するに当たり、OpenZeppelinを利用&参考にしました。

ERC721を利用するので、どうカスタマイズすべきなのか、どういう実装になってるのかをわりとたくさん読みました。 Solidityはコード量が少ないので読みやすいです。

https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721

8. 仕組みを有識者に聞く

なんとmofmofにブロックチェーンエンジニアの方がいるので、Slackでわからないところを教えてもらいました。

ポッドキャストでも教えてもらいました。 11. ブロックチェーンPoW勉強会(付録PDF付き)

これを聞くまでこのあたりの知識があまりない状態でしたが、大分理解が進みました。

まとめ

個人開発駆動開発は新しい技術を学ぶ最初のステップとしておすすめです。