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