solidity中的receive(接收)函数和fallback(回退函数)

目录


前言

在Solidity中,接收函数(receive function)和回退函数(fallback function)是两种特殊类型的函数,用于处理合约接收到以太币时的操作。


一、接收函数和回退函数是什么?

1、接收函数(Receive Function)

接收函数是一种特殊的外部函数,用于处理合约接收到以太币时的操作。它具有以下特点:

  • 接收函数的声明形式为 receive() external payable { ... },其中 external 表示只能通过外部调用来触发,payable 表示该函数可以接收以太币。
  • 当合约接收到以太币时,并且没有指定其他函数来处理接收到的以太币时,会调用接收函数。
  • 接收函数不能接受任何参数,因为它只能用于处理接收到的以太币,而没有其他输入。
  • 接收函数通常用于记录合约接收到的以太币数量,执行特定的逻辑操作或触发其他函数。 

    2、回退函数(Fallback Function)

  • 回退函数是一种特殊的外部函数,用于处理以太币发送时没有匹配到其他函数的情况。它具有以下特点:

  • 回退函数的声明形式为 fallback() external payable { ... },其中 external 表示只能通过外部调用来触发,payable 表示该函数可以接收以太币。
  • 当合约接收到以太币,并且没有匹配到其他具体函数来处理时,会调用回退函数。
  • 回退函数可以用于执行一些默认操作,如记录以太币的发送者、更新合约状态或拒绝接收以太币等。

注:在Solidity 0.6.0版本之后,如果合约没有定义任何接收函数,但有定义回退函数,则该合约将被视为不接收以太币的合约。

二、代码示例

1.接收函数(Receive Function)

代码如下(示例):

// 这个智能合约是一个简单的以太币接收器,它可以接收发送到合约地址的以太币,并将接收到的以太币数量存储在 received 变量中。

contract receive_test1{

    // 声明一个uint类型的变量,用于储存一接收到的以太币数量

    uint public  received;

    // 这是一个特殊的solidity函数,称为接收函数,当合约接收到以太币时会调用这个函数

     receive() external payable {

        // 将接收到的以太币数量加到 received 变量中。

        received +=msg.value;

     }

}

接收函数的用处:

 1、接收付款: 当有人向合约地址发送以太币时,接收函数会被调用,合约就能够处理这笔付款。这对于接受捐赠、购买商品或执行其他需要以太币支付的操作非常有用。

 2、处理转账: 如果你想要在合约内部实现转账功能,接收函数可以用于接收来自其他合约或账户的以太币,并在接收到后执行一些逻辑操作,例如记录转账信息或更新合约状态。

3、ICO(首次代币发行): 在初次代币发行期间,接收函数可以用于接收以太币,然后向投资者分配相应的代币。

4、分红支付: 如果你的合约实现了分红功能,接收函数可以用于接收分红池中的以太币,然后按照一定的逻辑将分红支付给合约持有者或其他相关方。

2.回退函数(Fallback Function)

代码如下(示例):

// 个智能合约是一个简单的以太币接收器,它使用回退函数来处理接收到的以太币

contract fallback_test{

// 声明一个uint变量,用于记录接收到的以太币数量。

    uint  fallbackReceived;

// 这是一个回退函数(fallback function),当合约接收到以太币但没有匹配到合约中任何其他函数时,会调用此函数。

     fallback() external payable {

        fallbackReceived+=msg.value;

      }  

}

 回退函数的用处:

1、接收以太币: 当没有与调用合约匹配的函数时,回退函数会被调用,这使得合约能够接收到以太币。

2、处理未知操作: 如果有人发送了一个不被合约所识别的交易,回退函数可以用来处理这种情况,例如拒绝交易或者记录交易信息。

3、增加合约的灵活性: 回退函数使得合约能够处理更多的操作,增加了合约的灵活性和可扩展性。


总结

总之,接收函数和回退函数都是用于处理合约接收到以太币的情况,但它们的触发时机和作用略有不同。接收函数是专门用于接收以太币的函数,而回退函数则是在没有匹配到其他函数时触发的默认处理函数。

猜你喜欢

转载自blog.csdn.net/weixin_60680666/article/details/137091953