从一行命令了解以太坊

了解一个新事物最快的手段是上手实践,在实践中不断地发现问题解决问题。

Imagem de capa

我觉得了解一个新事物最快的手段是上手实践,在实践中不断地发现问题解决问题。今天我们来试图近距离接触一下以太坊(ethereum)这个新事物。

安装 geth

几乎每一个接触以太坊的开发者,不可能不碰到gethgeth是用go语言编写的以太坊客户端,所以叫geth。安装方法很简单:

brew tap ethereum/ethereum
brew install ethereum

运行 geth:

网络

安装好geth之后,先不要像普通程序一样直接运行geth,这是因为geth缺省会连接到以太坊官方的正式网络上去,这个正式网络里的区块目前已经有多达500多万块,而且里面跑的都是要花真金白银的交易,为了练习起见,我们先连接到以太坊的测试网络上试一下。

除正式网络外,以太坊还有4个测试网络,geth能用的有3个。因为正式网络的编号是1,所以这3个测试网络的编号分别是2, 3, 4。编号为2的测试网络叫做Morden,目前已经废弃不用了;编号为3的叫做Ropsten,编号为4的叫做Rinkeby,这些名字的来源都是伦敦或者瑞典斯德哥尔摩的地铁站的名字,因为它们的主要维护者住在这几个地铁站旁边,也许哪一天会出现『五道口』这样的测试网络呢。

目前在用的测试网络主要就是RopstenRinkeby,区别在于Ropsten用的共识机制是PoW,而Rinkeby用的共识机制是PoA,先不要被这些可怕的名词吓晕,我们只要知道它在用法上的区别就是PoW的话,你如果想获得以太币的话是需要自己挖矿的,而PoA则不需要也不可以挖矿,你需要跟网络管理员讨要几块以太币来做实验。这几个网络的具体区别可以看这篇文章

指定网络的方法很简单,假设我们要使用rinkeby这个网络,那我们就这样写:

geth --rinkeby

数据文件

虽然指定了网络,但我们还不能马上启动geth,这是因为geth缺省的数据文件的路径是~/Library/Ethereum,如果我们直接启动的话,数据文件被放在这个目录下,而这个目录本来是为编号为1的正式网络预留的,如果我们把数据文件放在这里的话,如果以后我们想再启动正式网络,这些数据就会被覆盖,所以我们需要先在这个目录下建立一个子文件夹rinkeby,然后告诉geth我们的数据文件要存放在这个子文件夹里:

geth --rinkeby --datadir=$HOME/Library/Ethereum/rinkeby

同步模式

在启动geth之前,我们还需要告诉geth我们想以哪种方式同步数据,geth3种同步数据的方式,分别是full, fastlight。这三种方式中,full全同步是最慢的一种,它要把从创世区块往下的所有区块全部同步并校验一遍,fast快速同步模式相对于full来说要快一些,它只校验最近的1024个区块,而light模式是最快的,因为它只校验最近的一个状态,geth的缺省同步方式是fast,在rinkeby上目前有180多万个区块的情况下,同步的时间大约需要半个小时到2个小时,所以这里还是需要有一点耐心的。指定同步模式的命令如下:

geth --rinkeby --datadir=$HOME/Library/Ethereum/rinkeby --syncmode=fast

启动 rpc 服务器

为了能让我们的应用软件能够连接上geth,还需要在启动geth的同时启动rpc服务器,这个命令很简单:

geth --rinkeby --datadir=$HOME/Library/Ethereum/rinkeby --syncmode=fast --rpc

连接到状态服务器

我们费了这么大力气建立起来的geth环境,到底有没有被人认可呢?我们把它连接到rinkeby官方的状态服务器上看一下吧:

geth --rinkeby --datadir=$HOME/Library/Ethereum/rinkeby --syncmode=fast --rpc --ethstats='fengerzh:Respect my authoritah!@stats.rinkeby.io'

注意:这里的fengerzh是我给我的机器起的名字,你需要改变成一个不会和别人重复的名字,否则会出错误,而后面的这个Respect my authoritah!是密码,但这个密码必须是这样,否则也会通不过。

好了,我们终于连接好了,运行一下命令看看效果吧:

clipboard.png

我们刚刚设置好的结点已经出现在了官方的网站上,说明我们的设置已经成功了!

配置文件

上面这一串命令太长了,记不住怎么办?我们可以把这些配置信息导出到一个配置文件中:

geth --rinkeby --datadir=$HOME/Library/Ethereum/rinkeby --syncmode=fast --rpc --ethstats='fengerzh:Respect my authoritah!@stats.rinkeby.io' dumpconfig > ~/rinkeby.toml

这样以后我们再执行的时候,就直接执行

geth --config ~/rinkeby.toml console

就好了。

账号

建立账号

现在我们的geth环境能运行了,下一步我们就需要在里面建立一个账号,最好再能有几个以太币可以玩一玩,我们可以用一个简单的命令建立一个账号:

geth account new --datadir=~/Library/Ethereum/rinkeby/

这里一定不要忘记添加datadir,否则你的账号就建到正式网络上去,而不是rinkey测试网络了。

索取以太币

正如我们上面所说,由于rinkeby这个网络是基于PoA的,所以你在这里获取以太币的唯一方式是索取,而不是挖矿,所以你需要到这个网站来,点击下面的 3 个链接之一,把你刚才建好的账号的信息放在twitter里发布出去,然后再把twitter的网址粘回刚才那个网站,过不了一会你就会收到管理者寄给你的3个以太币。

clipboard.png

3个以太币太少了吗?你可以到这个网站换算一下3个以太币等于多少wei

clipboard.png

通常情况下,一份智能合约的部署费用大约需要1,400,000gas,具体数字要看你合约的复杂程度而定,举例来说,一次加法操作要花掉你3gas,而一次乘法操作要花掉5gas,创建一个新账号要花32000gas,具体数据可以查这里。而gas还要通过单价换算成以太币,就像汽油一样,部署一份智能合约要花掉140万升油,而一升油的价格不固定,可以由你自己决定,你给的油价高,算的就快,你给的油价低,算的就慢,如果太低的话就没有人算了,正式网络的油价可以在这里查到,而测试网络rinkeby的油价在官网上有显示,目前价格大约是20.687gwei,这样算下来,一份智能合约的费用大约是1400000*20.687=28961800gwei,折合0.0289618个以太币,那我们的3个以太币大约可以部署100份合约。而如果是正式网络的话,汽油单价没那么贵,大约是2或者3gwei,折为0.003以太币,而目前以太币的价格大约为5000元人民币,所以一份智能合约的价格是15元人民币。

如果你觉得这个价格太高的话,可以考虑建立自己的私有网络,我会在另一篇文章里详谈。