Solidity

[Solidity 入門] 状態変数とアクセスレベル (public / internal / private)

この記事で分かること

  • Solidityの状態変数とは何か?
  • 状態変数のアクセスレベル修飾子 (internal / private / public) について
  • constant 修飾子について

この記事では、Solidity言語入門と称してSolidityの基礎的な内容や、覚えておきたいテクニックなどを紹介しています。

Solidityとは、イーサリアムブロックチェーンの機能を拡張するために利用されているプログラミング言語で、スマートコントラクトと呼ばれる取引の契約書に当たるものを記述できる言語です。

今回の記事は、Solidityで最も重要になる状態変数の概念と、その修飾子について の説明になります。

状態変数とは?

Solidityには、状態変数とメモリ変数と呼ばれる2種類の変数が存在します。

状態変数は、Solidityコントラクトの中でも最も重要な要素の一つで、マイナーによってブロックチェーン/イーサリアムの台帳へ永久に保存されます。
つまり、状態変数の値を書き換えるには新規にブロックチェーンを作って、全世界の台帳に追記する形で値を更新していくことになります。

以下、状態変数の定義例です。

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.2 < 0.9.0;

contract StateVariableExample {
    // ここに定義されているのが状態変数(state variables)
    int public intValue;
    string stringValue;
    address private addressValue;
    bool constant isFinished = false;

    function get() public view returns(int) {
        return intValue;
    }
}
ゴイチ

状態変数に関して、敬愛する中島聡さんのメルマガから、とても分かりやすい表現があったため紹介します。

(中略)
C++やJavaのクラスは、実行時にはマシン語やバイトコードにコンパイルされ(コンパイル=マシンが実行出来る形に変更すること)、それがマシンにロードされた上で実行され、その結果としてクラスのインスタンス(オブジェクト)が作られます。さまざまな状態を持つインスタンスを複数作ることも可能だし、マシンごとに異なるインスタンスが作られるのが普通です。

Ethereum ブロックチェーン上でも、Solidityで書かれたコードが(バイトコードに)コンパイルされたのちに実行される点はC++やJavaのコードと同じですが、インスタンスは常に一つしか作られないし(シングルインスタンス)、コードとデータは一緒に管理されるし、Ethereum のマイニングマシンがたとえ数千台あろうと、基本的に全てのマシンに同じ状態を持つインスタンスが作られます。

つまり、上のコードで定義したSimpleStorageというコントラクトが Ethereum ブロックチェーン上にデプロイされた時に(デプロイ=運用環境に展開すること)、世界中にある全ての Ethereum マイニングマシン上にこのコントラクトのインスタンスが作られ、状態変数 storedData に格納された数字は、どのマシン上でも一緒になるのです。

全てのマシンに同じデータを保存するなど、従来型の発想では「とんでもない無駄」ですが、それによって初めて、特権を持つ存在が不要な分散型のデータベースを構築することが可能になっているのです。

中島聡さんのメルマガ「週刊 Life is beautiful 2022年3月8日号:プログラム言語 Solidity」より
ゴイチ

世界中のマシンに同じ状態を保持するとは何とも無駄のようですが、これがブロックチェーンの世界の常識なんですね

状態変数のアクセスレベル

状態変数はアクセスレベルを表す修飾子と合わせて使用されます。以下の修飾子を利用することができます。

  • internal
  • private
  • public
  • constant

internal

何も指定されていない場合、デフォルトでは internal 修飾子になります。

internal のアクセスレベルは、宣言されたコントラクト内の関数と、その継承コントラクト内でのみ です。

internal な変数は外部からの更新アクセスを許しませんが、参照することはできます。

private

internal より更に厳しい制約を持ちます。

private のアクセスレベルは、宣言されたコントラクト内でのみ です。

継承したコントラクト内では使用することはできません。

public

publicのアクセスレベルは、外部から状態変数に直接アクセスすることを許します

Solidityコンパイラは、publicな状態変数に対応する getter 関数を生成します。

constant

この修飾子は、状態変数を不変にします。

宣言時に変数へ値を代入しておく必要があります。

実際には、コンパイラはコードとして宣言されたすべての変数の参照箇所を、割り当てられた値に置き換えます。

まとめ

最後に、この記事の内容をまとめます。

要点まとめ

  • Solidityの状態変数は世界中のマイニングマシンで同一の値を保持する。
  • 状態変数にはアクセスレベルを表す修飾子がある。
  • アクセスレベルは、internal / private / public に分かれる。
  • constant 修飾子で状態変数を不変にできる。

Solidityの状態変数の意味やアクセスレベル修飾子についてまとめました。

状態変数は修飾子以外にデータ型も指定する必要がありますが、データ型については以下の記事にまとめていますので、良かったら合わせてご覧ください。

ゴイチ

最後まで読んでくれてありがとうございました!

参考書籍

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系・スマホ・大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-Solidity
-, ,