区块链系列六:设计自己的cryptocurrency

区块链系列四:Hello Ethereum!介绍了Ethereum的一些基础知识, 本文我们来用Ethereum发一个币玩玩。

安装客户端和钱包

按之前介绍安装客户端, 我们用Go语言版本的Geth。

下载安装Mist或Ethereum Wallet,Mist其实包含了钱包功能以及Remix IDE, 功能很强大的。

启动测试网络

注意, 如果我们用指定了自定义的存储位置, 会存储在此目录下。 而Mist自带一个geth客户端, 默认会去连localhost的默认客户端, 如果连不到则会启动自己的geth, 尝试连接mainnet。 所以为了让Mist连接我们的private network, 需要用将指定到默认位置。这样Mist就会连接到我们的客户端启动的private network了。

最小可行Token: MVT(Minimum Viable Token)

Show me the code!

理解contract

现在我们来从零开始逐渐构建一份完整的contract,并添加一些高级功能。

指定编译器版本。 contract类似于class, Chips是contract的名称(也就是我们token的名称)。balanceOf是Chips的一个字段, 类型为。 mapping是一种数据类型, 类似于Hashmap, 这里拿来存每个地址都多少token。 public表示所有人都可以访问。

我们可以如下图操作, 打开Mist,将代码copy到Mist中的编辑器中即可:

PS, 从上图中我们可以看出Mist其实里面包含的是一个网页, 直接在浏览器里访问网页url也可以:https://wallet.ethereum.org/ 。

是可以部署了, 但是没啥用, 因为balanceOf里每个地址都是0。 我们来给自己分配的token:

Chips是构造函数, 名称需要与contract名称一致, 只会在contract被部署的时候执行一次。是部署合约的人。 分配多少你可以随便写, 21000000是致敬BTC, 当然也可以用参数传递进去:

现在所有的token都在自己手里, 没啥价值, 我们要分点给其他人啊, 于是需要转账功能:

代码简单直接, 就是从发送者(msg.sender)转给to。 但是这里显然有问题, 万一发送者余额不足呢, 这种情况我们应该终止交易。 要提前终止代码执行有两种方法: return和throw。 return花费更少的gas, 但是之前修改的状态会被保留; 而throw会回滚所有的修改, 但是会花费掉所有gas。所以我们加一下判断:

contract信息

现在我们来添加一些关于contract的信息, 在contract中添加几个字段:

然后修改构造函数:

这里需要注意的是decimals,它的含义是1个token可以拆分成多少个最小基本单位。 比如1ether = 10 ** 18 wei, 所以Ethereum里decimals是18; 而如果是美刀, 则1美刀=100美分, 所以decimals是2。 这个地方没理解好后面会有坑,我们稍后介绍。

Events

我们想监听contract的某些状态, 比如当contract发生修改时,我们想获得通知。只需要写一个空函数(首字母大写)即可:

然后我们可以在函数中调用:

这样钱包会收到通知。

Deploy

我们来用Mist把前面代码部署到Ethereum网络吧!

选“合约” -》 “部署新合约”, 然后把solidity代码复制到编辑器里, 在“选择欲部署的合约”里选择Chips, 然后填上初始参数,如下图:

注意,这里我们初始给了10000, 但是decimal units为2, 其实表示的是100“块”token, 最小单位是0.01“块”token。

滚动到最下面, 设置一个合适的gas, 然后点击“部署”, 在弹出框中输入密码,点确定。 然后在里开启挖矿, , 过一会就会在主界面看到确认信息。

点击进入账号页面, 会看到自己拥有全部的: 100, 00

点击进入合约页面, 可以查看合约的信息。

现在我们可以转点token给朋友了。 点击发送, 配置好地址和数量, 选好token类型, 拖到最下面点击发送即可。

注意这里有个小坑, 数量这里输入10, 是指的token(相当于“块”), 而我们之前设置decimal units是2, 所以是1000“分”。第一次的时候没注意, 在构造函数填的只是100(相当于只有1块),结果这边转10块的时候, 总是报错。

输入密码, 继续挖一会矿, 会发现main account里面只有90, 00$$了, 然后在另一个账号里多了10,00$$。 如果另一个账号是在其他客户端上(比如转给其他朋友), 则他们是看不到新的token的。 需要在FirstChips的合约页面, 点击复制地址, 将地址发给朋友, 然后他们在合约页面,点查看代币, 然后把地址复制进去即可。

当然,你也可以调用contract的transfer函数来转账,注意这里的单位是“分”!

就这样我们很快就发了一个币, 当然只是运行在私有网络上, 要想部署到main net, 需要花费ethereum, 目前还没必要。

目前只有转账功能, 接下来我们打算设计一些复杂功能, 比如自动跟ether交易啊, POW机制啊, 账户冻结啊, 通过oraclize访问外部资源等, 敬请期待!

参考资料

https://www.ethereum.org/token

http://www.ethdocs.org

https://github.com/ethereum/go-ethereum/wiki/

https://solidity.readthedocs.io

http://web3js.readthedocs.io/en/1.0/index.html

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410G1R1L200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券