solidity: 转账实现

若-飞 / 2023-08-24 / 原文

1. payable介绍

在Solidity中,payable是一个修饰符(modifier),用于声明函数或合约可以接收以太币(Ether)的支付。

当一个函数被标记为payable时,它就可以接收以太币作为函数调用的一部分,并且可以在函数体内执行相关的逻辑来处理这笔支付。

以下是一些关键点关于payable的使用:

  1. 接收以太币: 使用payable修饰符声明的函数可以接收以太币作为支付。这意味着调用该函数时,发送的以太币将被转移到函数所在合约的余额中。

  2. 处理支付逻辑: 通过在payable函数的函数体内编写逻辑,你可以处理收到的以太币。这可以包括更新合约内部的状态、触发其他函数调用、与其他地址进行交互等。

  3. payable函数: 如果一个函数没有标记为payable,那么在调用该函数时,不能够向该函数发送以太币。如果尝试向非payable函数发送以太币,会触发一个异常并导致交易失败。

以下是一个使用payable修饰符的简单示例:

solidity:
contract MyContract {
    function receivePayment() payable public {
        // 处理收到的以太币
        // 可以在这里编写逻辑来处理支付
    }
}

在上述示例中,receivePayment函数被标记为payable,表示它可以接收以太币。当调用receivePayment函数并发送一定数量的以太币时,这笔以太币将被转移到MyContract合约的余额中,并且函数体内的逻辑将被执行。

总结来说,payable修饰符允许Solidity合约接收以太币支付,并在函数体内处理相关逻辑。

 

2. 编写一个转账的测试合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Payable  {
    // payable 标记函数:接收以太币,接收以后存储到合约中
    function deposit1() external payable {
        // 处理接收到的以太币
    }

    function deposit2() external {}

    // payable 标记函数
    function withdraw() external {
        // msg.sender合约的调用者
        // 把当前合约的所有余额全部转到调用者
        payable(msg.sender).transfer(address(this).balance);
    }

    // 通过balance属性来查看余额
    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }
}

3. 详解如何使用该合约

3.1. 转账前:

刚才写的合约的deposit1是payable,可以接受用户的转账:

账号拥有99.9999个以太币

3.2. 点击deposit1转账:

转账以后,账户少了10个ether,剩下89.99999个以太币了

3.3. 点击getBalance查看当前合约的额度:

当前合约的资产刚好是10个ether

3.4. 点击withdraw把当前合约的所有余额全部转到调用者:

账号当前的金额又变成99.99999了,当然有损失一些gas费,先忽略

3.5. 再次查看合约拥有的以太币:

由于把当前所有的钱都转给操作者了,所以金额变成0了