Solidity-restricted-access

提供:Dev Guides
移動先:案内検索

堅牢性-アクセス制限

契約へのアクセス制限は一般的な慣行です。 デフォルトでは、パブリックとして指定されていない限り、契約状態は読み取り専用です。

修飾子を使用して、契約の状態を変更できるユーザーを制限したり、契約の機能を呼び出したりできます。 以下で説明するように、複数の修飾子を作成して使用します-

  • onlyBy -関数で使用されると、言及された呼び出し元のみがこの関数を呼び出すことができます。
  • onlyAfter -関数で一度使用すると、その関数は一定時間後に呼び出すことができます。
  • コスト-関数で一度使用すると、呼び出し側は特定の値が提供されている場合にのみこの関数を呼び出すことができます。

pragma solidity ^0.5.0;

contract Test {
   address public owner = msg.sender;
   uint public creationTime = now;

   modifier onlyBy(address _account) {
      require(
         msg.sender == _account,
         "Sender not authorized."
      );
      _;
   }
   function changeOwner(address _newOwner) public onlyBy(owner) {
      owner = _newOwner;
   }
   modifier onlyAfter(uint _time) {
      require(
         now >= _time,
         "Function called too early."
      );
      _;
   }
   function disown() public onlyBy(owner) onlyAfter(creationTime + 6 weeks) {
      delete owner;
   }
   modifier costs(uint _amount) {
      require(
         msg.value >= _amount,
         "Not enough Ether provided."
      );
      _;
      if (msg.value > _amount)
         msg.sender.transfer(msg.value - _amount);
   }
   function forceOwnerChange(address _newOwner) public payable costs(200 ether) {
      owner = _newOwner;
      if (uint(owner) & 0 == 1) return;
   }
}