solidity简单示例

参考视频

【公开课】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才能提取
在这里插入图片描述

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜亚轲

你花钱的样子真帅

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值