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


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



----

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 をバッチ処理で永続化することもできるが、ブロックチェーンへの書き込みにはコストがかかるのでなるべく書き込まないという工夫がされていると理解した