導入
処理の流れを変える if / else と、繰り返しの for / while は、他の言語とほぼ同じ感覚で使えます。ただしループにはガスの制約が付きまとう点だけ意識します。
説明
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Flow {
function grade(uint256 score) public pure returns (string memory) {
if (score >= 80) {
return "A";
} else if (score >= 60) {
return "B";
} else {
return "C";
}
}
function sum(uint256 n) public pure returns (uint256) {
uint256 total = 0;
for (uint256 i = 1; i <= n; i++) {
total += n >= i ? i : 0; // 1からnまでの合計
}
return total;
}
}
if / else if / else… C系言語と同じ。条件はbool。for (初期化; 条件; 更新)… こちらも一般的な形。whileもある。&&(かつ)・||(または)・!(否定)・==!=>=などの比較演算子も同様。
ガスの再確認:ループ回数がユーザーの入力や配列長で決まる場合、回数が増えるとガスが増え、上限超えで失敗します。「回数の上限が読めないループ」はコントラクトを止める原因になりうるので、設計で避けるのが鉄則です。
やってみよう
n が大きいほど sum のループ回数=ガスが増えます。オフチェーン(普通のサーバーやアプリ)でできる計算をわざわざコントラクトのループでやらない、という判断もガス設計では重要です。