『0008』 - Solidity の状態変数と関数におけるパブリック、内部、プライベートの使用と、Solidity スマート コントラクトの継承と書き換え

Kongyi College: 国内ブロックチェーン職業教育のトップブランド

著者: Li Yuechun、ブロックチェーンおよび高可用性アーキテクチャ エンジニア
WeChat: liyc1215 QQ グループ: 348924182 ブログ: http://liyuechun.org

前のセクションで関数パラメータでこのキーワードを使用した場合storage、現在の関数の型はinternalまたはでなければなりませんprivate

このセクションでは、私 (WeChat: liyc1215) が属性関数の使用許可を中心に紹介します

状態変数と関数の権限

1.公共

注:デモンストレーションの便宜上、https://remix.ethereum.org/直接デモンストレーションします。

public状態変数関数には最大の権限があり、外部、サブコントラクト、およびコントラクト内からアクセスできます。

pragma solidity ^0.4.4;

contract Animal {


    string _birthDay; // 生日
    int public _age; // 年龄
    int internal _weight; // 身高
    string private _name; // 姓名


    function Animal() {
      _age = 29;
      _weight = 170;
      _name = "Lucky dog";
      _birthDay = "2011-01-01";
    }

    function birthDay() constant returns (string) {
      return _birthDay;
    }

    function age() constant public returns (int) {
      return _age;
    }

    function height() constant internal returns (int) {
      return _weight;
    }

    function name() constant private returns (string) {
      return _name;
    }

}

堅実性公共

この契約では、実行結果から、外部から呼び出すことができる関数が 、 の 3 つであることが簡単birthDayわかります関数の呼び出しに関しては、その理由は、状態変数の権限がtypeの場合、外部から呼び出すことができる関数を自動的に生成するためです。私たちのコントラクトでは、これは型であるため、実際には、以下に示すように、コントラクト内の状態変数と同じ名前のデフォルトのものが存在します。_ageage_age_age_age_agepublicpublicget_agepublicget函数

function _age() constant public returns (int) {
  return _age;
}

4 つの関数のうち、明示的に宣言します。

function birthDay() constant returns (string) {
    
    
  return _birthDay;
}

function age() constant public returns (int) {
    
    
  return _age;
}

function height() constant internal returns (int) {
    
    
  return _weight;
}

function name() constant private returns (string) {
    
    
  return _name;
}

上記の実行結果から、これら 4 つの関数のうち、外部からアクセスできるのは関数birthDayと関数だけであることがわかります。 [追記:この関数は私が明示的に宣言しています。状態変数はデフォルトで の型であるため、関数は自動的に生成されます。 . したがって、外部からアクセスできる状態変数と同名の関数は自動生成されません] . つまり、その型の関数のみが外部からアクセス可能であることがわかります。関数は宣言されており、デフォルトはtype であり、状態変数は宣言されており、デフォルトはtypeです。ageage_age_agepublicinternalpublicpublicinternal

まとめ:

  • 状態変数が宣言されると、デフォルトはinternal型になります。明示的に型として宣言された状態変数のみ、現在の状態変数の値を外部から取得するためにpublic状態変数と同じ名前の関数が自動的に生成されます。get
  • 関数が宣言されると、その関数はデフォルトでpublic型になり、public明示的に型として宣言された関数と同様に外部からアクセスできます。
二、internal
  • internal状態変数は、外部およびサブコントラクトの呼び出しに使用できます
  • internal関数privateは型関数と同じです。スマート コントラクトは内部でそれらを呼び出します。protected他の言語の関数とまったく同じではありません。
pragma solidity ^0.4.4;

contract Animal {

    string _birthDay; // 生日
    int public _age; // 年龄
    int internal _weight; // 身高
    string private _name; // 姓名

    function Animal() {
    
    
      _age = 29;
      _weight = 170;
      _name = "Lucky dog";
      _birthDay = "2011-01-01";
    }

    function birthDay() constant returns (string) {
    
    
      return _birthDay;
    }

    function age() constant public returns (int) {
    
    
      return _age;
    }

    function height() constant internal returns (int) {
    
    
      return _weight;
    }

    function name() constant private returns (string) {
    
    
      return _name;
    }

}


contract Person is Animal {

    function Person() {
    
    

        _age = 50;
        _weight = 270;
        _birthDay = "2017-01-01";

    }
}

Solidity コントラクトの継承

この場合、contract Person is Animalコントラクトはコントラクトのすべての状態変数Personを継承しますが、継承できるのは、親コントラクト内のすべてのタイプの関数、継承できない関数、継承できない関数、および継承できない関数のみです。Animalpublic/internalpublicinternal/privateinternal/privateinternal/private

3.プライベート

コントラクト内で状態変数をperson呼び出そうとすると、コンパイルが成功しないことがわかります。_name

堅実性プライベート

_name状態変数はAnimalコントラクト内のprivateプライベート型であり、内部でのみ使用できるためAnimal、サブコントラクトで状態変数を使用しようとするとエラーが報告されますPerson

4.書き換える

子コントラクトは、親コントラクトpublic型の関数を継承できますが、パブリック型の関数のみを継承できます。継承した関数を直接呼び出すこともできます。もちろん、継承した関数を書き換えることもできます。

  • 書き換え前
pragma solidity ^0.4.4;

contract Animal {

    string _birthDay; // 生日
    int public _age; // 年龄
    int internal _weight; // 身高
    string private _name; // 姓名

    function Animal() {
      _age = 29;
      _weight = 170;
      _name = "Lucky dog";
      _birthDay = "2011-01-01";
    }

    function birthDay() constant returns (string) {
      return _birthDay;
    }

    function age() constant public returns (int) {
      return _age;
    }

    function height() constant internal returns (int) {
      return _weight;
    }

    function name() constant private returns (string) {
      return _name;
    }

}


contract Person is Animal {

}

書き換え前の堅牢性

  • 書き換え後
pragma solidity ^0.4.4;

contract Animal {

    string _birthDay; // 生日
    int public _age; // 年龄
    int internal _weight; // 身高
    string private _name; // 姓名

    function Animal() {
    
    
      _age = 29;
      _weight = 170;
      _name = "Lucky dog";
      _birthDay = "2011-01-01";
    }

    function birthDay() constant returns (string) {
    
    
      return _birthDay;
    }

    function age() constant public returns (int) {
    
    
      return _age;
    }

    function height() constant internal returns (int) {
    
    
      return _weight;
    }

    function name() constant private returns (string) {
    
    
      return _name;
    }

}


contract Person is Animal {

    function birthDay() constant returns (string) {
    
    

      return "2020-12-15";
    }

}

書き換え後の堅牢性

まとめ

public、internal、privateこの記事では、コントラクトの内部、外部、およびサブコントラクトにおけるコントラクトの状態変数と関数における 3 つのアクセス許可の適用を主に包括的に紹介します。このチュートリアルを学ぶことで、状態変数の継承関数の継承書き換えについてさらに詳しく学べると思います次回の連載では、Solidityの関連構文や開発時の注意点についてさらに詳しく解説していきます。

技術交流

  • ブロックチェーン技術取引所QQグループ:348924182

  • 「Blockchain Tribe」公式公開アカウント

おすすめ

転載: blog.csdn.net/liyuechun520/article/details/78408608#comments_18893023