案例
集资合约:关于这个案例有两个角色,一个是投资人(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;
}
}