中国以太坊官网(第九课 如何调试以太坊官网的智能合约众筹案例)
中国以太坊官网(第九课 如何调试以太坊官网的智能合约众筹案例)
1。 文章摘要
【本文目标】
发布并执行通ETH官网的众筹合约代码。
【前置条件】
参考《第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易》完成了ColorBay的发行。
【技术收获】
1)。 调试成功以太坊官网的智能合约众筹代码
2)。 REMIX和myetherwallet配合的智能合约代码调试
【实操课程列表】
第一课 如何在WINDOWS环境下搭建以太坊开发环境
第二课 如何实现以太坊最简智能合约“Hello World”的运行
第四课 以太坊开发框架Truffle从入门到实战
第六课 技术小白如何开发一个DAPP区块链应用(以宠物商店为例)
第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易
第八课 如何调试以太坊官网的智能合约众筹案例
【说明】未列出的课程为知识普及的非实操类课程,所有区块链文章参考“区块链入口”专栏。
2。众筹和代币(TOKEN)的投资逻辑
爱西欧(Initial Crypto-Token Offering,首次代币众筹)被认为是区块链生态内生的一种新型投融资方式,概念起源于IPO,只不过募集的货币变为比特币、以太坊等通用数字货币,从而支持项目的开发成本。
目前对于爱西欧没有统一的定义, 一般而言,爱西欧指区块链初创项目在区块链平台上发行项目独有的加密代币,投资者通过使用指定的数字货币(如比特币、以太币)购买代币的方式为项目进行众筹融资的行为。代币依项目不同代表了对项目未来的使用权、投票权等。随着项目成果获得认可,使用人数增加,代币作为交易媒介或权益的价值获得不断提升。
2013年7月募集了5000个比特币的Mastercoin(现名为 Omni)是首个有记录的爱西欧,而以太坊在2014年7月超过1500万美元的ICO则开启了爱西欧快速发展的进程。2015 年,The DAO实现高达1。5亿美元融资,但后因受黑客攻击而失败。2016年以来,爱西欧众筹速度快、募集金额不断升高,常出现哄抢一空的情况。
众筹列表
爱西欧的流程及关键元素
对于爱西欧的流程没有统一的概述,一般认为爱西欧的流程总体可以分成准备期、窗口期、测试期和项目运行四个阶段。这四个阶段的主要内容如下:
众筹流程图
在爱西欧中有众多参与者与关键要素,可能包括 爱西欧 项目发起者、爱西欧 众筹平台、代币、代币钱包(部分直接就是平台或项目运行平台中的功能)等。
爱西欧风险评估方法
针对 爱西欧 投资的高风险状况,知名的区块链网站 Smith+Crown 在其爱西欧 手册中给出了几点投资参考,其首要剔提出的投资建议就是关注项目团队和项目执行力。而《财经》杂志也在6月5日的文章中也给出了鉴别风险的参考建议:
九大问题。jpg
作为技术派,比特币交易本文不再探讨技术使用背后的是是非非,只聚焦在众筹代码技术的实现和调试。
3,官网智能合约众筹代码分析
以太坊官网有一段关于爱西欧众筹的代码和运行介绍,但是其提供的测试环境跟很多人的测试环境不同,对测试步骤也介绍不全,很多人无法正常运行该智能合约,对其中的功能也不剩了解。
本文对这段代码增加了中文注释,并且对部分不适合的代码做了微调修改,并在下一章节提供了详细的调试步骤说明,供技术小白傻瓜式入门学习。
pragma solidity ^0。4。16;interface token { function transfer(address receiver, uint amount);}contract Crowdsale { address public beneficiary; // 募资成功后的收款方 uint public fundingGoal; // 募资额度 uint public amountRaised; // 参与数量 uint public deadline; // 募资截止期 uint public price; // token 与以太坊的汇率 , token卖多少钱 token public tokenReward; // 要卖的token mapping(address =>; uint256) public balanceOf; bool public fundingGoalReached = false; // 众筹是否达到目标 bool public crowdsaleClosed = false; // 众筹是否结束 /** * 事件可以用来跟踪信息 **/ event GoalReached(address recipient, uint totalAmountRaised); event FundTransfer(address backer, uint amount, bool isContribution); event LogAmount(uint amount); /** * 构造函数, 设置相关属性 */ function Crowdsale( address ifSuccessfulSendTo, uint fundingGoalInEthers, uint durationInMinutes, uint weiCostOfEachToken, address addressOfTokenUsedAsReward) { beneficiary = ifSuccessfulSendTo; fundingGoal = fundingGoalInEthers * 1 ether; deadline = now + durationInMinutes * 1 minutes; /*一个TOKEN等同于1个以太坊ETH太贵了,修改官网代码,变为一个TOKEN等同于1个wei*/ /*price = etherCostOfEachToken * 1 ether;*/ price = weiCostOfEachToken * 1 wei; tokenReward = token(addressOfTokenUsedAsReward); // 传入已发布的 token 合约的地址来创建实例 } /** * 无函数名的Fallback函数, * 在向合约转账时,这个函数会被调用 */ function () payable { require(!crowdsaleClosed); uint amount = msg。value; balanceOf[msg。sender] += amount; amountRaised += amount; LogAmount(amount);/*打款3个ETH,判断此处是3还是3*10^18*/ /*官网这个代码有问题,导致打回的币的数量会非常小,此处*1000倍,表示 1个ETH等于1000个TOKEN/ /*tokenReward。transfer(msg。sender, amount / price);*/ tokenReward。transfer(msg。sender, 1000 * (amount / price)); /*msg。sender对应的是当前运行的外部账号的地址*/ FundTransfer(msg。sender, amount, true); } /** * 定义函数修改器modifier(作用和Python的装饰器很相似) * 用于在函数执行前检查某种前置条件(判断通过之后才会继续执行该方法) * _ 表示继续执行之后的代码 **/ modifier afterDeadline() { if (now >;= deadline) _; } /** * 判断众筹是否完成融资目标, 这个方法使用了afterDeadline函数修改器 * 此段代码不会在deadline后自动运行,而是需要在deadline时间到后人工点击执行 * 如果在deadline时间前人工点击,会中断,也不会执行函数体代码; */ function checkGoalReached() afterDeadline { if (amountRaised >;= fundingGoal) { fundingGoalReached = true; GoalReached(beneficiary, amountRaised); } crowdsaleClosed = true; } /** * 完成融资目标时,融资款发送到收款方 * 未完成融资目标时,执行退款 * 此段代码不会在deadline后自动运行,而是在deadline时间到后人工点击执行 * 如果在deadline时间前人工点击,会中断,也不会执行函数体代码; */ function safeWithdrawal() afterDeadline { /*众筹截止时间后,如果众筹目标没有达到,则执行退款到当前外部账号*/ /*官网的这段代码的健壮性不够,要使合约的执行逻辑合理,则需要需要保持当前账号为众筹打ETH的账号*/ if (!fundingGoalReached) { uint amount = balanceOf[msg。sender]; balanceOf[msg。sender] = 0; if (amount >; 0) { if (msg。sender。send(amount)) { FundTransfer(msg。sender, amount, false); } else { balanceOf[msg。sender] = amount; } } } /*如果众筹目标达到了,并且受益账号等同于当前账号,则把众筹到的ETH打给当前账号*/ if (fundingGoalReached &;&; beneficiary == msg。sender) { if (beneficiary。send(amountRaised)) { FundTransfer(beneficiary, amountRaised, false);/**/ } else { //If we fail to send the funds to beneficiary, unlock funders balance fundingGoalReached = false; } } }}
函数说明
1,Crowdsale! 众筹合约的构造函数
ifSuccessfulSendTo: 募资成功后的收款方(本案例固定为合约创建者)
fundingGoalInEthers: 募资额度, 为了方便我们仅募3个ether
durationInMinutes: 募资时间,为了测试,案例时间设置为10分钟
weiCostOfEachToken:每个代币的价格, 案例在函数内部放大1000倍,设置为1,实际表示1个ETH需要发放1000个代币;
addressOfTokenUsedAsReward: 代币合约地址,案例发布的彩贝币(CB)的地址为"0x5eeec41dc08d7caece17c4a349635934637036f1";
2,function () payablepayable! 回调函数
没有函数名的payalbe函数为回调函数,意思是往智能合约地址打ETH的时候,则会自动调用该函数执行。
该函数的作用是收到ETH时,给众筹账号返回1000*n个ETH的彩贝CB代币。这儿代码健壮性不够,不管众筹是否成功,众筹账号都收到了CB代币。
3。 checkGoalReached:检查众筹目标是否达到
该调用函数修改器modifier的函数afterDeadline,只是表示截止时间前执行这个代码,实际不会checkGoalReached执行函数体的代码,只会执行afterDeadline的代码后就返回。
该函数的功能是设置fundingGoalReached为true表示众筹目标达到,设置crowdsaleClosed为true表示众筹可关闭。
该函数在截止时间到后要人工执行的,不会自动调用。
4。 safeWithdrawal: 众筹结束执行代码
该调用函数修改器modifier的函数afterDeadline,只是表示截止时间前执行这个代码,实际不会checkGoalReached执行函数体的代码,只会执行afterDeadline的代码后就返回。
如果众筹目标没有达到,则在当前执行账号为众筹账号的情况下,把募集的ETH打回给众筹发送的账号。
如果众筹目标账号达到,则把募集的ETH打给智能合约创建的账号。
4,智能合约众筹代码调试
智能合约执行的代码的坑较多,本文通过一步步的演示,给大家说明在REMIX+MetaMASK的环境下,如何完成该众筹合约代码的成功执行。
目标和总体步骤
目标:在10分钟内众筹3个ETH,返回3个ColorBay代币
前提条件:参考《第七课 技术小白如何在45分钟内发行通证(TOKEN)并上线交易》的实现,代币已经创建成功。
具体步骤:
[1] 在ACCOUNT 8上创建众筹智能合约,内容为ACCOUNT8在10分钟内众筹3个ETH,代币为ColorBay。
[2] ACCOUNT 8打3个ColorBay TOKEN给众筹智能合约
[3] ACCOUNT 1打3个ETH给众筹智能合约,同事收到3000个ColorBay
[4] 10分钟时间到后,人工执行checkGoalReached翻转众筹智能合约状态
[5] 10分钟时间到后,人工执行safeWithdrawal把众筹ETH打给收益账户ACCOUNT8
[1] 在ACCOUNT 8上创建众筹智能合约
直接调用REMIX官网编辑器地址即可调用Remix SOLIDITY 编辑器,如果该链接不能打开的话,你可以使用国内的小编专用Remix SOLIDITY编辑器 ,把上面的智能合约代码COPY后完成编译。
编译成功
设置MetaMASK的外部账户为ACCOUNT8(只要是里面有一定的ETH和代币的账户就行),
image。png
在ACCOUNT 8上创建众筹智能合约,内容为ACCOUNT8在10分钟内众筹3个ETH,代币为ColorBay。每个代币的价格1wei,代币合约地址为CB彩贝代币智能合约地址"0x5eeec41dc08d7caece17c4a349635934637036f1"。不知道这个地址来由的参考第七课的“MetaMask加载TOKEN”章节描述。
“Create”按钮的输入框代码为
"0x3D7DfB80E71096F2c4Ee63C42C4D849F2CBBE363",1, 10, 1,"0x5eeec41dc08d7caece17c4a349635934637036f1"
【说明】在remix中输入地址一定要加英文""表示。
具体的配置和操作步骤参考下图:
创建众筹智能合约
智能合约创建成功,点击Remix输出框的对应函数的"Detail"按钮,可以看到一些信息。
智能合约创建成功
我们可以获得该众筹智能合约的地址为
0x58103623f9ebd9b6a0518160c257e3884ddf0d08
[2] ACCOUNT 8打3个和3000个ColorBay TOKEN给众筹智能合约
转账3个Color Bay步骤
进入Network Ropsten(infura。io)的转账环境(由于你懂的原因误伤,国内有些互联网环境下无法打开时,请使用手机移动热点的方式访问即可打开)
转账CB设置步骤
确认交易
弹出后,点击支付交易费用
之后,点击网页下方的“Verify Transaction”,可以看到交易信息的区块进度,最终交易成功。
此次交易块的地址为https!//ropsten。etherscan。io/tx/0xc9013c7b57fca80c894d508a62bbdf019592466e1ff13a0139f1d3123c32a904
交易信息查看
转账3000个Color Bay步骤
按照我们的规划,转让3个Color Bay(CB)是不够的,我们要相同步骤再转账一次3000个CB的。
此次交易块的地址为
https!//ropsten。etherscan。io/tx/0xaaf04f1a63032bf2be77dc36d219f7bc4ce638a61a8b0b0c40d3c077bdd6b3a3
下面截图介绍一下交易信息内容描述:
交易概述页
跟踪事件页,下面EventLogs对应的是事件函数" event Transfer(address indexed from, address indexed to, uint256 value);"
【说明】事件,用来通知客户端交易发生,不会定义函数体,仅仅记录输入参数。
跟踪事件页
[3]ACCOUNT 1打3个ETH给众筹智能合约,同时收到3000个ColorBay
确保测试账号ACCOUNT 1有3个ETH测试币,没有的话采用BUY按钮免费买几个。
MetaMASK切换到ACCOUNT 1
浏览器切换到https!//www。myetherwallet。com/#send-transaction网站,转账3个ETH给众筹智能合约地址
转账3个ETH
转账确认
提交交易费用
本次交易对应的交易信息网址为https!//ropsten。etherscan。io/tx/0x485087d6bdbb92b292349694dd99c3ec698d4e9ddb0d573dda84395a59257ef7#eventlog。可见,已经把3000个代币打回给ACCOUNT1账号了。参考下图解释下事件描述:
打3个ETH,收到3000个CB
此时查看ACCOUNT1的账号信息,可以发现增加了3000个CB地址:
https!//ropsten。etherscan。io/token/0x5eeec41dc08d7caece17c4a349635934637036f1?a=0xd1f7922e8b78cbeb182250753ade8379d1e09949
截图说明:
代币流转信息
【说明】官网的这个代码不够智能,即使没有众筹成功,代币也已经发给众筹者了,这个逻辑不够严谨。
ACCOUNT1减少了3个ETH,查看地址:
https!//ropsten。etherscan。io/address/0xd1f7922e8b78cbeb182250753ade8379d1e09949
ETH的变化
[4] 10分钟时间到后,Meta账户切换为Account 8,人工执行checkGoalReached翻转众筹智能合约状态[4] 10分钟时间到后,Meta账户切换为Account 8,人工执行checkGoalReached翻转众筹智能合约状态
此处的操作作者曾经踩了个大坑。没有认真阅读代码,把时间设置为100分钟,然后在100分钟内点击checkGoalReached函数,发现没有任何变化。
10分钟时间到达后,检查众筹状态
众筹状态结果
[5] 10分钟时间到后,人工执行safeWithdrawal把众筹ETH打给收益账户ACCOUNT8
众筹结束打币
众筹结束事件查看图
众筹的ETH已到账
整个交易流程的代币转移可以查看代币合约的链接信息,看看事件可以看到所有的交易记录和账号:
https!//ropsten。etherscan。io/address/0x5eeec41dc08d7caece17c4a349635934637036f1#events
5,一个具有商用价值的众筹智能合约代码
个人觉得官网的这个智能合约不够好。理想中符合逻辑的智能合约应该是时间到后自动去检查众筹金额,到达目标时则自动执行合约,未到达目标时则代币和ETH均返回原始的账号。
画了业务流程图,但是还没有精力实现这段代码。待有兴趣的码友实现后交流。
商用的众筹智能合约流程
欧阳哥哥实现了该智能合约代码,并给出了详细的测试步。
相关文章
- 以太坊钱包导入(Metamask 空投第二波传言已至;小狐狸使用教程来了)
- 比特币交易平台app(最安全的比特币交易平台有哪些?首推就是OKEx)
- 聚宝网数字货币(又有“银行系”货基登陆蚂蚁财富 拼规模时代到来?)
- 莱特中国微商币(央行紧急叫停“代币”:融资野蛮生长 空手套白狼)
- p网eth异常(以太坊接连出现千万级收续费,是洗钱还是被勒索?)
- 区块链加(平安集团区块链研究院首席科学家郑溪龙:未来要深化“金融+科技”模式 同时探索“金融+生态”模式)
- 以太坊购买(现在还可以买ETH-)
- 物联网数字货币交易平台(北辰数字研究院+DDcoin介绍)
- 区块链1.0(声讯早班车:主流数字货币与区块链1.0)
- 中国区块链公司(今日推荐 - 中国区块链上市公司图谱2019:北上广深杭上市企业表现活跃)
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~