It’s now or never

IT系の技術ブログです。気になったこと、勉強したことを備忘録的にまとめて行きます。

【Ethereum】【Solidity】OpenZeppelinのDayLimitのソースを読んでみる

OpenZeppelinというフレームワークソースコードを引き続き読んでいます。

過去はこちら inon29.hateblo.jp

今回は、DayLimitというContractのソースを読んでみました。 DayLimitコントラクトは、関数に日付の実行制限を付与するためのコントラクトです。

ソース

https://github.com/OpenZeppelin/zeppelin-solidity/blob/v1.2.0/contracts/DayLimit.sol

フィールド

uint256 public dailyLimit;
uint256 public spentToday;
uint256 public lastDay;
  • dailyLimit: 一日に動かせる制限値
  • spentToday: 一日に動かした量
  • lastDay: 最後に動かした日(int)

コンストラクタ

function DayLimit(uint256 _limit) {
  // 1日あたりの制限値を設定
  dailyLimit = _limit;
  // 最後に実行された日を今日に初期化
  lastDay = today();
}
  • _limit: 一日に動かせる制限値を初期化できます。

制限値の初期化(_setDailyLimit)

function _setDailyLimit(uint256 _newLimit) internal {
  dailyLimit = _newLimit;
}
  • 一日の制限値の変更。
  • internalのため、このコンストラクタまたは継承コンストラクタからのみ実行可能です。

使用値の初期化(_resetSpentToday)

function _resetSpentToday() internal {
  spentToday = 0;
}
  • 一日に使用した量の初期化

制限チェック(underLimit)

function underLimit(uint256 _value) internal returns (bool) {
  // 日付が変わっていれば、使用値とチェック日付をリセットする
  if (today() > lastDay) {
    spentToday = 0;
    lastDay = today();
  }
  // 制限値を超えていなければ、使用値に加算してtrueを返す
  if (spentToday + _value >= spentToday && spentToday + _value <= dailyLimit) {
    spentToday += _value;
    return true;
  }
  return false;
}
  • 現在の値が、制限を超えているかをチェックします
  • spentToday + _value >= spentTodayは_valueがマイナスかをチェックしている?
    • この処理は、他のcontractでもよく見かけるが、uintでもマイナス値が入ることがあるのか?

今日の日付を返す(today)

function today() private constant returns (uint256) {
  return now / 1 days;
}
  • 現在日付を1日で割り、今日の日付のint値を返しています。

実行制限のmodifier(limitedDaily)

modifier limitedDaily(uint256 _value) {
  require(underLimit(_value));
  _;
}
  • 関数に制限値のチェックを行う実行チェックを付与できます。
  • underLimitでfalseが返されるとエラーになります。

感想

  • Shareableに比べるとかなりシンプルです。
  • 1dayの計算箇所を変更すれば、色々な期間の制限に応用ができそうです。