美文网首页
【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学习笔记】结构体和字典综合案例

    下面案例是一个募集合约的案例,里面有两个角色,一个是投资人Funder,另一个角色是运动员Campaign,被赞助...

  • 集资合约

    结构体和字典综合案例 下面的案例是一个集资合约的案例,里面有两个角色,一个是投资人Funder,也就是出资者。另一...

  • solidity基础(3)

    solidity的自定义结构体深入详解结构体,solidity中的自定义类型,我们可以使用关键字struct来进行...

  • Solidity的自定义结构体深入详解(十一)|入门系列

    结构体,Solidity中的自定义类型。我们可以使用Solidity的关键字struct来进行自定义。结构体内可以...

  • 结构体和类(一)

    结构体和类模块分两篇笔记来学习: 第一篇: 结构体和类的区别 分析类和结构体可变性 以一个具体的例子来学习使用类和...

  • 结构体和类(二)

    结构体和类模块分两篇笔记来学习: 第一篇: 结构体和类的区别 分析类和结构体可变性 以一个具体的例子来学习使用类和...

  • 15分钟快速回顾Swift3.0

    结构体 结构体有成员变量,构造方法,自定义方法,可以扩展系统的结构体 类和属性 构造函数 和 析构函数 字典模型转...

  • swift学习三(类与结构体)

    一、类和结构体对比 二、结构体和枚举是值类型 三、类是引用类型 四、类和结构体的选择 五、字符串、数组、和字典类型...

  • 类和结构体(Classes & Structures)

    目录 类和结构体对比 结构体和枚举是值类型 类是引用类型 字符串、数组和字典类型的赋值与复制行为 类和结构体对比 ...

  • 数组字典结构体枚举

    数组 字典 结构体 枚举

网友评论

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

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