コントラクトの構造
ひとつのSolidityファイルには、ライセンス、pragma、import、contractを記述します。contractの中に状態変数、イベント、エラー、modifier、関数、constructorを置きます。
構造を確認するSOLIDITY
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Profile {
string public name;
uint256 public createdAt;
constructor(string memory initialName) {
name = initialName;
createdAt = block.timestamp;
}
}実行結果OUTPUT
Deploy("Mity") → name: "Mity"
createdAt() → デプロイ時のブロック時刻デプロイ時に文字列を入力するとconstructorが一度だけ実行されます。createdAtは現在ブロックの時刻ですが、正確な時計として扱うものではありません。
可視性とgetter
状態変数にはpublic、internal、private、関数にはexternal、public、internal、privateがあります。privateはブロックチェーン上で秘密になるという意味ではなく、Solidityコードから直接参照できないという意味です。
明示的なgetterSOLIDITY
contract Vault {
uint256 private balance;
function deposit(uint256 amount) external {
balance += amount;
}
function currentBalance() external view returns (uint256) {
return balance;
}
}結果OUTPUT
deposit(50) → currentBalance() → 50constructorで初期化する
constructorはデプロイ時だけ実行されます。所有者のアドレスや初期設定を保存する場所ですが、後から変更できるかどうかも設計しておきます。
継承とinterface
interfaceを呼び出すSOLIDITY
interface ICounter {
function count() external view returns (uint256);
}
contract Reader {
function read(address target) external view returns (uint256) {
return ICounter(target).count();
}
}実行結果OUTPUT
Counterのcountが3のとき、read(counterAddress) → 3interfaceは相手の関数の形だけを宣言します。外部コントラクトを呼び出すと相手の実装や失敗の影響を受けるため、外部呼び出しは安全性の章で扱う注意点とセットで考えます。
練習
Profileに「公開プロフィールを更新できるのは本人だけ」という条件を追加してみましょう。次は関数・修飾子・エラーです。