智能案例详解:第四个公开众筹平台智能合约
1.业务逻辑
2.整体结构
pragma solidity^0.4.24;
contract FundingFactory {address public platformManager; //平台的管理员address[] fundingsAarry; //存储所有已经创建好的合约地址mapping(address => address[]) creatorFundingsArray; //找到项目方所创建的所有众筹项目://mapping(address => address[]) supportFundingsArray; //找到所有自己参与过的合约项目SupporterFunding supporterFunding; //地址是零,一定要实例化constructor() {platformManager = msg.sender;supporterFunding = new SupporterFunding();//一定要实例化}//提过一个创建合约的方法function createFunding(string _projectName, uint256 _supportMoney, uint256 _targetMoney, uint256 _durationTime) {address funding = new Funding(_projectName, _supportMoney, _targetMoney,_durationTime, msg.sender, supporterFunding);fundingsAarry.push(funding);creatorFundingsArray[msg.sender].push(funding); //维护项目发起人的所有众筹集合}function getAllFundings() public view returns(address[]) {return fundingsAarry; }function getCreatorFundings() public view returns(address[]) {return creatorFundingsArray[msg.sender];}function getSupporterFundings() public view returns(address[]) {return supporterFunding.getFunding(msg.sender);}
}contract SupporterFunding {mapping(address => address[]) supportFundingsArray; 找到所有自己参与过的合约项目//提供一个添加方法, //--> 在support时候调用function joinFunding(address addr, address funding) {supportFundingsArray[addr].push(funding);}//提供一个读取方法,function getFunding(address addr) public returns (address[]) {return supportFundingsArray[addr];}
}
//crow-funding
contract Funding {address public manager;// 1. 名字:众筹牙刷string public projectName;// 2. 需要每个投资人投多少钱:38元uint256 public supportMoney;// 3. 总共要集资多少钱:100000uint256 public targetMoney;// 4. 众筹截止时间:30天 //2592000suint256 endTime;mapping(address=> bool) supporterExistMap;SupporterFunding supporterFunding;// constructor(string _projectName, uint256 _supportMoney, uint256 _targetMoney,// uint256 _durationTime, address _creator, mapping(address => address[]) _supportFundingsArray) public {constructor(string _projectName, uint256 _supportMoney, uint256 _targetMoney,uint256 _durationTime, address _creator, SupporterFunding _supporterFunding) public {// manager = msg.sender;manager = _creator; //把项目发起人的地址传递过来,否则就是合约工厂的地址了projectName = _projectName;supportMoney = _supportMoney;targetMoney = _targetMoney;endTime = now + _durationTime; //传递进来众筹持续的时间,单位为秒,now 加上这个值,就能算出项目截止时间supporterFunding = _supporterFunding;}address[] supporters; //记录投资人的地址集合//投资人投钱,记录投资的地址function support() public payable {require(msg.value == supportMoney); //weisupporters.push(msg.sender);//每次赞助之后,都使用一个map来记录投资人,便于后续快速检查supporterExistMap[msg.sender] = true;//supportFundingsArray[msgr]//对传递过来的SupportFunding的结构进行赋值supporterFunding.joinFunding(msg.sender, this);}//退款function refund() onlyManager public {for (uint256 i = 0; i< supporters.length; i ++) {supporters[i].transfer(supportMoney);}//delete supporters;}enum RequestStatus { Voting, Approved, Completed}//modifierstruct Request {// 1. 要做什么:买电池string purpose;// 2. 卖家地址:0x1234xxxaddress seller;// 3. 多少钱:10元uint256 cost;// 4. 当前赞成的票数:10票uint256 approveCount;// 5. 有一个集合,记录投资人投票的状态:投过票,true,未投:falsemapping(address => bool) voteStatus; //每个地址智能support一次 //没有make(map[uint]string)//voteStatus[0x111] = trueRequestStatus status;}//项目方可以创建多个请求,需要一个数组记录Request[] public requests;function createRequest(string _purpose, address _seller, uint256 _cost) onlyManager public {Request memory req = Request({purpose: _purpose, seller: _seller, cost: _cost, approveCount: 0, status : RequestStatus.Voting});requests.push(req);}//投资人批准:默认不投票:no,主动投票:yesfunction approveRequest(uint256 index) public {// 投资者调用approveRequest// 1. 找到这个请求// 限定:只有投资人才可以投票// 2. 检查自己没有投过票// 3. 投票// 4. 标志自己已经投过票了//bool flag = false;// Flag 来记录遍历数组的结果,// True表示:是投资人// False表示:非投资人,直接退出// require(supporterExistMap[msg.sender] == true);require(supporterExistMap[msg.sender]);Request storage req = requests[index];//检查,如果不是投票状态(Compete或者Approved),就不用投票了require(req.status == RequestStatus.Voting);//这种使用for遍历的方式一定要小心, 尽量不要使用,消耗gas非常多// for (uint i = 0 ; i < supporters.length; i++) {// if (supporters[i] == msg.sender) {// flag = true;// break;// }// // break;// }// require(flag);require(req.voteStatus[msg.sender] == false);req.approveCount++;req.voteStatus[msg.sender] = true;}//项目方可以花费这笔钱。function finalizeReqeust(uint256 index) onlyManager public {Request storage req = requests[index];// 1. 检查当前余额是否满足支付require(address(this).balance >= req.cost);// 2. 检查赞成人数是否过半require(req.approveCount *2 > supporters.length);// 3. 向卖家转账req.seller.transfer(req.cost);// 4. 改变这个request的状态为Completedreq.status = RequestStatus.Completed;}modifier onlyManager {require(msg.sender == manager);_;}function getBalance() public view returns(uint256) {return address(this).balance;}function getSupporters() public view returns(address[]) {return supporters;}
}
3.重要函数
智能案例详解:第四个公开众筹平台智能合约相关推荐
- java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...
- 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...
原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...
- 代码检查规则:Python语言案例详解
在之前的文章中代码检查规则:Java语言案例详解学习了Java的检查规则.我们今天将学习<代码检查规则:Python语言案例详解>,内容主要分为两个部分:Python的代码检查规则和Pyt ...
- 代码检查规则:Java语言案例详解
本节课程为<代码检查规则:Java语言案例详解>, 通常情况下Java的代码检查规则可以分为以下十类: 接下来,让我们具体来看看每个分类的内容. 一.源文件规范 该类规范主要从文件名.文件 ...
- python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- 技术+案例详解无监督学习Autoencoder
摘要:本篇文章将分享无监督学习Autoencoder的原理知识,然后用MNIST手写数字案例进行对比实验及聚类分析. 本文分享自华为云社区<[Python人工智能] 十五.无监督学习Autoen ...
- java 同步块原理_Java同步代码块和同步方法原理与应用案例详解
Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...
- 数据湖架构Hudi(五)Hudi集成Flink案例详解
五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...
- 【原创干货】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单...
上两篇原创的文章,小编主要是讲了数据可视化方面的内容,但是好像看得人不是很多的样子(搞得小编心里拔凉拔凉的....) [硬核干货]4500字.10个案例分享几个Python可视化小技巧,助你绘制高质量 ...
最新文章
- 从tcp到netty(一)
- Comparator 与 Comparable
- PostgreSQL 从源码找出哪些操作需要超级用户权限 - 阿里云rds_superuser和superuser有什么区别...
- envoy api 网关_为Envoy构建控制平面的指南-特定于域的配置API
- 前端学习(2695):重读vue电商网站16之Upload 上传组件
- 新代系统plc梯形图说明书_东莞自动化PLC编程需要多少钱
- 程序员的遗憾:为什么我没早学数据分析?
- 也谈政府机关服务器资源的有效利用
- @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)
- matplotlib绘图实例:pyplot、pylab模块及作图参数
- html json编辑器,JSON.html HTML Editor
- 项目-基于SSM的订餐管理系统
- Appium-Get Clipboard(获取剪贴板)
- Sublime Text的使用代码块安装的模块
- Hark的数据结构与算法练习之若领图排序ProxymapSort
- (OpenCV)图像目标尺寸检测
- 日常pytho3练习脚本之--两个逗比聊天机器人
- Kaop打印项之表格
- 一语道破中国千年潜规则——每天懂一点人情世故
- Mybatis 源码分析(一)