我觉得了解一个新事物最快的手段是上手实践,在实践中不断地发现问题解决问题。今天我们来试图近距离接触一下以太坊(ethereum
)这个新事物。
安装geth
几乎每一个接触以太坊的开发者,不可能不碰到geth
,geth
是用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
,这些名字的来源都是伦敦或者瑞典斯德哥尔摩的地铁站的名字,因为它们的主要维护者住在这几个地铁站旁边,也许哪一天会出现『五道口』这样的测试网络呢。
目前在用的测试网络主要就是Ropsten
和Rinkeby
,区别在于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
我们想以哪种方式同步数据,geth
有3
种同步数据的方式,分别是full
, fast
和light
。这三种方式中,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!
是密码,但这个密码必须是这样,否则也会通不过。
好了,我们终于连接好了,运行一下命令看看效果吧:
我们刚刚设置好的结点已经出现在了官方的网站上,说明我们的设置已经成功了!
配置文件
上面这一串命令太长了,记不住怎么办?我们可以把这些配置信息导出到一个配置文件中:
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
个以太币。
3
个以太币太少了吗?你可以到这个网站换算一下3
个以太币等于多少wei
:
通常情况下,一份智能合约的部署费用大约需要1,400,000
个gas
,具体数字要看你合约的复杂程度而定,举例来说,一次加法操作要花掉你3
个gas
,而一次乘法操作要花掉5
个gas
,创建一个新账号要花32000
个gas
,具体数据可以查这里。而gas
还要通过单价换算成以太币,就像汽油一样,部署一份智能合约要花掉140
万升油,而一升油的价格不固定,可以由你自己决定,你给的油价高,算的就快,你给的油价低,算的就慢,如果太低的话就没有人算了,正式网络的油价可以在这里查到,而测试网络rinkeby
的油价在官网上有显示,目前价格大约是20.687gwei
,这样算下来,一份智能合约的费用大约是1400000*20.687=28961800gwei
,折合0.0289618
个以太币,那我们的3
个以太币大约可以部署100
份合约。而如果是正式网络的话,汽油单价没那么贵,大约是2
或者3gwei
,折为0.003
以太币,而目前以太币的价格大约为5000
元人民币,所以一份智能合约的价格是15
元人民币。
如果你觉得这个价格太高的话,可以考虑建立自己的私有网络,我会在另一篇文章里详谈。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。