文章介绍了 Solidity 中的 receive
函数以及如何使用 external
和 payable
修饰符来接收和发送以太币。还包括了如何通过合约调用钱包地址进行以太币转账的示例。
它有点烦人,只为发送以太币而必须进行 abi 编码。幸运的是,Solidity 有一种很好的处理方式。
contract TakeMoney {
receive() external payable {
}
}
注意几个新内容:
到现在为止,我们每当希望函数可以在合约外部调用时都会使用修饰符 public。External 意味着它可以 只能 在合约外部调用。为了简单起见,我们将使用 public,但稍后我们会详细讨论 external 和 public 之间的区别。不过,Solidity 只允许 receive 函数为 external。
它还必须是 payable。尝试删除 payable 关键字并编译合约。那将不会成功。
现在,另一个函数如何发送以太币到它?
contract TakeMoney {
receive()
external
payable {
}
function viewBalance()
public
view
returns (uint256) {
return address(this).balance;
}
}
contract ForwardMoney {
function payMe()
public
payable {
}
function sendMoney(address luckyAddress)
public
payable {
uint256 myBalance = viewBalance();
luckyAddress.call{value: myBalance}("");
}
function viewBalance()
public
view
returns (uint256) {
return address(this).balance;
}
}
现在把它插入 remix 进行测试。
这干净多了。没有 abi 编码或其他。
这种结构也是我们向 wallets 发送资金的方式。下面是一个允许只有一个地址提取以太币的合约。
contract SaveMoney {
function withdrawMoney()
public
payable {
require(msg.sender ==
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4,
"not the first remix address");
msg.sender.call{value: viewBalance()}("");
}
function viewBalance()
public
view
returns (uint256) {
return address(this).balance;
}
// 任何人都可以发送
receive()
external
payable {
}
}
我们向没有函数的钱包进行“函数调用”可能看起来有些奇怪。
这种惯例有点令人困惑。只需记住这一点。
所有的调用调用都会转移以太币。但是零是一个有效的以太币转移金额。
在以太坊中,所有函数调用都可以转移以太币,即使未明确设置值参数。然而,零是一个有效的以太币转移金额,并且在不需要转移任何以太币的情况下非常有用。
练习题
查看 Solidity 训练营 ,以了解更多关于智能合约开发和代币标准的内容。
- 原文链接: rareskills.io/learn-soli...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!