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 internal
o 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.
public
Las 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;
}
}
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
_age
public
public
get
_age
public
get函数
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 birthDay
y 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 .age
age
_age
_age
public
internal
public
public
internal
resumen:
- Cuando se declara una variable de estado, su valor predeterminado es
internal
el tipo. Solopublic
las variables de estado declaradas explícitamente como un tipo generarán automáticamente una función con el mismo nombre que la variable de estadoget
para la adquisición externa del valor de la variable de estado actual. - Cuando se declara una función, su valor predeterminado es
public
un tipo ypublic
es accesible desde el exterior como una función declarada explícitamente como un tipo.
2. interno
internal
Las variables de estado de tipo están disponibles para llamadas externas y de subcontrato .internal
Las funciones de tipo son iguales queprivate
las funciones de tipo, los contratos inteligentes las llaman internamente y no sonprotected
exactamente 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";
}
}
En este caso, contract Person is Animal
el Person
contrato hereda todas las variables de estado Animal
del contrato public/internal
, pero solo puede heredar todo public
tipo de funciones en el contrato principal, funciones que no se pueden heredar internal/private
, funciones que no se pueden heredar y funciones internal/private
que no se pueden heredar .internal/private
3. privado
Cuando intentamos person
llamar _name
a variables de estado en el contrato, encontrará que la compilación no puede pasar.
Debido a que _name
las variables de estado son tipos privados en Animal
el contrato y solo se pueden usar internamente, se informará un error cuando intentemos usarlas en el subcontrato .private
Animal
Person
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 {
}
- 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";
}
}
resumen
Este artículo presenta principalmente de manera integral public、internal、private
la 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"