学习以太坊部署智能合约(六) — 智能合约集资(CrowdFunding)案例(超级详细注释)

案例

集资合约:关于这个案例有两个角色,一个是投资人(Funder);也就是出资者。另一个角色是运动员(Campaign),被赞助者。一个Funder可以给多个Campaign赞助,一个Campaign也可以被多个Funder赞助


代码

本次案例使用solidity语言,在Remix中在线开发,有问题可以直接留言。

/*

集资合约案例:两个角色,一个投资人(Funding),另一个角色运动员Campaign。
一个投资者可以给多个运动员,一个运动员可以被多个投资者赞助

*/

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.4.4;

contract CrowdFunding {
    
    // 定义一个“Funding”结构体类型,用于表示出资人,其中出资人的钱包地址和他一共出资的总额度
    struct Funder {
        address addr; // 出资人地址
        uint amount; //出资总额
    }
    
    // 定义一个表示存储运动员相关信息的结构体
    
    struct Campaign {
        address beneficiary; // 受益人钱包地址
        uint fundingGoal; //需要赞助的总额度
        uint numFunders; //有多少人赞助
        uint amount; // 已赞助的总金额
        mapping (uint => Funder) funders; //按照索引存储出资人信息
    }
    
    uint public numCampaigns; //统计运动员(被赞助人)数量
    mapping(uint => Campaign) campaigns; // 以键值对的形式存储被赞助人的信息
    
    
    // 新增一个Campaign对象,需要传入受益人的地址和需要筹资的总额
    
    function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {
        campaignID = numCampaigns++; //计数+1
        
        // 创建一个Campaign对象,并存储到“campaigns”里面
        
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
        
    }
    
    // 通过campaignID给某个Campaign对象赞助
    
    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID]; //通过campaignID获取campaignID对应的Campaign对象
        
        c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value}); //存储投资者信息
        
        c.amount += msg.value; //计算收到的总款
        
        c.beneficiary.transfer(msg.value);
    }
    
    
    //检查某个campaignID编号的受益人集资是否达标,不达标返回false,否则返回true
    
    function checkGoalReached(uint campaignID) public view returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        return true;
            
    }
    
}




多多关注,有什么问题可以评论!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值