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);
}
}

区块链特辑——solidity语言基础(五)的更多相关文章

  1. 区块链特辑——solidity语言基础(三)

    Solidity语法基础学习 五.映射类型: 映射型态 Mapping Type 映射钥匙Key → 真实资料 Value mapping(KeyType → ValueType) VariableN ...

  2. 区块链特辑——solidity语言基础(六)

    Solidity语法基础学习 十.实战项目(二): 1.实战准备: ERC20代币接口 ERC20 Token Interface接口 Interface IName {--} ·关键字:interf ...

  3. 区块链特辑——solidity语言基础(七)

    Solidity语法基础学习 十.实战项目(二): 3.项目实操: ERC20 代币实战 ①转账篇 总发行量函数 totalSupply() return(uint256) ·回传代币的发行总量 ·使 ...

  4. 比原链CTO James | Go语言成为区块链主流开发语言的四点理由

    11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...

  5. Solidity语言基础 和 Etherum ERC20合约基础

    1. 类型只能从第一次赋值中推断出来,因此以下代码中的循环是无限的,  小. for (var i = 0; i < 2000; i++) { ... } --- Solidity Types ...

  6. C语言基础五 数组

    数组跟变量的区别? 数组是可以在内存中连续存储多个元素的结构,所有元素必须属于相同类型. 格式:元素类型 数组名[元素个数]: 数组的特点: 只能存放单一元素的数据,里面存放的数据成为元素. 数组的声 ...

  7. Go语言基础五:引用类型-切片和映射

    切片 Go的数组长度不可以改变,在某些特定的场景中就不太适用了.对于这种情况Go语言提供了一种由数组建立的.更加灵活方便且功能强大的包装(Wapper),也就是切片.与数组相比切片的长度不是固定的,可 ...

  8. python自动化--语言基础五面向对象、迭代器、range和切片的区分

    面向对象 一.面向对象简单介绍: class Test(): #类的定义 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 def __ini ...

  9. C语言基础五 数组的应用

    .根据用户输入的10人成绩并将其保存到数组中,求最高成绩,最低成绩和平均成绩 int scoure[10];//存储10个数据的数组 int i; int sum;//总成绩 int max,min, ...

  10. 001/Go语言构建区块链(mooc)

    1.区块链发展与现状 视频地址:https://www.imooc.com/video/17452 注意: 比特币与以太坊最大的区别在于: 以太坊引入了对图灵完美智能合约的支持,人们可以将任何业务逻辑 ...

随机推荐

  1. GeoJSON代码示例

    GeoJSON代码示例 1. 读取GeoJSON文件 1.1 实现思路 graph TD A[读取GeoJSON文件] --> B[读取GeoJSON文件内容] B --> C[解析Geo ...

  2. React基础笔记1

    官网:https://react.docschina.org/ 一.认知React 概述 React 起源于 Facebook(脸书) 的内部项目,它是一个用于构建用户界面的 javascript 库 ...

  3. CDS标准视图:功能位置描述 I_FunctionalLocationText

    视图名称:功能位置描述 I_FunctionalLocationText 视图类型:基本视图 视图代码: 点击查看代码 @EndUserText.label: 'Functional Location ...

  4. git撤销远已经push到程服务器上某次提交

    git撤销远已经push到程服务器上某次提交 问题: 不小心把一次错误的代码push到远程服务器上的分支上,或者没有merge强制将本地的方法push到git服务器上. 解决方法: 输入 git lo ...

  5. weixueyuan-Nginx微服务11

    https://www.weixueyuan.net/nginx/microservices/ 微服务是什么 计算机自诞生以来,极大地影响了人类的生产和社会活动,软件生产以一种生产活动的方式进入了人们 ...

  6. Delphi XE TVirtualQuery raised exception class ESQLiteError with message 'duplicate column name:dw'

    使用Delphi XE7+UniDAC+TVirtualQuery开发的过程中,对已经查询到内存中的数据集TUniQuery组件,再次运用SQL语句进行查询 结果程序运行后提示错误:raised ex ...

  7. uni-app中picker-view显示默认值的注意点(坑)

    今天我在使用picker-view的时候,发现无法给picker-view给一个默认值:后面经过发现后: 才知道到,是一个异步问题: 1==>动态循环出来的数据,在data中直接循环,不要在re ...

  8. Kali 修改root密码

    Kali 修改root密码 进入 Kali 系统,切换 root 用户 sudo su 输入当前用户密码 成功切换到 root 用户后,进行修改密码 passwd root

  9. Luogu P4933 大师 题解 [ 绿 ] [ 线性 dp ] [ dp 细节处理 ] [ 限制转移条件优化 ]

    依据值域的 \(O(n^2)\) 做法 这种做法只适用于这种值域小的题,下一种做法才是求等差数列的通解. 我们定义 \(f[i][j]\) 表示以 \(h_i\) 为最后一个数,公差为 \(j\) 的 ...

  10. [ABC227E] Swap 题解

    考试一道题题解. 30pts:枚举所有串,\(check\) 是否可行. 60pts:做 \(bfs\),暴力推演变化过程,用 \(map\) 去重,时间复杂度 \(O(nC_{n}^{n/3}C_{ ...