CryptoZombies勉強会#6を開催しました
現時点では最新のレッスン
遂に最新レッスンまで追いつきました。
ということでCryptoZombies勉強会#6を開催しました。
今回はレッスン6を進めていきます。
レッスン6でやったこと
レッスン6はSolidityではなくデプロイしたコントラクトにWebからアクセスできるようにするライブラリWeb3.jsを使用します。
これにより、WebサイトからEthereumにアクセスして情報を取得したり書き込んだりできます。
- Web3.js
- Ethereum Foundationが提供しているJavaScriptライブラリ
- JavaScript
- Infra
- 公開鍵/秘密鍵方式
- MetaMask
- コントラクトのデプロイ
- コントラクトのインターフェース(ABI)
- Web3.jsからコントラクトへのアクセスは上述した下記が必要となる
- 上記を取り込みインスタンス化(実体化)することでJavascriptから扱えるようになる
- Callメソッド
- Sendメソッド
- public 状態変数へのアクセス
- public の状態変数はgetterが自動的に生成されるためcallで呼び出すことが可能
- ただしmappingの場合は自動でgetterが生成されないため自前でgetterメソッドを用意する必要がある
- JavaScriptのPromise
- Callback関数を連鎖的に呼び出せる
- 今回の例ではCallが正常に呼び出し完了した後に別処理を実装する
- ユーザーがMetaMaskでアカウントを切り替えたのをイベントとして監視する
- userAccountを退避しておき、一定期間でMetaMaskで選択されたアカウントと一致しているかチェック
- アカウントが異なればuserAccountを更新し、そのアカウントに該当するゾンビ一覧を再描画する
- Wei
- Etherの更に細かい単位
- 1 Ether = 1018 wei
- 1 wei = 0.0000000000000000001 Ether
- payable関数にvalueとしてEtherを送る
- payable関数にはsend関数の引数にvalueでEtherを送ることができる
- 単位はweiなのでWeb3.jsライブラリでEtherと単位を変換する
- Eventの監視
- SolidityでEventを定義しておくとWeb3.jsでEventを呼び出した際にフックすることができる
- 今回の例では新規ゾンビを作成した後にEventを呼び出すことでWeb3.js側でゾンビが作られたんだなとわかり再描画して新規ゾンビを反映することができる
- Eventで渡す引数にindexedを指定することでWeb3.jsからフィルタリングすることができる
- これにより自分のaddressに関するものだけを抽出することが可能
- イベント履歴の取得
- getPastEventsを呼び出すことで指定したブロック間で発生したEventを取得することができる
- Solidityでは状態変数にデータを保存すると非常に高コストだが、Eventを利用することでデータを可視化することができるテクニック
- ただしコントラクト上からはEventの履歴を参照することはできない
- 使い方が難しいが非常に有効なテクニックとなるので覚えておきたい
総括
遂にCryptoZombiesの最新レッスンまで追いつきました。
今回のレッスンではWeb3.jsを学びましたが、実際にWeb3.jsを書いてみないとイメージがつかないと思います。こればかりはCryptoZombiesでも難しい。
そのため、次回ではTruffleを使ってDappsを作るところも勉強会として開催します。