區塊鏈:集資 智能合約 綜合案例

結構體和字典綜合案例

下面的案例是一個集資合約的案例,裏面有兩個角色,一個是投資人Funder,也就是出資者。另一個角色是運動員Campaign,被贊助者。一個Funder可以給多個Campaign贊助,一個Campaign也可以被多個Funder贊助。

完整合約:

pragma solidity ^0.4.4;

contract CrowdFunding {

    // 定義一個`Funder`結構體類型,用於表示出資人,其中有出資人的錢包地址和他一共出資的總額度。
    struct Funder {
        address addr; // 出資人地址
        uint amount;  // 出資總額
    }


   // 定義一個表示存儲運動員相關信息的結構體
    struct Campaign {
        address beneficiary; // 受益人錢包地址
        uint fundingGoal; // 需要贊助的總額度
        uint numFunders; // 有多少人贊助
        uint amount; // 已贊助的總金額
        mapping (uint => Funder) funders; // 按照索引存儲出資人信息
    }

    uint 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 returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        return true;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章