solidity: 转账实现
1. payable介绍
在Solidity中,payable
是一个修饰符(modifier),用于声明函数或合约可以接收以太币(Ether)的支付。
当一个函数被标记为payable
时,它就可以接收以太币作为函数调用的一部分,并且可以在函数体内执行相关的逻辑来处理这笔支付。
以下是一些关键点关于payable
的使用:
-
接收以太币: 使用
payable
修饰符声明的函数可以接收以太币作为支付。这意味着调用该函数时,发送的以太币将被转移到函数所在合约的余额中。 -
处理支付逻辑: 通过在
payable
函数的函数体内编写逻辑,你可以处理收到的以太币。这可以包括更新合约内部的状态、触发其他函数调用、与其他地址进行交互等。 -
非
payable
函数: 如果一个函数没有标记为payable
,那么在调用该函数时,不能够向该函数发送以太币。如果尝试向非payable
函数发送以太币,会触发一个异常并导致交易失败。
以下是一个使用payable
修饰符的简单示例:
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了