本文へスキップ
BecomeCoder

Solidityコース · 第4章 制御・お金・安全性 ― require・payable・event · レッスン15

条件分岐とループ ― if と for

ブラウザで完結

導入

処理の流れを変える 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 のループ回数=ガスが増えます。オフチェーン(普通のサーバーやアプリ)でできる計算をわざわざコントラクトのループでやらない、という判断もガス設計では重要です。

実際に動かしてみよう

下のエディタのコントラクトを「コンパイル & デプロイ」すると、ブラウザ内で本物のSolidityコンパイラ(solc)がコンパイルし、EVM(@ethereumjs)にデプロイされます。デプロイ後は public な関数がボタンになって並ぶので、引数を入れて呼び出すと戻り値・イベント・require のエラー(revert理由)まで確認できます。本文のコントラクトを書き換えて動きを試しながら進めましょう(コンパイラ本体は初回だけ読み込みに数秒かかります)。

Solidity — ブラウザ内でコンパイル & 実行

ブラウザ内で本物のSolidityコンパイラ(solc)とEVM(@ethereumjs)を動かす環境を読み込みます(コンパイラ本体は初回のコンパイル時に読み込むため、最初の実行だけ数秒かかります)。
スクロールして表示された時点でも自動で読み込まれます。