初心者文系主婦がブロックチェーンを学ぶブログ

IT革命のビッグウェーブに乗り遅れた主婦が、ブロックチェーン革命の波にのるべく、ブロックチェーン技術を学ぶブログです。

【CryptZombies】レッスン3チャプター1:Immutability of Contracts

SolidityはJavaScriptに似ている言語ですが、イーサリアムのDApp(Decentralized Application=分散型アプリケーション)は普通のアプリケーションとはかなり違う点があります。

 

Immutable

まず、コントラクトをイーサリアム上にデプロイ(利用可能な状態)すると、イミュータブルになります。つまり、編集も更新もできなくなるということです。

コントラクトにデプロイした最初のコードは永久にブロックチェーン上に残ることになります。これがSolidityにとってセキュリティが極めて重要になる理由の一つです。

コントラクトに何か欠陥があっても、それをあとで修正する方法はありません。

その場合は、問題点を直した別のスマートコントラクトを使用してほしいと、ユーザーに伝えるしかありません。

コードは法のようなもの。スマートコントラクトのコードに書かれていることは、関数を呼び出すたびに毎回その通りに正確に実行されます。

誰もその関数を変更して、期待と違う動作をさせることはできません。

 

外部依存関係

レッスン2では、クリプトキティーズのコントラクトのアドレスはハードコードにしました。もしクリプトキティーズのコントラクトにバグがあり、何者かによってすべてのキティーが破壊されたらどうなるでしょうか?

DAppは全く使い物にならなくなります。ハードコードで指定したアドレスで、子猫を呼び出せなくなるからです。ゾンビは子猫たちを餌にすることができなくなり、しかもコントラクトを修正して直すこともできないのです。

こうした理由で、大切な部分に関してはDAppを更新できる機能があったほうがいいのです。

例えば、クリプトキティーズのコントラクトをハードコーディングする代わりに、setKittyContractAddressという関数を設定しておけば、あとでクリプトキティーズのコントラクトに何かあった場合には、アドレスが変更できるようになるのです。

 

テストの実行

レッスン2で使ったクリプトキティーズのコントラクトのアドレスを変更できるように変えるのだ。

①ハードコードしたckAddressの行を削除せよ。

f:id:nomadomama:20181204234023p:plain

上記を削除します。

f:id:nomadomama:20181204234106p:plain

 

②kittyContractを作成した行を、単なる変数の宣言に変更せよ(変数に何もセットしてはならない)。

f:id:nomadomama:20181204234143p:plain

上記を単なる変数の宣言にするために、「=」以下を削除します。

f:id:nomadomama:20181204234325p:plain

 

③setKittyContractAddressという関数を作成せよ。引数を_address(address)とすること。またexternal関数で設定せよ。

f:id:nomadomama:20181204234515p:plain

 

④関数の中に、kittyContractにKittyInterface(_address)を設定する1行を追加せよ。

f:id:nomadomama:20181204234759p:plain

 

お疲れさまでした!

 

 

<参考>

CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network