首页 > 其他分享 >区块链特辑——solidity语言基础(五)

区块链特辑——solidity语言基础(五)

时间:2023-01-12 22:11:51浏览次数:51  
标签:sender solidity 捐款 owner msg 提领 address 特辑 区块

Solidity语法基础学习

九、实战项目(一):

学以致用

UP主捐款合约

·合约要求:

  ·建立时,需将合约的建立者设定成owner(constructor,msg.sender)

  ·需记录每个观众的捐款总额(mapping)

  ·每次收到捐款时,需触发捐款事件:(event)

    ·列出捐款者、捐助金额(indexed)

  ·提供函数可以查询观众的捐款金额(returns)

  ·提供函数可以查询观众的VIP等级(string,if)

  ·没捐过款→”None”

  ·> 0ETH→”N”

  ·> 1ETH→”R”

  ·> 5ETH→”SR”

  ·>10ETH→”UR”

·提供函数让UP主可以提领金额,且触发提领事件(payable,address.balance,transfer)

  ·列出提款者、提领金额

Example:UP主捐款合约

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.17;

contract Donation {
    address public owner;
    //将捐款的每一个人对应到捐款数额
    mapping(address => uint256) donationList;
    
    //宣告一个事件,谁捐了,捐了多少钱
    event Donate(address indexed sender, uint256 value); 
    //提领事件,提领者,提领了多少钱
    event Withdraw(address indexed owner, uint256 value);

    //只有拥有者可以提领
    modifier onlyOwner() {
        require(msg.sender == owner,"Only owner can access this function");
        _;
    }

    constructor() {
        //将合约的拥有者设定为建立合约的人
        owner = msg.sender;
    }

    //收受捐款的函数
    function donate() public payable {
        donationList[msg.sender] += msg.value;
        emit Donate(msg.sender, msg.value);
    }

    //查询捐款总金额
    function getHistory() public view returns (uint256) {
        return donationList[msg.sender];
    }

    //查询VIP等级
    function getRank() public view returns(string memory) {
        //这里if判断要从范围大的条件到范围小的条件,否则满足小条件的会导致全部回传N
        if (donationList[msg.sender] > 10 ether) {
            return "UR";
        } else if (donationList[msg.sender] > 5 ether) {
            return "SR";
        } else if (donationList[msg.sender] > 1 ether) {
            return "R";
        } else if (donationList[msg.sender] > 0) {
            return "N";
        } else {
            return "None";
        }
    }

    //提领余额
    function withdraw() onlyOwner public {
        address payable receiver = payable(owner);
        uint256 value = address(this).balance;
        receiver.transfer(address(this).balance);
        emit Withdraw(receiver, value);
    }
}

 

标签:sender,solidity,捐款,owner,msg,提领,address,特辑,区块
From: https://www.cnblogs.com/wybsignal/p/17048062.html

相关文章

  • 重磅!瞄准 Web 3.0,谷歌云推出专为区块链服务的 Blockchain Node Engine!
    【本文由CloudAce整理发布,谷歌云服务请访问 CloudAce官网】区块链技术正在为世界各地的消费者和企业带来巨大的创新和价值创造。随着技术变得越来越主流,公司需要可扩......
  • 区块链特辑——solidity语言基础(四)
    Solidity语法基础学习七、事件:事件Event·日志(log),是用来快速索引并查询过往资料的手段。·而solidity是透过“事件”在区块链上写下日志,使用者或由触发的事件所产生的......
  • 区块链特辑——solidity语言基础(一)
     Solidity语法基础学习一、智能合约的结构:  首先以上是智能合约的结构,包含版权宣告、编译指示、Usingfor宣告、错误定义、输入、列举与枚举、常数、合约、函......
  • 区块链特辑——solidity语言基础(二)
    Solidity语法基础学习四、函数类型:函数FunctionfunctionFnName[V][SM][return(……)]{}·[V]:Visibility,可见性;·[SM]:StateMutability,状态可变性;·[returns......
  • 区块链特辑——solidity语言基础(三)
    Solidity语法基础学习五、映射类型:映射型态MappingType映射钥匙Key→真实资料Valuemapping(KeyType→ValueType)VariableName·关键字:mapping·宣告一......
  • solidity 内存(memory) 可变数组的增删改查 操作
    //SPDX-License-Identifier:MITpragmasolidity^0.8.9;libraryArray{functionpush(uint256[]memory_nums,uint256_num)internalpure{assemb......
  • 区块链入门 ③ - 交易
    区块链入门③-交易交易概述比特币交易本质上包含交易参与者价值转移的相关信息数据结构。比特币区块链是一本全球复式记账总账簿,每笔交易都是在比特币区块链上的一个......
  • 区块链的技术基础
    区块链的技术基础拜占庭将军问题:​​https://www.8btc.com/article/70370​​区块链的类型:公有区块链、联盟链(又名许可链)、侧链分布式算法在经济学上的扩展加密签名算法......
  • 产业区块链一周快讯速览(六)
    政策公告成都印发首个“元宇宙”政策文件,提出到2025年元宇宙相关产业规模达到1500亿元成都市新经济发展工作领导小组办公室近日印发《成都市元宇宙产业发展行动方案(2022......
  • Web3区块链DAS域名注册教程 tron trx链波卡钱包地址解析 用户名转账 ENS
    而在去中心化系统中,大部分人充值、转账时,使用的都是区块链原生的长地址,比如:ETH的地址:0x9euo8sHip*******dHld90CKB的地址:ckHUEI829D********hfjdD0在操作过程中,这......