本文主要是对Geth学习使用的总结。
-
Geth
Geth是以太坊命令行客户端,目前是官方唯一支持的。通过Geth实现以太坊的各种功能:账户的增删改、开启挖矿、以太币的转移、智能合约的部署与执行等。直接执行geth会自动连接到以太坊的主网并开始同步。网络中可能同时存在数十条甚至上百条的以太链,当两个以太坊节点连接时,通过genesis block和network id来确认彼此连接的是否为同一条链。
可以创建一条与以太坊主链的 genesis block 和 network id 不一样的链,可以其中一项不同,也可以两项都不同。
当创建的链的 genesis block 和 network id 刚好与网络上其他人的链相同,那么就看哪条链长,如果比对方的短,那么链上的数据会全部被覆盖,变成对方的链。
通常把私链和主链的数据存在不同的文件夹,指定文件夹存储私链的资料,利用 --datadir 参数来指定。
geth --datadir "./mychain" --networkid 123
创建一条新链,首先要初始化 genesis block,因此先创建一个文件,记录genesis block的信息,如下:
{ "difficulty" : "0x20000", "extraData" : "asdfg", "gasLimit" : "0x8000000", "alloc": {}, "config": { "chainId": 15, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 } }
其中, extraData 可以写入32bytes大小的任意数据,每个 block 都会有,由挖出 block 的 miner 矿工决定要不要在这写入内容。
alloc 只有 genesis block 才有,指定哪些 address 初始就有多少 wei (ether的单位之一),以太坊的主链在genesis block 中利用alloc生出一笔ether 分给投资人、基金会及贡献者。将上述genesis block 保存为json文件,并执行:
geth --datadir "./mychain" --networkid 123 init genesis.json
接着执行如下命令进入console:
geth --datadir "./mychain" --networkid 123 console
此时一个节点已经构建成功。
每次如果要连到自己创建的私链,则必须要指定 datadir 和 networkid等参数,否则可能会连到主链。如果搭建一个私人网络,安装以上步骤以外,还可以配合 nodiscover 参数。
如果没有配置 --nodiscover ,节点能找到彼此。
-
如果配置 --discover,必须手动的方式加入其他节点,有三种方式,但是不管用哪种方式都必须要先知道所链节点的信息,信息由节点的id、ip和port组成。
在geth命令行中执行 admin.nodeInfo 查看节点信息。
1、方式一:geth指令加入 boothnodes 参数geth --datadir "./privatechain" --networkid 123 --nodiscover --bootnodes enode://[e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx](mailto:e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx):30303 console
2、方式二:进入console,然后使用 admin.addPeer()
admin.addPeer("enode://[e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx](mailto:e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx):30303")
3、方式三:在指定目录下 ./mychain 创建文件static-nodes.json,让geth自动连接
["enode://[e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx](mailto:e92fd77c6b2df9daff7ac54473c40d1eef18f63eddbd6fadc2d5fd79a5d957e522348314d6bd63c6919e09bd6b2b5e5616d9b8169ab898946a21d0e06abe08ad@61.66.218.xxx):30303"]
节点加入后,可以在console中通过admin.peers来查看。
1、如果私链有许多成员,可以在geth命令中加入 --identity 来识别,当使用 admin.peers 查看时,就可以快速知道连接的节点身份。
2、可以通过 --verbosty 来指定显示的信息量,从0(无信息)到6(细节信息)。
3、通过 --mine 指令让节点自动挖矿,或是进入console后执行miner.start()和miner.stop()来控制。geth --identity “Bob” --verbosity 2 --mine
- 开启RPC
在geth启动命令中加入 --rpc 参数即可启动,RPC的默认端口为8545,可以用 --rpcport 来指定; --rcpapi-- 指定要开放的API接口,默认是eth
,net
和web3
三个模块,其中测试常用的personal
和admin
模块,由于涉及节点控制权以及私钥等,默认是不放开的,需要自己手动指定。当手工指定模块时,需要显示指定默认模块,如果不指定,geth启动后将不支持原先默认的模块。
如果远程终端断开后,要重连到原来的geth客户端,执行:
geth attach http://host:port
host是你的ip地址,比如127.0.0.1,port是你设置的端口,比如默认的8545。
eth
、rpc
和web3
三个模块,不能调用诸如personal
之类的API,如果要调用,需要在geth命令启动节点时指定。- 挖矿
miner.start()
出错的原因是当前环境下还没有账户,需要先建立账户,通过 personal.newAccount("william") 创建账户。如果已有账户,可能是启动时指定目录不正确。
添加后再执行 miner.start()
: