solidity 特殊函数

接收以太的函数

一个合约最多可以有一个 receive 函数, 使用 receive() external payable { ... } 来声明。(没有 function 关键字)。

这个函数不能有参数,不能返回任何东西,必须具有 external 的可见性和 payable 的状态可变性。

它可以是虚拟的,可以重载,也可以有修饰器。

当一个合约收到一个普通的以太币转账(没有调用合约中的任何函数)时,receive函数会被触发(如果存在的话)。

如果合约中没有receive函数,但合约收到了以太币,转账将失败,除非合约有一个fallback函数。

当以太被直接发送到一个合约(没有使用函数调用,即发送者使用 send 或 transfer), 但接收合约没有定义一个接收以太的函数或一个 payable 类型的 fallback 函数,会抛出一个异常, 将以太送回(这在Solidity v0.4.0之前是不同的)。

因此,如果您想让您的合约接收以太, 您必须实现一个 receive 函数(不建议使用 payable 类型的 fallback 函数来接收以太, 因为它不会因为接口混乱而失败)。

没有接收以太币功能的合约可以作为 coinbase交易*(又称 *矿工区块奖励)的接收者 或作为 selfdestruct 的目的地接收以太币。

合约不能对这样的以太币转移做出反应,因此也不能拒绝它们。

这是EVM的一个设计选择,Solidity无法绕过它。

这也意味着 address(this).balance 可以高于合约中 实现的一些手工记帐的总和(即在接收以太函数中更新的累加器)。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Name {
    
    mapping (address => uint256) public values;

    receive() external payable {
        values[msg.sender] = values[msg.sender] + msg.value;
    }
    // 获取当前用户余额
    function getValue(address adr) public view returns (uint256) {
        return values[adr];
    }
    // 获取合约余额
     function getValue() public view returns (uint256) {
        return address(this).balance;
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值