以太坊源码解析(四)使用Geth

Posted by 姚飞亮 on 2020-07-11

以太坊源码解析(四)使用Geth

命令行选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ geth --help
NAME:
geth - the go-ethereum command line interface
以太坊命令行界面
Copyright 2013-2019 The go-ethereum Authors
USAGE:用法
geth [options] command [command options] [arguments...]
geth[options]命令[命令选项][参数…]
VERSION:版本:
1.9.16-unstable-6d8e51ab-20200707
COPYRIGHT:
Copyright 2013-2020 The go-ethereum Authors
版权:
版权所有2013-2020 The go ethereum作者

COMMANDS命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
COMMANDS:命令
account 管理账户
attach 启动交互式JavaScript环境(连接到节点)
console 启动交互式JavaScript环境
copydb 从目标chaindata文件夹创建本地链
dump 从存储器中转储特定块
dumpconfig 显示配置值
dumpgenesis 将genesis块JSON配置转储到stdout
export 将区块链导出到文件中
export-preimages 将preimage数据库导出到RLP流中
import 导入区块链文件
import-preimages 从RLP流导入preimage数据库
init 引导并初始化一个新的genesis块
inspect 检查数据库中每种类型数据的存储大小
js 执行指定的JavaScript文件
license 显示许可证信息
makecache 生成ethash验证缓存(用于测试)
makedag 生成乙灰矿DAG(用于测试)
removedb 删除区块链和状态数据库
retesteth 以重新测试模式启动geth
show-deprecated-flags 显示已弃用的标志
version 打印版本号
wallet 管理以太坊预售钱包
help, h 显示一个命令的命令或帮助列表

以太坊选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ETHEREUM OPTIONS:
--config value TOML配置文件
--datadir value 数据库和密钥库的数据目录 (default: "/Users/apple/Library/Ethereum")
--datadir.ancient value 链数据链(默认为链段内的数据 (default = inside chaindata)
--keystore value 密钥库的目录 (default = inside the datadir)
--nousb 禁用对USB硬件钱包的监视和管理
--pcscdpath value 智能卡守护程序(pcscd)套接字文件的路径
--networkid value 网络标识符(integer, 1=Frontier, 3=Ropsten, 4=Rinkeby, 5=Görli) (default: 1)
--goerli Görli网络:预先配置的权威验证测试网络
--rinkeby Rinkeby网络:预先配置的授权证明测试网络
--yolov1 YOLOv1网络:预先配置的权威验证短期测试网络。
--ropsten Ropsten网络:预先配置的工作证明测试网络
--syncmode value 块链同步模式("fast", "full", or "light") (default: fast)
--exitwhensynced 块同步完成后退出
--gcmode value 区块链垃圾收集模式 ("full", "archive") (default: "full")
--txlookuplimit value N按哈希维护事务索引的最近块数(默认值=索引所有块) (default = index all blocks) (default: 0)
--ethstats value ethstats服务的报告URL(nodename:secret@host:port)
--identity value 自定义节点名称
--lightkdf 以降低KDF强度为代价减少密钥派生RAM和CPU的使用
--whitelist value 要实施的逗号分隔块号到哈希映射(<number>=<hash>)

轻型客户端选项:

1
2
3
4
5
6
7
8
LIGHT CLIENT OPTIONS:
--light.serve value 为LES请求提供服务所允许的最大时间百分比(多线程处理允许值超过100) (default: 0)
--light.ingress value 服务轻型客户端的传入带宽限制(千字节/秒,0=无限制)(kilobytes/sec, 0 = unlimited) (default: 0)
--light.egress value 服务轻型客户端的传出带宽限制 (kilobytes/sec, 0 = unlimited) (default: 0)
--light.maxpeers value 要服务的轻型客户端或要连接的轻型服务器的最大数量 (default: 100)
--ulc.servers value 受信任的ultra light服务器列表
--ulc.fraction value 发布新头部所需的受信任ultra light服务器的最小百分比 (default: 75)
--ulc.onlyannounce Ultra light服务器仅发送通知

开发者链选项

1
2
3
DEVELOPER CHAIN OPTIONS:
--dev 具有预先出资的开发人员帐户的临时授权证明网络,支持挖掘
--dev.period value 要在开发人员模式下使用的阻止期间(0=仅当事务挂起时才使用)(默认值:0)

乙炔选项

1
2
3
4
5
6
7
8
9
ETHASH OPTIONS:
--ethash.cachedir value 存储ethash验证缓存的目录(默认为datadir内)
--ethash.cachesinmem value 要保存在内存中的最近的ethash缓存数(每个16MB)(默认值:2)
--ethash.cachesondisk value 要保留在磁盘上的最近的ethash缓存数(每个16MB)(默认值:3)
--ethash.cacheslockmmap 锁定最近的ethash缓存的内存映射
--ethash.dagdir value 存储ethash挖掘dag的目录 (default: "/Users/apple/Library/Ethash")
--ethash.dagsinmem value 要保存在内存中的最近的ethash挖掘dag数(每个1+GB)(默认值:1)
--ethash.dagsondisk value 要保留在磁盘上的最近的ethash挖掘dag数(每个1+GB)(默认值:2)
--ethash.dagslockmmap 最近的ethash挖掘dag的锁定内存映射

事务池选项

1
2
3
4
5
6
7
8
9
10
11
12
TRANSACTION POOL OPTIONS:
--txpool.locals value 以逗号分隔的帐户作为本地帐户处理(不刷新,优先包含)
--txpool.nolocals 对本地提交的交易禁用价格豁免
--txpool.journal value 本地事务的磁盘日志,以便在节点重新启动后继续存在(default: "transactions.rlp")
--txpool.rejournal value 重新生成本地事务日志的时间间隔(default: 1h0m0s)
--txpool.pricelimit value 最低天然气价格限制,以强制接受进入池(default: 1)
--txpool.pricebump value 替换现有交易的价格缓冲百分比(default: 10)
--txpool.accountslots value 每个帐户保证的最小可执行事务槽数(default: 16)
--txpool.globalslots value 所有帐户的最大可执行事务槽数(default: 4096)
--txpool.accountqueue value 每个帐户允许的最大不可执行事务槽数(default: 64)
--txpool.globalqueue value 所有帐户的最大不可执行事务槽数(default: 1024)
--txpool.lifetime value 不可执行事务排队的最长时间(default: 3h0m0s)

性能调整选项

1
2
3
4
5
6
7
PERFORMANCE TUNING OPTIONS:
--cache value 分配给内部缓存的内存(default = 4096 mainnet full node, 128 light mode) (default: 1024)
--cache.database value 用于数据库io的缓存内存允许量百分比 (default: 50)
--cache.trie value 用于trie缓存的缓存内存允许量百分比(默认值=15%完全模式,30%存档模式)(default = 15% full mode, 30% archive mode) (default: 15)
--cache.gc value 用于trie修剪的缓存内存允许量百分比(默认值=25%完全模式,0%存档模式) (default = 25% full mode, 0% archive mode) (default: 25)
--cache.snapshot value 用于快照缓存的缓存内存允许量百分比(默认值=10%完全模式,20%存档模式)(default = 10% full mode, 20% archive mode) (default: 10)
--cache.noprefetch 在块导入期间禁用启发式状态预取(CPU和磁盘IO更少,等待数据的时间更长)

帐户选项

1
2
3
4
5
ACCOUNT OPTIONS:
--unlock value 要解锁的帐户的逗号分隔列表
--password value 用于非交互式密码输入的密码文件
--signer value 外部签名者(ipc文件的url或路径)
--allow-insecure-unlock 当http公开与帐户相关的RPC时允许不安全的帐户解锁

API和控制台选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
API AND CONSOLE OPTIONS:
--ipcdisable 禁用IPC-RPC服务器
--ipcpath value datadir中IPC套接字/管道的文件名(显式路径转义)
--http 启用HTTP-RPC服务器
--http.addr value HTTP-RPC服务器侦听接口(默认值:“localhost”)
--http.port value HTTP-RPC服务器侦听端口(默认值:8545)
--http.api value 通过HTTP-RPC接口提供的API
--http.corsdomain value 从中接受跨源请求的以逗号分隔的域列表(强制使用浏览器)
--http.vhosts value 从中接受请求的以逗号分隔的虚拟主机名列表(服务器强制)。接受“*”通配符。(默认值:“localhost”)
--ws 启用WS-RPC服务器
--ws.addr value WS-RPC服务器侦听接口(默认值:“localhost”)
--ws.port value WS-RPC服务器侦听端口(默认值:8546)
--ws.api value 通过WS-RPC接口提供的API
--ws.origins value 接受websockets请求的来源
--graphql 启用GraphQL服务器
--graphql.addr value GraphQL服务器侦听接口(默认值:“localhost”)
--graphql.port value GraphQL服务器侦听端口(默认值:8547)
--graphql.corsdomain value 从中接受跨源请求的以逗号分隔的域列表(强制使用浏览器)
--graphql.vhosts value 从中接受请求的以逗号分隔的虚拟主机名列表(服务器强制)。接受“*”通配符。(默认值:“localhost”)
--rpc.gascap value 设置可用于eth_call/estimateGas的气体上限(0=无限)(默认值:25000000)
--rpc.txfeecap value 设置可通过rpcapis发送的交易费用上限(以太形式)(0=无上限)(默认值:1)
--jspath loadScript loadScript的JavaScript根路径(默认:“.”)
--exec value 执行JavaScript语句
--preload value 要预加载到控制台中的JavaScript文件的逗号分隔列表

网络选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NETWORKING OPTIONS:
--bootnodes value 用于P2P发现引导的逗号分隔enode url
--bootnodesv4 value P2P v4发现引导(轻型服务器,完整节点)的逗号分隔enode url(已弃用,使用--bootnodes)
--bootnodesv5 value P2P v5发现引导(light server,light nodes)的逗号分隔enode url(已弃用,请使用--bootnodes)
--discovery.dns value 设置DNS发现入口点(使用“”禁用DNS)
--port value 网络侦听端口(默认值:30303)
--maxpeers value 网络对等方的最大数量(如果设置为0,则禁用网络)(默认值:50)
--maxpendpeers value 挂起连接尝试的最大次数(如果设置为0,则使用默认值)(默认值:0)
--nat value NAT端口映射机制(any | none | upnp | pmp | extip:<IP>)(默认值:“any”)
--nodiscover 禁用对等机发现机制(手动添加对等机)
--v5disc 启用实验性RLPx V5(主题发现)机制
--netrestrict value 限制与给定IP网络的网络通信(CIDR掩码)
--nodekey value P2P节点密钥文件
--nodekeyhex value P2P节点密钥为hex(用于测试)

矿工选项

1
2
3
4
5
6
7
8
9
10
11
MINER OPTIONS:
--mine 启用挖掘
--miner.threads value 用于挖掘的CPU线程数(默认值:0)
--miner.notify value 用于通知新工作包的逗号分隔HTTP URL列表
--miner.gasprice value 开采交易的最低天然气价格(默认值:1000000000)
--miner.gastarget value 开采区块的目标天然气底板(默认值:8000000)
--miner.gaslimit value 开采区块的目标气体上限(默认值:8000000)
--miner.etherbase value 区块采矿奖励的公共地址(默认值=第一个帐户) (default = first account) (default: "0")
--miner.extradata value 阻止miner设置的额外数据(默认值=客户端版本) (default = client version)
--miner.recommit value 重新创建正在挖掘的块的时间间隔(默认值:3s)
--miner.noverify 禁用远程密封验证

天然气价格ORACLE选项

1
2
3
GAS PRICE ORACLE OPTIONS:
--gpo.blocks value 检查天然气价格的最近区块数(默认值:20)
--gpo.percentile value 建议天然气价格是一组最近交易的天然气价格的给定百分比(默认值:60)

虚拟机选项

1
2
3
4
VIRTUAL MACHINE OPTIONS:
--vmdebug 记录对VM和协定调试有用的信息
--vm.evm value 外部EVM配置(默认=内置解释器)(default = built-in interpreter)
--vm.ewasm value 外部ewasm配置(默认=内置解释器)(default = built-in interpreter)

日志记录和调试选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
LOGGING AND DEBUGGING OPTIONS:
--fakepow 验证工作无效
--nocompaction 导入后禁用数据库压缩
--verbosity value 日志详细程度:0=静默,1=错误,2=警告,3=信息,4=调试,5=详细信息(默认值:3): 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
--vmodule value 每个模块详细程度:逗号分隔的<pattern>=<level>列表(例如eth/*=5,p2p=4) <pattern>=<level> (e.g. eth/*=5,p2p=4)
--backtrace value 在特定的日志记录语句处请求堆栈跟踪(例如“街区:271") (e.g. "block.go:271")
--debug 在日志消息前面加上调用站点位置(文件和行号)
--pprof 启用pprofhttp服务器
--pprof.addr value pprofhttp服务器监听接口(默认值:“127.0.0.1”)
--pprof.port value pprofhttp服务器侦听端口(默认值:6060)
--pprof.memprofilerate value 以给定的速率打开内存配置(默认值:524288)
--pprof.blockprofilerate value 以给定速率启用块分析(默认值:0)
--pprof.cpuprofile value 将CPU配置文件写入给定文件
--trace value 将执行跟踪写入给定文件

度量和统计选项

1
2
3
4
5
6
7
8
9
10
11
METRICS AND STATS OPTIONS:
--metrics 启用指标收集和报告
--metrics.expensive 支持昂贵的指标收集和报告
--metrics.addr value 启用独立度量HTTP服务器侦听接口(默认值:“127.0.0.1”)
--metrics.port value Metrics HTTP服务器侦听端口(默认值:6060)
--metrics.influxdb 启用指标导出/推送到外部InfluxDB数据库
--metrics.influxdb.endpoint value 要向其报告度量的InfluxDB API终结点(default: "http://localhost:8086")
--metrics.influxdb.database value 要将报告的度量推送到的InfluxDB数据库名称(default: "geth")
--metrics.influxdb.username value 授权访问数据库的用户名(default: "test")
--metrics.influxdb.password value 授权访问数据库的密码(default: "test")
--metrics.influxdb.tags value 逗号分隔的InfluxDB标记(key/values)附加到所有测量值(default: "host=localhost")

耳语(实验)选项

1
2
3
4
5
WHISPER (EXPERIMENTAL) OPTIONS:
--shh 启用耳语
--shh.maxmessagesize value 可接受的最大邮件大小(默认值:1048576)
--shh.pow value 接受的最小功率(默认值:0.2)
--shh.restrict-light 限制两个whisper light客户端之间的连接

别名(已弃用)选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ALIASED (deprecated) OPTIONS:
--rpc 启用HTTP-RPC服务器(已弃用,请使用--HTTP)
--rpcaddr value HTTP-RPC服务器侦听接口(已弃用,使用--http.addr.地址)(默认值:“localhost”)
--rpcport value HTTP-RPC服务器侦听端口(已弃用,请使用--http.端口)(默认值:8545)
--rpccorsdomain value 从中接受跨源请求的以逗号分隔的域列表(强制使用浏览器)(已弃用,请使用--http.corsdomain)
--rpcvhosts value 从中接受请求的以逗号分隔的虚拟主机名列表(服务器强制)。接受“*”通配符。(已弃用,使用--http.vhost)(默认值:“localhost”)
--rpcapi value 通过HTTP-RPC接口提供的API(已弃用,使用--http.api)
--wsaddr value WS-RPC服务器侦听接口(已弃用,使用--地址)(默认值:“localhost”)
--wsport value WS-RPC服务器侦听端口(已弃用,请使用--ws.port公司)(默认值:8546)
--wsorigins value 接受websockets请求的来源(不推荐,使用--ws.起源) (deprecated, use --ws.origins)
--wsapi value 通过WS-RPC接口提供的API(已弃用,使用--ws.api标准)
--gpoblocks value 检查天然气价格的最近区块数(不推荐,使用--gpo块)(默认值:20)
--gpopercentile value 建议天然气价格是一组最近交易的天然气价格的给定百分比(不推荐,使用--gpo百分位)(默认值:60)
--pprofport value pprofhttp服务器侦听端口(已弃用,使用--pprof.端口)(默认值:6060)
--pprofaddr value pprofhttp服务器侦听接口(已弃用,使用--地址)(默认值:“127.0.0.1”)
--memprofilerate value 以给定的速率打开内存分析(不推荐,使用--pprof.memprofilerate公司)(默认值:524288)
--blockprofilerate value 以给定的速率打开块分析(不推荐,使用--pprof.blockprofilerate公司)(默认值:0)
--cpuprofile value 将CPU配置文件写入给定文件(不推荐,使用--pprof.cpuprofile文件)

其他选项

1
2
3
MISC OPTIONS:
--snapshot 启用快照数据库模式--实验性“正在工作”功能
--help, -h 显示帮助

连接到网络

如何找到对等

Geth不断尝试连接到网络上的其他节点,直到有对等节点为止。如果您在路由器上启用了UPnP或在面向Internet的服务器上运行以太坊,它还将接受来自其他节点的连接。

Geth通过称为发现协议的东西找到对等方。在发现协议中,节点互相闲聊以发现网络上的其他节点。为了起步,geth使用了一组引导程序节点,其端点记录在源代码中。

要在启动时更改引导--bootnodes节点,请使用选项并用逗号分隔节点。例如:

1
geth --bootnodes enode://pubkey1@ip1:port1,enode://pubkey2@ip2:port2,enode://pubkey3@ip3:port3

连接的常见问题

有时您只是无法连接。最常见的原因如下:

  • 您的当地时间可能不正确。要使用以太坊网络,需要一个准确的时钟。检查您的操作系统以了解如何重新同步时钟(例如sudo ntpdate -s time.nist.gov),因为即使太快12秒也可能导致0个对等方。
  • 某些防火墙配置可以阻止UDP通信流。您可以使用静态节点功能或admin.addPeer()在控制台上手动配置连接。

要在没有发现协议的情况下启动geth,可以使用--nodiscover参数。您只希望这是您正在运行测试节点或具有固定节点的实验测试网络。

检查连通性

要检查客户端在交互式控制台中连接的对等节点,该net 模块具有两个属性,可为您提供有关对等节点数以及您是否为侦听节点的信息。

1
2
3
4
> net.listening
true
> net.peerCount
4

要获取有关连接的对等方的更多信息,例如IP地址和端口号,受支持的协议,请使用对象的peers()功能adminadmin.peers() 返回当前连接的对等方的列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> admin.peers
[{
ID: 'a4de274d3a159e10c2c9a68c326511236381b84c9ec52e72ad732eb0b2b1a2277938f78593cdbe734e6002bf23114d434a085d260514ab336d4acdc312db671b',
Name: 'Geth/v0.9.14/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '5.9.150.40:30301',
LocalAddress: '192.168.0.28:39219'
}, {
ID: 'a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c',
Name: 'Geth/v0.9.15/linux/go1.4.2',
Caps: 'eth/60',
RemoteAddress: '52.16.188.185:30303',
LocalAddress: '192.168.0.28:50995'
}, {
ID: 'f6ba1f1d9241d48138136ccf5baa6c2c8b008435a1c2bd009ca52fb8edbbc991eba36376beaee9d45f16d5dcbf2ed0bc23006c505d57ffcf70921bd94aa7a172',
Name: 'pyethapp_dd52/v0.9.13/linux2/py2.7.9',
Caps: 'eth/60, p2p/3',
RemoteAddress: '144.76.62.101:30303',
LocalAddress: '192.168.0.28:40454'
}, {
ID: 'f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0',
Name: '++eth/Zeppelin/Rascal/v0.9.14/Release/Darwin/clang/int',
Caps: 'eth/60, shh/2',
RemoteAddress: '129.16.191.64:30303',
LocalAddress: '192.168.0.28:39705'
} ]

要检查geth使用的端口并找到您的enode URI,请运行:

1
2
3
4
5
6
7
8
9
10
11
> admin.nodeInfo
{
Name: 'Geth/v0.9.14/darwin/go1.4.2',
NodeUrl: 'enode://3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694@[::]:30303',
NodeID: '3414c01c19aa75a34f2dbd2f8d0898dc79d6b219ad77f8155abf1a287ce2ba60f14998a3a98c0cf14915eabfdacf914a92b27a01769de18fa2d049dbf4c17694',
IP: '::',
DiscPort: 30303,
TCPPort: 30303,
Td: '2044952618444',
ListenAddr: '[::]:30303'
}

定制网络

有时您可能不需要连接到实时公共网络,而可以选择创建自己的专用测试网。如果您不需要测试外部合同而只想测试技术,这将非常有用,因为您不必与其他矿工竞争,并且可以轻松地产生大量的测试以供使用(将12345替换为任何非负数):

1
geth -—networkid="12345" console

通过提供--genesis标志,还可以使用来自JSON文件的自定义创世块运行geth 。生成JSON文件应具有以下格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"alloc": {
"dbdbdb2cbd23b783741e8d7fcf51e459b497e4a6": {
"balance": "1606938044258990275541962092341162602522202993782792835301376"
},
"e6716f9544a56c530d868e4bfbacb172315bdead": {
"balance": "1606938044258990275541962092341162602522202993782792835301376"
},
...
},
"nonce": "0x000000000000002a",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x",
"gasLimit": "0x2fefd8"
}

静态节点

如果您始终希望连接某些对等节点,则Geth还支持称为静态节点的功能。静态节点在断开连接时重新连接。您可以通过将以下内容放入来配置永久静态节点 /geth/static-nodes.json

1
2
3
4
[
"enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303",
"enode://pubkey@ip:port"
]

您还可以在运行时通过js控制台使用admin.addPeer()以下方式添加静态节点 :

1
admin.addPeer("enode://f4642fa65af50cfdea8fa7414a5def7bb7991478b768e296f5e4a54e8b995de102e0ceae2e826f293c481b5325f89be6d207b003382e18a8ecba66fbaf6416c0@33.4.2.1:30303")

JavaScript控制台

Geth JavaScript控制台公开了完整的web3 JavaScript Dapp API和其他管理API。

交互使用:控制台

geth JavaScript控制台以consoleattachgeth子命令启动。该console子命令启动GETH节点,然后打开控制台。该attach 子命令连接到控制台已经运行GETH实例。

1
2
geth console
geth attach

如果geth节点与非默认ipc端点一起运行,或者您想通过rpc接口进行连接,则Attach模式接受一个端点。

1
2
3
geth attach /some/custom/path.ipc
geth attach http://191.168.1.1:8545
geth attach ws://191.168.1.1:8546

请注意,默认情况下,geth节点不会启动HTTP和WebSocket服务器,并且出于安全原因,并非所有功能都通过这些接口提供。启动geth节点时,可以使用--rpcapi--wsapi参数覆盖默认值,也可以使用admin.startRPCadmin.startWS覆盖这些默认值。

如果需要日志信息,请从以下开始:

1
geth console --verbosity 5 2>> /tmp/eth.log

否则,使日志静音,以免污染控制台:

1
geth console 2> /dev/null

Geth支持通过该--preload 选项将自定义JavaScript文件加载到控制台中。这可用于加载常用功能或设置web3合同对象。

1
geth console --preload "/my/scripts/folder/utils.js,/my/scripts/folder/contracts.js"

非交互式使用:脚本模式

也可以执行文件到JavaScript解释器。在consoleattach子接受--exec这是一个JavaScript语句的参数。

1
geth attach --exec "eth.blockNumber"

这将显示正在运行的geth实例的当前块号。

或在http上的远程节点上执行带有更复杂语句的本地脚本:

1
2
geth attach http://geth.example.org:8545 --exec 'loadScript("/tmp/checkbalances.js")'
geth attach http://geth.example.org:8545 --jspath "/tmp" --exec 'loadScript("checkbalances.js")'

使用--jspath来为您的js脚本设置库目录。loadScript()没有绝对路径的参数to 将相对于该目录被理解。

您可以通过键入exit或直接使用退出控制台CTRL-C

注意事项

go-ethereum使用Otto JS VM,它具有一些局限性:

  • "use strict" 将解析,但什么也没做。
  • 正则表达式引擎(re2 / regexp)与ECMA5规范不完全兼容。

web3.js使用bignumber.js库。该库自动加载到控制台中。

计时器

除了JS的全部功能(按照ECMA5)之外,以太坊JSRE还增加了各种计时器。它实现了setIntervalclearIntervalsetTimeoutclearTimeout您可以用来使用的浏览器窗口。它还提供了admin.sleep(seconds)一个基于块的计时器的实现,admin.sleepBlocks(n) 该计时器一直休眠直到添加的新块的数量等于或大于n(例如“等待n个确认”)为止。

管理账户

警告 记住您的密码。

如果您丢失了用于加密帐户的密码,则将无法访问该帐户。重复:没有密码就无法访问您的帐户,并且这里没有“ 忘记我的密码”选项。别忘记了。

以太坊CLI geth通过以下account命令提供帐户管理:

1
$ geth account <command> [options...] [arguments...]

通过管理帐户,您可以创建新帐户,列出所有现有帐户,将私钥导入新帐户,迁移到最新密钥格式并更改密码。

当提示您输入密码时,它支持交互模式以及通过给定密码文件提供密码的非交互模式。非交互模式仅适用于在测试网络或已知安全环境中的脚本使用。

确保记住创建新帐户(使用新帐户,更新帐户或导入帐户时)提供的密码。没有它,您将无法解锁您的帐户。

请注意,不支持以未加密格式导出密钥。

密钥存储在下/keystore。确保定期备份密钥!有关 更多信息,请参见 DATADIR备份和还原。如果给出了自定义datadir和keystore选项,则keystore选项将优先于datadir选项。

密钥文件的最新格式为:UTC---。列出时的帐户顺序为字典顺序,但由于时间戳格式的影响,实际上是创建顺序

在以太坊节点之间传输整个目录或其中的单个密钥是安全的。请注意,如果要从其他节点向节点添加密钥,则帐户的顺序可能会更改。因此,请确保您不要依赖或更改脚本或代码片段中的索引。

然后再次。不要忘记密码

1
2
3
4
5
COMMANDS:
list Print summary of existing accounts
new Create a new account
update Update an existing account
import Import a private key into a new account

您可以通过获取有关子命令的信息geth account --help

1
2
3
4
5
6
7
8
$ geth account list --help
list [command options] [arguments...]

Print a short summary of all accounts

OPTIONS:
--datadir "/home/bas/.ethereum" Data directory for the databases and keystore
--keystore Directory for the keystore (default = inside the datadir)

帐户也可以通过Javascript控制台进行管理

创建一个帐户

1
2
3
4
5
$ geth account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase:
Address: {168bc315a2ee09042d83d7c5811b533620531f67}

在自定义密钥库目录中列出帐户

1
2
3
$ geth account list --keystore /tmp/mykeystore/
Account #0: {5afdd78bdacb56ab1dad28741ea2a0e47fe41331} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-27.437847599Z--5afdd78bdacb56ab1dad28741ea2a0e47fe41331
Account #1: {9acb9ff906641a434803efb474c96a837756287f} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-52.180688336Z--9acb9ff906641a434803efb474c96a837756287f

使用自定义数据目录将私钥导入节点

1
2
3
4
5
6
$ geth account import --datadir /someOtherEthDataDir ./key.prv
The new account will be encrypted with a passphrase.
Please enter a passphrase now.
Passphrase:
Repeat Passphrase:
Address: {7f444580bfef4b9bc7e14eb7fb2a029336b07c9d}

帐户更新

1
2
3
4
5
6
7
8
9
$ geth account update a94f5374fce5edbc8e2a8697c15331677e6ebf0b
Unlocking account a94f5374fce5edbc8e2a8697c15331677e6ebf0b | Attempt 1/3
Passphrase:
0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b
Account 'a94f5374fce5edbc8e2a8697c15331677e6ebf0b' unlocked.
Please give a new password. Do not forget this password.
Passphrase:
Repeat Passphrase:
0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b
非互动使用

您提供纯文本密码文件作为该--password标志的参数。文件中的数据由密码的原始字符组成,后跟一个换行符。

注意:不建议直接在命令行中提供密码,但是您始终可以使用shell技巧来规避此限制。

1
2
3
$ geth account new --password /path/to/password 

$ geth account import --datadir /someOtherEthDataDir --password /path/to/anotherpassword ./key.prv

建立帐户

创建一个新账户
1
2
3
$ geth account new
$ geth account new --password /path/to/passwdfile
$ geth account new --password <(echo $mypassword)

创建一个新帐户并打印地址。

在控制台上,使用:

1
2
3
4
5
6
> personal.newAccount()
... you will be prompted for a password ...

or

> personal.newAccount("passphrase")

该帐户以加密格式保存。您必须记住此密码,以便将来解锁您的帐户。

对于非交互使用,可以使用以下--password标志指定密码短语:

1
geth account new --password <passwordfile>

注意,这仅用于测试,将密码保存到文件或以任何其他方式公开是一个坏主意。

通过导入私钥创建帐户
1
geth account import <keyfile>

从中导入未加密的私钥并创建一个新帐户并打印地址。

假定密钥文件包含未加密的私钥,作为编码为十六进制的规范EC原始字节。

该帐户以加密格式保存,提示您输入密码。

您必须记住此密码,以便将来解锁您的帐户。

对于非交互使用,可以使用以下--password标志指定密码短语:

1
geth account import --password <passwordfile> <keyfile>

注意:由于您可以将加密的帐户直接复制到另一个以太坊实例,因此在节点之间转移帐户时不需要此导入/导出机制。

警告:将密钥复制到现有节点的密钥库中时,您习惯的帐户顺序可能会更改。因此,请确保您不依赖帐户顺序,也不必仔细检查并更新脚本中使用的索引。

警告:如果将密码标志与密码文件一起使用,则最好确保除您之外的任何人都无法读取该文件,甚至无法列出该文件。您可以通过以下方法实现此目的:

1
2
3
4
touch /path/to/password 
chmod 700 /path/to/password
cat > /path/to/password
>I type my pass here^D

更新现有帐户

您可以使用update带有帐户地址或索引作为参数的子命令在命令行上更新现有帐户。您可以一次指定多个帐户。

1
2
geth account update 5afdd78bdacb56ab1dad28741ea2a0e47fe41331 9acb9ff906641a434803efb474c96a837756287f
geth account update 0 1 2

该帐户以加密格式保存在最新版本中,系统会提示您输入密码来解锁该帐户,并提示您使用另一个密码来保存更新的文件。

因此,可以使用同一命令将不赞成使用的格式的帐户迁移到最新格式,或更改帐户的密码。

成功更新后,该键的所有先前格式/版本都将被删除!

导入预售钱包

导入预售钱包非常容易。如果您记得自己的密码,那就是:

1
geth wallet import /path/to/my/presale.wallet

将提示您输入密码并导入您的以太坊预售帐户。它可以与–password选项一起以非交互方式使用,以密码文件作为参数,其中包含明文形式的钱包密码。

列出帐户并检查余额

列出您的当前帐户

在命令行中,使用以下命令调用CLI:

1
2
3
$ geth account list
Account #0: {5afdd78bdacb56ab1dad28741ea2a0e47fe41331} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-27.437847599Z--5afdd78bdacb56ab1dad28741ea2a0e47fe41331
Account #1: {9acb9ff906641a434803efb474c96a837756287f} keystore:///tmp/mykeystore/UTC--2017-04-28T08-46-52.180688336Z--9acb9ff906641a434803efb474c96a837756287f

按照创建顺序列出您的帐户。

注意:如果从其他节点复制密钥文件,则此顺序可以更改,因此请确保您不依赖索引,或者确保是否复制密钥以检查和更新脚本中的帐户索引。

使用控制台时:

1
2
> eth.accounts
["0x5afdd78bdacb56ab1dad28741ea2a0e47fe41331", "0x9acb9ff906641a434803efb474c96a837756287f"]

或通过RPC:

1
2
3
4
5
6
7
8
9
# Request
$ curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1} http://127.0.0.1:8545'

# Result
{
"id":1,
"jsonrpc": "2.0",
"result": ["0x5afdd78bdacb56ab1dad28741ea2a0e47fe41331", "0x9acb9ff906641a434803efb474c96a837756287f"]
}

如果要非交互式使用帐户,则需要解锁它。您可以在命令行中使用带有--unlock逗号分隔的帐户列表(以十六进制或索引形式)作为参数的选项来执行此操作,以便可以通过编程方式为一个会话解锁帐户。如果您想通过RPC在Dapps中使用您的帐户,这将很有用。--unlock将解锁第一个帐户。当您以编程方式创建帐户时,此功能非常有用,您无需知道实际帐户即可对其进行解锁。

创建帐户并在帐户解锁的情况下启动节点:

1
2
geth account new --password <(echo this is not secret!) 
geth --password <(echo this is not secret!) --unlock primary --rpccorsdomain localhost --verbosity 6 2>> geth.log

可以使用整数索引代替帐户地址,该整数索引引用帐户列表中的地址位置(并对应于创建顺序)

命令行允许您解锁多个帐户。在这种情况下,解锁参数是用逗号分隔的帐户地址或索引列表。

1
geth --unlock "0x407d73d8a49eeb85d32cf465507dd71d507100c1,0,5,e470b1a7d2c9c5c6f03bbaa8fa20db6d404a0c32"

如果非交互使用此构造,则您的密码文件将需要包含所涉及帐户的相应密码,每行一个。

在控制台上,您还可以持续一段时间(以秒为单位)解锁帐户(一次解锁)。

1
personal.unlockAccount(address, "password", 300)

请注意,由于控制台历史记录已记录,因此我们不建议您在此处使用password参数,因此您可能会破坏您的帐户。你被警告了。

查看账户余额

要检查您的etherbase帐户余额:

1
2
> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
6.5

使用JavaScript函数打印所有余额:

1
2
3
4
5
6
7
8
9
10
function checkAllBalances() {
var totalBal = 0;
for (var acctNum in eth.accounts) {
var acct = eth.accounts[acctNum];
var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
totalBal += parseFloat(acctBal);
console.log(" eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + " ether");
}
console.log(" Total balance: " + totalBal + " ether");
};

然后可以执行以下操作:

1
2
3
4
5
> checkAllBalances();
eth.accounts[0]: 0xd1ade25ccd3d550a7eb532ac759cac7be09c2719 balance: 63.11848 ether
eth.accounts[1]: 0xda65665fc30803cb1fb7e6d86691e20b1826dee0 balance: 0 ether
eth.accounts[2]: 0xe470b1a7d2c9c5c6f03bbaa8fa20db6d404a0c32 balance: 1 ether
eth.accounts[3]: 0xf4dd5c3794f1fd0cdc0327a83aa472609c806e99 balance: 6 ether

由于此功能将在重启geth之后消失,因此存储以后要调用的常用功能会有所帮助。该 loadScript 功能使得这个非常容易。

首先,将checkAllBalances()功能定义保存到计算机上的文件中。例如,/Users/username/gethload.js。然后从交互式控制台加载文件:

1
2
> loadScript("/Users/username/gethload.js")
true

该文件将修改您的JavaScript环境,就像您手动键入命令一样。随时尝试!

矿业

本文档说明了如何设置用于采矿的geth。以太坊Wiki上还有一个有关挖矿页面,请确保也检查该页面

挖掘是创建新块的过程。Geth实际上一直在创建新的块,但是这些块需要通过工作量证明加以保护,以便其他节点可以接受。挖掘就是创建这些工作量证明的价值。

工作量证明计算可以多种方式执行。盖斯(Geth)包括一个CPU采矿机,它在盖斯(geth)进程中进行挖掘。我们不建议将CPU矿工与以太坊主网一起使用。如果要挖掘真实的以太币,请使用GPU挖掘。最好的选择是ethminer软件。

在开始挖矿之前,请始终确保您的区块链与链完全同步,否则您将无法在正确的链上进行挖矿,并且您的区块奖励将无价。

GPU挖矿

ethash算法很难存储,为了将DAG装入内存,每个GPU需要1-2GB的RAM。如果得到Error GPU mining. GPU memory fragmentation?,则没有足够的内存。

安装ethminer

要获得ethminer,您需要安装ethminer二进制软件包或从源代码构建它。请参阅https://github.com/ethereum-mining/ethminer/#build了解官方的ethminer构建/安装说明。在撰写本文时,ethminer仅提供用于Microsoft Windows的二进制文件。

在Geth中使用ethminer

首先创建一个帐户,以持有您的集体奖励。

1
geth account new

按照提示输入密码。不要忘记您的密码。还要注意在帐户创建过程结束时打印的公共以太坊地址。在以下示例中,我们将使用0xC95767AC46EA2A9162F0734651d6cF17e5BfcF10作为示例地址。

现在启动geth并等待它同步区块链。这将需要一段时间。

1
geth --rpc --etherbase 0xC95767AC46EA2A9162F0734651d6cF17e5BfcF10

现在我们准备开始采矿。在新的终端会话中,运行ethminer并将其连接到geth:

1
ethminer -G -P http://127.0.0.1:8545

ethminer在端口8545(geth中的默认RPC端口)上与geth通信。您可以通过将--rpcport选项设置为来更改此设置geth。Ethminer可以在任何端口上找到它。您还需要设置的端口ethminer-P http://127.0.0.1:3301。如果要在同一台计算机上挖掘多个实例,则必须设置自定义端口。如果要在专用群集上进行测试,建议您改用CPU挖掘。

如果默认的for ethminer不起作用,请尝试使用以下命令指定OpenCL设备: --opencl-device X其中X为0、1、2等。ethminer使用-M (基准)运行时,您应该看到类似以下内容:

1
2
3
Benchmarking on platform: { "platform": "NVIDIA CUDA", "device": "GeForce GTX 750 Ti", "version": "OpenCL 1.1 CUDA" }

Benchmarking on platform: { "platform": "Apple", "device": "Intel(R) Xeon(R) CPU E5-1620 v2 @ 3.70GHz", "version": "OpenCL 1.2 " }

注意:geth GPU挖掘时,哈希率信息不可用。使用检查您的哈希率ethminerminer.hashrate将始终报告0。

用Geth进行CPU挖掘

当您启动以太坊节点时geth,默认情况下不会进行挖掘。要以挖掘模式启动它,请使用--mine命令行标志。该--minerthreads参数可用于设置并行挖掘线程的数量(默认为处理器内核的总数)。

1
geth --mine --minerthreads=4

您还可以使用控制台在运行时启动和停止CPU挖掘 。miner.start对于矿工线程数采用可选参数。

1
2
3
4
> miner.start(8)
true
> miner.stop()
true

请注意,仅当您与网络同步时才挖掘真正的以太币(因为您是在共识块之上进行挖掘的)。因此,eth区块链下载器/同步器将延迟挖掘,直到完成同步为止,此后挖掘将自动开始,除非您使用取消意图miner.stop()

为了获得以太币,您必须设置以太坊(或coinbase)地址。该etherbase默认为您的主帐户。如果您没有etherbase地址,则geth --mine不会启动。

您可以在命令行上设置etherbase:

1
geth --etherbase '0xC95767AC46EA2A9162F0734651d6cF17e5BfcF10' --mine 2>> geth.log

您也可以在控制台上重置etherbase:

1
> miner.setEtherbase(eth.accounts[2])

请注意,您的etherbase不必是本地帐户的地址,只需是现有帐户的地址即可。

有一个选项可以将额外的数据(仅32个字节)添加到您的已开采块中。按照惯例,这被解释为unicode字符串,因此您可以设置简短的虚荣标签。

1
> miner.setExtra("ΞTHΞЯSPHΞЯΞ")

您可以使用miner.hashrate检查您的哈希,结果以H / s(每秒哈希操作)为单位。

1
2
> miner.hashrate
712000

成功挖掘一些区块后,您可以检查您的etherbase帐户的以太余额。现在假设您的etherbase是本地帐户:

1
2
> eth.getBalance(eth.coinbase).toNumber();
'34698870000000'

您可以使用控制台上的以下代码片段来检查特定矿工(地址)开采的区块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> function minedBlocks(lastn, addr) {
addrs = [];
if (!addr) {
addr = eth.coinbase
}
limit = eth.blockNumber - lastn
for (i = eth.blockNumber; i >= limit; i--) {
if (eth.getBlock(i).miner == addr) {
addrs.push(i)
}
}
return addrs
}
// scans the last 1000 blocks and returns the blocknumbers of blocks mined by your coinbase
// (more precisely blocks the mining reward for which is sent to your coinbase).
> minedBlocks(1000, eth.coinbase)
[352708, 352655, 352559]

请注意,您经常会发现一个块,但它从未进入规范链。这意味着当您在本地包括您的已开采区块时,当前状态将显示记入您帐户的采矿奖励,但是,过了一会儿,发现了更好的链,我们切换到不包含您的区块的链,因此没有采矿奖励被计入。因此,作为一名矿工,监控其币库余额很有可能会发现它可能会波动很大。

日志显示5个区块后已确认的本地开采区块。目前,您可能会发现,从这些日志中生成您的已开采区块列表更加容易和快捷。

专用网络

本指南说明了如何建立包含多个Geth节点的专用网络。如果节点未连接到主网络,则以太坊网络是专用网络。在这种情况下,专用仅表示保留或隔离,而不是受保护或安全。

选择网络ID

网络ID是一个整数,用于隔离以太坊对等网络。仅当两个对等方都使用相同的创世块和网络ID时,区块链节点之间的连接才会发生。使用--networkid命令行选项设置geth使用的网络ID。

主网络的ID为1。如果您提供的自定义网络ID与主网络不同,则您的节点将不会连接到其他节点并形成专用网络。如果您打算连接到Internet上的专用链,则最好选择一个尚未使用的网络ID。您可以在https://chainid.network上找到以太坊网络的社区运行注册表。

选择共识算法

当主网络使用工作量证明来保护区块链时,盖斯还支持“陈旧的”权威证明共识算法,作为私有网络的替代方案。我们强烈建议在新的专用网络部署中使用“ clique”,因为它比工作量证明的资源占用少得多。该集团系统还用于多个以太坊公共测试网,例如RinkebyGörli

以下是Geth中可用的两种共识算法之间的主要区别:

Ethash共识是一种工作量证明算法,是一个允许任何愿意将资源专用于采矿的人公开参与的系统。虽然这对于公共网络来说是一个伟大的财产,但区块链的整体安全性严格取决于用于保护其安全的资源总量。因此,对于矿工少的专用网络,工作量证明是一个糟糕的选择。Ethash挖掘的“难度”会自动进行调整,以便在大约12秒的间隔内创建新区块。随着在网络上部署更多挖掘资源,创建新块变得更加困难,因此平均块时间与目标块时间匹配。

Clique共识是一种授权证明系统,其中新的块只能由授权的“签名者”创建。集团共识协议在EIP-225中指定 。最初的授权签名者集在创世块中配置。可以使用表决机制对签名者进行授权和取消授权,从而允许在区块链运行时更改签名者集。可以将Clique配置为以任何块时间为目标(在合理限制内),因为它与难度调整无关。

创建创世块

每个区块链都始于创世块。当您第一次使用默认设置运行Geth时,它将把主要的网络起源提交给数据库。对于专用网络,通常需要一个不同的创世块。

使用genesis.json文件配置了genesis块。创建创世块时,您需要为区块链确定一些初始参数:

  • 在启动(config)时启用了以太坊平台功能。在区块链运行时启用协议功能需要安排硬分叉。
  • 初始阻气极限(gasLimit)。您在此处的选择会影响单个块中可以进行多少EVM计算。我们建议使用主要的以太坊网络作为指导,以找到大量的以太坊 。可以在启动后使用--targetgaslimit命令行标志来调整块气限制。
  • 初始分配以太(alloc)。这将确定您在创世块中列出的地址有多少以太币可用。随着链的发展,可以通过挖掘来创建其他以太。

集团例子

这是用于权限证明网络的genesis.json文件的示例。本config 节确保所有已知协议更改均可用,并配置“ clique”引擎以用于达成共识。

请注意,初始签名者集必须通过该extradata字段进行配置。要使派系正常工作,必须填写此字段。

首先使用geth account 命令创建签署者帐户密钥(多次运行此命令以创建多个签署者密钥)。

1
geth account new --datadir data

记录此命令打印的以太坊地址。

要为您的网络创建初始额外数据,请收集签名者地址,并将其编码 extradata为32个零字节,所有签名者地址以及65个其他零字节的串联。在下面的示例中,extradata包含一个初始签名人地址 0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82

您可以使用period配置选项来设置链的目标阻止时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"clique": {
"period": 5,
"epoch": 30000
}
},
"difficulty": "1",
"gasLimit": "8000000",
"extradata": "0x00000000000000000000000000000000000000000000000000000000000000007df9a875a174b3bc565e6424a0050ebc1b2d1d820000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}

Ethash示例

由于ethash是默认的共识算法,因此无需配置其他参数即可使用它。您可以使用difficulty参数来影响初始挖掘难度 ,但是请注意,难度调整算法将快速适应您在链上部署的挖掘资源量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"difficulty": "1",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}

初始化Geth数据库

要创建使用此创世块的区块链节点,请运行以下命令。这将为您的链导入并设置规范的创世块。

1
geth init --datadir data genesis.json

使用此数据目录的geth将来运行,将使用您定义的创世纪块。

1
geth --datadir data --networkid 15

安排硬叉

随着以太坊协议开发的进展,新的以太坊功能变得可用。要在专用网络上启用这些功能,必须安排硬分叉。

首先,选择任何将来激活硬叉的程序段号。继续上面的genesis.json示例,让我们假设您的网络正在运行并且其当前块号为35421。要调度“ Istanbul” fork,我们选择块40000作为激活块号,然后修改genesis.json文件对其进行设置。 :

1
2
3
4
5
6
7
8
{
"config": {
...
"istanbulBlock": 40000,
...
},
...
}

为了更新到新的分支,请首先确保您的专用网络上的所有Geth实例实际上都支持Istanbul分支(即,确保您安装了最新版本的Geth)。现在关闭所有节点,然后重新运行init命令以启用新的链配置:

1
geth init --datadir data genesis.json

设置网络

将您的节点初始化为所需的创始状态后,就该建立对等网络了。任何节点都可以用作入口点。我们建议将单个节点指定为所有其他节点用来加入的集合点。该节点称为“引导节点”。

首先,确定您的引导节点将在其上运行的计算机的IP地址。如果您使用的是Amazon EC2之类的云服务,则可以在管理控制台中找到虚拟机的IP。还请确保您的防火墙配置允许端口30303上的UDP和TCP通信。

引导节点需要知道其自己的IP地址,以便能够将其中继。使用--nat标志设置IP (插入您自己的IP而不是下面的示例地址)。

1
geth --datadir data --networkid 15 --nat extip:172.16.254.4

现在,使用JS控制台提取引导节点的“节点记录”。

1
geth attach data/geth.ipc --exec admin.nodeInfo.enr

此命令应打印base64字符串,例如以下示例。其他节点将使用引导节点记录中包含的信息连接到您的对等网络。

1
"enr:-Je4QEiMeOxy_h0aweL2DtZmxnUMy-XPQcZllrMt_2V1lzynOwSx7GnjCf1k8BAsZD5dvHOBLuldzLYxpoD5UcqISiwDg2V0aMfGhGlQhqmAgmlkgnY0gmlwhKwQ_gSJc2VjcDI1NmsxoQKX_WLWgDKONsGvxtp9OeSIv2fRoGwu5vMtxfNGdut4cIN0Y3CCdl-DdWRwgnZf"

设置对等网络取决于您的要求。如果您通过Internet连接节点,请确保已为Bootnode和所有其他节点分配了公共IP地址,并且TCP和UDP通信都可以通过防火墙。

如果不需要Internet连接或所有成员节点都使用知名IP进行连接,我们强烈建议设置Geth以限制对IP子网的对等连接。这样做将进一步隔离您的网络,并防止与其他区块链网络的交叉连接,以防您的节点可从Internet访问。使用该 --netrestrict标志可配置IP网络白名单:

1
geth <other-flags> --netrestrict 172.16.254.0/24

使用以上设置,Geth将仅允许来自172.16.254.0/24子网的连接,并且不会尝试连接到设置的IP范围之外的其他节点。

运行成员节点

在运行成员节点之前,必须使用与引导节点相同的创世纪文件对其进行初始化。

随着bootnode的可操作性和外部可访问性(您可以尝试telnet 确保它确实可访问),您可以启动更多的Geth节点,并使用该--bootnodes标志通过bootstrap节点将其连接。

要创建与引导节点在同一台计算机上运行的成员节点,请选择一个单独的数据目录(示例data-2:)和侦听端口(示例:)30305

1
geth --datadir data-2 --networkid 15 --port 30305 --bootnodes <bootstrap-node-record>

在成员节点运行的情况下,您可以通过附加控制台并运行来检查其是否连接到引导程序节点或网络中的任何其他节点admin.peers。节点可能最多需要几秒钟才能建立连接。

1
geth attach data-2/geth.ipc --exec admin.peers

集团:运行签名者

要将Geth设置为在授权证明模式下对块进行签名,必须具有签名者帐户。该帐户必须解锁才能进入矿区。以下命令将提示您输入帐户密码,然后开始签名块:

1
geth <other-flags> --unlock 0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82 --mine

您可以通过将默认的气体限制块收敛为(with --targetgaslimit)并在(with --gasprice)接受价格交易来进一步配置采矿。

Ethash:经营矿工

为了在简单的专用网络中进行工作量证明,单个CPU挖掘器实例足以按固定的时间间隔创建稳定的块流。要启动Geth实例进行挖掘,请使用所有常规标志运行它,并添加以下内容以配置挖掘:

1
geth <other-flags> --mine --minerthreads=1 --etherbase=0x0000000000000000000000000000000000000000

这将开始在单个CPU线程上挖掘大宗商品和交易,并将所有块奖励计入所指定的帐户--etherbase



Ω