Função de fallback do Solidity: tudo o que você precisa saber

Este artigo visa fornecer uma compreensão clara sobre a função de fallback de solidity , a fim de fornecer conceitos valiosos ao aluno sobre as funções de fallback e seu funcionamento, respectivamente.



O que é a função de fallback do Solidity?

As funções de fallback do Solidity não possuem nome, parâmetros ou valores de retorno.

A função fallback é uma função especial em contratos Solidity que é chamada quando o contrato recebe fundos ou quando uma chamada de função inválida é feita para o contrato.

É uma função abrangente que permite que os contratos recebam ether e também lida com chamadas de função não reconhecidas.

Os seguintes cenários podem levar à sua execução:

  • O identificador de função não é uma das funções disponíveis em contratos inteligentes.
  • Se nenhum dado foi fornecido com a chamada de função.
  • É possível atribuir apenas uma função sem nome a um contrato.

Propriedades da função de fallback do Solidity

  1. É uma função sem nome.
  2. É impossível para eles aceitar argumentos.
  3. É impossível devolver qualquer coisa.
  4. Em um contrato inteligente, pode existir apenas uma função de fallback.
  5. É obrigatório marcá-lo como externo.
  6. Você deve marcá-lo como a pagar. O contrato lançará uma exceção se o ether for recebido sem nenhum dado.
  7. Se invocado por outra função, será limitado a 2300 gás.

A função de fallback é chamada em dois casos:

  • Quando um usuário envia ether para um contrato sem especificar uma chamada de função.
  • Quando um usuário envia ether para um contrato e especifica uma chamada de função inválida.

No primeiro caso, a função de fallback é chamada automaticamente. No segundo caso, a função de fallback é chamada explicitamente pela EVM (Ethereum Virtual Machine).


Como usar a função de fallback?

A função de fallback pode ser utilizada de várias formas, dependendo dos requisitos do contrato.

Aqui estão alguns exemplos de como a função de fallback pode ser usada:

 

Casos de Uso Visão geral
receber éter A função de fallback pode ser usada para receber ether de contas ou contratos externos.
Rejeitar éter A função de fallback pode ser usada para rejeitar ether de contas ou contratos externos.
Redirecionar Ether A função de fallback pode ser usada para redirecionar o ether para outro contrato.
Executar Código A função de fallback pode ser usada para executar o código quando uma chamada de função inválida é feita para o contrato.

 

Importante : A função Fallback deve ser usada com cautela, pois pode levar a um comportamento inesperado se não for implementada corretamente.
Recomendação : Evite usar a função de fallback, a menos que seja necessário para a funcionalidade do contrato.

O programa fornecido mostra a declaração de uma função de fallback. A saída deste método só pode ser visível na seção de log:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// SPDX-License-Identifier: 3.0
pragma solidity ^0.8.0;
contract SolidityTest{
event fallback_Function_calling(string msg);
fallback() external payable {
emit fallback_Function_calling("This is a fall ball function having no name,parameters of return type");
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>
Você entenderá melhor o funcionamento da função fallback considerando o exemplo abaixo:

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
pragma solidity ^0.8.17;
contract Fallback {
event my_Log(string func, uint gas);
// Fallback function must be declared as external.
fallback() external payable {
// send / transfer (forwards 2300 gas to this fallback function)
// call (forwards all of the gas)
emit my_Log("fallback", gasleft());
}
// Receive is a variant of fallback that is triggered when msg.data is empty
receive() external payable {
emit my_Log("receive", gasleft());
}
// Helper function to check the balance of this contract
function show_Balance() public view returns (uint) {
return address(this).balance;
}
}
contract SendToFallback {
function transferToFallback(address payable _to) public payable {
_to.transfer(msg.value);
}
function callFallback(address payable _to) public payable {
(bool sent, ) = _to.call{value: msg.value}("");
require(sent, "Failed to send Ether");
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>
Podemos usar a função fallback() para processar a transação ether sem fornecer nenhum dado a eles:

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
pragma solidity ^0.5.0;
contract SolidityTest {
uint public mrx ;
function() external { mrx = 1; }
}
contract SolidityTest1 {
function() external payable { }
}
contract SolidityTest2 {
function callSolidityTest(SolidityTest test) public returns (bool) {
(bool success,) = address(test).call(abi.encodeWithSignature("nonExistingFunction()"));
require(success);
// test.mrx is now 1
address payable testPayable = address(uint160(address(test)));
// Sending ether to SolidityTest contract,
// the transfer will fail, i.e. this returns false here.
return (testPayable.send(2 ether));
}
function callSolidityTest1(SolidityTest1 sink) public returns (bool) {
address payable sinkPayable = address(sink);
return (sinkPayable.send(2 ether));
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>

Conclusão

As funções do Solidity Fallback são essenciais para os contratos inteligentes do Solidity . Com esse recurso, o contrato pode processar transações Ether recebidas e chamadas de função que não estão explicitamente definidas no contrato.

Os usuários do contrato podem usar funções de fallback ao lidar com pagamento personalizado e lógica de reembolso, lidar com entradas inesperadas normalmente ou fornecer um mecanismo de fallback em caso de erros.

O uso de funções de fallback deve, no entanto, ser implementado adequadamente para evitar a introdução de vulnerabilidades de segurança. Um contrato deve evitar enviar Ether ou fazer chamadas externas da função de fallback, pois isso pode ser potencialmente explorado por invasores.

Nós valorizamos o seu feedback.
+1
0
+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