ブラックリスト機能付き仮想通貨コントラクトをデプロイしてみる
どうも、ぺろりんです。
今回も「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」で勉強していきます。
前回は最低限みたいな機能が付いた仮想通貨コントラクトをデプロイして遊んでみましたが、次の話題は「ブラックリスト」です。
登録されると取引禁止になる「ブラックリスト」機能付きの仮想通貨コントラクトをデプロイして、実際にユーザーをブラックリストに追加したり、リストからはずしたりしてみて、挙動を確認してみます。
引き続きJavaScript VMを使って、ブラウザ上で完結した環境で動作確認していきます。
ブラックリストの仕組み
コード自体は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」を参照していただきたいのですが、基本的な仕組みは簡単なものです。
「blackList」という名前の変数をフラグとして使ってif文でフラグをチェックし、そのユーザーに「ブラックリスト」フラグが立っていたら取引がなかったことになる、という内容です。
今回のコードは、前回のコードにこの変数「blackList」を使ったフラグチェック機能が付いたものです。
「ブラックリスト」機能付きの仮想通貨コントラクトをコンパイルしてみる
さて、教科書通りのコードを入れてコンパイルしてみると、案の定めっちゃ怒られますw

数は結構ありますが、内容を分類すると前回対処した4通りの警告と同じものでした。
というわけで、前回の知識をそのまま使えばコードを修正できます。
やることをザクっと書くと以下の4つですが、詳しくは前回の記事をご覧ください。
・「public」をつける
・「emit」をつける
・「throw」を「revert()」に置き換える
・コントラクタを「constructor」にする
上記の4種類をやってみると、「Static Analysis raised 2 warning(s) that requires your attention. Click here to show the warning(s).」というのは残るものの、いっぱい出ていた警告は綺麗になりました\(^o^)/
このメッセージは害はなさそうなので先に進みます。

「ブラックリスト」機能付きの仮想通貨コントラクトをデプロイしてみる
EnvironmentでJavaScript VMを選び、Deployのプルダウン的なところを開いて仮想通貨の総量、名前、単位、小数点以下の桁数をそれぞれ入力してtransactします。

これでデプロイできました。

デプロイした「ブラックリスト」機能付きの仮想通貨コントラクトで遊んでみる
ここでは、以下のアドレスをユーザーA、ユーザーBと呼ぶことにします。
ユーザーA:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
ユーザーB:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
ユーザーAは、この仮想通貨コントラクトをデプロイしたときのユーザーです。
なのでこのコード上、ユーザーAが「owner」となり、ブラックリストにユーザーアカウントを追加/削除できる権限を持ちます。
残高確認
まずは、ユーザーA、Bそれぞれの残高確認をしてみます。
これはbalanceOfというので確認できます。
まだ送金していないので、ユーザーAの残高は、全OreOreCoinである10000[oc]です。


そして、送金していない状態なので、当然ユーザーBは残高0[oc]です。


送金
このままだとあまり面白くないので、この世界にOreOreCoinをすこし流通させてみましょう。
というわけで、すべてのOreOreCoinを持っているユーザーAから、ユーザーBへ2000[oc]を送金してみます。
まずはAccount欄をユーザーAにして、送金先アドレスと送金する量を入力しつつtransferを実行します。



これでユーザーAからユーザーBへ2000[oc]送金できました。
残高を確認してみましょう。
まずはユーザーAを見るとbalanceOfのところに8000とあります。

次にユーザーBは、balanceOfのところに2000とあります。

ユーザーBをブラックリストに登録してみる
入力欄にユーザーBのアドレスを入れて(言い忘れましたが、アドレスは「"(ダブルクォーテーション)」で囲む必要があります)、blacklistingを実行してみました。
これでユーザーBのアドレスがブラックリストに登録され、ユーザーBとOreOreCoinのやり取りができなくなっているはずです。

ユーザーBをブラックリストに登録した状態でユーザーAからユーザーBへ送金してみる
ユーザーBをブラックリストに登録した状態で、ユーザーAからユーザーBへ2000[oc]送金してみます。


「logs」欄を見ると、RejectedPaymentToBlacklistedAddrという、ブラックリストに登録されたユーザーに送金した際に呼び出されるイベントが呼び出されていました。
実際、残高確認をしてみると、以下の通り2000[oc]の移動がなかったことがわかります。
ユーザーA。

ユーザーB。

逆に、ユーザーBからユーザーAへ1000[oc]送金してみる、というのも同様にできません。




ユーザーBをブラックリストからはずしてみる
ブラックリストからはずすには、ユーザーBのアドレスを入力してdeletefromblacklistを実行します。


ユーザーBをブラックリストからはずしてから送金してみる
ユーザーAからユーザーBへ1000[oc]送ってみました。
うまくいくと、eventとしてTransferが呼び出されます(、というコードになっています)。

ちゃんと送金できたようです。


逆に、ユーザーBからユーザーAへ2000[oc]送ってみます。

残高も想定通りの挙動になっていることがわかります。


その他の挙動確認
個人的に挙動が気になったところも確認してみます。
変数blackListにユーザーBのアカウントを入れるとどうなるか?
blackListは、これの値によってユーザーがブラックリストに入っているかどうかを管理する変数です。
ブラックリストに登録するときは、引数にされたアドレスのblackList値を1に、ブラックリストからはずすときには-1にするような動作をします。
で、恐らくアドレスを入れてblackListボタンを押すと、引数にしたアドレスのblackList値を返すと思われます。
実際、ユーザーBのアドレスを入れてblackListボタンを押すと、先ほどブラックリストからはずしたときに設定された-1が返ってきました。



特にブラックリストの追加削除していないユーザーAについては、blackList値は0でした。

何もしていないユーザーのblackList値が0なら、個人的にはブラックリストからはずすときにはblackList値は0で良いような気もするのですが、ブラックリストに登録されたという履歴を残すためなんでしょうか?
ユーザーAをブラックリストに登録してみる
これは普通にできました。



そして、ちゃんとブラックリスト登録されたユーザーAからユーザーBへ送金しようとしても、送金されませんでした。



オーナーがブラックリストに登録されてはダメかと思いましたが、考えてみれば、オーナーはブラックリストの追加/削除をするだけで、ブラックリストに登録されていようがブラックリストの追加/削除はできるので、別に変なことにはならないんですねw
まとめ
今回は、「ブラックリスト」機能付き仮想通貨コントラクトをデプロイして、その動きを確認してみました。
コンパイル時の警告に関しては前回の知識だけで乗り切れたので、スムーズにデプロイできました。
デプロイ後の動きとしても、教科書の想定通りに動いていることが確認できました!
次回はキャッシュバック機能をつけて遊んでみます。
というわけで、今回はこのへんで。
今回も「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」で勉強していきます。
前回は最低限みたいな機能が付いた仮想通貨コントラクトをデプロイして遊んでみましたが、次の話題は「ブラックリスト」です。
登録されると取引禁止になる「ブラックリスト」機能付きの仮想通貨コントラクトをデプロイして、実際にユーザーをブラックリストに追加したり、リストからはずしたりしてみて、挙動を確認してみます。
引き続きJavaScript VMを使って、ブラウザ上で完結した環境で動作確認していきます。
ブラックリストの仕組み
コード自体は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」を参照していただきたいのですが、基本的な仕組みは簡単なものです。
「blackList」という名前の変数をフラグとして使ってif文でフラグをチェックし、そのユーザーに「ブラックリスト」フラグが立っていたら取引がなかったことになる、という内容です。
今回のコードは、前回のコードにこの変数「blackList」を使ったフラグチェック機能が付いたものです。
「ブラックリスト」機能付きの仮想通貨コントラクトをコンパイルしてみる
さて、教科書通りのコードを入れてコンパイルしてみると、案の定めっちゃ怒られますw

数は結構ありますが、内容を分類すると前回対処した4通りの警告と同じものでした。
というわけで、前回の知識をそのまま使えばコードを修正できます。
やることをザクっと書くと以下の4つですが、詳しくは前回の記事をご覧ください。
・「public」をつける
・「emit」をつける
・「throw」を「revert()」に置き換える
・コントラクタを「constructor」にする
上記の4種類をやってみると、「Static Analysis raised 2 warning(s) that requires your attention. Click here to show the warning(s).」というのは残るものの、いっぱい出ていた警告は綺麗になりました\(^o^)/
このメッセージは害はなさそうなので先に進みます。

「ブラックリスト」機能付きの仮想通貨コントラクトをデプロイしてみる
EnvironmentでJavaScript VMを選び、Deployのプルダウン的なところを開いて仮想通貨の総量、名前、単位、小数点以下の桁数をそれぞれ入力してtransactします。

これでデプロイできました。

デプロイした「ブラックリスト」機能付きの仮想通貨コントラクトで遊んでみる
ここでは、以下のアドレスをユーザーA、ユーザーBと呼ぶことにします。
ユーザーA:0xca35b7d915458ef540ade6068dfe2f44e8fa733c
ユーザーB:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
ユーザーAは、この仮想通貨コントラクトをデプロイしたときのユーザーです。
なのでこのコード上、ユーザーAが「owner」となり、ブラックリストにユーザーアカウントを追加/削除できる権限を持ちます。
残高確認
まずは、ユーザーA、Bそれぞれの残高確認をしてみます。
これはbalanceOfというので確認できます。
まだ送金していないので、ユーザーAの残高は、全OreOreCoinである10000[oc]です。


そして、送金していない状態なので、当然ユーザーBは残高0[oc]です。


送金
このままだとあまり面白くないので、この世界にOreOreCoinをすこし流通させてみましょう。
というわけで、すべてのOreOreCoinを持っているユーザーAから、ユーザーBへ2000[oc]を送金してみます。
まずはAccount欄をユーザーAにして、送金先アドレスと送金する量を入力しつつtransferを実行します。



これでユーザーAからユーザーBへ2000[oc]送金できました。
残高を確認してみましょう。
まずはユーザーAを見るとbalanceOfのところに8000とあります。

次にユーザーBは、balanceOfのところに2000とあります。

ユーザーBをブラックリストに登録してみる
入力欄にユーザーBのアドレスを入れて(言い忘れましたが、アドレスは「"(ダブルクォーテーション)」で囲む必要があります)、blacklistingを実行してみました。
これでユーザーBのアドレスがブラックリストに登録され、ユーザーBとOreOreCoinのやり取りができなくなっているはずです。

ユーザーBをブラックリストに登録した状態でユーザーAからユーザーBへ送金してみる
ユーザーBをブラックリストに登録した状態で、ユーザーAからユーザーBへ2000[oc]送金してみます。


「logs」欄を見ると、RejectedPaymentToBlacklistedAddrという、ブラックリストに登録されたユーザーに送金した際に呼び出されるイベントが呼び出されていました。
実際、残高確認をしてみると、以下の通り2000[oc]の移動がなかったことがわかります。
ユーザーA。

ユーザーB。

逆に、ユーザーBからユーザーAへ1000[oc]送金してみる、というのも同様にできません。




ユーザーBをブラックリストからはずしてみる
ブラックリストからはずすには、ユーザーBのアドレスを入力してdeletefromblacklistを実行します。


ユーザーBをブラックリストからはずしてから送金してみる
ユーザーAからユーザーBへ1000[oc]送ってみました。
うまくいくと、eventとしてTransferが呼び出されます(、というコードになっています)。

ちゃんと送金できたようです。


逆に、ユーザーBからユーザーAへ2000[oc]送ってみます。

残高も想定通りの挙動になっていることがわかります。


その他の挙動確認
個人的に挙動が気になったところも確認してみます。
変数blackListにユーザーBのアカウントを入れるとどうなるか?
blackListは、これの値によってユーザーがブラックリストに入っているかどうかを管理する変数です。
ブラックリストに登録するときは、引数にされたアドレスのblackList値を1に、ブラックリストからはずすときには-1にするような動作をします。
で、恐らくアドレスを入れてblackListボタンを押すと、引数にしたアドレスのblackList値を返すと思われます。
実際、ユーザーBのアドレスを入れてblackListボタンを押すと、先ほどブラックリストからはずしたときに設定された-1が返ってきました。



特にブラックリストの追加削除していないユーザーAについては、blackList値は0でした。

何もしていないユーザーのblackList値が0なら、個人的にはブラックリストからはずすときにはblackList値は0で良いような気もするのですが、ブラックリストに登録されたという履歴を残すためなんでしょうか?
ユーザーAをブラックリストに登録してみる
これは普通にできました。



そして、ちゃんとブラックリスト登録されたユーザーAからユーザーBへ送金しようとしても、送金されませんでした。



オーナーがブラックリストに登録されてはダメかと思いましたが、考えてみれば、オーナーはブラックリストの追加/削除をするだけで、ブラックリストに登録されていようがブラックリストの追加/削除はできるので、別に変なことにはならないんですねw
まとめ
今回は、「ブラックリスト」機能付き仮想通貨コントラクトをデプロイして、その動きを確認してみました。
コンパイル時の警告に関しては前回の知識だけで乗り切れたので、スムーズにデプロイできました。
デプロイ後の動きとしても、教科書の想定通りに動いていることが確認できました!
次回はキャッシュバック機能をつけて遊んでみます。
というわけで、今回はこのへんで。
Keyword : ブロックチェーンBrowser-SoliditySolidityEthereumイーサリアム仮想通貨