通学智能合约系列(二十二)--乞丐版众筹项目实践

Posted 通学技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通学智能合约系列(二十二)--乞丐版众筹项目实践相关的知识,希望对你有一定的参考价值。

智能合约众筹项目实战

首先要给大家说声抱歉,最近太太太忙了。之前老早说的要进行一个智能合约总结,一直都没有时间,今天终于能抽出来点时间,做一个收尾工作。

无论做任何事,我都喜欢善始善终。要做就要做彻底。在这里,我们就跟着建勋老师的步伐,一起来实现我们这个乞丐版的灾情众筹项目吧。

当下正值台风“烟花”的侵袭,郑州的父老乡亲们身处水深泥流之中,我们大家也都是忧心忡忡,想给我们的同胞尽一份心,尽一份力。生活在我们当下这个时空,各种天灾频发,各种人祸也是经常让大家吃瓜吃的津津有味,例如,某某H十字又中饱私囊了多少我们的爱心捐赠。某笔款项又又又又不知去向。

那么,我们有没有好的办法,好的手段来实现我们的捐款可追溯,透明,公正,没有猫腻呢?

答案是肯定的,我们学了这么久的智能合约,作为一种图灵完备的,运行在区块链上的编程语言,便是上述问题的量身打造。在动手之前,我们先的合计合计,虽然是要写一个乞丐版的项目 ,但也不能缺胳膊少腿的。

我的基本想法就是,首先我们这个系统必须要有两类人:请求捐赠的人,捐赠的人。另外,我们需要具备 三个功能:发起筹款,捐款,结束捐款。大致的图就是下面这个样子了。

在这里插入图片描述

想想都是问题,做做都有答案。废话不多说,我们直接上代码。

pragma solidity ^0.4.16;

// 乞丐版灾情众筹项目
contract zhouchouTest{

    // 发起人或者可以理解为需要被帮助的人
    struct needer{
         // 发起人钱包地址
         address neederAddress;
    	 // 发起人目标筹款金额
         uint goal;
    	 // 账户金额(已筹得金额)
         uint amount;
         // 捐款人个数
         uint funderAmount;
         // 捐款人id与捐款人映射
         mapping(uint =>funder) map;
    }
    
    // 捐款人 
    struct funder{
        // 捐款人账户地址
        address funderAddress;
        // 捐款金额
        uint money;
        
    }
    
    
    // 作为一个乞丐版的众筹平台 我们也不能只支持一个人在该平台上 发起众筹 
    // 当多个人发起时,我们可以记录一下发起人的总数 也可以作为发起人的id
    uint neederId;
    // 另外我们还需要将id与发起人做一个映射,方便管理
    mapping(uint => needer) needMap;
    
    // 发起众筹 谁要发起众筹,需要众筹多少马尼呢?
    function newNeeder(address _neederAddress, uint _goal){
        // 发起人我们需要存储在区块链上以方便与后续查看 所以不能在内存中构造
        // needer memory newNeeder = needer(_neederAddress,_goal,0,0);
        
        // 不同的发起人
        neederId++;
        // 将发起人与我们的计数做一个绑定
        needMap[neederId] = needer(_neederAddress,_goal,0,0);
        
    }
    
    // 捐赠(看他们那么可怜,我拉上朋友一起给他们捐赠吧)
    // 那么到底是谁捐赠的?那我要捐赠给谁?
    function contribute(address _funderAddress,uint _neederAmount){
        // 根据id确定我要捐给谁
        needer storage _needer = needMap[_neederAmount];
        // 我要把捐500块钱,直接打给我想要捐的那个人的账户余额里
        // 通过msg.value全局变量确认我要捐多少钱
        _needer.amount += msg.value;
        // 有人给我捐款+1 (此处直接 个数等同于捐赠人id)
        _needer.funderAmount++;
        // 构造捐赠人(是谁 给我捐赠的,捐了多少马尼),最终要捐赠给谁
        _needer.map[_needer.funderAmount] = funder(_funderAddress,msg.value);
    }
    
    
    // 请求捐赠不同于乞讨,我们获取到了我们需要的马尼之后,就该结束了。
    // 而乞讨确实可以作为终身职业。emm 此处应该有一个五味杂陈的表情
    // 接收捐赠是否结束?(我发起众筹已经有一些时日了 灾情也结束了 我该看看是不是可以结束筹集马尼了)
    function isComplete(uint _neederId){
        // 根据发起人id获取发起人的筹mn信息
        needer storage _needer = needMap[_neederId];
        // 如果筹集的马尼已经大于我设定的目标筹款马尼时,那我就提现重新开始好好生活了~
        if(_needer.amount > _needer.goal){
        	// 提现
            _needer.neederAddress.transfer(_needer.amount);
        }
    }
 }

编写完成我们的众筹项目后,我们可以部署一下。然后执行以下步骤。

在这里插入图片描述

发起众筹前,1472民众存款:

在这里插入图片描述

发起众筹后,1472民众存款:

在这里插入图片描述

果然是多了2个达不溜,谢谢土豪大善人。

最后,1472民众感谢了平台,感谢了5830`大善人;

5830大善人感谢了平台,平台感谢了5830善人,并为其建立了个人档案,将这一善举利用hash函数打包,永久地记录在 了区块链上。

以上是关于通学智能合约系列(二十二)--乞丐版众筹项目实践的主要内容,如果未能解决你的问题,请参考以下文章

通学智能合约系列(二十二)--乞丐版众筹项目实践

通学智能合约系列(二十二)--乞丐版众筹项目实践

通学智能合约系列(二十)--结构体<下>

通学智能合约系列(二十)--结构体<上>

通学智能合约系列(二十)--结构体<上>

通学智能合约系列(二十)--结构体<上>