Solidity Receive - 接受 Native Coin

文章介绍了 Solidity 中的 receive 函数以及如何使用 externalpayable 修饰符来接收和发送以太币。还包括了如何通过合约调用钱包地址进行以太币转账的示例。

它有点烦人,只为发送以太币而必须进行 abi 编码。幸运的是,Solidity 有一种很好的处理方式。


contract TakeMoney {

    receive() external payable {

    }
}

注意几个新内容:

  • receive 是一个函数,但它没有 function 关键字。这是因为它是一个“特殊”函数,像构造函数一样,所以为了强调这个,“function” 关键字没有包含。
  • 我们使用了修饰符 external 而不是 public

到现在为止,我们每当希望函数可以在合约外部调用时都会使用修饰符 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 {

    }
}

我们向没有函数的钱包进行“函数调用”可能看起来有些奇怪。

这种惯例有点令人困惑。只需记住这一点。

所有的调用调用都会转移以太币。但是零是一个有效的以太币转移金额。

在以太坊中,所有函数调用都可以转移以太币,即使未明确设置值参数。然而,零是一个有效的以太币转移金额,并且在不需要转移任何以太币的情况下非常有用。

练习题

Receive

Donations

Withdraw

Distribute

DistributeV2

BasicBank

BasicBankV2

了解更多

查看 Solidity 训练营 ,以了解更多关于智能合约开发和代币标准的内容。

  • 原文链接: rareskills.io/learn-soli...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/