yethan.goes.asna
約1年 前に投稿  25 Karma
【Ownerble】internal関数を経由する理由

openzeppelin-solidityのOwnerbleのコードを読んでいます。
transferOwnership関数において、_transferOwnership経由する理由は何故でしょうか?

pragma solidity ^0.4.23;

contract Ownerble {
  address public owner;

  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  constractor() public{
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function renounceOwnership()public onlyOwner {
     emit ownershipRenounced(owner);
     owner = address(0);
   }

  // この関数です!!
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }
  // 何故この関数を経由するのでしょうか?
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit Ownershiptransferred(owner, _newOwner);
    owner = _newOwner;
  }
}
ja
#solidity
yethan.goes.asna
約1年 前に投稿  25 Karma
【Ownerble】internal関数を経由する理由

openzeppelin-solidityのOwnerbleのコードを読んでいます。
transferOwnership関数において、_transferOwnership経由する理由は何故でしょうか?

pragma solidity ^0.4.23;

contract Ownerble {
  address public owner;

  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  constractor() public{
    owner = msg.sender;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  function renounceOwnership()public onlyOwner {
     emit ownershipRenounced(owner);
     owner = address(0);
   }

  // この関数です!!
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }
  // 何故この関数を経由するのでしょうか?
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit Ownershiptransferred(owner, _newOwner);
    owner = _newOwner;
  }
}
ja
#solidity

1回答
echizenn_brave8150
約1年 前に回答 100 Karma

詳しくopenzeppelinのコードを読み込んだわけではないので細かいところはわかりませんが、Ownable.solを継承しているSuperuser.solの60行目でも_transferOwnership関数が使われています。なので、同じコードを反復しないようにするために上記のようなコードの構造にしたのではないでしょうか?

詳しくopenzeppelinのコードを読み込んだわけではないので細かいところはわかりませんが、Ownable.solを継承しているSuperuser.solの60行目でも_transferOwnership関数が使われています。なので、同じコードを反復しないようにするために上記のようなコードの構造にしたのではないでしょうか?

nakajo

@echizenn_brave8150さんがすでに回答されてる内容と同じですが、
https://github.com/OpenZeppelin/openzeppelin-solidity/commit/7fb84b42d5fd0efc09a65cd0fe03e433941a3202
にある通り、Superuser.solでも同じfunctionを定義するため、実装を2重に記述しなくて済むように実処理部分をinternal functionに移動させたようですね。

もう少し詳しく説明すると、Solidityではfunctionの名前と引数の型でfunctionの一意性が決まります。そのため、Superuser.solでtransferOwnershipを定義した時、これはOwnable.sol側で定義していたtransferOwnershipをオーバーライドしてしまいます。
なので、internal functionに実実装を押し出す必要があります。

Jun 19 '18 at 12:47 am
Earn tokens by posting and answering questions about blockchain!
Karma to eth
あなたの回答