導入
状態変数や関数には、「誰がアクセスできるか」を表す 可視性(visibility) を必ず指定します。ブロックチェーンでは全データが公開されているため、可視性は「情報の秘匿」ではなく「呼び出せる範囲の制御」だという点に注意が必要です。
説明
可視性は4種類あります。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Visibility {
uint256 public a = 1; // 誰でも読める(自動でgetter関数が作られる)
uint256 private b = 2; // このコントラクト内からのみ
uint256 internal c = 3; // このコントラクト+継承先から
function pub() public pure returns (string memory) { return "外部・内部どちらからも"; }
function ext() external pure returns (string memory) { return "外部からのみ"; }
function intr() internal pure returns (string memory) { return "内部・継承先から"; }
function priv() private pure returns (string memory) { return "このコントラクト内のみ"; }
}
| 可視性 | このコントラクト内 | 継承先 | 外部(他コントラクト・ユーザー) |
|---|---|---|---|
public | ○ | ○ | ○ |
external | ✕ | ✕ | ○ |
internal | ○ | ○ | ✕ |
private | ○ | ✕ | ✕ |
publicな状態変数には、同名の読み取り関数(getter)が自動生成される。だからcount publicにすると外からcount()で読めた。externalは外部から呼ばれる前提の関数向け。- 重要な誤解に注意:
privateにしても「値が秘密になるわけではありません」。台帳のデータは誰でも解析でき、privateは「Solidity コードから直接触れない」だけ。パスワードや秘密鍵をコントラクトに保存してはいけません。
やってみよう
パスワードや当選番号を private 変数に入れれば隠せる、と考えるのは典型的な誤りです。ブロックチェーンは全データが公開・永久保存であることを、可視性とセットで必ず覚えておきましょう。