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: memberf
is not visible c.setData(3); local = c.getData(); local = c.compute(3, 5); // error: membercompute
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プロトコル、公開鍵暗号などビットコインを支える技術について詳細に解説されています。また、サンプルコードを通して実際に手を動かして学べるので非常に濃い内容となっています。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
Solidityを勉強している大学生です。
Solidityに関する情報が少ないなかこのような記事を書いてくださり本当にありがとうございます。
この記事ではフォーカスしていることではないのですが、サンプルコードのContract Cの3行目
C c = new C();
の左辺 C c におけるC(大文字) の役割が理解できないのですが、教えていただくことは可能でしょうか。
よろしくお願いします。
C(大文字)は型情報ですね。Contract Cのことを指しています。
教えてくださりありがとうございます!