solidity实战-----编写一个简单的众筹合约

网友投稿 263 2022-09-21

solidity实战-----编写一个简单的众筹合约

在学习完solidity编程基础之后,于是结合课程编写了一个简单的众筹合约。

【需求分析】

众筹里面需要有2类角色:接收者和捐赠者,其中接收者可以对应多个捐赠者。下面是这两类角色属性分析:

接收者:接收者地址、众筹总金额、当前众筹金额、捐赠者的个数

捐赠者: 捐赠者地址、捐赠金额

1.接收者

我们按照上面的要求创建了一个接收者对象,里面包含其属性

//接收者对象 struct Recipient{ address recipient_address; //接收者地址 uint goal; //筹资金额目标 uint amount; //当前筹资金额 uint contributor_amount; //捐赠者数量 mapping(uint => Contributor) map; //通过id与捐赠者关联 }

2.捐赠者

//捐赠者对象 struct Contributor{ address contributor_address; //捐赠者地址 uint contributor_money; //捐赠金额 }

3.创建一个众筹事件

address _address:代表的是当前发起众筹用户的地址

uint  _goal:代表的是需要筹集的资金总额是多少

// 发起一个众筹事件 function create_crowdfunding(address _address,uint _goal) public { // 将接受者id加1 recipientId++; // 创建接受者对象,并通过id与其绑定 recipient_map[recipientId] = Recipient(_address,_goal,0,0); }

4.为创建众筹者捐赠

address Newaddress:捐赠者地址

uint _recipientId:接收者的id

//发起捐赠 function contribute(address Newaddress,uint _recipientId) public payable{ // 通过id获取接受者对象 Recipient storage _recipient = recipient_map[_recipientId]; // 当前接受者金额加上获赠的金额 _recipient.amount += msg.value; //捐赠人数加1 _recipient.contributor_amount++; // 将接受者id与捐赠者绑定在一起 _recipient.map[ _recipient.contributor_amount] = Contributor(Newaddress,msg.value); }

5.判断众筹是否完成

通过传入接收者id来判断该对象是否完成了众筹

// 判断众筹任务是否完成 function Iscompelte(uint _recipientId)public returns(bool){ // 通过id获取接受者对象 Recipient storage _recipient = recipient_map[_recipientId]; // 判断筹集资金是否达到与其目标 if(_recipient.amount >= _recipient.goal){ //将众筹到的资金转移到接受者合约地址 _recipient.recipient_address.transfer(_recipient.amount); return true; } return false; }

6.完整代码

pragma solidity ^0.4.24;contract crowd_funding{ //捐赠者对象 struct Contributor{ address contributor_address; //捐赠者地址 uint contributor_money; //捐赠金额 } //接收者对象 struct Recipient{ address recipient_address; //接收者地址 uint goal; //筹资金额目标 uint amount; //当前筹资金额 uint contributor_amount; //捐赠者数量 mapping(uint => Contributor) map; //通过id与捐赠者关联 } uint public recipientId; //接受者id mapping(uint => Recipient) recipient_map; //通过id将接受者信息关联 // 发起一个众筹事件 function create_crowdfunding(address _address,uint _goal) public { // 将接受者id加1 recipientId++; // 创建接受者对象,并通过id与其绑定 recipient_map[recipientId] = Recipient(_address,_goal,0,0); } //发起捐赠 function contribute(address Newaddress,uint _recipientId) public payable{ // 通过id获取接受者对象 Recipient storage _recipient = recipient_map[_recipientId]; // 当前接受者金额加上获赠的金额 _recipient.amount += msg.value; //捐赠人数加1 _recipient.contributor_amount++; // 将接受者id与捐赠者绑定在一起 _recipient.map[ _recipient.contributor_amount] = Contributor(Newaddress,msg.value); } // 判断众筹任务是否完成 function Iscompelte(uint _recipientId)public returns(bool){ // 通过id获取接受者对象 Recipient storage _recipient = recipient_map[_recipientId]; // 判断筹集资金是否达到与其目标 if(_recipient.amount >= _recipient.goal){ //将众筹到的资金转移到接受者合约地址 _recipient.recipient_address.transfer(_recipient.amount); return true; } return false; } }

7.演示

将刚才我们选中的用户地址:0xdd870fa1b7c4700f2bd7f44238821c26f7392148

填入到下面的框框中,然后自定义一个众筹金额,如下所示:

接下来我们需要选择第一个用户地址为它进行捐赠

输入捐赠金额2000wei

然后在下面的contribute输入第一个用户地址:0xca35b7d915458ef540ade6068dfe2f44e8fa733c

以及需要捐赠的接收者id号,我们可以在下面 查看接收者的id

查看控制台如下所示:

此时我们还需要判断捐赠的金额是否达到我们预期的目标,如果满足我们将这比捐赠者捐赠的2000wei转移到接收者的合约地址上面,我们现在看看接收者合约地址上的余额是多少?

可以看到我们接收者账户余额多了2000wei

再看下控制台,返回true说明完成众筹了。

【总结】

上面测试的只是通过一个人直接捐赠来完成的,我们还可以通过多人来完成捐赠,这里就不一一测试了,通过这个简单的众筹合约基本上融汇了solidity编程中的基本概念。

参考资料:​​基于以太坊众筹合约实战​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信视频号又升级,直播功能终于火力全开!
下一篇:视频号首场百万级直播爆款是如何打造的?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~