坚固性v0.6.0。后备功能。它们有什么用呢? [英] Solidity v0.6.0. Fallback functions. What are they needed for?
本文介绍了坚固性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屋!
查看全文