主页 > imtoken钱包 > 以太坊ICO示例(代码片不好用!!)

以太坊ICO示例(代码片不好用!!)

imtoken钱包 2023-02-12 06:29:15

1.什么是ICO? ICO 是一种通过最初生成数字加密货币作为投资回报来筹集资金的方式。 其概念来源于证券行业的首次公开募股(IPO,首次公开募股)。

与传统意义上的IPO相比,ICO具有缩短投融资链、降低投融资门槛、流动性好、全球投资等优势。 在常见的 ICO 中,数字货币和区块链项目向早期爱好者出售项目代币。 项目团队通过ICO获得技术开发和市场拓展的资金; 项目爱好者通过ICO支持项目,也可以选择相应代币进入交易市场后退出交易。

当你有一个好主意时,你需要每个人的资金来支持你。 您可以使用众筹合同来请求捐款。 众筹合约的基本思想是你设定一个众筹目标,如果在截止日期前没有完成众筹,所有的捐款将被退还,从而降低捐赠者的风险。 由于代码是公开可审计的,不需要中心化的可信平台做保障。 每个捐赠者只需要支付一定数量的gas。

2. 众筹奖励-代币 一般来说,募资者根本说不清募到的钱是怎么花的,资金管理不善,往往导致项目一事无成。 这时候,我们可以采用智能投票的方式来进行决策,对大家来说都是公平的。 (这个例子本文不做介绍,可以参考链接)

在下面的例子中,我们主要解决众筹中的两个重要问题:如何管理和保存用于奖励的代币; 养后奖励如何使用。

传统的众筹或奖励记录通常有一个中央数据库来跟踪所有的捐赠者:谁错过了众筹截止日期,谁在众筹过程中捐赠了多少等。相比之下,在区块链中我们将以去中心化的方式进行以太坊ico众筹,只是创建一个token记录众筹的每条记录,奖励了多少token,每个捐助者都可以获得一个Token,可以交易、出售或持有。 如果要给予实物奖励,生产者只需要用代币换取实物产品。 捐赠者也可以将代币留作纪念,无论众筹项目是否达到目标。

3. 众筹合约的完善 3.1. 设置众筹合约中使用的代币

下面是一个简单的代币代码,用于发放给捐助者。 请注意,我们没有设置代币总量,但一直在发行更多代币。 在实际使用过程中,可以根据自己的需要进行自己的限制:

编译指示可靠性 0.4.16; /** * 一个简单的代币合约。 */contract token {string public standard = '#39;;string public name; //代币名称 string public symbol; //令牌符号如'$' uint8 public decimals = 2; //token单位,显示小数点后多少个0,像以太坊,有18个0uint256 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) {//合约管理者获得的token总量 balanceOf[_owned] = totalSupply;name = tokenName;symbol = tokenSymbol;} /*** 转账,可根据自己实现needs* @param _to address 接受代币地址* @param _value uint256 接受代币数量*/function transfer(address _to, uint256 _value){//send from 发送方减去发送量 balanceOf[msg.sender] - = _value;//向接收方添加相同数量的 balanceOf[_to] += _value;//通知任何监听交易的客户端 Transfer(msg.sender, _to , _value);}/*** 添加代币并发送代币给新的捐赠用户* @param _to 地址接受代币地址* @param _amount uint256 a ccept token amount*/function issue(address _t o, uint256 _amount) public{totalSupply = totalSupply + _amount;balanceOf[_to] += _amount;//通知任何监听交易的客户端 Transfer(this, _to, _amount);} }

3.2. 众筹合约基本设置

在众筹合约中,可以通过以下变量设置众筹以太币总量、众筹截止时间、以太币与代币的兑换比例。 如果不使用单位进行语句转换,则默认以以太坊为单位。 所有的单位都是wei,1 ether=10^18 wei:

fundingGoal = fundingGoalInEthers * 1 以太; //众筹Ether总量 deadline = now + durationInMinutes * 1分钟; //众筹截止时间,单位为分钟 price = 500 finney; //1个以太币可以买2个代币货币

在初始化众筹合约构造函数时,我们会将众筹合约的账户地址作为管理地址传递给token。 这里使用关键字this表示当前合约的地址,也可以传递给某人。 最初,指定数量的代币会在创建时奖励给该人。

函数 Crowdsale(uint fundingGoalInEthers,uint durationInMinutes,string tokenName,string tokenSymbol)token(this,tokenName,tokenSymbol)

3.3. 让众筹合约收到以太币

在 solidity 中,有一个未命名的函数,当合约收到以太币时默认执行。 通过添加payable关键字,我们可以支付这个合约(存入Ether),然后我们可以根据之前Ether和token的兑换比例,奖励给某人一定数量的token,并进行统计。

/** * 默认函数* * 默认函数,可以直接支付给合约*/function() payable {//判断是否关闭众筹 require(!crowdsaleClosed);uint amount = msg.value;//金额the donor Accumulated balance[msg.sender] += amount;//累计募集金额+= amount;//转账操作,转多少代币给donor issue(msg.sender, amount / price * 10 ** uint256 (小数));FundTransfer(msg.sender, amount, true);}

上述代码中,如果众筹合约关闭(crowdsaleClosed = true),则不会继续执行,无法交易。 这样做的原因是,如果众筹合约成功或者已经结束,就可以避免别人赔钱付款,造成后期不必要的纠纷。

3.4. 检测众筹合约是否完成

检测众筹合约是否达成的代码如下。 若募集资金金额达到众筹目标值,则众筹结束,并通知客户备案

/** * 检测众筹目标是否达到*/function checkGoalReached() afterDeadline {if (amountRaised >= fundingGoal){//达到众筹目标 fundingGoalReached = true;GoalReached(beneficiary, amountRaised);}//关闭众筹crowdsaleClosed = true;}

3.5. 众筹结束后的操作

同时,我们还提供了另一种方法。 当众筹失败时,捐赠者可以取回他的捐赠。 如果众筹成功,受益人可以获得以太币。

/** * 提取资金 * * 检查是否达到了目标或时间限制,如果是,并且达到了资金目标, * 将全部金额发送给受益人。 如果没有达到目标,每个贡献者可以撤回*他们贡献的金额*/function safeWithdrawal() afterDeadline {//如果没有达到众筹目标 if (!fundingGoalReached) {//获取合约调用者的贡献余额 uint amount = balance[msg.sender];if (amount > 0) {//返回合约发起方的所有余额 msg.sender.transfer(amount);FundTransfer(msg.sender, amount, false);balance[msg.sender] = 0;}}//如果众筹目标达到,合约调用者为受益人(受益人、金额、虚假); }}

4. 众筹合约示例中使用的众筹合约代码如何使用:

编译指示可靠性 0.4.16; /** * 一个简单的代币合约。 */ contract token {string public standard = '#39;;string public name; //代币名称 string public symbol; //令牌符号如'$' uint8 public decimals = 2; //token单位,显示小数点后多少个0,像以太坊,有18个0uint256 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) {//合约管理者获得的token总量 balanceOf[_owned] = totalSupply;name = tokenName;symbol = tokenSymbol;} /*** 转账,可根据自己实现needs* @param _to address 接受代币地址* @param _value uint256 接受代币数量*/function transfer(address _to, uint256 _value){//send from 发送方减去发送量 balanceOf[msg.sender] - = _value;//向接收方添加相同数量的 balanceOf[_to] += _value;//通知任何监听交易的客户端 Transfer(msg.sender, _to , _value);}/*** 添加代币并发送代币给新的捐赠用户* @param _to 地址接受代币的地址* @param _amoun t uint256 接受的代币数量*/function issue(address _ to, uint256 _amount) public{totalSupply = totalSupply + _amount;balanceOf[_to] += _amount;//通知任何监听交易的客户端 Transfer(this, _to, _amount);} }/** * 众筹合同* /contract Crowdsale is token {address public beneficiary = msg.sender; //受益人地址,测试时为合约创建者 uint public fundingGoal; //众筹目标,单位为etruint public amountRaised; //募集金额,单位为weiuint public deadline; //截止时间 uint public price; //代币价格 bool public fundingGoalReached = false; //众筹目标达成 bool public crowdsaleClosed = false; //众筹封闭映射(address => uint256) public balance ; //保存众筹地址//记录收到以太币通知事件GoalReached(address _beneficiary, uint _amountRaised);//转账通知事件FundTransfer(address _backer, uint _amount, bool _isContribution);/***初始化构造函数* * @param fundingGoalInEthers total众筹Ether* @param durationInMinutes 众筹截止时间,单位为分钟* @param tokenName 代币名称* @param tokenSymbol 代币符号*/function Crowdsale(uint fundingGoalInEthers,uint durationInMinutes,string tokenName,string tokenSymbol) token(this, tokenName, tokenSymbol ){fundingGoal = fundingGoalInEthers * 1 以太币; 截止日期 = 现在 + durationInMinutes * 1 分钟; 价格 = 500 芬尼; //1个以太坊可以买2个代币}/***默认函数**默认函数,可以直接支付给合约*/function()payable{//判断是否关闭众筹require(!crowdsaleClosed);uint amount = msg.value;//捐赠金额累计余额[msg.sender] += amount;//捐赠总额amountRaised += amount;//转账操作,转多少代币给捐赠者issue(msg.sender, amount / price * 10 ** uint256(decimals));FundTransfer(msg.sender, amount, true);}/*** 判断众筹是否过了Deadline*/modifier afterDeadline() { if (now >= deadline) _ ; }/*** 检查众筹目标是否达成*/function checkGoalReached() afterDeadline {if (amountRaised >= fundingGoal){//达成众筹目标GoalReached fundingGoalReached = true;GoalReached(beneficiary, amountRaised);}// Close crowdsaleCrowdsaleClosed = true;}/*** 提取资金** 检查是否已达到目标或时间限制,如果是,则资金目标已达到,* 将全部金额发送给受益人。

如果没有达到目标以太坊ico众筹,每个贡献者可以撤回*他们贡献的金额*/function safeWithdrawal() afterDeadline {//如果没有达到众筹目标 if (!fundingGoalReached) {//获取合约调用者的贡献余额 uint amount = balance[msg.sender];if (amount > 0) {//返回合约发起方的所有余额 msg.sender.transfer(amount);FundTransfer(msg.sender, amount, false);balance[msg.sender] = 0;}}//如果众筹目标达到,合约调用者为受益人(受益人、金额、假);}}}