什么是Geth
Geth是 ethereum 协议的Go语言实现,Geth支持ethereum中的各种操作;并且得益于Go语言的多平台特性,Geth也支持在多个平台上使用。
安装Geth
安装分为两种:
- 直接下载编译好的Geth二进制文件
- 从源码编译生成二进制文件
在本示例中,不需要对Geth代码进行修改,所以选择下载编译好的Geth二进制文件
在MacOS上安装
在terminal中执行
1 | brew tap ethereum/ethereum |
在Ubuntu上安装
在terminal中执行
1 | sudo apt-get install software-properties-common |
验证安装成功
在terminal中执行
1 | geth version |
出现如下显示,即为安装成功
1 | Geth |
创世块
任何以太链都以一个创世块开始,为此我们需要定义一些创世块的参数,以便更好的服务于我们的开发和测试。
以下是一个创世块的样例配置,该配置是json格式的:
1 | { |
config.chainId // 以太链的ID,用来唯一标记一条以太链
coinbase // 矿工账号,第一个区块挖出后将给这个矿工账号发送奖励
difficulty // 难度值,越大越难
extraData // 附加信息随便填
gasLimit // gas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大
nonce // 一个 64 位随机数
mixhash // 与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash
parentHash // 上一个区块的 hash 值
alloc // 预设账号以及账号的以太币数量,这里不做配置
初始化以太链
在定义了一个创世块的配置文件之后,使用该创世块的配置文件初始化以太链;
1 | geth --datadir "~/geth/nodes/node_1" init genesis.json |
出现如下显示
1 | WARN [02-11|17:49:04] No etherbase set and no accounts found as default |
初始化完成之后,启动geth进入交互式命令行工具
1 | geth --datadir "~/geth/nodes/node_1" \ |
查看节点信息
1 | > admin.nodeInfo |
此时,我们已经成功创建了一个只有一个创世块、只有一个节点的以太坊的私有链,但是这个以太链中还没有账户以及交易,下面我们来创建账户。
创建账户
在交互式命令行中运行
1 | > personal.newAccount('geth') |
创建了一个名为0xb6e09535504452d5f1be75b510944fa5942efb08
,密码为geth
的账户
通过以下命令确认这一点
1 | > personal.listAccounts |
增加一个节点
打开一个新的terminal,使用刚才的创世块配置文件,初始化一个节点并启动
1 | geth --datadir "~/geth/nodes/node_2" init genesis.json |
这是第二个节点的信息
1 | > admin.nodeInfo |
连接两个节点
以上操作仅仅创建了两个隔离的节点
在第二个节点上执行
1 | > admin.peers |
发现都是空的,现在要把两个节点连接起来,在第二个节点上执行
1 | admin.addPeer("enode://860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af@[::]:30303") |
其中admin.addPeer("enode://860d8e7e94dfdc72c0c3ca8f5aa919f1a32cf3a2461a74eb0c1b0f8b3563b757b1e0c9cd53068e79774da3ec0d652acbfddeb75420b670fe9b208313293600af@[::]:30303")
这一串地址是节点1的信息。
此时就可以看到
1 | > admin.peers |
至此,一个有两个互联节点的以太坊链就成功搭建起来了。
挖矿
搭建起来的第一件事就是挖矿,在随便一个节点上执行
1 | > miner.start(1) |
挖矿便开始了,随后风扇呜呜的声音就起来了
此时查看挖到的块数
1 | > eth.blockNumber |
发现开始0
为了能查看进度,执行
1 | tail -f ~/geth/logs/console.log |
或者
1 | tail -f ~/geth/logs/console2.log |
取决于你用哪个节点挖矿
出现如下输出
1 | INFO [02-11|18:09:52] Generating DAG in progress epoch=0 percentage=29 elapsed=35.565s |
当percentage=100的时候,挖矿便开始了,稍等一会之后,再执行
1 | > eth.blockNumber |
发现已经挖到了,为了风扇废掉,及时停止了挖矿
1 | > miner.stop() |
查看区块的信息
查看最后一个区块的信息
1 | > eth.getBlock(eth.blockNumber) |
拿到挖到最后一个区块的矿工的名字
1 | > eth.getBlock(eth.blockNumber).miner |
查找该矿工总共有多少以太坊币
1 | > eth.getBalance(eth.getBlock(eth.blockNumber).miner) |
注意次数的以太币单位为Wei
,是最小的不可分的单位,10^18个wei
是一个以太币,故而上述矿工总共有75个以太币,因为总共有15个区块被挖出来,按照每个区块奖励5个以太币的设定,正好75个以太币。