『0008』 - El uso de variables y funciones públicas, internas y privadas en estado en Solidity y la herencia y reescritura de contratos inteligentes de Solidity

Kongyi College: una marca líder de educación vocacional nacional blockchain

Autor: Li Yuechun, ingeniero de arquitectura de alta disponibilidad y blockchain
WeChat: liyc1215 Grupo QQ: 348924182 Blog: http://liyuechun.org

Cuando usamos esta palabra clave en un parámetro de función en la sección anterior storage, la función actual debe ser de tipo internalo private.

En esta sección, yo (WeChat: liyc1215) me centraré en presentar los permisos de uso de atributos y funciones .

Permisos de variables y funciones de estado.

1. público

Nota: Para facilitar la demostración, la https://remix.ethereum.org/demostraré directamente.

publicLas variables y funciones de estado de tipo tienen los mayores permisos y se puede acceder a ellas externamente, mediante subcontratos y dentro del 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 publica

En este contrato, podemos ver fácilmente a partir de los resultados de ejecución que hay tres funciones que se pueden llamar externamente, a saber, birthDay, Algunas personas pueden preguntar, ¿por qué se pueden llamar funciones externas ? ¿Por qué se pueden llamar funciones externas ? ¿Por qué se pueden llamar funciones externas_age ? En cuanto a llamar a funciones, la razón es que los permisos de nuestras variables de estado son que cuando los permisos de una variable de estado son de tipo, generará automáticamente una función que se puede llamar externamente . En nuestro contrato, debido a que es un tipo, en realidad hay uno predeterminado con el mismo nombre que la variable de estado en el contrato , como se muestra a continuación:age_age_age_age_agepublicpublicget_agepublicget函数

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

Entre las cuatro funciones declaramos explícitamente:

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

De los resultados de ejecución anteriores, sabemos que entre estas cuatro funciones, solo se puede acceder externamente a la función birthDayy a la función [PD: La función la declaro explícitamente. La función se genera automáticamente porque la variable de estado es de tipo por defecto . Por lo tanto, una función con el mismo nombre que la variable de estado a la que se puede acceder desde el exterior no se generará automáticamente] . En otras palabras, solo se puede acceder a la función del tipo desde el exterior. Se puede ver que cuando se declara la función, el tipo predeterminado es y se declara la variable de estado, el tipo predeterminado es .ageage_age_agepublicinternalpublicpublicinternal

resumen:

  • Cuando se declara una variable de estado, su valor predeterminado es internalel tipo. Solo publiclas variables de estado declaradas explícitamente como un tipo generarán automáticamente una función con el mismo nombre que la variable de estado getpara la adquisición externa del valor de la variable de estado actual.
  • Cuando se declara una función, su valor predeterminado es publicun tipo y publices accesible desde el exterior como una función declarada explícitamente como un tipo.
2. interno
  • internalLas variables de estado de tipo están disponibles para llamadas externas y de subcontrato .
  • internalLas funciones de tipo son iguales que privatelas funciones de tipo, los contratos inteligentes las llaman internamente y no son protectedexactamente iguales a las de otros lenguajes.
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";

    }
}

herencia contrato solidez

En este caso, contract Person is Animalel Personcontrato hereda todas las variables de estado Animaldel contrato public/internal, pero solo puede heredar todo publictipo de funciones en el contrato principal, funciones que no se pueden heredar internal/private, funciones que no se pueden heredar y funciones internal/privateque no se pueden heredar .internal/private

3. privado

Cuando intentamos personllamar _namea variables de estado en el contrato, encontrará que la compilación no puede pasar.

solidez privada

Debido a que _namelas variables de estado son tipos privados en Animalel contrato y solo se pueden usar internamente, se informará un error cuando intentemos usarlas en el subcontrato .privateAnimalPerson

4. Reescribir

Un contrato secundario puede heredar funciones del tipo del contrato principal y solo puede heredar funciones de tipo público. Podemos llamar directamente a las funciones heredadas. Por supuesto, también podemos reescribir las funciones heredadas.public

  • Antes de reescribir
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 reescribir

  • Después de reescribir
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 después de reescribir

resumen

Este artículo presenta principalmente de manera integral public、internal、privatela aplicación de los tres permisos en las variables y funciones de estado del contrato en los contratos internos, externos y subcontratos del contrato. Al estudiar este tutorial, creo que aprenderá más sobre la herencia de variables de estado y la herencia y reescritura de funciones . En la próxima serie de artículos, enseñaremos más a fondo la sintaxis relevante en Solidity y las precauciones durante el desarrollo.

Intercambio de tecnología

  • Grupo QQ de intercambio de tecnología blockchain: 348924182

  • Cuenta pública oficial "Blockchain Tribe"

Supongo que te gusta

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