智能合约经典综合案例--众筹
经典综合案例——众筹pragma solidity ^0.5.10;// 流程: 创建众筹事件 --> 投资人投资 --> 为受益人提款contract crowdfunding{// 投资者对象struct Funder{address funderAddr;// 投资人地址uint amount;// 投资金...
·
经典综合案例——众筹
pragma solidity ^0.5.10;
// 流程: 创建众筹事件 --> 投资人投资 --> 为受益人提款
contract crowdfunding{
// 投资者对象
struct Funder{
address funderAddr; // 投资人地址
uint amount; // 投资金额
}
// 受益人对象
struct Campaign{
address payable beneficiary; // 受益人地址
uint goal; // 目标金额
uint amount; // 当前已募集的金额
uint funderNum; // 投资者数量
// 映射,将投资者ID => 投资人对象绑定,从而可以得知是谁给当前受益人投资
mapping(uint => Funder) fundersMap;
}
// 将受益人信息存储在区块链上
uint campaignID; // 受益人ID
// 映射,将受益人ID => 受益人对象对象绑定,从而可以更好地管理收益人信息
mapping(uint => Campaign) campaignsMap;
// 实现一个众筹事件
function NewNeeder(address payable _beneficiary, uint _goal) public{
// 将受益人ID与受益人对象绑定
campaignID ++;
campaignsMap[campaignID] = Campaign(_beneficiary, _goal, 0, 0);
}
// @param _address 投资人地址,也可以用msg.sender获取
// @param _campaignID 受益人ID
function invest(address _funderAddr, uint _campaignID) public payable{
Campaign storage c = campaignsMap[_campaignID]; // 通过campaignID获取到受益人对象
c.amount += msg.value; // 募集到的资金增加
c.funderNum ++; // 投资人数增加
c.fundersMap[c.funderNum] = Funder(_funderAddr, msg.value); // 将投资者ID与投资者对象绑定
}
// 当募集的资金满足goal条件,即给受益人地址转账
function check(uint _campaignID) public{
Campaign storage c = campaignsMap[_campaignID];
if(c.goal <= c.amount){
c.beneficiary.transfer(c.amount);
}
}
// 测试,受益人目标金额、已募集金额、投资人数
function test() view public returns(uint, uint, uint){
return (campaignsMap[1].goal, campaignsMap[1].amount, campaignsMap[1].funderNum);
}
}
欢迎交流学习!!!👏
更多推荐
已为社区贡献2条内容
所有评论(0)