1、以太坊客户端:
- go-ethereum
语言:Go
简介:官方推荐,开发使用最多
地址:https://github.com/ethereum/go-ethereum
还有其他类型的客户端,有兴趣的可以了解一下。
2、Geth客户端安装(Linux)
如果安装在linux上,想要使用metamask钱包连接私链,为了安全起见,metamask提供以localhost连接,所以最好是安装在有图形化界面的linux系统,然后安装google浏览器,安装metamask插件,添加私有网络然后连接。
前提:linux上有git环境,Go环境
- 安装Go环境
- 下载Go的软件包go1.16.3.linux-amd64.tar.gz,上传到linux,(在/usr/local/ether/go目录下)
下载地址:https://golang.org/dl/或者https://golang.google.cn/dl/
- 解压缩包,解压完后会出现一个go文件夹
tar -xzf go1.16.3.linux-amd64.tar.gz
- 将 /usr/local/ether/go//go/bin 目录添加至PATH环境变量:
export PATH=$PATH:/usr/local/ether/go/go/bin
- 使用go version检查是否配合成功
2.1、安装Geth客户端(以太坊节点)
(1)在linux上初始化一个仓库
git init
(2)克隆github上的go-ethereum仓库
git clone https://github.com/ethereum/go-ethereum.git
直接下载:https://geth.ethereum.org/downloads/# geth压缩包
(3)Go客户端叫做Geth,进入代码目录,编译克隆下的代码
make geth
- 如果出现如下错误:
修改build目录下的env.sh文件格式为unix,原来为dos
vi编辑文件,然后输入命令查看文件格式
set ff?
命令:set ff=dos #强制转化为dos格式,如果是要转化成unix格式就是 set ff=unix
保存: w!
- 如果出现如下错误:
设置使用过国内的代理地址
go env -w GOPROXY=https://goproxy.cn
然后重新执行make geth
(4)查看geth的版本
./build/bin/geth version
stable:稳定的版本
(5)启动区块链,指定数据目录为当前的data文件夹(可以不指定),启动后就会一直同步区块链上的数据,大概90G以上,同步完成后然后就可以参与挖矿。
./build/bin/geth --datadir ./data
可以使用--syncmode "fast"设置同步数据的模式为快速同步,不验证区块中的交易,只下载每个区块头和区块体,直到区块同步完成再获取区块链当前的状态,还有full模式和light模式,full是所有的区块下载并验证,light不下载区块,只获取最新的区块链状态。
2.2、搭建私有链
geth目录为:/usr/local/ether/go-ether/go-ethereum/build/bin/geth
privateChain目录创建在ether下:/usr/local/ether/go-ether/privateChain
genesis.json文件放入:/usr/local/ether/go-ether/privateChain目录下
官方文档说明地址:https://geth.ethereum.org/docs/interface/private-network 包含搭建多个节点互相连接的私链
(1)创建一个文件夹用来存放私有链的数据,并进入
mkdir privateChain
cd privateChain
(2)创建创世纪块(私链的第一个区块),编辑文本genesis.json,写入官方提供的创世区块,默认会分给alloc中的地址以太币,可以替换为自己的以太坊地址。
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"ethash": {}
},
"difficulty": "2000",
"gasLimit": "8000000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "300000" },
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": { "balance": "400000" }
}
}
difficulty:挖矿难度,控制矿工的挖矿时间
gasLimit:一个区块内最大的Gas费,单个块中可以进行的EVM计算量,可以在启动后使用--miner.gastarget
命令行标志来调整块Gas费限制。
chainId:网络ID是一个整数,用于隔离以太坊对等网络。仅当两个对等方都使用相同的创世块和网络ID时,区块链节点之间的连接才会发生。使用--networkid
命令行选项设置geth使用的网络ID。主网络的ID为1。如果自定义网络ID与主网络不同,则节点将不会连接到其他节点并形成专用网络。如果打算连接到Internet上的专用链,则最好选择一个尚未使用的网络ID。可以在https://chainid.network上找到由社区运营的以太坊网络ChainId
alloc:初始分配ether(alloc
)。这决定在创世纪块中列出的地址有多少以太币可用。随着链的发展,可以通过挖掘来创建额外的以太币。
以下命令都在/usr/local/ether/go-ether/go-ethereum/目录下执行
(3)初始化Geth数据库
./build/bin/geth init --datadir ../privateChain ../privateChain/genesis.json
(4)启动Geth,使用data下的自定义的创世纪块,networkid与创世纪块中的chainId保持一致,
-
启动同时进入控制台,命令行加上console
-
启动时,如果添加--dev参数,会创建开发者默认账户,并且分配给该账户一定的币。
-
--dev.period 1:表示可以直接挖矿,不需要有交易产生,默认该参数为0,表示需要有交易产生才能挖到矿,为了测试直接修改为1。
-
可以添加--nodiscover就不会去寻找其他节点。
-
如果不希望控制台一直打印信息可以在console后面改变为:console 2>>geth.log
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console 2>>geth.log
注意:以下图片中在测试时启动没有直接以--dev方式启动,就需要自己手动创建地址,然后再去挖矿,也出现了一些问题,都已解决,建议直接以上述命令启动。如果没有以--dev方式启动,也没关系,只是在测试挖矿时会有一点问题,文章的末尾列出了我遇到的一些问题以及解决办法。
(6)控制台命令,首先使用web3查看内部的所有的方法
-
admin对象的方法,
查看所有节点:admin.peers
添加节点:admin.addPeer
获取数据目录:admin.getDatadir
获取节点信息:admin.getNodeInfo
等。
- eth对象的方法
获取私链所有账户 :eth.accounts
获取gas单价:eth.gasPrice
获取chainId:eth.chainId
获取账户余额:eth.getBalance("地址")
等。
-
矿工挖矿
开始挖矿:miner.start()
停止挖矿:miner.stop()
设置GasPrice:miner.setGasPrice("")
其他对象可以输入web3回车查看。
(7)例如
- 查看当前链上所有账户:
eth.accounts
- 查看初始区块创建时账户默认分配的以太币(genesis.json中配置的),单位是Wei
eth.getBalance("")
通过we3的fromWei方法转为以太币单位“ether”,只有0.000003个以太币
- 当前区块高度
eth.blockNumber
- 创建一个账户
personal.newAccount()
输入账户密码:123456,生成一个地址:
得到的地址就是:0xcd9dc4ee443a2d6bdc1355ac4f72d131f8c5a33b
然后查看私链上的账户:eth.accounts,就看到已经有了一个账户
查看数据存储的位置:在privateChain目录下:此时的keystore目录下就产生了一个文件
文件内容为:
格式化后:
{
"address": "c63735581fc36429444cb58ce22ea7fb712c7860", //账户地址
"crypto": {
//加密算法
"cipher": "aes-128-ctr",
//加密内容
"ciphertext": "251424971692b3bef9dabaf0fac440882c7105dba4fb4e089e80b71cda8a58c4",
//加密的参数
"cipherparams": {
"iv": "54e8f0f8ae71d62b541bf923e5c4d495"
},
"kdf": "scrypt",
"kdfparams": {
"dklen": 32,
"n": 262144,
"p": 1,
"r": 8,
//加密使用的盐
"salt": "609b7cc53db3ccd9ab0625601c5aa51600174be9113ab05c4ecd9737ebcdaeb8"
},
"mac": "361a8da722d73eab8d1e988a8b55adc85faef7d33c66bd0f03367cb496a395aa"
},
"id": "ae97aca0-b577-486a-9e1d-fd3890bdfe51",
"version": 3
}
- 此时使用初始的账户给创建的账户转账,如果是在控制台操作账户,可以使用eth.accounts[0],来代表第0个账户
eth.sendTransaction({from:"0xf98D275eF33f54AA311E3cA353Db53Fc1577cB31",to:eth.accounts[0],value:200000})
显示未知的账户,这是因为发送交易时必须是自己管理的账户才能发,类似于当前这两个账户不在同一个钱包下,无法转账。from的初始地址不在私链中,不是由私链管理的。
如果使用自己刚才创建的账户去发送呢?把它两调换一下,
eth.sendTransaction({from:eth.accounts[0],to:"0xf98D275eF33f54AA311E3cA353Db53Fc1577cB31",value:200000})
这里提示的是转账资金不足,这是正确的,因为该账户刚创建出来,没有以太币,说明由私链管理的账户是可以转账的。
如果出现需要解锁账户,使用如下命令:
personal.unlockAccount("地址")
- 如果需要挖矿
查看当前的账户地址:
eth.coinbase
注意:如果启动时添加了--dev参数
新版本默认挖矿时,新加了一个参数,挖矿是在有交易时才能挖到矿,如果没有交易产生直接去挖矿,是挖不到矿的,需要添加两个参数--dev --dev.period 1,重新启动:
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console
开始挖矿:
miner.start(1)
挖到矿后会显示如下:
停止挖矿:
miner.stop()
我在停止挖矿时,一直停不下来,只能退出重启。最好还是把控制台日志信息打印到文件中(使用console 2>>geth.log)。
列出我在搭建时遇到的一些问题:
(1)使用miner.start(1)启动时,控制台返回null,而且挖不到矿,百度了很多后都说是新版本添加“--dev.period 1”这个参数,官方文档对这个参数也有说明,默认参数值为0,挖矿时要有交易产生才可以挖矿,修改为其他值,例如1表示挖矿时不需要有交易产生。添加了之后发现返回还是null,不过多等了一会后,发现挖到矿了。
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 console
(2)如果启动时没有添加--dev参数,使用自己手动创建的账户开始挖矿,需要重启添加上”--dev --dev.period 1“这两个参数,如果出现如下图所示出错:
这是因为启用开发者模式发现已经有账户了,就不会去新创建账户,会默认使用创建的第0个账户,作为开发者账户。为了安全起见,启动时需要告诉客户端该账户的密码,如果是在第一次启动,就以dev模式启动,会默认创建一个账户作为开发者账户也就是第0个账户,并分配以太币。
添加参数--password,将创建的第0个账户的密码放入txt文件,加载
./build/bin/geth --datadir ../privateChain --networkid 15 --nodiscover --dev --dev.period 1 --password '../privateChain/password.txt' console 2>>geth.log
3、Geth客户端安装(Windows)
2.1、下载Geth客户端文件
官方网址:https://geth.ethereum.org/downloads/
2.2、双击安装,安装完成后,会出现如下列表(geth.log除外):
2.3、搭建私有链与linux相同
- 创建一个文件夹,作为私有链的数据文件夹(文件位置可以随意),同时创建一个创世纪块文件。
- cmd进入geth安装目录,初始化私有链,--datadir指向创建的存放数据的文件夹(根据自己的数据文件地址为准)。
geth init --datadir ../privateChain ../privateChain/genesis.json
- 启动即可:
geth --datadir mychain --networkid 15 --nodiscover --dev --dev.period 1 --rpc console 2>>geth.log
--rpc参数表示启动远程rpc连接,此时就可以使用metamask连接私链。
如果描述有什么问题?欢迎留言提问,共同学习
2.3、Geth命令选项
官网命令文档:https://geth.ethereum.org/docs/interface/command-line-options
以下命令原文链接:https://www.jianshu.com/p/d4cdc060b5c4
account 管理账户
attach 启动交互式JavaScript环境(连接到节点)
bug 上报bug Issuesconsole 启动交互式JavaScript环境
copydb 从文件夹创建本地链dump Dump(分析)一个特定的块存储
dumpconfig 显示配置值
export 导出区块链到文件import 导入一个区块链文件init 启动并初始化一个新的创世纪块
js 执行指定的JavaScript文件(多个)
license 显示许可信息
makecache 生成ethash验证缓存(用于测试)
makedag 生成ethash 挖矿DAG(用于测试)
monitor 监控和可视化节点指标
removedb 删除区块链和状态数据库
version 打印版本号
wallet 管理Ethereum预售钱包
help,h 显示一个命令或帮助一个命令列表
ETHEREUM选项:
--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 选项:
--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.journalvalue本地交易的磁盘日志:用于节点重启 (默认: "transactions.rlp")
--txpool.rejournalvalue重新生成本地交易日志的时间间隔 (默认: 1小时)
--txpool.pricelimitvalue加入交易池的最小的gas价格限制(默认: 1)
--txpool.pricebumpvalue价格波动百分比(相对之前已有交易) (默认: 10)
--txpool.accountslotsvalue每个帐户保证可执行的最少交易槽数量 (默认: 16)-
-txpool.globalslotsvalue所有帐户可执行的最大交易槽数量 (默认: 4096)
--txpool.accountqueuevalue每个帐户允许的最多非可执行交易槽数量 (默认: 64)
--txpool.globalqueuevalue所有帐户非可执行交易最大槽数量 (默认: 1024)
--txpool.lifetimevalue非可执行交易最大入队时间(默认: 3小时)
性能调优的选项:
--cache value 分配给内部缓存的内存MB数量,缓存值(最低16mb /数据库强制要求)(默认:128)
--trie-cache-gens value 保持在内存中产生的trie node数量(默认:120)
帐户选项:
--unlock value需解锁账户用逗号分隔
--password value用于非交互式密码输入的密码文件
API和控制台选项:
--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|none|upnp|pmp|extip:)(默认: “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)
GAS价格选项:
--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写入指定文件