Guia rápido para controle de acesso Solidity

Neste artigo, exploraremos os vários mecanismos de controle de acesso do Solidity com exemplos e como eles podem ser usados ​​para impor o acesso restrito a partes específicas de um contrato inteligente.

Na maioria dos contratos, o acesso ao contrato é restrito. A menos que especificado como público, um estado de contrato é somente leitura por padrão.



Solidity Controle de Acesso / Acesso Restrito

Um contrato pode ser impedido de ser modificado ou ser chamado com a ajuda de modificadores.

Aqui estão as etapas que seguiremos para criar e usar vários modificadores:

  1. onlyBy : Quando usado em uma função, só pode ser chamado pelo usuário mencionado na chamada.
  2. OnlyAfter : Especifica que uma função pode ser chamada após um certo período de tempo.
  3. Costs : uma vez usado em uma função, o chamador só pode chamar essa função se um determinado valor for fornecido.

O seguinte programa mostra os métodos de restrição de funções:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
pragma solidity ^0.8.0;
contract SolidityTest {
address public owner=msg.sender;
uint public time=block.timestamp;
modifier onlyBy(address user_address){
require(user_address==owner,"Welcome to the program User");
_;
}
function get_Product(uint mrx,uint ample) public onlyBy(owner) view returns(uint){
return mrx*ample;
}
modifier onlyAfter(uint enter_Time){
require(enter_Time >= time ,"Wait for 2 minutes to get this executed");
_;
}
function get_Sum(uint mrx,uint ample) public onlyBy(owner) onlyAfter(time + 1 minutes) view returns(uint){
return mrx+ample;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>

Exemplo de Explicação

O exemplo acima contém duas funções, get_Product e get_Sum , e dois modificadores , onlyBy e onlyAfter.

O contrato SolidityTest contém duas variáveis ​​de estado , owner e time , que são inicializadas com o endereço do criador do contrato (msg.sender) e o timestamp do bloco atual (block.timestamp), respectivamente.

O modificador onlyBy é definido para restringir o acesso a determinadas funções apenas ao proprietário do contrato.

A instrução require verifica se o parâmetro user_address passado para a função corresponde ao endereço do proprietário.

Se o endereço não corresponder, a função será revertida com uma mensagem de erro. O símbolo _ é um espaço reservado que representa o código da função à qual o modificador é aplicado.

A função get_Product usa dois parâmetros uint, mrx e ample, e retorna seu produto.

O modificador onlyBy(owner) é aplicado à função, o que significa que somente o proprietário do contrato pode chamar essa função.

O modificador onlyAfter é definido para restringir o acesso a determinadas funções até que um determinado registro de data e hora do bloco seja alcançado.

A instrução require verifica se o parâmetro enter_Time passado para a função é igual ou maior que a variável de estado time mais 1 minuto. Se a condição não for atendida, a função será revertida com uma mensagem de erro.

A função get_Sum usa dois parâmetros uint, mrx e ample, e retorna sua soma. Os modificadores onlyBy(owner) e onlyAfter(time + 1 minutes) são aplicados à função, o que significa que somente o proprietário do contrato pode chamar essa função e a função só pode ser chamada um minuto após a implantação do contrato.

Aqui está outra função que mostra o processo de verificação do comprador, transferência e verificação de tempo para criptografar a função apenas para o comprador real:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
pragma solidity ^0.6.0;
contract SolidityTest {
address public buyer = msg.sender;
uint public creation_Time = block.timestamp;
modifier onlyBy(address user_account) {
require(
msg.sender == user_account,
"Buyer Matched."
);
_;
}
function modify_Buyer(address new_buyer) public onlyBy(buyer) {
buyer =new_buyer;
}
modifier onlyAfter(uint _time) {
require(
creation_Time >= _time,
"Function called earlier before time"
);
_;
}
function remover_buyer() public onlyBy(buyer) onlyAfter(creation_Time + 2 weeks) {
delete buyer;
}
modifier costs(uint _amount) {
require(
msg.value >= _amount,
"Transferred Successfully."
);
_;
if (msg.value > _amount)
msg.sender.transfer(msg.value -- _amount);
}
function forceOwnerChange(address new_buyer) public payable costs(440 ether) {
buyer =new_buyer;
if (uint(buyer) & 0 == 1) return;
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>

Conclusão

As restrições de função Solidity fornecem a capacidade de adicionar condições ou restrições adicionais à execução de seus contratos inteligentes.

É possível tornar seu código mais seguro, robusto e eficiente usando modificadores.

O tipo de restrições que precisam ser implementadas em um contrato inteligente do Solidity deve ser cuidadosamente considerado e modificado de acordo.

Isso permite que você crie contratos inteligentes que são mais confiáveis ​​e confiáveis ​​e mais adequados às suas necessidades específicas.

Nós valorizamos o seu feedback.
+1
1
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone