【Solidity基礎】public, privateとexternal, internalの違いと使い所




Solidityのアクセス権限

Solidityには変数と関数にどこからアクセスできるのか制限をつけることができます。下記4つを設定することができます。今回はこの4つのアクセス制限と使い所を説明したいと思います。

  • private
  • public
  • internal
  • external

private

他の言語と同じで定義されたコントラクト内でのみ使用することができます。定義されたコントラクトを継承した子のコントラクトではprivateな関数と値を使用することはできません。

public

publicは定義されたコントラクトとこのコントラクトを継承したコントラクトから呼び出すことができかつ、外部から呼び出すことができます。関数に明示的に権限を設定していない場合のデフォルト設定がpublicとなるので気をつけてください。

internal

internalは定義されたコントラクトとこのコントラクトを継承したコントラクからのみ呼び出すことができます。変数に明示的に権限を設定していない場合のデフォルトの設定はinternalとなります。

external

externalは外部からのみ呼び出すことができます。

externalとpublicの使いどころ

externalは外部からしか呼ぶことができませんが、thisを使うと内部から外部的に関数を呼び出すことができます。呼び出せるということだけを見るとpublicと同じ権限になり違いが無くなりますが下記Stack Overflowに詳しく説明されているので読んでみてください。

違いを簡単に説明すると、引数で渡された値をメモリに保存するかしないかの違いがあります。

publicな関数を外部から呼ぶと引数の値を一度メモリに保存します。externalな関数の場合は引数で渡された値はメモリに保存されることなく関数が処理されるのでgasがpublicよりも低くすむそうです。

public関数は内部からも呼ばれる関数なので変数をメモリに入れておく必要があるという説明がされていてなるほどと理解することができました。間違いがあれば指摘していただければと思います。

external vs public best practices

サンプルコード

下記はSolidityのドキュメントに記載されているサンプルコードです。非常にわかりやすいので一度読んで理解しておくといいかと思います。ドキュメントはこちら

// This will not compile

pragma solidity ^0.4.0;

contract C {
    uint private data;

    function f(uint a) private returns(uint b) { return a + 1; }
    function setData(uint a) public { data = a; }
    function getData() public returns(uint) { return data; }
    function compute(uint a, uint b) internal returns (uint) { return a+b; }
}

contract D {
    function readData() public {
        C c = new C();
        uint local = c.f(7); // error: member f is not visible
        c.setData(3);
        local = c.getData();
        local = c.compute(3, 5); // error: member compute is not visible
    }
}

contract E is C {
    function g() public {
        C c = new C();
        uint val = compute(3, 5); // access to internal member (from derived to parent contract)
    }
}

おすすめ書籍

Ethereumを使ったDApps開発を学びたいなら今だとこの1冊が1番良いです!開発環境の構築から使うべきツール、フレームワーク、実装方法・注意点まで網羅的に解説されている書籍なのでおすすめです。出版も2018年1月ということでかなり新しい本で、DMM Bitcoinを作っているネクストカレンシー所属の方が書いているので信頼できます。

ビットコインとブロックチェーンの詳細をしっかりと学びたい方にはこちらの書籍が非常におすすめです。ウォレットの仕組み、楕円曲線暗号、P2Pプロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら




3 件のコメント

  • Solidityを勉強している大学生です。
    Solidityに関する情報が少ないなかこのような記事を書いてくださり本当にありがとうございます。

    この記事ではフォーカスしていることではないのですが、サンプルコードのContract Cの3行目

    C c = new C();

    の左辺 C c におけるC(大文字) の役割が理解できないのですが、教えていただくことは可能でしょうか。
    よろしくお願いします。 

  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です