坚固性v0.6.0。后备功能。它们有什么用呢? [英] Solidity v0.6.0. Fallback functions. What are they needed for?

查看:18
本文介绍了坚固性v0.6.0。后备功能。它们有什么用呢?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在阅读了Solidity v0.6.0docs的文档后,我仍然不理解fallback函数的含义。我读到它被分成两个函数:fallback () external payable receive () external payable。它们是匿名的,不接受任何参数,在绝大多数情况下,receive () external payable用于接收资金。你能用我的代码例子解释一下这些函数的一些用例吗,以便理解它们的所有特性,否则不知何故一切都是空白的,但我明白这是一个重要的概念。连receive () external payable函数的含义都不清楚,我调用的是buyToken ()方法,为什么要直接调用Remix中的the buyToken (),绕过receive () external payable,因为她是不可见的和匿名的。

pragma solidity ^0.7.0;
    // SPDX-License-Identifier: MIT
    
    contract BuyToken {
      mapping(address => uint256) public balances;
      address payable wallet;
    
      event Purchase(
        address indexed buyer,
        uint256 amount
      );
    
      constructor(address payable _wallet) {
        wallet = _wallet;
      }
    
    
      fallback() external payable {
      }
    
    
      receive() external payable {
        buyToken();
      }
    
      function buyToken() public payable {
        balances[msg.sender] += 1;
        wallet.transfer(msg.value);
        emit Purchase(msg.sender, 1);
      }
    }

推荐答案

当发送方将eth发送到您的合同地址且未指定任何函数时(即tx的data字段为空),receive()将被执行。

由于receive()仅调用buyToken(),因此它会生成与用户直接执行buyToken()相同的一组操作。

但其他合同可以对receive()函数进行不同的使用。简单的银行合同示例:

pragma solidity ^0.8;

contract MyContract {
    mapping (address => uint256) public balances;

    receive() external payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 _amount) external {
        require(_amount <= balances[msg.sender], 'Insufficient balance');
        balances[msg.sender] -= _amount;
        payable(msg.sender).transfer(_amount);
    }
}

或时间锁:

pragma solidity ^0.8;

contract MyContract {
    uint256 public constant unlockAfter = 1640995200; // 2022-01-01

    receive() external payable {
        // anyone can send funds to this contract
    }

    function withdraw() external {
        require(msg.sender == address(0x123), 'Not authorized');
        require(block.timestamp >= unlockAfter, 'Not unlocked yet');
        payable(msg.sender).transfer(address(this).balance);
    }
}

当函数签名(data字段的前4个字节)与任何现有函数都不匹配时,使用fallback()函数。

pragma solidity ^0.8;

contract MyContract {
    function foo() external {
        // executed when the `data` field starts with `0xc2985578`, the signature of `foo()`
    }
    
    fallback() external {
        // executed when the `data` field is empty or starts with an unknown function signature
    }
}

这篇关于坚固性v0.6.0。后备功能。它们有什么用呢?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆