『0008』- O uso de variáveis e funções públicas, internas e privadas em estado no Solidity e a herança e reescrita de contratos inteligentes do Solidity

Kongyi College: uma marca líder de educação profissional em blockchain nacional

Autor: Li Yuechun, engenheiro de arquitetura de blockchain e alta disponibilidade
WeChat: liyc1215 Grupo QQ: 348924182 Blog: http://liyuechun.org

Quando usamos esta palavra-chave em um parâmetro de função na seção anterior storage, a função atual deve ser do tipo internalou private.

Nesta seção, eu (WeChat: liyc1215) focarei na introdução das permissões de uso de atributos e funções .

Permissões de variáveis ​​e funções de estado

1. público

Nota: Para comodidade de demonstração, demonstrarei https://remix.ethereum.org/diretamente.

publicVariáveis ​​e funções de estado de tipo têm as maiores permissões e podem ser acessadas externamente, subcontratos e dentro do contrato.

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

}

solidez pública

Neste contrato, podemos ver facilmente pelos resultados da execução que existem três funções que podem ser chamadas externamente, a saber, birthDay, _age. ageAlgumas pessoas podem perguntar: por que funções externas podem ser chamadas _age? Por que funções externas podem ser chamadas _age? Por que funções externas podem ser chamado? Quanto à chamada de _agefunções,_age o motivo é porque as permissões de nossas variáveis ​​​​de estado são que publicquando as permissões de uma variável de estado são do tipo, ela gerará automaticamente uma função publicque pode ser chamada externamente . getNo nosso contrato, por _ageser publicum tipo, na verdade existe um padrão com o mesmo nome da variável state do contrato get函数, conforme mostrado abaixo:

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

Entre as quatro funções declaramos explicitamente:

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

A partir dos resultados de execução acima, sabemos que entre essas quatro funções, apenas a função birthDaye agea função podem ser acessadas externamente. [PS: ageA função foi declarada explicitamente por mim. _ageA função é gerada _ageautomaticamente publicporque a variável de estado é do internaltipo por padrão . Portanto, uma função com o mesmo nome da variável de estado que pode ser acessada externamente não será gerada automaticamente] . Em outras palavras, apenas publica função do tipo pode ser acessada externamente. Pode-se observar que quando a função é declarada, o padrão é publico tipo e a variável de estado é declarada, o padrão é internalo tipo .

resumo:

  • Quando uma variável de estado é declarada, o padrão é o internaltipo. Somente publicvariáveis ​​de estado declaradas explicitamente como um tipo gerarão automaticamente uma função com o mesmo nome da variável de estado getpara aquisição externa do valor da variável de estado atual.
  • Quando uma função é declarada, seu padrão é publicum tipo e publicé acessível externamente, assim como uma função declarada explicitamente como um tipo.
2. interno
  • internalVariáveis ​​de estado de tipo estão disponíveis para chamadas externas e de subcontrato .
  • internalAs funções de tipo são iguais às privatefunções de tipo. Os contratos inteligentes as chamam internamente. Eles protectednão são exatamente iguais aos de outras linguagens.
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";

    }
}

herança de contrato de solidez

Nesse caso, contract Person is Animalo Personcontrato herda todas as variáveis ​​de estado Animaldo contrato public/internal, mas só pode herdar todos publicos tipos de funções do contrato pai, funções que não podem ser herdadas internal/private, funções que não podem ser herdadas e funções internal/privateque não podem ser herdadas .internal/private

3. privado

Quando tentamos personchamar _namevariáveis ​​de estado no contrato, você descobrirá que a compilação não pode passar.

solidez privada

Como _nameas variáveis ​​de estado são tipos privados Animalno contrato e só podem ser usadas internamente, um erro será relatado quando tentarmos usá-las no subcontrato .privateAnimalPerson

4. Reescrever

Um contrato filho pode herdar funções do tipo do contrato pai e só pode herdar funções do tipo público. Podemos chamar diretamente as funções herdadas. Claro, também podemos reescrever funções herdadas.public

  • Antes de reescrever
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 {

}

solidez antes de reescrever

  • Depois de reescrever
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";
    }

}

solidez após reescrever

resumo

Este artigo apresenta principalmente de forma abrangente public、internal、privatea aplicação das três permissões nas variáveis ​​​​e funções de estado do contrato nos contratos internos, externos e subcontratos do contrato. Ao estudar este tutorial, acredito que você aprenderá mais sobre herança de variáveis ​​de estado e herança e reescrita de funções . Na próxima série de artigos, ensinaremos mais detalhadamente a sintaxe relevante do Solidity e os cuidados durante o desenvolvimento.

Intercâmbio de tecnologia

  • Grupo QQ de troca de tecnologia Blockchain: 348924182

  • Conta pública oficial da "Tribo Blockchain"

Acho que você gosta

Origin blog.csdn.net/liyuechun520/article/details/78408608#comments_18893023
Recomendado
Clasificación