渋谷ほととぎす通信

Unity・ゲーム開発 技術で一生食べていく情報発信

【Solidity】public変数を定義すると同名のgetter関数自動生成してくれる

オオバです。
Unityでゲームを作りながら趣味でブロックチェーンの勉強をしています。

Ethereumの開発をするために今はSolidityをメインに学習中。

Remix IDEでSolidityを動かしてみて思ったのは、
言語仕様を理解する必要があるということ。

こういうとき僕は公式ドキュメントに立ち返ります。

ネット上に散らばる資料も勉強にはなりますが、
公式ドキュメントの情報に勝るものはありません。

ということで現在Solidityの公式ドキュメントを粛々と読んでいる最中。

そこで気づいたことをブログにメモしています。
※【執筆時点】Solidityのバージョンは0.8.4

ここらは本題です。

Solidityのコンパイラはpublic変数のgetterを自動生成してくれていた件

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract hoge {
    uint public piyo;
}  

👆こちらコードではpiyoというpublic変数を定義したコントラクトです。

function piyo() external view returns (uint) { return piyo; }

👆内部的には以下のようなgetter関数が作られています。
getterとは読み取り専用の関数の事です。

具体的なコードを見ていきましょう。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Hoge {
    uint public piyo;
}

contract  Foo {
    function execute() public {
        Hoge hoge = new Hoge();
        // getterが自動生成されているためアクセス可能
        uint result = hoge.piyo();
    }
} 

このようにpiyoは外(Foo)からpiyo()という形でアクセスが可能です。
わざわざgetterを定義しなくても良いので便利ですね。

注意点

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
contract Hoge {
    uint public piyo;

    function piyo() external view returns(uint){
        return piyo;
    }
}

👆このようにgetterであるpiyo()を開発者は定義できません。

DeclarationError: Identifier already declared

コンパイラー的にはすでに定義済みとのことです。

まとめ

本記事ではSolidityのpublic変数について学んできました。

  • public変数を定義すると対となるgetterを自動生成
  • 自分で同名のgetterは定義は不可(コンパイルエラー)

今回はこれだけ覚えておきましょう。

以上です。

今後も引き続きUnityも発信しつつ、
趣味でEthereumについての学習も共有していきますので、
興味ある方は👇の読者登録、またはTwitterのフォローをお願いいたします。