Learn Solidity 8 FallBack Functions
view 就是限定不能修改状态,用于直接返回状态。pure 就是用于返回计算结果,不能修改状态。
- 基本例子
在 Solidity 中,call 和 transfer 关键字用于调用其它合约的函数并发送以太币。
call 关键字用于调用其它合约上的函数。它通常用于与其它合约交互,而无需创建新的事务。如果不希望为函数调用支付 gas 或者希望调用不属于你的合约上的函数,这将会非常有用。
另一方面,transfer 关键字用于向其它合约或地址发送以太币。与 call 不同,transfer 总是会创建新事务并消耗 gas。它通常用于向其它合约或地址发送以太币作为合约的逻辑的一部分。
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
/*
* FallBack Function
* 1. 没有名字,是一个匿名函数
* 2. 没有任何输入
* 3. 没有任何输出
* 4. 必须背定义成external
* 为什么要用? 当我们调用一些不存在的函数,或者是通过 send, transfer 或 call 发送以太给一个合约
*/
contract FallBack {
event Log(uint256 gas);
fallback() external payable {
// 不推荐些太多的代码在这里,这个函数将会失败如果它用了太多的gas,通常我们不写任何代码
// 触发send的方法, 我们将得到2300gas 以足够发出一个日志
// 触发call的方法, 我们将得到所有的gas
// 这里是一个特殊的函数,返回还剩下多少gas
emit Log(gasleft());
}
function getBalance() public view returns (uint256) {
// 返回合约存储的余额;
return address(this).balance;
}
}
// 新的恶合约用于发送以太给Fallback合约的时候,触发Fallback合约中的fallback 函数
contract SendToFallBack {
function transferToFallBack(address payable _to) public payable {
// 用transfer方法发送以太
// 自动的转发将花费2300左右的gas
_to.transfer(msg.value);
}
function callFallBack(address payable _to) public payable {
// 用call的方式发送以太
(bool sent, ) = _to.call{value: msg.value}("");
require(sent, 'Failed to Send!');
}
}