geth是以太坊的官方客户端,它是一个命令行工具,提供很多命令和选项,可以运行以太坊节点、创建和管理账户、发送交易、挖矿、部署智能合约等。
geth客户端可使用三种方法进行安装:
在前面Go语言学习笔记章节中详细介绍了Go语言开发环境的搭建,搭建好Go语言开发环境之后,我使用的是ubuntu系统搭建,通过
git clone https://github.com/ethereum/go-ethereum.git
没有安装git的需要先安装git,Ubuntu下使用sudo apt-get install git安装。
下载以太坊源码,源代码需要放在之前Go语言开发环境设置的$GOPATH/src目录下。
cd go-ethereum
make geth
make会执行build目录下的编译脚本,会在** go-ethereum/build/bin**目录下编译生成geth程序。
直接只用命令:
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
或者去官网或国内镜像下载适合你系统版本的压缩包,解压缩后直接运行就可以。
如果不加任何参数直接运行 geth ,会自动连接到以太坊公网,此时会开始同步区块,在Linux系统中,区块数据默认存储在~/.ethereum中。
在以太坊的共有链上部署智能合约、发起交易需要花费以太币。而通过修改配置,可以在本机搭建一套以太坊私有链,因为与公有链没关系,既不用同步公有链庞大的数据,也不用花钱购买以太币,很好地满足了智能合约开发和测试的要求,开发好的智能合约也可以很容易地切换接口部署到以太坊公有链上。
下面开始建立私有以太坊网络:
mkdir private-geth
cd private-geth
建立创世纪区块文件,是一个json格式的文件:
在创世纪区块的json文件中填入以下内容, 并保存:
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x40000",
"extraData" : "",
"gasLimit" : "0xffffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00",
"alloc": { }
}
初始化创世纪节点,并设置data目录:
创世纪节点文件参数说明:
alloc:用来预设置账号以及账号的 ether 数量。因为私有链挖矿比较容易,所以我们不需要预设置账号。比如,{“0x880004bb64282fb01a3a2500ddf1f4bb5ad4b64a”:{“balance”:“100000000000000000000000000000”}}
nonce:一个64位随机数,用于挖矿。
mixhash:和 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash。
difficulty:设置当前区块的难度,如果难度过大,cpu挖矿就很难,所以这边设置的很小,不要跟自己过不去嘛。
coinbase:默认挖矿的矿工账号。
timestamp:设置创世块的时间戳。
parentHash:上一个区块的hash值,因为是创世块,所以值是0。
extraData:附加信息,随便填。
gasLimit:设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和。因为我们是私有链,所以可以写的大一些,方便开发测试。
初始化后目录结构为:
其中keystore目录用来保存账户信息,geth目录用来保存区块信息。
启动节点, 加上console 表示启动后,启用命令行:
geth --datadir ./data/00 --networkid 15 console
networkid表示网络id,主网络为1
现在私有网络就搭建成功,下面就可以在这个刚刚搭建出来的私有以太坊网络中执行挖矿操作了。
挖矿首先必须有一个账户,输入下面的命令,查看当前node中的所有账户:
# 查看一下系统有的用户
> eth.accounts
[]
# 查看详细的用户信息
> personal
# 创建两个账号用于转账,或者使用 personal.newAccount() 也会提示输入密码
> personal.newAccount('123456')
> personal.newAccount('123456')
> eth.accounts
["0x18a6581a285f40ac3faaa646e13d7c6dd87276f4", "0x2455572ef500cf8634a4090d6d6096c588013e2a"]
# 此时可以看下 keystore 目录,多出了两个文件,也就是我们刚才创建的两个账户密钥(丢了它,你就等于丢了币)
账号创建好了,但是一开始账号都没有 ether,这时就需要挖矿获取币了。
使用miner.start()命令开启挖矿,默认挖出的 ether 是存到 eth.coinbase 账户中的,也就是第一个账户。
# 查看账号1下的余额
> eth.getBalance(eth.accounts[0])
# 查看coinbase账号
> eth.coinbase
0x18a6581a285f40ac3faaa646e13d7c6dd87276f4
# 如果想要把挖到的矿存入其他账户,可以使用
> miner.setEtherbase(eth.accounts[1])
true
开始挖矿,我们先把coinbase改成账号1
> miner.setEtherbase(eth.accounts[0])
true
# 如果出现 miner.start() 直接返回 null 的情况,请先查看是否还未创建过账户。
> miner.start(1)
INFO [05-31|19:57:17] Updated mining threads threads=0
INFO [05-31|19:57:17] Transaction pool price threshold updated price=18000000000
INFO [05-31|19:57:17] Starting mining operation
INFO [05-31|19:57:17] Commit new mining work number=12 txs=0 uncles=0 elapsed=194.667µs
INFO [05-31|19:57:19] Successfully sealed new block number=12 hash=82d29d…65290c
INFO [05-31|19:57:19] mined potential block number=12 hash=82d29d…65290c
INFO [05-31|19:57:19] Commit new mining work number=13 txs=0 uncles=0 elapsed=159.066µs
INFO [05-31|19:57:19] Successfully sealed new block number=13 hash=e91844…e962a6
INFO [05-31|19:57:19] mined potential block number=13 hash=e91844…e962a6
等到 percentage 达到100就能挖出来了,请耐心等待~,出现小锤头的时候意味着你挖到了!
# 已经挖到了,我们先暂停挖矿,注意:输入的字符会被挖矿刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,即可停止挖矿。正在执行的挖矿进程不会立即暂停,仍然会等到当前完整快写完后才会暂停
> miner.stop()
true
然后查看账户余额
> eth.getBalance(eth.accounts[0])
112000000000000000000
# 不要被这个零的个数吓到,这里默认显示的以 wei 为单位的,而 1 ether = 10^18 wei,所以我们转换一下单位立马就清晰了,
> web3.fromWei(eth.getBalance(eth.accounts[0]), 'ether')
112
# 嗯,其实我们目前就挖了112个ether
在转账前,我们需要先解锁账号
> personal.unlockAccount(eth.accounts[0])
# 我们先转8个ether给账号2
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(8,'ether')})
INFO [03-12|20:24:15] Submitted transaction fullhash=0x996a3037b75585415ece5b1dc28181833691760176b3f24066c93e7093a967e5 recipient=0x29a079BdbC6D4d122178FBe01558E5DF2D008523
我们可以看到目前只是向区块链提交了这笔转账交易,谁来执行这笔交易呢?矿工。我们还是得开启挖矿模式,把这笔转账交易执行掉。然后我们再来看看好朋友的账户里面有多少 ether 了,
> miner.start(1)
# 持续几秒
> miner.stop()
# 然后查看账号2的余额,已经有余额
> eth.getBalance(eth.accounts[1])
8000000000000000000
以太坊节点之间能够互相链接需要满足两个条件:
为了在本地网络运行多个以太坊节点的实例,必须确保一下几点:
节点之间相互连接有三种办法:
首先在节点一上查看enode信息:
admin.nodeInfo
enode: “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910”,
然后在节点二上执行admin.addPeer添加节点一:
admine.addPeer(“enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910”)
true
返回true就说明执行成功,我们可以通过admin.peers查看新增的节点信息,同步操作是异步的,可能不能立马看到节点一的信息。
连接成功后,两个节点都可以通过admine.peers查看到对方的节点信息,节点二就会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块,向任意一个节点发送交易,另一个节点也会收到该笔交易。
启动节点的时候指定–bootnodes选项连接到其他节点。
可以先启动一个节点,通过admin.nodeInfo查看 enode信息,其他节点启动的时候添加配置 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910” 可以都和这个节点形成连接,从而相互之间相互连接。
如节点一启动:
geth --datadir ./data/01 --networkid 15 --ipcdisable --port 61910 --rpcport 8200 --bootnodes “enode://5b3b7c5d65a4cf3e65875b15cd14a1abdc30f94931e67e68bf606941cc1630624da83c00c83f7b843f303668c184d914e36890147738d5e7fe03a560bd9548d9@[::]:61910” console
节点data的所在路径(刚才启动时–datadir路径),默认:
Mac: ~/Library/Ethereum
Linux: ~/.ethereum
Windows: %APPDATA%\Ethereum
在此目录下创建名为:static-nodes.json的文件。
文件内容及格式如下:
[
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333"
"enode://6427b7e7446bb05f22fe7ce9ea175ec05858953d75a5a6e4f99a6aec0779a8bd6276f1959a42fe5948acbe14bcd0652082dc546d3b37ae8f2aea41eba4eca43b@121.201.14.181:30303",
"enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333",
"enode://3dde41a994b3b99f938f75ddf6d48318c78ddd869c70b48d00b922190bb434fc5474f6250c143723f4387273d123e02f6a38f07d0311f240d2915f6140e09850@207.226.141.212:30303",
"enode://7ab8fa90b204f2146c00939b8474549c544caa3598a0894fa639a5cdbd992cbc6135fd776f8bcf97ae95fdaa3afbfa2d107fea71549119afd7ea57356b899be5@121.201.24.236:30303",
"enode://db81152a8296089b04a21ad9bf347df3ff0450ffc8215d9f50c400ccf8d18963118010cacf03c4b71981cf9cac5394438cab3039e98db4d2aae5859ab7d1793e@139.198.1.244:30303",
"enode://68dd1360f0a4ac362b41124692e31652ffe26f6f06a284ca11f3b514b3968594ac1f4320d1aa1ca343b06327c18a2e40eded74edfb3086e1baaa27ca24226b21@113.106.85.172:30303",
"enode://58f6b6908286cefe43c166cfc4fed033c750caa1bc3f6e1e1e1507752c0b91248addb3122f8557c5f8912e702285a160ab3a10203ae1eff3807eda25d6ed6478@45.113.71.186:30303",
"enode://87190a01c02cafb97e7f49672b4c3be2937cf79c3969e0b8e7b35cac28cebfbda52a13d56fd2113c726a1dd359c9476ccf7e60651439cef56e3a71039f6a4f5e@119.29.207.90:30303",
"enode://d1fdd05a62fd9544eeb455e4f4d4bd8bb574138d82d8f909f3041d0792e3401f8695133d39ad0a3aa5d217e3c5bed0511b531505a67b03607a909ae9096720d2@120.26.129.121:30303",
"enode://a1e9cf99eca94590ae776c8dd5c6c043a8c1f0375e9e391c9fb55133385bf453ac3d3fb3ead8e63415b2ef99d54a19e2a7bc830cd1fdbbb283818e3bcb0ea31e@182.254.209.254:30303",
"enode://562796b19d43d79dfb6160abd2d7bb78a2f2efd9501a0a767c00677e0fb3a4407235f813c3003682c2a421a58709c52f595827bc15708cc5f534f55d0f8d03ad@121.40.199.54:30303",
"enode://fa2c17dcc83a6e2825668210abf7480452de4b13d8bdea8f301c3b603701918bc4dade9e68d119d7a8214e90e7ea10a2782041c98951385d97bee73358fb08f4@120.26.124.58:30303",
"enode://0b331b27e2976d797aed1d1464ac483a7f262860334cb5737a01a0188da08d79226a6973adc5f2a2c1a20192b399161eee23a0d56ecf472cbe4058d010ecc89f@47.89.49.61:30303",
"enode://fd2a5d30e4f3917ee640876cc57d72a8bf5ecf049e9106c95e60cf306dd7a5dd68d1a295f3718af44a7083252686926d6e8a402f1abe6f805e10e7281967db28@121.201.29.82:30303",
"enode://0d1b9eed7afe2d5878d5d8a4c2066b600a3bcac2e5730586421af224e93a58cd03cac75bf0b2a62fd8049cd3692a085758cc1e407c8b2c94bb069814a5e8d0f0@209.9.106.245:30303"
]
static-nodes.json的文件中的节点将组网形成集群。
以太坊客户端默认启动连接的节点数位11-13个,如果觉得不够,可以使用在启动时增加启动参数 –maxpeers 100命令,让连接启动节点数增加到100上限,当然,也会大量消耗你的硬盘和CPU。
自动集群部署脚本下载
geth [选项] 命令 [命令选项] [参数…]
命令 | 详解 |
---|---|
account | 管理账户 |
attach | 启动交互式JavaScript环境(连接到节点) |
bug | 上报bug Issues |
console | 启动交互式JavaScript环境 |
copydb | 从文件夹创建本地链 |
dump | Dump(分析)一个特定的块存储 |
dumpconfig | 显示配置值 |
export | 导出区块链到文件 |
import | 导入一个区块链文件 |
init | 启动并初始化一个新的创世纪块 |
js | 执行指定的JavaScript文件(多个) |
license | 显示许可信息 |
makecache | 生成ethash验证缓存(用于测试) |
makedag | 生成ethash 挖矿DAG(用于测试) |
monitor | 监控和可视化节点指标 |
removedb | 删除区块链和状态数据库 |
version | 打印版本号 |
wallet | 管理Ethereum预售钱包 |
help,h | 显示一个命令或帮助一个命令列表 |
选项 | 详解 |
---|---|
–config value | TOML 配置文件 |
–datadir “xxx” | 数据库和keystore密钥的数据目录 |
–keystore | keystore存放目录(默认在datadir内) |
–nousb | 禁用监控和管理USB硬件钱包 |
–networkid value | 网络标识符(整型, 1=Frontier, 2=Morden (弃用), 3=Ropsten, 4=Rinkeby) (默认: 1) |
–testnet | Ropsten网络:预先配置的POW(proof-of-work)测试网络 |
–rinkeby | Rinkeby网络: 预先配置的POA(proof-of-authority)测试网络 |
–syncmode “fast” | 同步模式 (“fast”, “full”, or “light”) |
–ethstats value | 上报ethstats service URL (nodename:secret@host:port) |
–identity value | 自定义节点名 |
–lightserv value | 允许LES请求时间最大百分比(0 – 90)(默认值:0) |
–lightpeers value | 最大LES client peers数量(默认值:20) |
–lightkdf | 在KDF强度消费时降低key-derivation RAM&CPU使用 |
命令 | 详解 |
---|---|
–dev | 使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。 |
–dev.period value | 开发者模式下挖矿周期 (0 = 仅在交易时) (默认: 0) |
命令 | 详解 |
---|---|
–ethash.cachedir | ethash验证缓存目录(默认 = datadir目录内) |
–ethash.cachesinmem value | 在内存保存的最近的ethash缓存个数 (每个缓存16MB ) (默认: 2) |
–ethash.cachesondisk value | 在磁盘保存的最近的ethash缓存个数 (每个缓存16MB) (默认: 3) |
–ethash.dagdir “” | 存ethash DAGs目录 (默认 = 用户hom目录) |
–ethash.dagsinmem value | 在内存保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 1) |
–ethash.dagsondisk value | 在磁盘保存的最近的ethash DAGs 个数 (每个1GB以上) (默认: 2) |
命令 | 详解 |
---|---|
–txpool.nolocals | 为本地提交交易禁用价格豁免 |
–txpool.journal value | 本地交易的磁盘日志:用于节点重启 (默认: “transactions.rlp”) |
–txpool.rejournal value | 重新生成本地交易日志的时间间隔 (默认: 1小时) |
–txpool.pricelimit value | 加入交易池的最小的gas价格限制(默认: 1) |
–txpool.pricebump value | 价格波动百分比(相对之前已有交易) (默认: 10) |
–txpool.accountslots value | 每个帐户保证可执行的最少交易槽数量 (默认: 16) |
–txpool.globalslots value | 所有帐户可执行的最大交易槽数量 (默认: 4096 |
–txpool.accountqueue value | 每个帐户允许的最多非可执行交易槽数量 (默认: 64) |
–txpool.globalqueue value | 所有帐户非可执行交易最大槽数量 (默认: 1024) |
–txpool.lifetime value | 非可执行交易最大入队时间(默认: 3小时) |
命令 | 性能 |
---|---|
–cache value | 分配给内部缓存的内存MB数量,缓存值(最低16 mb /数据库强制要求)(默认:128) |
–trie-cache-gens value | 保持在内存中产生的trie node数量(默认:120) |
命令 | 性能 |
---|---|
–unlock value | 需解锁账户用逗号分隔 |
–password value | 用于非交互式密码输入的密码文件 |
命令 | 性能 |
---|---|
–rpc | 启用HTTP-RPC服务器 |
–rpcaddr value | HTTP-RPC服务器接口地址(默认值:“localhost”) |
–rpcport value | HTTP-RPC服务器监听端口(默认值:8545) |
–rpcapi value | 基于HTTP-RPC接口提供的API |
–ws | 启用WS-RPC服务器 |
–wsaddr value | WS-RPC服务器监听接口地址(默认值:“localhost”) |
–wsport value | WS-RPC服务器监听端口(默认值:8546) |
–wsapi value | 基于WS-RPC的接口提供的API |
–wsorigins value | websockets请求允许的源 |
–ipcdisable | 禁用IPC-RPC服务器 |
–ipcpath | 包含在datadir里的IPC socket/pipe文件名(转义过的显式路径) |
–rpccorsdomain value | 允许跨域请求的域名列表(逗号分隔)(浏览器强制) |
–jspath loadScript | JavaScript加载脚本的根路径(默认值:“.”) |
–exec value | 执行JavaScript语句(只能结合console/attach使用) |
–preload value | 预加载到控制台的JavaScript文件列表(逗号分隔) |
命令 | 性能 |
---|---|
–bootnodes value | 用于P2P发现引导的enode urls(逗号分隔)(对于light servers用v4+v5代替) |
–bootnodesv4 value | 用于P2P v4发现引导的enode urls(逗号分隔) (light server, 全节点) |
–bootnodesv5 value | 用于P2P v5发现引导的enode urls(逗号分隔) (light server, 轻节点) |
–port value | 网卡监听端口(默认值:30303) |
–maxpeers value | 最大的网络节点数量(如果设置为0,网络将被禁用)(默认值:25) |
–maxpendpeers value | 最大尝试连接的数量(如果设置为0,则将使用默认值)(默认值:0) |
–nat value | NAT端口映射机制 (any |
–nodiscover | 禁用节点发现机制(手动添加节点) |
–v5disc | 启用实验性的RLPx V5(Topic发现)机制 |
–nodekey value | P2P节点密钥文件 |
–nodekeyhex value | 十六进制的P2P节点密钥(用于测试) |
命令 | 性能 |
---|---|
–mine | 打开挖矿 |
–minerthreads value | 挖矿使用的CPU线程数量(默认值:8) |
–etherbase value | 挖矿奖励地址(默认=第一个创建的帐户)(默认值:“0”) |
–targetgaslimit value | 目标gas限制:设置最低gas限制(低于这个不会被挖?) (默认值:“4712388”) |
–gasprice value | 挖矿接受交易的最低gas价格 |
–extradata value | 矿工设置的额外块数据(默认=client version) |
命令 | 性能 |
---|---|
–gpoblocks value | 用于检查gas价格的最近块的个数 (默认: 10) |
–gpopercentile value | 建议gas价参考最近交易的gas价的百分位数,(默认: 50) |
命令 | 性能 |
---|---|
–vmdebug | 记录VM及合约调试信息 |
命令 | 性能 |
---|---|
–metrics | 启用metrics收集和报告 |
–fakepow | 禁用proof-of-work验证 |
–verbosity value | 日志详细度:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3) |
–vmodule value | 每个模块详细度:以 =的逗号分隔列表 (比如 eth/*=6,p2p=5) |
–backtrace value | 请求特定日志记录堆栈跟踪 (比如 “block.go:271”) |
–debug | 突出显示调用位置日志(文件名及行号) |
–pprof | 启用pprof HTTP服务器 |
–pprofaddr value | pprof HTTP服务器监听接口(默认值:127.0.0.1) |
–pprofport value | pprof HTTP服务器监听端口(默认值:6060) |
–memprofilerate value | 按指定频率打开memory profiling (默认:524288) |
–blockprofilerate value | 按指定频率打开block profiling (默认值:0) |
–cpuprofile value | 将CPU profile写入指定文件 |
–trace value | 将execution trace写入指定文件 |
命令 | 性能 |
---|---|
–shh | 启用Whisper |
–shh.maxmessagesize value | 可接受的最大的消息大小 (默认值: 1048576) |
–shh.pow value | 可接受的最小的POW (默认值: 0.2) |
命令 | 性能 |
---|---|
–fast | 开启快速同步 |
–light | 启用轻客户端模式 |
–help, -h 显示帮助