美文网首页
【Solidity学习笔记】结构体和字典综合案例

【Solidity学习笔记】结构体和字典综合案例

作者: 海阳之新 | 来源:发表于2018-05-05 23:06 被阅读31次

    下面案例是一个募集合约的案例,里面有两个角色,一个是投资人Funder,另一个角色是运动员Campaign,被赞助者。一个Funder可以给多个Campaign赞助,一个Campaign也可以被多个Funder赞助。

    pragma solidity ^0.4.17;
    
    contract CrowdFunding {
        // 定义一个投资人的结构体类型,用于表示出资人,其中有出资人的钱包地址和一共出资的总金额。
        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 || c.amount == 0) {
                return false;
            }
            return true;
        }
     
        // 获取被赞助人的信息
        function getCampaignInfo(uint campaignID) public returns (address f1, uint256 f2, uint256 f3, uint256 f4) {
            Campaign storage c = campaigns[campaignID];
            f1 = c.beneficiary;
            f2 = c.fundingGoal;
            f3 = c.numFunders;
            f4 = c.amount;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:【Solidity学习笔记】结构体和字典综合案例

          本文链接:https://www.haomeiwen.com/subject/amzelftx.html