// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;
contract CoinBank {
// 声明一个变量来存储合约的所有者
address immutable owner;
// 在合约创建时,设置合约的所有者为创建者
constructor() {
owner = msg.sender;
}
// 装饰器函数,用于判断调用者是否是合约所有者
modifier OnlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
// 创建一个名为deposit的函数,允许任何人向合约发送以太币
function deposit() public payable {
// 函数体为空,因为我们不需要做任何事情
// 任何发送到这个函数的以太币都会自动添加到合约的余额中
}
// 创建一个名为withdraw的函数,只允许合约的所有者提取以太币
function withdraw() external OnlyOwner {
// require(msg.sender == owner, "caller is not owner");
// 使用transfer函数将合约的所有余额发送给所有者
(bool sent, bytes memory data) = address(msg.sender).call{
value: address(this).balance
}("");
require(sent, "Failed to send Ether");
}
// 获取当前地址的余额
function getBalance() external view returns (uint256) {
return address(this).balance;
}
}
上面的合约可以说是一个存钱罐合约,它允许任何人存入以太币,但只有合约的所有者才能取出:
owner
:这是一个状态变量,用于存储合约的所有者地址。immutable
关键字表示这个变量的值在合约创建时被设置,然后就不能再改变。constructor
:这是一个构造函数,它在合约创建时运行。在这个函数中,我们将owner
变量设置为合约的创建者。OnlyOwner
:这是一个修饰符,它可以添加到函数上,以在函数运行之前执行一些代码。在这个修饰符中,我们使用require
函数来确保只有合约的所有者才能运行函数。deposit
:这是一个公开的函数,任何人都可以调用它来向合约发送以太币。发送的以太币会自动添加到合约的余额中。withdraw
:这是一个外部函数,只有合约的所有者才能调用它。这个函数会将合约的所有余额发送给所有者。这里使用了低级别的.call
函数来发送以太币,这是因为在Solidity 0.8.x版本中,.transfer
和.send
函数已经被废弃。getBalance
:这是一个外部的只读函数,它返回合约的当前余额。
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特