Solidity(6)

208 阅读1分钟

众筹


pragma solidity ^0.4.24;

// 主要完成产品的众筹
contract CrowdFunding{
    
    // 投资者是结构体
    struct Funder{
        address addr;  // 投资者地址
        uint amount;   // 投资金额
    }
    
    // 采用结构体来描述众筹产品
    struct Product{
        address addr;   // 如果众筹成功,则金额会转到当前地址
        uint goal;      // 预期众筹的目标,如果达到此目标则说明众筹成功
        uint amount;    // 实际众筹的金额
        uint funderNum;    // 统计投资者的人数,缺省值为0
        // 映射类型,统计当前产品的投资者
        mapping(uint => Funder) funders;
    }
    
    // 平台要统计众筹的产品数量
    uint count;  
    // 此映射主要记录平台的众筹产品
    mapping (uint => Product) public products;
    // 添加众筹产品信息   
    function candidate(address addr, uint goal) returns (uint compaingnID){
        // 结构体是不需要new,此处按照结构体声明的变量顺序进行赋值
        products[count++] = Product(addr, goal*10**18, 0, 0);
    }
    
    // 此函数实现对产品进行众筹功能
    function vote(uint index) payable {
        // 通过索引获取要众筹产品信息
        Product p = products[index];
        // 创建投资者,并且存储到产品众筹映射中
        // msg.sender:当前函数调用者,就是众筹者, msg.value:众筹金额是调用函数时传入的value值
        p.funders[p.funderNum++] = Funder({addr: msg.sender, amount: msg.value});
        // 把当前众筹金额追加到amount中
        p.amount += msg.value;
    }
    
    // 检测当前产品众筹是否成功(如果成功则众筹金额转到产品提供的地址)
    function check(uint index) payable returns (bool){
        Product p = products[index];
        // 判断当前众筹金额是否大于设置金额
        if(p.amount < p.goal){
            return false;
        }
        // 众筹成功,当前金额要转给产品地址
        uint amount = p.amount;
        // 初始化amount
        p.amount = 0;
        p.addr.transfer(amount);  // 如果失败则返回为false
        // if(!p.addr.send(amount)){
        //     throw;
        // }
        return true;
    }
}