【CryptZombies】レッスン3チャプター1:Immutability of Contracts
SolidityはJavaScriptに似ている言語ですが、イーサリアムのDApp(Decentralized Application=分散型アプリケーション)は普通のアプリケーションとはかなり違う点があります。
Immutable
まず、コントラクトをイーサリアム上にデプロイ(利用可能な状態)すると、イミュータブルになります。つまり、編集も更新もできなくなるということです。
コントラクトにデプロイした最初のコードは永久にブロックチェーン上に残ることになります。これがSolidityにとってセキュリティが極めて重要になる理由の一つです。
コントラクトに何か欠陥があっても、それをあとで修正する方法はありません。
その場合は、問題点を直した別のスマートコントラクトを使用してほしいと、ユーザーに伝えるしかありません。
コードは法のようなもの。スマートコントラクトのコードに書かれていることは、関数を呼び出すたびに毎回その通りに正確に実行されます。
誰もその関数を変更して、期待と違う動作をさせることはできません。
外部依存関係
レッスン2では、クリプトキティーズのコントラクトのアドレスはハードコードにしました。もしクリプトキティーズのコントラクトにバグがあり、何者かによってすべてのキティーが破壊されたらどうなるでしょうか?
DAppは全く使い物にならなくなります。ハードコードで指定したアドレスで、子猫を呼び出せなくなるからです。ゾンビは子猫たちを餌にすることができなくなり、しかもコントラクトを修正して直すこともできないのです。
こうした理由で、大切な部分に関してはDAppを更新できる機能があったほうがいいのです。
例えば、クリプトキティーズのコントラクトをハードコーディングする代わりに、setKittyContractAddressという関数を設定しておけば、あとでクリプトキティーズのコントラクトに何かあった場合には、アドレスが変更できるようになるのです。
テストの実行
レッスン2で使ったクリプトキティーズのコントラクトのアドレスを変更できるように変えるのだ。
①ハードコードしたckAddressの行を削除せよ。
上記を削除します。
②kittyContractを作成した行を、単なる変数の宣言に変更せよ(変数に何もセットしてはならない)。
上記を単なる変数の宣言にするために、「=」以下を削除します。
③setKittyContractAddressという関数を作成せよ。引数を_address(address)とすること。またexternal関数で設定せよ。
④関数の中に、kittyContractにKittyInterface(_address)を設定する1行を追加せよ。
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network