導入
コントラクトを台帳に配置(デプロイ)する、その瞬間に一度だけ実行される特別な関数が コンストラクタ(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)を渡す必要があります。「配置=設置工事のとき一度だけ回せるダイヤル」がコンストラクタだとイメージすると、役割がつかめます。