『0008』- L'utilisation de variables et de fonctions publiques, internes et privées dans l'état dans Solidity et l'héritage et la réécriture des contrats intelligents Solidity

Kongyi College : une marque leader dans l'enseignement professionnel blockchain national

Auteur : Li Yuechun, ingénieur en architecture blockchain et haute disponibilité
WeChat : liyc1215 Groupe QQ : 348924182 Blog : http://liyuechun.org

Lorsque nous avons utilisé ce mot-clé dans un paramètre de fonction dans la section précédente storage, la fonction actuelle doit être de type internalou private.

Dans cette section, je (WeChat : liyc1215) me concentrerai sur l'introduction des autorisations d'utilisation des attributs et des fonctions .

Autorisations des variables d'état et des fonctions

1. publique

Remarque : Pour faciliter la démonstration, je https://remix.ethereum.org/vais faire une démonstration directement.

publicLes variables et fonctions d'état de type disposent des autorisations les plus élevées et sont accessibles en externe, en sous-traitance et au sein du contrat.

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;
    }

}

solidité publique

Dans ce contrat, nous pouvons facilement voir à partir des résultats d'exécution qu'il existe trois fonctions qui peuvent être appelées de manière externe, à savoir , birthDay. _ageCertaines agepersonnes peuvent se demander : pourquoi les fonctions externes peuvent-elles être appelées _age? Pourquoi les fonctions externes peuvent-elles être appelées ? Pourquoi les fonctions externes peuvent-elles être appelées _age? être appelé ? Quant à l'appel de _agefonctions,_age la raison en est que les autorisations de nos variables d'état sont que publiclorsque les autorisations d'une variable d'état sont de type, elle générera automatiquement une fonction publicqui peut être appelée en externe . getDans notre contrat, comme _ageil s'agit publicd'un type, il en existe un par défaut portant le même nom que la variable d'état dans le contrat get函数, comme indiqué ci-dessous :

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

Parmi les quatre fonctions nous déclarons explicitement :

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;
}

D'après les résultats d'exécution ci-dessus, nous savons que parmi ces quatre fonctions, seules la fonction birthDayet agela fonction sont accessibles en externe. [PS : ageLa fonction est explicitement déclarée par moi. _ageLa fonction est générée _ageautomatiquement publiccar la variable d'état est de internaltype par défaut . Par conséquent, une fonction du même nom que la variable d'état accessible de l'extérieur ne sera pas automatiquement générée.] . En d'autres termes, seule publicla fonction du type est accessible de l'extérieur. On voit que lorsque la fonction est déclarée, la valeur par défaut est publicle type et la variable d'état est déclarée, la valeur par défaut est internaltype .

résumé:

  • Lorsqu'une variable d'état est déclarée, elle est par défaut de internaltype. Seules publicles variables d'état explicitement déclarées comme type généreront automatiquement une fonction du même nom que la variable d'état getpour l'acquisition externe de la valeur de la variable d'état actuelle.
  • Lorsqu'une fonction est déclarée, elle est par défaut publicun type et publicest accessible de l'extérieur tout comme une fonction explicitement déclarée comme type.
2. interne
  • internalLes variables d'état de type sont disponibles pour les appels externes et en sous-traitance .
  • internalLes fonctions de type sont identiques aux privatefonctions de type. Les contrats intelligents les appellent en interne. Elles protectedne sont pas exactement les mêmes que celles des autres langages.
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";

    }
}

contrat de solidité héritage

Dans ce cas, contract Person is Animalle Personcontrat hérite de toutes les variables d'état Animaldu contrat public/internal, mais ne peut hériter que de tous publicles types de fonctions du contrat parent, des fonctions qui ne peuvent pas être héritées internal/private, des fonctions qui ne peuvent pas être héritées et des fonctions internal/privatequi ne peuvent pas être héritées .internal/private

3. privé

Lorsque nous personessayons d'appeler _namedes variables d'état dans le contrat, vous constaterez que la compilation ne peut pas réussir.

solidité privée

Étant donné que _nameles variables d'état sont de type privé dans Animalle contrat et ne peuvent être utilisées qu'en interne, une erreur sera signalée lorsque nous tenterons de les utiliser dans le sous-contrat .privateAnimalPerson

4. Réécrire

Un contrat enfant peut hériter de fonctions du type du contrat parent et ne peut hériter que de fonctions de type public. Nous pouvons appeler directement les fonctions héritées. Bien sûr, nous pouvons également réécrire les fonctions héritées.public

  • Avant de réécrire
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 {

}

solidité avant réécriture

  • Après réécriture
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";
    }

}

solidité après réécriture

résumé

Cet article présente principalement de manière exhaustive public、internal、privatel'application des trois autorisations dans les variables d'état du contrat et les fonctions dans les contrats internes, externes et de sous-traitance du contrat. En étudiant ce tutoriel, je pense que vous en apprendrez davantage sur l'héritage des variables d'état et l'héritage et la réécriture des fonctions . Dans la prochaine série d'articles, nous enseignerons plus en détail la syntaxe pertinente dans Solidity et les précautions lors du développement.

Échange technologique

  • Groupe QQ d'échange de technologie Blockchain : 348924182

  • Compte public officiel de "Blockchain Tribe"

Je suppose que tu aimes

Origine blog.csdn.net/liyuechun520/article/details/78408608#comments_18893023
conseillé
Classement