ICO是以初始发生的数字加密钱银作为出资报答的一种筹集资金的方法,它的概念源自证券界的Initial Public Offering(IPO,首次揭露发行)。
相较于传统意义上的IPO,ICO具有能够缩短投融资链、降低投融资门槛、流动性佳、全球性出资等优势。常见的ICO里,数字钱银和区块链项目向前期爱好者出售项目代币。项目团队经过ICO获取技术开发和商场拓展资金;而项目爱好者经过ICO支持项目,一起也可在对应代币进入买卖商场后挑选买卖退出。
当你有一个好的想法,需要大家的资金来资助你。你能够运用众筹合约来发起请求捐款。众筹合约的根本思路是,你设定一个众筹方针,在达到方针的最终期限时,假如没有完成众筹,所有的捐款将被退回,因而减少了捐献者的危险。由于代码是开放的,可被审计的,也就不需要一个集中的、可信的渠道来担保,每个捐款的人,只需要付出必定的gas。
众筹的奖赏-代币
一般来说,那些筹集资金的人在资金筹集和资金办理不善之后,根本就不能说这笔钱是如何运用的,这常常导致项目根本无法交付任何东西。这时我们能够运用智能合适中投票的方法来做决定,这样对所有人都是公平的。
鄙人面的比如里,我们在众筹中,首要处理两个重要的问题:如何办理和保存用于奖赏的代币;筹集奖金后如何运用。
传统的众筹或奖赏记载一般有一个中央数据库,来保存、盯梢所有捐助者的过程:谁错过了众筹的最终期限了,谁在众筹过程中捐献了多少等。与之相反,在区块链中我们将以分散的方法来做这件事,只需创立一个标记来记载众筹的每一条记载、奖赏了多少代币,后边每个捐献者都能够得到一个他们能够买卖、出售或保存的代币。假如要给予实物奖赏,生产者只需要交换实物产品的代币。捐献者也能够将代币做为纪念品保存,不论这个众筹项目有没有达到它的方针,都能够保藏。
众筹合约示例
设置众筹合约中运用的代币
下面是一段简略的代币代码,用于发行给捐献者,注意我们没有设置代币的总量,而是一直在增发,在实际运用过程中,能够依据需求自行做约束:
pragma solidity 0.4.20;
/**
*一个简略的代币合约。
*/
contract token{
string public standard='yuyangray';
string public name;//代币名称
string public symbol;//代币符号比如'$'
//代币单位,展现的小数点后边多少个0,和以太币相同后边是是18个0
uint8 public decimals=2;
uint256 public totalSupply;//代币总量
/*这儿每个地址对应的是代币的数量,而不是捐献的以太币的数量*/
mapping(address=>uint256)public balanceOf;
event Transfer(address indexed from,address indexed to,uint256 value);//转帐告诉事件
/*初始化合约,而且把初始的所有代币都给这合约的创立者
* param _owned合约的办理者
* param tokenName代币名称
* param tokenSymbol代币符号
*/
function token(address _owned,string tokenName,string tokenSymbol)public{
//合约的办理者取得的代币总量
balanceOf[_owned]=totalSupply;
name=tokenName;
symbol=tokenSymbol;
}
/**
*转帐,详细能够依据自己的需求来完成
* param _to address承受代币的地址
* param _value uint256承受代币的数量
*/
function transfer(address _to,uint256 _value)public{
//从发送者减掉发送额
balanceOf[msg.sender]-=_value;
//给接收者加上相同的量
balanceOf[_to]+=_value;
//告诉任何监听该买卖的客户端
Transfer(msg.sender,_to,_value);
}
/**
*增加代币,并将代币发送给捐献新用户
* param _to address承受代币的地址
* param _amount uint256承受代币的数量
*/
function issue(address _to,uint256 _amount)public{
totalSupply=totalSupply+_amount;
balanceOf[_to]+=_amount;
//告诉任何监听该买卖的客户端
Transfer(this,_to,_amount);
}
}
上面的代码,在Mist中是履行的效果如下:
众筹合约的根本设置
在众筹合约中,下面几个变量能够用于设置众筹以太币总量、众筹截止时刻、以太币和代币的兑换比例,假如不运用单位进行声明换算,默许在以太坊中,所有的单位都是wei,1 ether=10^18 wei:
fundingGoal=fundingGoalInEthers*1 ether;//众筹以太币总量
deadline=now+durationInMinutes*1 minutes;//众筹截止时刻,单位是分钟
price=500 finney;//1个以太币能够买2个代币
在初始化众筹合约构造函数的时分,我们会将众筹合约的帐户地址,传递给代币做为办理地址,这儿运用的是关键字this表示当时合约的地址,也能够传递给某个人,初始创立时奖赏给这个人指定量的代币。
function Crowdsale(
uint fundingGoalInEthers,
uint durationInMinutes,
string tokenName,
string tokenSymbol
)token(this,tokenName,tokenSymbol)