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