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 internal
ou 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.
public
Variá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;
}
}
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
. age
Algumas 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 _age
funções,_age
o motivo é porque as permissões de nossas variáveis de estado são que public
quando as permissões de uma variável de estado são do tipo, ela gerará automaticamente uma função public
que pode ser chamada externamente . get
No nosso contrato, por _age
ser public
um 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 birthDay
e age
a função podem ser acessadas externamente. [PS: age
A função foi declarada explicitamente por mim. _age
A função é gerada _age
automaticamente public
porque a variável de estado é do internal
tipo 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 public
a função do tipo pode ser acessada externamente. Pode-se observar que quando a função é declarada, o padrão é public
o tipo e a variável de estado é declarada, o padrão é internal
o tipo .
resumo:
- Quando uma variável de estado é declarada, o padrão é o
internal
tipo. Somentepublic
variáveis de estado declaradas explicitamente como um tipo gerarão automaticamente uma função com o mesmo nome da variável de estadoget
para aquisição externa do valor da variável de estado atual. - Quando uma função é declarada, seu padrão é
public
um tipo epublic
é acessível externamente, assim como uma função declarada explicitamente como um tipo.
2. interno
internal
Variáveis de estado de tipo estão disponíveis para chamadas externas e de subcontrato .internal
As funções de tipo são iguais àsprivate
funções de tipo. Os contratos inteligentes as chamam internamente. Elesprotected
nã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";
}
}
Nesse caso, contract Person is Animal
o Person
contrato herda todas as variáveis de estado Animal
do contrato public/internal
, mas só pode herdar todos public
os 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/private
que não podem ser herdadas .internal/private
3. privado
Quando tentamos person
chamar _name
variáveis de estado no contrato, você descobrirá que a compilação não pode passar.
Como _name
as variáveis de estado são tipos privados Animal
no contrato e só podem ser usadas internamente, um erro será relatado quando tentarmos usá-las no subcontrato .private
Animal
Person
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 {
}
- 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";
}
}
resumo
Este artigo apresenta principalmente de forma abrangente public、internal、private
a 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"