经典综合案例——众筹

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);
    }

}

欢迎交流学习!!!👏

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐