web3

Web3開発キャッチアップの覚え書き

初期に引っかかったポイントを忘れないうちに

いまさらWeb3に入門する

人によっては2018年くらいから手を出していると思うが、そこから4年も遅れて2022年5月も終わりに近づく頃、ようやくWeb3の面白さに気付いた。
世間の潮流に比べて気付くのが遅かったことは疑いようもない事実だが、とはいえ私が本業をエンジニア(それもインフラ)にしたのが2021年ということを考えれば、置かれた状況にしてはむしろ早いと捉えることもできる。さすが俺、天才だ。

そもそものキッカケは大学時代からの友人がWeb3に絡めて面白いプロジェクトを立ち上げており、自分もいっちょ噛みしたいと思ったのであった。 嗚呼、素晴らしきミーハー根性。

当初はWeb3に対して懐疑的だった私だが、上記をキッカケに勉強してみると技術単体で見ても非常に面白いことに気が付いた。 技術だけでなく友人がやっているプロジェクトもいわゆるWeb3に蔓延する単なるポンジ・スキームとは違い社会的意義を感じられたので、なおのことやる気がわいている状況である。

と、ここまで書いておいてなんだが、べつに携わるのが単なるポンジ・スキームだったとしても、それはそれでいいのかもしれない。
というのも、日本社会そのものがポンジの最たる例だというツイートを見て「それもそうだな」と思ったからだ。

社会全体がそういう歴史を現在進行系で辿っているのだから、自分がその道に染まったとしてことさら悪だということもなかろう。

本記事の立て付け

この備忘録は、Web3を理解したい一般人に向けた懇切丁寧な解説というよりは、いくばくかの素養はあって自分の手でWeb3を使った何かをしたいというエンジニアに向け、そのキャッチアップ的な部分にフォーカスして書く。 まさにタイトルに書いた通りの内容で、読者を釣ろうなどという気はさらさらない。清廉潔白な私にふさわしい振る舞いである。

手始めに本を読むべし

まず、新しい分野を学ぶにあたっての基礎知識は(ネット上に散逸した情報ではなく)、書籍でインストールすべきだ。

Web3の技術、そしてそのコアコンセプトは素晴らしいものだが、予備知識がない状態で情報を得ようとしても三流マーケ界隈の粗製乱造SEO最適化記事による検索エンジン汚染が甚だしいので、要領を得ない説明に煙をまかれることになるだろう。しかるに、ネット経由の初期サーチはオススメできない。

そこで、私が読んだ本を紹介しておこう。ブロックチェーンプログラミングのためのコンピュータサイエンスがわかる本だ。

私が読んだときはkindle unlimited対象だった。実は他の本も何冊かチラ見したのだが、通読したのはこの本だけで、その理由は技術面に寄り添った内容だったからだ。

前半部分は公開鍵認証だとか基本情報レベルの前提知識のため、非エンジニアでも十分読める。後半はビットコインとイーサリアムについて概要がまとまっていてよい。

コントラクトデプロイのちょっとしたチュートリアルもついているので(情報が古いのでそのままでは通用しない部分もあるが)、1冊目に適してはいると思う。

CryptoZombiesでSolidityを覚えよ

本を読んだあとは「さあ実践だ!」と言いたいところだが上述の本ではいささか準備としては欠ける。
CryptoZombiesで実際にスマートコントラクトを書きながらSolidityを覚えるのがよい。

いきなり未知の単語を羅列してしまったので補足する。

Web3をことさら調べたことがなければ、ブロックチェーンだとか暗号通貨に関係してそう、くらいのイメージしか持っていないことだろう。

暗号通貨のイメージというとビットコインが有名だが、Web3のキモは**イーサリアム(Ethereum)**のスマートコントラクトだ。
よって、以降は基本的にイーサリアムについて書く。

先ほど紹介した書籍に載っている情報でもあるので端折って書くが、イーサリアムもビットコイン同様にブロックチェーン技術の一種である。

ビットコインとイーサリアムの大きな違いはスマートコントラクトという仕組みだ。 スマートコントラクトは、ブロックチェーン上に取引情報のみならず、プログラムコード自体と付随する変数情報を書き込む。

ブロックチェーンにプログラムが刻まれるということは、そこにブロックチェーン環境がある限り、作成者の手を離れてもプログラムは永遠に実行環境ごと残り続ける。 つまり、Web2までとは違い、プログラムの作成者(往々にしてサービスの管理者)がいなくなる=サービスが終了する、という中央集権的(管理者に依存した)仕組みになっていない。

これこそが、Web3ひいてはスマートコントラクトが、非中央集権的たる理由なのだ。そして、そのスマートコントラクトを書くための専用言語がSolidityである。

専用言語といっても、JavaScriptライクな文法なので開発のエンジニアであれば習得に困ることはないと思われる。

そして冒頭に書いたとおり、Solidityのチュートリアルは、CryptoZombiesをやるのがよい。非常にわかりやすい良質なコンテンツである。もちろん無料だ。

さらに驚くべきことに、重要なチャプターにいたっては多言語対応だ。

もちろん英語のほうが更新が早いので、コンテンツ内容に英語と日本語で若干の差異はあるのは事実だ(そのため私は英語版で一通りやってしまった)。

が、差異があるのを嫌って英語版をやってはみたものの、終わってから見るとまったくクリティカルな差異でもなかったので「おとなしく日本語版でやってもよかったな」と思ったのもまた事実である。

とりあえず、これから始めんとする諸兄におかれては、前の項で紹介した本を読んで、日本語版でCryptoZombiesをやればよいだろう。全体の概要理解と、言語文法的なチュートリアルはこれだけでほぼ完了だ。

本は1日もあれば読み終わるし、CryptoZombiesも(仮に英語版だったとしても)1週間もあれば十分こなせるだろう。

MetaMaskがないと始まらない

Progateや競技プログラミングをやっている人には伝わりやすいのだが、プログラムを書けることと環境構築ができることはまた別だ。

ここからは言語や仕組みの理解というよりは、環境構築やインフラ面の整備についても書いておく。

まず、ブラウザにMetaMask拡張機能を入れることが必要だ。Web3に参加するにあたって、暗号通貨ウォレットを用意しなければ、ブロックチェーン上の取引ができないからだ。

MetaMaskを入れると、新規のアカウント(公開鍵と秘密鍵)を入手できる。ちなみに、スマホアプリ版のMetaMaskもある。どちらも入れておけば間違いないだろう。

MetaMaskはウォレットと呼ばれ、いろいろな機能があるが、なんといっても秘密鍵を管理してくれる。
と同時に、Webページ上でブロックチェーン取引が必要なシーンでポップアップして署名を実行することができる。

ほとんどのDAppsはMetaMaskのインストールを前提に構成されている。つまりはWeb3利用にあたって必須の拡張機能だ。

ちなみにDAppsとは、Decentralized Applicationsの略で、分散型アプリとか呼ばれていたりする。スマートコントラクトをバックエンドとして使うアプリの総称だと思っておけばよいだろう(そう、スマートコントラクトがバックエンドになるのだ!)。

テストネット

現在、イーサリアム価格のインフレがすさまじく、ブロックチェーンに内容を刻むのにべらぼうな金額がかかる(これをガス代といい、コントラクトを作成するのに数万〜数十万円レベル)。

ちょっとお話にならないので、技術だけキャッチアップしたい場合はテストネットLayer2といった別のイーサリアムネットワークを使用するのがよい。 テストネットを利用するのにお金はかからない。Layer2ネットワークはガス代が廉価になる。

テストネットは複数あるが、それぞれのテストネットごとにFaucetと呼ばれるページがあり、テストネット上でのみ使用できるETHが配布されている。 かつてはテストネット用のETHは無尽蔵に配布されていたようだが、いまはテストネット用であっても1日あたりの配給額に上限があるのが普通だ。

RopstenやRinkebyと呼ばれるテストネットワークが有名なようだが、近日中にdeprecatedになるというようなことが案内されていた。 以降はGoerliというネットワークを使うことが推奨されているようだ。

注意することがあるとすれば、MetaMaskのデフォルト状態ではテストネットやLayer2ネットワークは非表示(または未登録)の設定になっていることだ。とくにPolygonなどのLayer2ネットワークなどは初期状態では未登録のため、設定から明示的に追加しないと使用できない。

追加にはRPCのURLアドレス、chainIDなどが必要だ。ただ、これは「MetaMask Polygon 追加」などで調べればいくらでも出てくるので割愛する。

Alchemy

ブラウザ経由のEhtereumのやりとりはMetaMaskが担ってくれるが、ローカルでの開発など、ブラウザを介さずにブロックチェーン上のやりとりをするにはEthereumクライアントが必要である。

イメージとしては、自前でサーバーを立ててやる必要がある感じに近い。しかし、サーバー構築は面倒なので、APIサーバーを立ててくれているサービスを利用するのが一般的だ。

有名なのがAlchemyInfuraだ。小規模な利用であれば無料なので登録しておくのがよい。

RinkebyなどのFaucetではAlchemyへのログインが必須だったりするので、迷ったらAlchemyに登録しておけば損はない。

Hardhatとethers.js

上で紹介した書籍はちょっと古いのでTruffleweb3.jsを使った方法が紹介されているが、今はHardhatethers.jsが主流だ。

Hardhatはコントラクトのローカル実行環境やテスト、デプロイなど一連を行えるツールである。

ethers.jsはWebページ経由でMetaMaskとやりとりさせるWebフロントエンドのライブラリだ。

ERC規格

コントラクトにも規格がある。ERCと呼ばれていて、NFTであればERC721やERC1155といったインターフェースを持っていることが大手販売所にリストする条件だったりする。

大手販売所としてはOpenSeaが有名である。

OpenSeaでは、テストネット用のダミーページもある。たとえばRinkebyテストネットにデプロイしたNFTをリストすることができるので、本番デプロイ前の確認がスムーズに行える。

ERC1155の注意点

独自のコントラクトではなく、OpenSea上でNFTを発行して、そのNFTを持っている人だけに特定のコンテンツを見せるページなどを考えているのであれば、ERC1155についての注意が必要だ。

下記の引用RTのスレッドを見ればおおむね分かるかと思う。

Webフロントエンドの知識

上でサッとさらった通り、ブロックチェーンそのものを開発するとかではなく、Web3技術を利用するだけなら手軽に始められる環境は十分に整っている。

とはいえ、それを用いたアプリケーション開発には既往のWebアプリケーション開発の知識が必要であり、今であればReactあるいはVueといったフロントエンド知識や、FirebaseやAmplifyといったBaaSやPaaSの知識は当然に必要である。

現状、上述したとおり非常にガス代が高いこともあり、コアのロジックとしてイミュータビリティを確保したい部分だけをスマートコントラクトとして実装し、残りの部分は普通のWebアプリケーションとして開発するというのが主流のスタイルだ。

したがって、Web3だからといってWeb2の知識を全部かなぐり捨てるわけにはいかない。ちゃんと習得する必要があり、そこから逃げることはできない。

イメージとしては、これまでバックエンドで一貫性や無謬性などに最新の注意を払いながらトランザクションの管理をしていた部分の一部がブロックチェーンに置き換わるのを想像するのがよいだろう。

取引の正確性やセキュリティは非中央集権的なブロックチェーン技術が担保しているので、そのブロックチェーンに刻まれたデータをもとに「どうUIを作るか」はこれまで通りフロントエンド技術を使うことになる。

フロントエンド+スマートコントラクト(+部分的にBaaS)なスタックがDAppsを個人で開発するのに必要となる範囲だろう。

おわりに

私はインフラエンジニアなので、上述するスタックと業務範囲が全然かぶらない。要するにエンジニアと言いつつDApps開発は完全に独学なので、本業のWebアプリケーションエンジニアから見たら稚拙な面も多々あるとは思うが、いったんここで筆を置くことにする。

とはいえ、今のままでは書き捨てすぎる。もう少し構造化して、順序よく書かないとこれから始める人にむけての有益な記事とならないので、推敲・加筆・記事の分割等を順次進めていければと思っている。

なにはともあれ牡蠣を食べよう

最後に。みんなも牡蠣を買って日本の水産業を盛り上げよう。それでは。