智能合约众筹项目实战

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

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

当下正值台风“烟花”的侵袭,郑州的父老乡亲们身处水深泥流之中,我们大家也都是忧心忡忡,想给我们的同胞尽一份心,尽一份力。生活在我们当下这个时空,各种天灾频发,各种人祸也是经常让大家吃瓜吃的津津有味,例如,某某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);
}
}
}

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

通学智能合约系列(二十二)--乞丐版众筹项目实践_编程语言_02

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

通学智能合约系列(二十二)--乞丐版众筹项目实践_编程语言_03

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

通学智能合约系列(二十二)--乞丐版众筹项目实践_编程语言_04

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

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

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