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;
    }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章