本文へスキップ
BecomeCoder

Solidityコース · 第2章 Solidityの基本 ― コントラクトを書いてみる · レッスン10

コンストラクタ ― デプロイ時に一度だけ

ブラウザで完結

導入

コントラクトを台帳に配置(デプロイ)する、その瞬間に一度だけ実行される特別な関数コンストラクタ(constructor) です。初期設定に使います。

説明

「このコントラクトを配置した人」を所有者(owner)として記録する、定番の使い方を見てみましょう。

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

contract Owned {
    address public owner;
    string  public projectName;

    // デプロイ時に一度だけ実行される
    constructor(string memory _name) {
        owner = msg.sender;   // デプロイした人のアドレス
        projectName = _name;
    }
}
  • constructor(...) … デプロイ時に一度だけ呼ばれ、その後は二度と呼べない。
  • msg.sender … 「今この処理を呼び出した人のアドレス」を表す組み込み変数(第4章で詳説)。コンストラクタ内では「デプロイした人」になる。
  • string memory _name … 引数。memory は「一時的な作業用メモリに置く」指定(string などの可変長型で必要。第3章で扱います)。
sequenceDiagram
    participant D as デプロイする人
    participant B as ブロックチェーン
    participant C as コントラクト
    D->>B: コントラクトを配置(引数 _name を渡す)
    B->>C: constructor を1回だけ実行
    C->>C: owner = msg.sender を記録
    Note over C: 以降 constructor は呼べない<br/>owner は台帳に固定

こうして記録した owner は、「所有者だけが実行できる関数」を作るときの基礎になります(第4章の modifier で活躍します)。

やってみよう

引数付きのコンストラクタを持つコントラクトは、デプロイ時に必ずその引数(ここでは _name)を渡す必要があります。「配置=設置工事のとき一度だけ回せるダイヤル」がコンストラクタだとイメージすると、役割がつかめます。

実際に動かしてみよう

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

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

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