本文へスキップ
BecomeCoder

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

可視性 ― public / private / internal / external

ブラウザで完結

導入

状態変数関数には、「誰がアクセスできるか」を表す 可視性(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 変数に入れれば隠せる、と考えるのは典型的な誤りです。ブロックチェーンは全データが公開・永久保存であることを、可視性とセットで必ず覚えておきましょう。

実際に動かしてみよう

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

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

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