本書は生成 AI と共同で執筆しています。コードはすべて実際に手元で動かし、テストを通し、ローカルチェーンにデプロイして挙動を確認していますが、誤りが含まれている可能性があります。金銭を扱う判断の前には、必ずご自身で一次情報をご確認ください。
誰に向けた本か
Web アプリケーションは書けるが、スマートコントラクトは書いたことがない人を想定しています。具体的には、React や Next.js でフロントエンドを組み、API を設計し、データベースを触ったことがある人です。
逆に、ブロックチェーンの前提知識は要求しません。ウォレットもガスもトランザクションも、必要になった時点で説明します。
姉妹編に『読んで学ぶブロックチェーン』があります。あちらは実際にチェーンに記録された 1 件の取引を読み解く本で、読む側の話でした。本書は書く側です。片方だけ読んでも成立するように書いていますが、「そもそもチェーンに何が書かれているのか」が曖昧なら、先にあちらに目を通しておくと理解が速いはずです。
なぜまるばつなのか
題材は小さいほど良い、というのが理由の半分です。盤面は 9 マス、ルールは 5 行で説明でき、勝敗判定は 8 本の線を調べるだけ。ロジックの説明に紙幅を取られません。
もう半分の理由は、まるばつが「解けている」ゲームだからです。双方が最善を打てば必ず引き分けになります。この性質が、後半で経済設計を考えるときに効いてきます。完璧な相手に同額を賭けて挑むと、最良の結果が「引き分け=返金」にしかならない。つまり期待値がマイナスにしかならない賭けになる。技術的に実装できることと、成立する仕組みであることは別だという話を、具体例つきでできます。
何を作るか
最終的に、こういうものができあがります。
- 対人戦のコントラクト — 両者が同額を賭け、コントラクトがそれを預かり、勝者がポットを総取りする。引き分けなら返金
- CPU 戦のコントラクト — 対戦相手のロジックを Solidity で実装。賭けなし。強さ 3 段階で、最強設定は理論上負けない
- フロントエンド — Next.js + wagmi + viem。ウォレットを接続して、ブラウザから対戦する
サーバもデータベースもありません。盤面も勝敗判定もチェーン上にあり、Web ページは単にそれを読み書きするだけです。
すべてテストネットで完結します。理由は監査を受けていないからだけではなく、法的な理由もあります(第 19 章)。賭けるのはテストネットの ETH だけです(ただし faucet によっては、ボット対策としてメインネットに少額の残高があることを求められます)。
アプリの対応チェーン一覧からメインネットを外してあるので、ブラウザから普通に遊んでいる限り本物の ETH は賭けられません。ただしこれは UI の防護柵であって、コントラクト側の制限ではありません。cast send やエクスプローラの Write タブからは、チェーンを問わず直接呼べます。そしてこのコードをメインネットへデプロイするのを止めるものは、この一文しかありません。監査を受けていないエスクローに本物の資金を入れないでください。
本書の進み方
いきなり完成品を見せて解説する、という形は取りません。削れるだけ削ったものから始めて、必要になった機能を一つずつ足していきます。
最初に書くコントラクトは、数を 1 つ覚えるだけのものです。次にまるばつを、ライブラリもビット演算も使わず素朴に実装します。その時点では賭け金もありません。
そこから、こういう順で問題が発生し、対処していきます。
| 章 | 発生する問題 | 対処 |
|---|---|---|
| 9 | 1 ゲームごとにデプロイが必要で高すぎる | ゲームを配列に持つ |
| 10 | 勝者に自動送金すると、受け取れない相手のせいで決着が失敗する | 送金をやめて記帳する |
| 11 | 負けそうな側が黙って消えると資金が永久に凍る | 持ち時間と不戦勝を入れる |
| 12 | 素朴な配列はガスを食う | ビットマスクに置き換える |
つまり、完成品のコードにある「なぜこうなっているのか分からない部分」が、すべて具体的な事故への対処として登場します。逆に言えば、そういう理由のない機能は入れていません。
手を動かす前提で書いています
各章のコードは、コピーして動かせる形で載せています。必要なのは Foundry と Node.js だけで、インターネット接続すら後半まで不要です。ローカルに使い捨てのブロックチェーンを立てて、その上で全部やります。
第 3 章でその道具立てを説明します。まずは、そもそもスマートコントラクトとは何なのかから始めます。ここが一番つまずきやすく、そして最初に持っている直感が、たいてい間違っています。