Dappsでゲームを作ってみる(Part.1) コントラクトの定義
基礎的な勉強ばかりやっていてもつまらないので、ここは階段を数段飛ばして、実際にゲームを作っていきたいと思います。
なんとか形になるといいなw
どんなゲームを作るのか
コントラクトの定義に入る前に、まず、「どんなゲームを作るのか」を決めないと進むに進めません。
可能な限りシンプルなゲームにしたいので、「3Dボックスを自由に積めるゲーム」にしようと思います。
要件を抜き出すと
- ボックスには「所有者」の概念がある
- ボックスには「色」の概念がある
- ボックスには「座標(x,y,z)」の概念がある
といったあたりでしょうか?
まずは、このあたりの要件をコントラクトで表現してみる事にします。
プロジェクトの作成
最初の一歩として、まずはtruffleのプロジェクトを作成します。
ネットワーク設定
dockerで立ち上げているganacheに対してデプロイされるように、ネットワーク設定を追加しておきます。
ganacheは、以前の記事 で用意したものと同じものが立ち上がっているとします。
これで、コントラクトを書く準備が整いました!
truffle.jsとtruffle-config.jsの違い
余談ですが、truffle init
コマンドでは、設定ファイルとして truffle.js
と truffle-config.js
の二つが作成されます。
これって、何がどう違うんだろう?って思ったら、公式ドキュメントに書いてありました。
どうも、Windowsだと、truffle.jsを実行ファイルと勘違いされる事があるようで、それを回避するための一つの方法として truffle-config.js にリネームしろ、とそういう事のようです。
Windows使わないので、truffle-config.js
は削除とします(笑)
コントラクトの定義
BoxFactoryコントラクトの作成
まずは、truffleコマンドを通して、コントラクトの箱形を作成します。
作成されたコントラクトは内容が空なので、今回の要件を満たせるように実装を加えます。
必要そうな機能を、難しい事は考えずにざっと実装してみました!
z座標に関して
本当はz座標に関しても定義するべきなんですが、この後のクライアント実装がちょっと複雑になりそうだったので、 一旦ステイしています。
Solidityは、構造体を返却できない
どうも、現段階のsolidityでは構造体を返却する事ができないようです。
なので、getBoxes
の返却内容が非常に残念な事になっています。
https://medium.com/coinmonks/solidity-tutorial-returning-structs-from-public-functions-e78e48efb378
このあたりの記事が参考になるのですが、これは、今後のバージョンアップでサポートされる事を期待したい…。
振り返り
今回から、truffle
コマンドはdockerを通さずに実行するようにしました。
truffleコマンドは常に最新を使う、という精神で問題なさそうに感じたというのと、
truffleが何かプロジェクト固有のデータをストアする事がないからです。
次の記事では、今回定義したコントラクトに関するテストを書いてみたいと思います。