本文へスキップ
BecomeCoder

Solidityコース · 第3章 値とデータ構造 ― address・mapping・struct · レッスン13

配列 ― 順序のあるデータ

ブラウザで完結

導入

同じ型の値を並べて持つのが 配列(array) です。参加者リストや履歴など、「順番に並べたい」「全部を辿りたい」データに使います。

説明

要素数が変わる動的配列と、固定長の配列があります。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Players {
    address[] public players;      // 動的配列(可変長)
    uint256[3] public topScores;   // 固定長配列(要素3つ)

    function join() public {
        players.push(msg.sender);  // 末尾に追加
    }

    function count() public view returns (uint256) {
        return players.length;     // 要素数
    }

    function firstPlayer() public view returns (address) {
        return players[0];         // 添字は0から
    }
}
  • address[] public players; … 長さが変わる動的配列。push() で末尾追加、.length で個数。
  • uint256[3] … 長さ固定の配列。
  • 添字は 0 始まり。範囲外にアクセスすると処理は失敗(revert)する。

ガスの注意:配列を先頭から末尾まで for で回す処理は、要素が増えるほどガスが増え、上限を超えると処理が実行不能になることがあります。「全件ループ」は Solidity では要注意パターン。可能なら mapping で直接引く設計にします。

やってみよう

players.push(...) で無制限に増える配列を全走査する関数は、参加者が数万人になると1回の実行でガス上限を超え、動かなくなる危険があります。「配列は増える、ループはガスを食う」――この2つを結びつけて設計する感覚が大切です。

実際に動かしてみよう

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

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

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