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.重要函数

智能案例详解:第四个公开众筹平台智能合约相关推荐

  1. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解

    本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...

  2. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

  3. 代码检查规则:Python语言案例详解

    在之前的文章中代码检查规则:Java语言案例详解学习了Java的检查规则.我们今天将学习<代码检查规则:Python语言案例详解>,内容主要分为两个部分:Python的代码检查规则和Pyt ...

  4. 代码检查规则:Java语言案例详解

    本节课程为<代码检查规则:Java语言案例详解>, 通常情况下Java的代码检查规则可以分为以下十类: 接下来,让我们具体来看看每个分类的内容. 一.源文件规范 该类规范主要从文件名.文件 ...

  5. python装饰器setter_第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter...

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  6. 技术+案例详解无监督学习Autoencoder

    摘要:本篇文章将分享无监督学习Autoencoder的原理知识,然后用MNIST手写数字案例进行对比实验及聚类分析. 本文分享自华为云社区<[Python人工智能] 十五.无监督学习Autoen ...

  7. java 同步块原理_Java同步代码块和同步方法原理与应用案例详解

    Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...

  8. 数据湖架构Hudi(五)Hudi集成Flink案例详解

    五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...

  9. 【原创干货】6000字、22个案例详解Pandas数据分析/预处理时的实用技巧,超简单...

    上两篇原创的文章,小编主要是讲了数据可视化方面的内容,但是好像看得人不是很多的样子(搞得小编心里拔凉拔凉的....) [硬核干货]4500字.10个案例分享几个Python可视化小技巧,助你绘制高质量 ...

最新文章

  1. 从tcp到netty(一)
  2. Comparator 与 Comparable
  3. PostgreSQL 从源码找出哪些操作需要超级用户权限 - 阿里云rds_superuser和superuser有什么区别...
  4. envoy api 网关_为Envoy构建控制平面的指南-特定于域的配置API
  5. 前端学习(2695):重读vue电商网站16之Upload 上传组件
  6. 新代系统plc梯形图说明书_东莞自动化PLC编程需要多少钱
  7. 程序员的遗憾:为什么我没早学数据分析?
  8. 也谈政府机关服务器资源的有效利用
  9. @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)
  10. matplotlib绘图实例:pyplot、pylab模块及作图参数
  11. html json编辑器,JSON.html HTML Editor
  12. 项目-基于SSM的订餐管理系统
  13. Appium-Get Clipboard(获取剪贴板)
  14. Sublime Text的使用代码块安装的模块
  15. Hark的数据结构与算法练习之若领图排序ProxymapSort
  16. (OpenCV)图像目标尺寸检测
  17. 日常pytho3练习脚本之--两个逗比聊天机器人
  18. Kaop打印项之表格
  19. 一语道破中国千年潜规则——每天懂一点人情世故
  20. Mybatis 源码分析(一)

热门文章

  1. 2016 版 Laravel 系列入门教程(四)【最适合中国人的 Laravel 教程】
  2. 【干货精选】项目管理与跨部门沟通合作
  3. 2021年车工(中级)考试题库及车工(中级)模拟考试
  4. 第 12 章 基于块匹配的全景图像拼接--Matlab深度学习实战图像处理应用
  5. 毕业设计 深度学习乳腺癌分类
  6. python爬虫程序下载_Python爬虫之多线程下载程序类电子书
  7. 【通信电子电路】第12章 三相电路
  8. element-ui 多选表格 隐藏表头勾选框
  9. (几何)n个点中找4个点求能组成正方形的最大面积
  10. 【渝粤教育】电大中专电商运营实操 (9)作业 题库