今回は、緊急停止機能のあるスマートコントラクトの動作確認を行います。
アカウントごとの役割
アカウントの役割は次の通りです。
- MAIN ACCOUNT (eth.accounts[0])
コンストラクトの生成者。 - ACCOUNT1 (eth.accounts[1])
メッセージの変更を行うユーザ。アカウント1。 - ACCOUNT2 (eth.accounts[2])
マイナー。 - ACCOUNT3 (eth.accounts[3])
メッセージの変更を行うユーザ。アカウント3。
デプロイ
まずはデプロイを行います。デプロイアカウントはMAIN ACCOUNTです。
デプロイするコントラクトは、Circuit Breakerコントラクトになります。
[デプロイ時のイメージ]
デプロイ後のコントラクトの状態を確認します。
[コントラクト状態]

StoppedステートがNo(=false)となっているので、コントラクトが有効であることが分かります。
またオーナーがMAIN ACCOUNTで、Messageが初期状態の0x00000000000000000000000000000000であることも確認できます。
メッセージの変更
Set Message関数をコールして、メッセージを変更します。
アカウント1から、メッセージ“0x616263”(=abc)を設定します。
[メッセージ変更]
コントラクトの状態を確認します。
[コントラクト状態]

メッセージが“0x616263”に変更されていることが確認できます。
緊急停止
オーナーアドレスから緊急停止を行います。
Toggle Circuit関数を指定し、stoppedステートのYesチェックボックスを選択し、EXECUTEボタンをクリックします。
[緊急停止]
コントラクトの状態を確認します。
[コントラクト状態]

StoppedステートがYESに変更され、緊急停止状態になっていることが確認できます。
メッセージの変更
再度Set Message関数をコールして、メッセージを変更します。
アカウント3から、メッセージ“0x646566”(=def)を設定します。
また最大消費手数料としては5,000,000 weiを指定しました。(EXECUTEボタン押下後のダイアログ画面にて)
[メッセージ変更]
コントラクトの状態を確認します。
[コントラクト状態]
メッセージが変更されずに“0x616263”のままとなっています。
トランザクションも確認します。
[トランザクションの確認]
Gas Usedが5,000,000 weiとなっており、手数料が最大で消費されているのでこのトランザクションが失敗したことを確認できます。
まとめ
スマートコントラクトは、リリース前に脆弱性をできる限りなくすことが重要ですが、どんなにテストを行ったとしてもリリース後に脆弱性が見つかる可能性があります。
そのため、緊急停止を行う機能はセキュリティを考慮して必ず実装しておくべきです。