結構體和字典綜合案例
下面的案例是一個集資
合約的案例,裏面有兩個角色,一個是投資人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;
}
}