用 5 个 CMT 可以做什么?
很悲伤的消息是, 在币圈大凉的环境下, 按照现在的币价来算, 只能买一瓶矿泉水.
但是这 5 个 CMT 在开发人员手里, 大有用处! 究竟能够发挥了什么作用, 来 CyberMiles 开发者社区 11 月 25 日举办的 2 小时学会编写智能合约 Workshop101 看看.
Hello World
Hello world 是最简单的程序之一, 也是大部分程序员编写的第一个程序. 这次的 workshop 101 也是从最基础的 Hello world 智能合约开始.
这里要特别指出哦, Hello World 部分的主讲人杨乐. 她是 CyberMiles 的产品经理, 是香港大学英文文学系的高材生, 她与这次来参会的大多数人一样, 在此之前, 没有任何编程经验. 只要你愿意, 欢迎来到开发者社区小课堂的讲台哟.
说回正题, 在正式部署执行 Hello world 智能合约之前, 我们需要在电脑上安装 MetaMask for CMT. 这是一个安装在 Chrome 浏览器的钱包工具, 它的主要功能是管理 CyberMiles 帐号私钥, 实现从网页上直接支付 CMTs (包括 gas 费) 等功能.
安装过程比较简单, 去官网 (https://www.cybermiles.io/metamask/) 下载插件, 之后在 Chrome 的扩展程序中打开开发者模式, 将下载好的 metamask4cmt.crx 拖拽至 Chrome 的扩展程序页面.
拖拽后, 如果 Metamask for CMT 不能正常工作, 可以试下重启浏览器. 如果依然不能正常工作, 来参加 workshop 的程序员提供了一个新的方法, 非常厉害, 当天拯救了不少人的电脑.
把下载好的 metamask4cmt.crx 的后缀改成. rar, 进行解压. 在 Chrome 扩展程序页面, 点击 "加载已解压的扩展程序", 添加解压好的 metamask4cmt.crx 就可以了.
此外, 如果 Chrome 中已经安装了其他版本的 MetaMask, 为了不影响使用, 最好暂时停止使用其他版本的 MetaMask, 只留 Metamask for CMT 激活.
安装好 MetaMask for CMT, 就可以生成一个新的 CyberMiles 帐号来存储 CMTs, 在最上方选择 Main CyberMiles Network. 因为主办方会给每个人发 5 个真实的 CMT, 用于支付执行智能合约的 gas 费以及参与后面的神秘环节.
CMT 的转账速度非常快, 差不多 10 秒就到账了, 并且不用支付 gas 费, 转账体验非常好!
有了 5 个 CMT 和 MetaMask for CMT, 就可以开始我们的 Hello World!
在 Chrome 里打开 Remix for CMT 的网页, 将写好的 Hello World 智能合约代码放进中间的代码编辑区, 当然, 你也可以选择自己写代码.
之后点击右侧的 Start to compile, 编译器会自动检查这段代码是否存在常规性错误. 没有问题的话, 编译器会自动识别出该段合约的名称, 也就是 Contract 后面的 Greet. 如果有问题, 编译器会给出提示, 根据提示修改代码, 再次编译即可.
检查代码没有问题后, 就可以把 Greet 智能合约部署到 CyberMiles 区块链了. 点击右侧最上方的 Run, 然后点击 Deploy. 这时需要调用 MetaMask for CMT 支付部署智能合约所需要的 gas 费.
一般情况下, MetaMask 的支付页面会自动跳出, 点击 Submit 进行支付就可以了. 如果没有自动跳出, 手动点击插件就好了. 可以看到, 部署这个合约上链只需要花费 0.000489 个 CMT.
支付完 gas 费后, 右下方 Deployed Contracts 处就可以看到, 我们的合约已经在 CyberMiles 链上部署好了.
红色的 terminate 可以终止这个合约, 但只有合约 owner 才可以执行这项操作, 终止合约同样需要支持少量 gas 费.
greet 显示智能合约的内容是什么, 在这里是 Hello World. 当然, Hello World 这个词只是程序员的选择. 作为智能合约的开发者, 你可以让 greet() 返回任何字符 - 可以是一首歌, 一篇文章, 一本书, 或者是一段加密的文字.
owner 显示这个合约的所有权归哪个地址所有. 你为这个合约支付部署 gas 费的账号地址就是合约的所有者.
同时用区块浏览器 ( http://cmttracking.io/ ) 查询交易地址信息, 可以看到刚刚创建的合约地址. 如果你的朋友有这个合约地址, 在 At Address 栏内输入合约地址, 点击 At Address 就可以收到别致的智能合约问候啦!
我们上面看见怎么用 Hello World 智能合约在区块链存一段话, 并让世界上任何人看见这段话. 那么, 这是怎么在代码里实现的呢?
pragma lity ^1.2.4;
这是智能合约所用的代码语言及版本.
- contract Greet {
- function greet() {
- }
- function terminate() {
- }
- }
以上代码介绍了智能合约的名字 Greet, 以及两个功能, greet 和 terminate.
- address public owner;
- modifier onlyOwner() {
- assert(msg.sender == owner);
- _;
- }
- constructor () public {
- owner = msg.sender;
- }
以上的代码设置了合约的 owner,owner 的地址信息是公开的. 信息发送者, 也就是谁支付了 gas 费, 让合约能够部署到链上, 谁就是 owner, 并且定义了只有 owner 能够修改这个合约.
- function greet() public pure returns (string) {
- return "Hello world";
- }
以上代码表明当你调用 greet() 时, 就会出现 Hello World. 这个功能只是从区块链上读取数据, 所以不需要 gas 费用. 这里你可以把 Hello World 改成任何文字.
- function terminate() external onlyOwner {
- selfdestruct(owner);
- }
这就是智能合约最开始定义的 terminate 终止合约的功能, 并且定义了只有 Owner 可以执行这项功能. selfdestruct 是析构函数, 用于销毁数据, 终止合约.
到这里, Hello World 的代码就结束了, 这是一段非常完整的代码.
这个最基础的合约既设置了合约的 Owner, 同时也设置了 Owner 能够销毁合约, 当执行 selfdesruct 时, 合约里的钱也会返还给 Owner.
因为合约地址与钱包地址长地非常像, 并且长度也一致, 如果不小心把币打到了合约地址, 一般情况下, 是无法找回的. 但如果你知道合约的 owner 是谁, 可以联系合约的 owner, 在销毁合约时拿回你的资产.
这只是个人的小损失, 如果项目方没有认真地对待代码, 带来的资产损失是非常严重的. 非常典型的案例是, 今年 7 月份, Polkadot 有超过 513,774.16 ETH 被冻结在 Parity 钱包中, 就是因为合约中的 owner 被人设成 null 了, 因此没有人可以终止合约, 拿回存在合约里的钱. 现在, 钱仍然被锁在合约里, 永久冻结.
谨慎对待, 认真审查每一段代码, 尤其是涉及到钱的代码, 这是每个程序员该有的素质.
CyberMiles 连最基础的智能合约代码也保证了代码的完整性, 值得我们学习.
Bet game 竞猜小游戏
这次 workshop 还有进阶版, 通过智能合约发起一个竞猜游戏, 由智能合约当裁判, 可以说具备了完全的公正性.
代码比较复杂, 不再一一解释, 有兴趣的朋友可以自行去 GitHub 研究一下.
Owner 把智能合约部署在 CyberMiles 区块链上后, 玩家可以在 Remix for CMT 中输入合约地址, 调用该合约, 参与竞猜游戏.
游戏规则是每个参加 workshop 的人先从 2 到 12 中随机选择一个整数, 并为自己选择的数字支付一定数量的 CMT 作为赌注. 如果猜对了, 将获得等比例的 CMT.
规则公布后, Owner 选择 startGame , 游戏正式开始! 大家在现场跃跃欲试, 有人大声说着 "all in", 有人应和着, 现场一时异常欢乐. 这也是 5 个 CMT 的神秘用处!
调用合约成功后, 在右下方 placeBet 处填写自己选择的整数, 在右上方 Value 处, 将单位选择为 CMT, 并且填写自己准备花费多少钱. 填好后, 通过 Metamask for CMT 支付 gas 费, 将下来坐等开奖!
杨乐在微信中随机掷了两个骰子, 确认了最终的正确答案. 在骰子 "尘埃落定" 的过程中, 一片安静, 静悄悄地等最终答案, 看来大家都沉浸在游戏中了.
正确答案出来后, 合约 Owner 在 endGame 处填写数字 8, 并支付 gas 费.
接下来就到领奖环节, 根据智能合约的规则, 前面在 placeBet 填写了数字 8 的参与者将按比例平分收集到的所有下注的 CMT.
赢家点击 payme, 支付 gas 费, 合约将自动把分配好的 CMT 转账到赢家的 CMT 账户里, 这一切由代码计算, 执行.
现场有两位赢家, 一位以 0.5 CMT 拿走了 5.3 个 CMT, 一位以 2CMT 拿走 21.2CMT. 当然也有没有猜中的同学不死心地点了 payme, 但是因为不是赢家, 什么也没拿到, 白白地支付了 gas 费. 不相信智能合约是不行的.
结果公示, 两位赢家拿走奖励后, Owner 选择 terminate 这个合约, 游戏到此圆满结束!
用 5 个 CMT 编写智能合约, 和周围的小伙伴一起讨论这段代码该怎么理解, 又有 CMT 开发社区的人热心指导, 最后参与到有趣的游戏中, 见证了什么叫做 "Code is law".
非常感谢 CyberMiles 开发者社区能够组织这样一次活动. 这是一次非常棒的体验, 也是区块链技术应有的魅力之处!
来源: https://juejin.im/post/5bfff0496fb9a049a5709f2b