参考视频
【公开课】Python区块链开发教程 Solidity web3 区块链和智能合约
代码
总的来说,下面的FundMe代码允许用户以ETH为单位向合约资助资金,同时确保每笔资助至少等价于50美元。合约所有者可以随时提取合约中的所有资金。此外,该合约通过与Chainlink预言机的交互来获取ETH的实时市场价格。
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.2 <0.9.0;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract FundMe {
// 储存每个地址资助的ETH数量
mapping(address => uint256) public addresstoFunded;
// 记录所有资助者的地址
address[] public funders;
// 合约的所有者地址
address public owner;
// 构造函数,设置合约部署者为合约的所有者
constructor() {
owner = msg.sender;
}
// 允许用户向合约发送ETH
function fund() public payable {
// 设置最低资助金额(50美元等价的ETH)
uint256 minimumUSD = 50;
// 确保发送的ETH至少等于最低金额
require(getRate(msg.value) >= minimumUSD, "Wrong!");
// 更新发送者地址的资助总额
addresstoFunded[msg.sender] += msg.value;
// 添加发送者地址到资助者列表
funders.push(msg.sender);
}
// 从Chainlink预言机获取其版本号
function getVersion() public view returns (uint256) {
AggregatorV3Interface priceFeed = AggregatorV3Interface(
0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
);
return priceFeed.version();
}
// 从Chainlink预言机获取当前ETH的美元价格
function getPrice() public view returns (uint256) {
AggregatorV3Interface priceFeed = AggregatorV3Interface(
0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e
);
(, int256 answer, , , ) = priceFeed.latestRoundData();
return uint256(answer);
}
// 将特定数量的ETH转换为美元
function getRate(uint ethAmount) public view returns (uint256) {
// 获取ETH当前的美元价格
uint256 ethPrice = getPrice();
// 计算ETH数量对应的美元价值
uint256 ethAmountInUsd = (ethPrice * ethAmount) / (10 ** 18);
return ethAmountInUsd;
}
// 修饰符,确保只有合约所有者可以调用某些函数
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
// 允许合约所有者提取合约中所有的ETH
function withdraw() public payable onlyOwner {
// 将合约的ETH余额发送到所有者地址
address payable recipient = payable(msg.sender);
recipient.transfer(address(this).balance);
// 重置所有资助者的资助金额
for (
uint256 funderIndex = 0;
funderIndex < funders.length;
funderIndex++
) {
address funder = funders[funderIndex];
addresstoFunded[funder] = 0;
}
// 清空资助者列表
funders = new address[](0);
}
}
运行代码
使用fund按钮向合约发送Gwei时,注意价值要超过50美元才行,withdraw的话没有金额限制但是只有owner才能提取