以太坊的命令行客户端挺多,不同语言的实现,有python的pyethapp,有c++的cpp-ethereum,还有我们这里要说的go语言实现的geth。
geth是官方客户端,也是目前最流行的以太坊命令行客户端。还有适合普通用户使用的图形化客户端,Ethereum Wallet 和 Mist。
上一节中我们的智能合约是部署在javascript模拟的区块链节点中。我们现在准备把它部署到真正的以太坊节点上,当然我们是部署在开发环境中,正式环境的部署是需要花费以太币的。
安装go语言环境
官方下载页面 https://golang.org/dl/
官方安装说明 https://golang.org/doc/install
也可以网上搜索下go语言安装,安装完成后测试下
$ go version
正常的话,会返回go的版本号,类似这样
go version go1.9.3 darwin/amd64
安装geth
有很多安装方式,官方安装说明 https://ethereum.github.io/go-ethereum/install
这里使用源码安装方式
git clone https://github.com/ethereum/go-ethereum.git
cd go-ethereum
make geth
编译完成后找到可执行文件 geth (或者 geth.exe windows下),文件在源码目录下 /build/bin/ 。这个文件是可以单独执行的,不需要任何其它文件的依赖,你可以随意将它拷贝到其它目录,或者将它添加到你的PATH环境变量中。
启动geth
geth可以有很多不同的启动方式,可以连接以太坊主网络、以太坊测试网络,或者搭建以太坊私有链,这些启动方式我们以后再谈到,现在我们启动以太坊开发环境。
geth --ipcpath <test-chain-directory>/geth.ipc --datadir <test-chain-directory> --dev console
geth --datadir <data directory> --dev --rpc --rpccorsdomain "*" console
参数说明
--datadir
数据库和秘钥存储路径
--dev
开发环境,采用权威证明(PoA),开发帐号有预存金额,自动封装交易数据到区块链
--rpc
开启HTTP-RPC服务,默认8545端口
--rpccorsdomain
允许连接到rpc的url匹配模式 *代表任意
console
启动一个交互式的JavaScript环境
``
控制台命令
> web3.eth.accounts
["0xe698356a50e71bade22e1a324d5c815f0631df2c"]
> user1 = web3.eth.accounts[0]
"0xe698356a50e71bade22e1a324d5c815f0631df2c"
> user1_balance = web3.eth.getBalance(user1)
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
> web3.fromWei(user1_balance,'ether')
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+59
解释下这几个命令:
-
web3.eth.accounts
获取当前节点控制的帐号列表,这里可以看到已经有一个帐号了,这是--dev
参数帮我们创建的帐号。 -
web3.eth.getBalance(user1)
获取帐号余额,我们看到返回了一个很大的数字,77次方的一个值。这也是--dev
参数帮我们给这个帐号预存的余额,方便我们做测试。 -
web3.fromWei(user1_balance,'ether')
把这个余额做单位转换。以太币有一套货币单位,最大的是ether,最小的是wei,1ether = 10^18wei。我们查询余额默认给出的是wei为单位的表示,这里是把单位转换成ether为单位的表示。
这里使用的web3对象,是以太坊开发的一套javascript库,目的是让应用程序能够与以太坊节点进行通信。注意,这里有两层,geth启动了一个以太坊节点,console参数开启了一个javascript的控制台,这个控制台注入了web3.js这个库,以使我们可以通过web3对象与以太坊节点做交互。
web3命令的完整文档 https://github.com/ethereum/wiki/wiki/JavaScript-API
以太币单位说明 http://ethdocs.org/en/latest/ether.html
remix与geth绑定
启动完成geth后,我们需要将我们的remix IDE与geth绑定。remix的安装和使用前面有介绍。
在右侧功能项中 Run -> Environment 选择 Web3 Provider,使用默认的连接地址。
绑定完成后,现在我们的Account 列表中就是我们刚刚在控制台中查询到的帐号,后面还有很长一个数值,是它的余额。
在remix的命令行终端中输入命令
这里与我们之前的控制台是一样的。我们看到现在块高(blockNumber)是0。
部署代币合约
现在与我们之前的合约部署是一样的,点击Create就可以了。部署完成后我们再次查询
> web3.eth.blockNumber
1
现在块高已经是1了,就是说我们刚刚的代币合约已经写入区块链了。
在remix下做方法调用
现在我们需要再创建一个帐号用来做测试
> web3.personal.newAccount("123456")
"0xc710711af7f890ecef56bb38bde1eade2e5d0ab8"
注意,这个命令在remix的控制台不能使用,提示personal_newAccount方法不存在,我猜应该是web3的版本问题。所以我是在命令行窗口下进行的。
transfer "0xc710...ab8",2000
这里地址我省略了,实际调用需要完整地址。调用完成后我们在控制台再查询块高,现在是2了。同时我们发现所有蓝色按钮(只读)的方法,是不会增加块高的,只有红色按钮(有写入操作)的方法会增加块高度。