10_众筹合约实现

在这里插入图片描述

ICO众筹介绍

ICO(Initial Crypto-Token Offering,首次代币众筹)被认为是区块链生态内生的一种新型投融资方式,概念起源于IPO,只不过募集的货币变为比特币、以太坊等通用数字货币,从而支持项目的开发成本。

目前对于ICO没有统一的定义, 一般而言,ICO指区块链初创项目在区块链平台上发行项目独有的加密代币,投资者通过使用指定的数字货币(如比特币、以太币)购买代币的方式为项目进行众筹融资的行为。代币依项目不同代表了对项目未来的使用权、投票权等。随着项目成果获得认可,使用人数增加,代币作为交易媒介或权益的价值获得不断提升。

2013年7月募集了5000个比特币的Mastercoin(现名为 Omni)是首个有记录的ICO,而以太坊在2014年7月超过1500万美元的ICO则开启了ICO快速发展的进程。2015 年,The DAO实现高达1.5亿美元融资,但后因受黑客攻击而失败。2016年以来,ICO众筹速度快、募集金额不断升高,常出现哄抢一空的情况

众筹合约初始化

pragma solidity >=0.6.0 <0.7.0;

contract CrowdDemo{
    
    // 创建投资人结构体
    struct Funder{
        address addr;  // 投资者地址
        uint amount;   // 投资金额
    }
    
    // 众筹的产品
    struct Product{
        address addr;  // 如果众筹成功,则金额会转到当前地址
        uint goal;   // 预期众筹的目标
        uint amount;   // 实际众筹的目标
        uint funderNum;   // 投资者的人数
        // 创建产品和投资人的关系
        mapping(uint => Funder) funders;
    }
    
    // 平台发布众筹产品
    Product[] public products;
    
    // 发布待众筹的商品信息
    function candidate(address addr,uint goal) public returns (uint){
        products.push(Product(addr,goal,0,0));
        return products.length;
    }
    
}

众筹合约实现

如果众筹成功则众筹的金额都转到待众筹产品提供的地址,大家可以考虑如果众筹失败如何实现退款功能!

pragma solidity >=0.6.0 <0.7.0;

contract CrowdDemo{
    
    // 创建投资人结构体
    struct Funder{
        address addr;  // 投资者地址
        uint amount;   // 投资金额
    }
    
    // 众筹的产品
    struct Product{
        address payable addr;  // 如果众筹成功,则金额会转到当前地址
        uint goal;   // 预期众筹的目标
        uint amount;   // 实际众筹的目标
        uint funderNum;   // 投资者的人数
        // 创建产品和投资人的关系
        mapping(uint => Funder) funders;
    }
    
    // 平台发布众筹产品
    Product[] public products;
    
    // 发布待众筹的商品信息
    function candidate(address payable addr,uint goal) public returns (uint){
        products.push(Product(addr,goal*10**18,0,0));
        return products.length;
    }
    
    // 编写函数实现众筹功能
    function vote(uint index) public payable{
        // 通过索引获取要众筹的产品
        Product storage p = products[index];   // a = b
        p.funders[p.funderNum++]= Funder({addr:msg.sender,amount:msg.value});
        // 把众筹的金额追加到amount中
        p.amount += msg.value;
    }
    
    // 检查某个产品是否众筹成功
    function check(uint index) public payable returns(bool){
        Product storage p = products[index];
        // 当前众筹金额是否大于设置金额
        if(p.amount < p.goal){
            return false;
        }
        // 众筹成功,金额转给产品对应的地址
        uint amount = p.amount;
        p.addr.transfer(amount);  // amount交给transfer函数的调用者
        p.amount = 0;
    }
}

在这里插入图片描述

发布了141 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lsqzedu/article/details/104794691