プロジェクトの説明: クラウドファンディング キャンペーンは受信者によって開始され、寄付者によって寄付が行われます。(実際には、多くの詳細は完璧ではありません)
役割: 受け取り手、寄付者
イベント: クラウドファンディングを開始し、寄付を開始し、受け取り手が現金を引き出します。
pragma solidity^0.4.26;
contract crowdFunding{
// 接收者:账户,目标金额,当前已筹集到的金额,捐款人数,捐赠者列表(用id关联)
struct Initiator{
address ini_address;
uint goal;
uint current;
uint sup_amount;
mapping(uint => Support) idSup;
}
// 捐赠者:账户,捐赠金额
struct Support{
address sup_address;
uint sup_value;
}
// 接收者集合(用id关联)
uint iniId;
mapping(uint => Initiator) idIni;
// 发起众筹,不通过Id的方法没法初始化
// 参数:接收者账户,目标金额
function create_crowdFunding(address iniAddress, uint _goal){
idIni[iniId] = Initiator(iniAddress,_goal,0,0);
iniId++;
}
// 发起捐赠
// 参数:接收者账户,id
function contribute(address iniAddress, uint _iniId) payable {
Initiator initiator = idIni[_iniId];
require(initiator.ini_address == iniAddress);
Support memory support = Support(msg.sender, msg.value);
initiator.idSup[initiator.sup_amount] = support;
initiator.sup_amount++;
initiator.current += msg.value;
}
// 提现,如果大于目标金额即可提现,否则失败
// 参数:接收者id
function withdrawal(uint _iniId) returns(string){
Initiator initiator = idIni[_iniId];
// 判断是否为接收者,只有接收者有权提现
if(initiator.ini_address != msg.sender){
return "Not qualified !";
}
if(initiator.current >= initiator.goal){
initiator.ini_address.transfer(initiator.current);
return 'success !';
}
return 'false !';
}
// 获取当前接收者的地址和id
function getIniId() view returns(uint,address){
return(iniId-1,idIni[iniId-1].ini_address);
}
}