在第1章的环境准备中,我们已经准备好了geth的docker环境。docker中geth案例使用的是Ropsten测试网络,可通过--testnet参数来指定。
首先通过ssh连接geth容器,ssh服务的端口为20022,密码为newpass,代码如下:
然后启动节点,并让节点在后台运行,代码如下:
以上启动节点的命令需要先连接容器,当然也可以选择另一种方式来启动节点,即通过docker exec命令一次性连接geth容器并启动节点,代码如下:
节点启动后,我们要测试节点是否可以正常连接。因为这是本地启动的节点,与网络是不互通的,所以需要在Kali中通过curl命令进行测试,代码如下:
如果节点启动成功,则返回结果如下:
上面启动节点的命令是docker容器的程序开发人员在说明文档中提供的,大部分为默认配置,涉及的参数比较少。在其他场景使用geth启动一条私链时,我们经常会涉及一些参数,具体内容如下。
关于geth的参数还有很多,上面只是介绍了常用的部分,如果读者需要了解更多的参数详情,可参考官方中的文档。
RPC(Remote Process Call,远程过程调用)指两台物理位置不同的服务器,其中一台服务器的应用想调用另一台服务器上某个应用的函数或方法,由于不在同一个内存空间不能直接调用,因此需要通过网络来表达语义及传入的参数。RPC是一种跨操作系统、跨编程语言的网络通信方式。
RPC规定在网络传输中参数和返回值均被序列化为二进制数据,这个过程被称为序列化(Serialize)或编组(Marshal)。通过寻址和传输将序列化的二进制数据发送给另一台服务器。另一台服务器接收二进制数据后会先反序列化,恢复为内存中的表达方式,然后找到对应方法进行调用,并将返回值仍旧以二进制形式返回给第一台服务器,再反序列化读取返回值。
前面使用curl命令测试节点已经启动成功,现在我们使用geth attach命令来连接节点,连接节点成功后将进入console,代码如下:
在console中,因为已经注入了web3的功能对象,所以可直接通过代码调用。我们通过eth.accounts查看,最初节点是没有账户的,下面新建一个账户,密码设为123456,代码如下:
新建的账户是没有以太币的,不过可以通过挖矿来获得以太币奖励。先用miner.setEtherbase函数设置矿工账户为0xd6647b360d1c4409ba0da90d0bbc8db816bef208,挖矿得到的奖励会存储在矿工账户中,接着执行miner.start函数开始挖矿,代码如下:
由于第1次启动挖矿时会生成挖矿所需的DAG文件,所以该过程会稍慢。等待几分钟后,才能显示挖矿成功,所以第1次和第2次使用eth.getBalance函数获取矿工账户中的余额显示为0,第3次才能看到有余额增加,如图4.1所示。
图4.1
挖矿获得以太币奖励后,为了避免生成过多无用的区块,此时可以停止挖矿,代码如下:
上面讲的是在console中手动挖矿的过程,其目的是帮助我们更好地理解以太坊的运行机制。如果希望减少这些过程,则可以在启动节点时使用--dev参数来指定开发者模式。在开发者模式下,会自动生成测试一个账户且已含有较多的以太币。另外,在交易池中出现交易时,也会自动挖矿打包区块。关于--dev模式的相关内容,读者可参考其官方文档。
在账户0xd6647b360d1c4409ba0da90d0bbc8db816bef208中已经有了一些以太币,下面我们先看看账户之间如何转账,使用personal.newAccount函数新建一个账户,密码同样为123456(这里为了方便直接使用弱口令)。再使用eth.accounts函数查看节点,发现已经多了一个0x99405a520b104e2a005be7462378d3fa389dd057账户,使用eth.getBalance函数查看新账户的余额为0,代码如下:
转账前需要先解锁账户,否则会提示账户locked类型的警告。执行personal.unlock Account函数解锁账户,输入新建账户时设置的那个密码,返回true即可解锁成功,代码如下:
执行eth.sendTransac函数给0x99405a520b104e2a005be7462378d3fa389dd057转账10 wei,from的值为发送以太币的账户,to的值为接收以太币的账户,gas的值相当于手续费,value的值为10的十六进制0xa,代码执行完成并返回交易的hash,代码如下:
执行eth.getBalance函数获取账户0x99405a520b104e2a005be7462378d3fa389dd057的余额,可是发现余额还是0。其原因就是此时没有矿工在挖矿,交易还没得到确认打包,所以状态没更新。执行txpool.status查看交易池的状态,看到pending状态为1,代码如下:
在以太坊公链环境中并不需要自己挖矿确认交易,有大量的矿工为了以太币奖励在不停地挖矿。这里我们用的是私有节点,需要手动挖矿,设置挖到一个区块就停止,代码如下:
等待挖矿完成后,执行eth.getBalance函数进行查看,发现账户0x99405a520b104e2a005be7462378d3fa389dd057已收到了以太币,余额变为10。同时再次查看交易池的状态,pending的状态已变为0,如图4.2所示。
图4.2
至此,我们已经学习了启动节点、创建账户、挖矿、转账等操作,下面继续学习部署智能合约的方法。