Marimo.sol を読む会

https://marimo.life/Smart Contract のソースコードを読む会をやった。chanoha といっしょに読み読み。

Marimo.sol は 200 行もないくらいの量で、Solidity を学ぶ教材としてもいい感じ。


  function getCurrentSize(uint256 tokenId) public view returns (uint16) {
    require(_exists(tokenId), "no token");
    uint256 elapsedTime = getElapsedTimeFromLastWaterChanged(tokenId);
    uint256 coefficient = 90000 minutes;
    // add constacont(1440, 33840, 79920, 94320) as the initial value when elapsedTime is zero in each cases
    if (elapsedTime <= 20 days) {
      return uint16((100 * elapsedTime) / coefficient  + getLastSize(tokenId));
    } else if (elapsedTime <= 50 days) {
      return uint16((95 * elapsedTime + 1440 * 60 * 100) / coefficient +  getLastSize(tokenId));
    } else if (elapsedTime <= 80 days) {
      return uint16((50 * elapsedTime + 33840 * 60 * 100) / coefficient + getLastSize(tokenId));
    } else if (elapsedTime <= 100 days) {
      return uint16((10 * elapsedTime + 79920 * 60 * 100) / coefficient + getLastSize(tokenId));
    } else {
      return uint16(getLastSize(tokenId) + (94320 * 60 * 100 / coefficient));
    }
  }
  • 関数 getCurrentSize の実装がおもしろい
    • 最後に水を換えた時点での Size が記録されていて、そこからの差分は計算によって導出し、現在の Size を返す
    • 現在の Size をバッチ処理で永続化することもできるが、ブロックチェーンへの書き込みにはコストがかかるのでなるべく書き込まないという工夫がされていると理解した