主页 > imtoken冷钱包苹果版下载 > 如何通过以太坊智能合约进行众筹(ICO)

如何通过以太坊智能合约进行众筹(ICO)

imtoken冷钱包苹果版下载 2024-01-26 05:14:05

如何通过以太坊智能合约进行众筹(ICO)

在上一篇文章中,我们已经写了两次如何发行代币。 今天我们就来说说如何使用代币公开募集资金,也就是写一个募资合约

写在前面

本文中提到的代币是使用以太坊智能合约创建的。 在阅读本文之前,您应该对以太坊智能合约有一定的了解。 如果你还不知道,我建议你先看看以太坊是什么

众筹

简单说一下众筹的概念:一般来说,我有一个很好的idea,但是我没有钱去做,所以我把这个idea发给大家,说:我需要500块钱来做这个。 万,你有兴趣投资一些钱吗? 如果30天内投资500万,我就开始。 到时候大家都是原股东。 如果筹款金额低于500万,您将退还您投入的资金。 为了每一个

现在ICO众筹已经被各种大佬割韭菜了,已经烂尾了(不管达不达标,钱都会被收走)

事实上,区块链技术非常适合解决众筹的信任问题。 借助智能合约,可以实现当募集金额完成后,募集资金将自动划入指定账户。 筹款金额未完成时,可进行退款。 过程不需要看众筹领头人的人品,不需要依赖第三方平台信用担保

代币

传统众筹参与后通常不容易交易(参与后不能转让给其他人),但通过使用代币参与众筹,很容易进行交易。 众筹参与者可以随时进行交易,等待众筹项目实施完成后,将完全根据持有的代币数量进行回馈

举个例子来解释一下,大家会更容易理解,有这个众筹:A有技术做一个可以监测健康的戒指,为此向公众募集2亿,100元对应筹集资金时的代币。 戒指上市后,代币持有者可以用一个代币兑换一枚戒指,而戒指的开发周期为一年以太坊ico众筹,所以在戒指上市前的一年内,众筹参与者可以随时兑换持有的一些代币

众筹智能合约代码

接下来我们看看如何实现一个众筹智能合约

  1. pragma solidity ^0.4.16;
  2. interface token {
  3. function transfer(address receiver, uint amount);
  4. }
  5. contract Crowdsale {
  6. address public beneficiary; // 募资成功后的收款方
  7. uint public fundingGoal; // 募资额度
  8. uint public amountRaised; // 参与数量
  9. uint public deadline; // 募资截止期
  10. uint public price; // token 与以太坊的汇率 , token 卖多少钱
  11. token public tokenReward; // 要卖的 token
  12. mapping(address => uint256) public balanceOf;
  13. bool fundingGoalReached = false; // 众筹是否达到目标
  14. bool crowdsaleClosed = false; // 众筹是否结束
  15. /**
  16. * 事件可以用来跟踪信息
  17. **/
  18. event GoalReached(address recipient, uint totalAmountRaised);
  19. event FundTransfer(address backer, uint amount, bool isContribution);
  20. /**
  21. * 构造函数, 设置相关属性
  22. */
  23. function Crowdsale(
  24. address ifSuccessfulSendTo,
  25. uint fundingGoalInEthers,
  26. uint durationInMinutes,
  27. uint finneyCostOfEachToken,
  28. address addressOfTokenUsedAsReward) {
  29. beneficiary = ifSuccessfulSendTo;
  30. fundingGoal = fundingGoalInEthers * 1 ether;
  31. deadline = now + durationInMinutes * 1 minutes;
  32. price = finneyCostOfEachToken * 1 finney;
  33. tokenReward = token(addressOfTokenUsedAsReward); // 传入已发布的 token 合约的地址来创建实例
  34. }
  35. /**
  36. * 无函数名的 Fallback 函数,
  37. * 在向合约转账时, 这个函数会被调用
  38. */
  39. function () payable {
  40. require(!crowdsaleClosed);
  41. uint amount = msg.value;
  42. balanceOf[msg.sender] += amount;
  43. amountRaised += amount;
  44. tokenReward.transfer(msg.sender, amount / price);
  45. FundTransfer(msg.sender, amount, true);
  46. }
  47. /**
  48. * 定义函数修改器 modifier(作用和 Python 的装饰器很相似)
  49. * 用于在函数执行前检查某种前置条件(判断通过之后才会继续执行该方法)
  50. * _ 表示继续执行之后的代码
  51. **/
  52. modifier afterDeadline() { if (now >= deadline) _; }
  53. /**
  54. * 判断众筹是否完成融资目标, 这个方法使用了 afterDeadline 函数修改器
  55. *
  56. */
  57. function checkGoalReached() afterDeadline {
  58. if (amountRaised >= fundingGoal) {
  59. fundingGoalReached = true;
  60. GoalReached(beneficiary, amountRaised);
  61. }
  62. crowdsaleClosed = true;
  63. }
  64. /**
  65. * 完成融资目标时, 融资款发送到收款方
  66. * 未完成融资目标时, 执行退款
  67. *
  68. */
  69. function safeWithdrawal() afterDeadline {
  70. if (!fundingGoalReached) {
  71. uint amount = balanceOf[msg.sender];
  72. balanceOf[msg.sender] = 0;
  73. if (amount > 0) {
  74. if (msg.sender.send(amount)) {
  75. FundTransfer(msg.sender, amount, false);
  76. } else {
  77. balanceOf[msg.sender] = amount;
  78. }
  79. }
  80. }
  81. if (fundingGoalReached && beneficiary == msg.sender) {
  82. if (beneficiary.send(amountRaised)) {
  83. FundTransfer(beneficiary, amountRaised, false);
  84. } else {
  85. //If we fail to send the funds to beneficiary, unlock funders balance
  86. fundingGoalReached = false;
  87. }
  88. }
  89. }
  90. }

部署和说明

在部署这个合约之前以太坊ico众筹,我们需要先部署一个代币合约,请参考分步教程创建自己的数字货币

要创建众筹合约,我们需要提供以下参数:

ifSuccessfulSendTo:筹款成功后的收款人(其实可以默认为合约创建者)

fundingGoalInEthers:筹款金额,为了方便我们只筹到3个以太币

durationInMinutes:筹款时间

finneyCostOfEachToken 每个代币的价格,这里为了方便使用单位finney,取值为:1(1 ether = 1000 finney)

addressOfTokenUsedAsReward:代币合约地址

如:

以太坊ico众筹_以太坊ico众筹_sitesina.com.cn 以太坊ico

本文使用的参数为:

"0xc6f9ea59d424733e8e1902c7837ea75e20abfb49",3,100,1,"0xad8972e2b583f580fc52f737b98327eb65d08f8c"

参与者在投资时实际购买众筹合约代币。 所有代币都需要预先存入合约。 代币数量为:募集金额/代币价格,这里是:3 * 1000/1 = 3000(当也可以大于3000)

预存代币到合约,可以使用myetherwallet钱包,或者在remix中重新加载代币合约,执行代币合约的tranfer()函数进行代币转账,比如使用myetherwallet转账如图:

以太坊ico众筹_sitesina.com.cn 以太坊ico_以太坊ico众筹

参与者的投资行为是向众筹合约转账。 转账时会执行Fallback函数(即无名函数),将相应的代币返还到自己的账户中。

safeWithdrawl() 可以由参与者或受益人执行。 融资不达标的,参与方可收回前期投资资金。 融资达标,受益人可以获得全部融资资金

扩张

以上是一份非常正式的募捐合同。 接下来说一下两个募资合约的延期,无限募资合约和割韭菜合约是如何实现的。

这部分内容独家发表在我的区块链技术小专栏