見出し画像

Solidity勉強日誌⑦外部依存関係を抜けるには?

コントラクトをEthereum上にデプロイすると、編集も更新もできなくなってしまいます。これはスマートコントラクトのメリットでもありデメリットでもあるところです。

そしてこれがSolidityにとってセキュリティが極めて重要になる理由の1つです。コントラクトに何か欠陥があっても、それをあとで修正する方法はありません。

その場合は、問題点を直した別のスマートコントラクトを使用してほしいと、ユーザーに伝えるしかありません。もし、他人のコントラクトを使用していたら、自分のコントラクトを安全に保っただけではセキュリティ上安全ではありません。他人のコントラクトがハッキングを受けたら自分のコントラクトまで影響が出てしまうのです。

Solidity勉強日誌⑤ブロックチェーン上の他人のコントラクトとやりとりするには?にて他人のコントラクトのやりとりする方法を解説しました。

その中で下記のようにコントラクトアドレスを読み込ませて、作成したInterfaceにコントラクトアドレスを食わせてあげる箇所があったかと思います。

contract MyContract {
address NumberInterfaceAddress = 0xab38...; 
NumberInterface numberContract = NumberInterface(NumberInterfaceAddress);
function someFunction() public {
uint num = numberContract.getNum(msg.sender);
}
}

この参照しているコントラクトがハッキングを受けたとしても、自分のコントラクトは安全を保つために、外部依存性を抜けなければなりません。

それには、NumberInterfaceAddressに直接コントラクトアドレスを入れるのではなく、下記のようにsetterメソッドを使うようにするのです。(setterメソッドって何だっけという方はこちらをご確認下さい!)


function setnumberContractAddress(address _address) external {
numberContract = NumberInterface(NumberInterfaceAddress);
}

こうして使用しているコントラクトが最悪、ハッキングを受けてしまったら、新しくデプロイし直してもらい、コントラクトアドレスを変更することで、同時に影響を受ける可能性をなくすのです。

参考:CryptoZombies


この記事が気に入ったらサポートをしてみませんか?