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

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

【CryptZombies】レッスン3チャプター2:Ownableコントラクト

チャプター1で作成したコードにはセキュリティホールがあります。

setKittyContractAddressはexternalなので、だれでも呼び出すことができるのです。

つまり、この関数を呼び出した者はクリプトキティーズのコントラクトのアドレスを変更することで、私たちのアプリをめちゃくちゃにすることが可能なのです。

もちろん、アドレスの更新ができるようにするのですが、誰でも更新できるようにしたいわけではありません。

よくあるやり方としては、コントラクトをOwnable(所有可能)とすることです。

これはコントラクトには特別な権限を持つオーナー(所有者)がいることを意味するものです。

 

OpenZeppelinのOwnableコントラクト

コントラクトをOwnableにするために、OpenZeppelinのOwnableコントラクトを使います。

OpenZeppelinはSolidityのライブラリにあり、安全かつコミュニティで検証を経たスマートコントラクトです。これをDAppで使うことができます。

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }
}

<コンストラクタ>

 function Ownale()はコンストラクタです。これは特別な関数で、コントラクトと同じ名前になります。コントラクトが最初に作成された時に、1度だけ実行されます。

<関数修飾子>

 修飾子は半分関数のようなもので、他の関数を編集する際に使います。通常は実行する前に要件をチェックするために使用します。

 上の例では、onlyOwnerはowner(オーナー)だけが関数を実行できるように、制限をアクセスするために使用されます。

<indexed>

 無視してOKです。不要なものです。

 

Ownableコントラクトは基本的に次のようになります。

コントラクトが作られたとき、コンストラクタがownerをmsg.sender(実行した人物)に設定する。

②onlyOwner修飾子を追加して、ownerだけが特定の関数にアクセスできるように設定します。

③新しいownerにコントラクトを譲渡することも可能です。

 

onlyOwnerは誰もが必要としているものです。なので、SolidityのDAppを開発するときには、皆がこのOwnableコントラクトをコピペしてから最初のコントラクトの継承を始めています。

 

テストの実行

①ownable.solをimportするように我々のコードを変更せよ。(zombiefeeding.sol参照可)

レッスン2チャプター6で学習したとおりです。

f:id:nomadomama:20181205010439p:plain

「./」は、「同じディレクトリ(=ファイル)」という意味です。

 

②ZombieFactoryコントラクトを編集してOwnableを継承させよ。(zombiefeeding.sol参照可)

レッスン2チャプター5で学習したとおりです。

f:id:nomadomama:20181205010919p:plain

 

お疲れさまでした!

 

 

<参考>

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