Geth使用教程(linux)

本教程旨在为新手用户服务,在linux系统下,通过本教程的步骤,实现Geth客户端的安装部署,环境配置,常用功能的使用。

前言

  • 本教程旨在为新手用户服务,在linux系统下,通过本教程的步骤,实现Geth客户端的安装部署,环境配置,常用功能的使用。

安装配置GO

下载

安装

  • 选择Linux版本下载并解压
1
2
3
4
5
6
7
8
9
10
11
#下载
wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz

#解压
tar -xzvf go1.13.4.linux-amd64.tar.gz -C /usr/local

#初步验证
/usr/local/go/bin/go version

#返回如下结果
go version go1.13.4 linux/amd64

环境变量配置

  • 【当前用户环境配置】
1
2
3
4
5
6
7
8
9
10
#当前用户配置:在 ~/.bashrc文件末尾添加如下环境变量:
vim ~/.bashrc

#添加如下参考内容:
export GOPATH=/home/rico/works/myGoPath
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH

#重新加载 profile 文件,加载环境变量到内存,使配置生效
source ~/.bashrc
  • 【全局环境配置】
1
2
3
4
5
6
7
8
9
10
#全局环境配置:在 /etc/profile文件末尾添加以下环境变量:
vim /etc/profile

#添加如下参考内容:
export GOPATH=/home/rico/works/myGoPath
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin:$GOPATH

#重新加载 profile 文件,加载环境变量到内存,使配置生效
source /etc/profile
  • 检查配置是否成功
1
2
3
4
5
#在任意目录查看安装版本
go version

#返回如下结果即可
go version go1.13.4 linux/amd64

安装配置Geth

方式一

使用clone(推荐)

1
2
3
4
5
6
7
8
9
10
11
#将克隆下来的源码存放在$GOPATH/src/github.com/ethereum目录中
git clone https://github.com/ethereum/go-ethereum.git $GOPATH/src/github.com/ethereum

#设置goproxy为七牛云提供的代理
go env -w GOPROXY=https://goproxy.cn,direct

#关闭go1.13默认开启的module包管理模式
export GO111MODULE=off

#安装geth
go install github.com/ethereum/go-ethereum/cmd/geth

方式二

1
2
3
4
5
6
7
8
#将克隆下来的源码存放在$GOPATH/src/github.com/ethereum目录中
git clone https://github.com/ethereum/go-ethereum.git $GOPATH/src/github.com/ethereum

#切换到go-ethereum目录
cd $GOPATH/src/github.com/ethereum/go-ethereum

#make编译(make源码时,golang的env需取消GOBIN的配置项)
make geth

环境变量配置

  • 【当前用户环境配置】
1
2
3
4
5
6
7
8
9
10
11
#当前用户配置:在 ~/.bashrc文件末尾添加如下环境变量:
vim ~/.bashrc

#添加如下参考内容:
export GOPATH=/home/rico/works/myGoPath
export GOROOT=/usr/local/go
export GETHROOT=$GOPATH/src/github.com/ethereum/go-ethereum/build
export PATH=$PATH:$GOROOT/bin:$GOPATH:$GETHROOT/bin

#重新加载 profile 文件,加载环境变量到内存,使配置生效
source ~/.bashrc
  • 【全局环境配置】
1
2
3
4
5
6
7
8
9
10
11
#全局环境配置:在 /etc/profile文件末尾添加以下环境变量:
vim /etc/profile

#添加如下参考内容:
export GOPATH=/home/rico/works/myGoPath
export GOROOT=/usr/local/go
export GETHROOT=$GOPATH/src/github.com/ethereum/go-ethereum/build
export PATH=$PATH:$GOROOT/bin:$GOPATH:$GETHROOT/bin

#重新加载 profile 文件,加载环境变量到内存,使配置生效
source /etc/profile
  • 检查配置是否成功
1
2
3
4
5
6
7
8
9
10
11
12
13
#在任意目录查看安装版本
geth version

#返回如下结果即可
Geth
Version: 1.9.7-unstable
Architecture: amd64
Protocol Versions: [63]
Network Id: 1
Go Version: go1.13.3
Operating System: linux
GOPATH=/home/rico/works/myGoPath
GOROOT=/usr/local/go

Geth的使用

此部分内容,主要分为geth节点的启动示例和部分常用的console命令操作。

启动 geth节点

新建geth目录

路径、名称无要求,自定义,该目录主要存储geth节点的相关数据。

1
2
mkdir geth
cd geth

新建创世文件

新建并通过编辑软件打开genesis.json,输入以下创世文件内容(供参考)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"config": {
"chainId": 10086,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0
},
"alloc": {},
"coinbase": "0x0000000000000000000000000000000000000000",
"difficulty": "0x20000",
"extraData": "",
"gasLimit": "0x2fefd8",
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
创世文件说明
内容说明
chainId不同版本的eth的id,比较经典有,1代表主网,2代表普通测试网络,3代表Ropsten测试网络,4代表Rinkeby测试网络,42代表Kovan测试网络(其他的值代表哪些网络,可以参考) chainId的值要与在geth命令中的–networkid参数保持一致
homesteadBlock硬分叉区块高度,填写官网的默认值即可,后续硬分叉时才需要调整
eip155BlockEIP 155 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整
eip158BlockEIP 158 硬分叉高度,填写官网的默认值即可,后续硬分叉时才需要调整
alloc预设账号以及账号的以太币数量,私有链挖矿比较容易可以不配置
balance账户中的金额,单位是wei,1eth=10^18wei
coinbase矿工账号
difficulty难度值,越大越难,详见下表。参考链接
extraData附加信息,以0x开头填写,可填可不填
gasLimitgas 的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填的很大
nonce64 位随机数,默认即可
mixhash与 nonce 配合用于挖矿,由上一个区块的一部分生成的 hash,默认即可。因为是第一个区块,因此,默认就是0了
parentHash上一个区块的 hash 值,默认即可。因为是第一个区块,因此,默认就是0了

difficulty:挖矿难度参考表

  • 16进制10进制值倍数说明
    99999629145一秒一个
    2ffffd3145725五倍一分钟五到十个之间个
    5ffffa6291450放大十倍一分钟五个
    bffff412582900二十倍六分钟挖了八个
    3bfffc462914500一百倍六分钟两个
    77fff88125829000两百倍十分钟两个
    12bffed4314572500五百倍15分钟没有一个

初始化链

1
geth --datadir ./data/00 init ./genesis.json

启动节点

示例:

1
geth --datadir ./data/00 --networkid 100 --port 30303 --nodiscover --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "db,eth,net,web3,personal,miner" console

命令行参数说明:更多参数的使用,请参考链接1 或者 参考链接2

参数说明
datadirgeth安装的目录,数据存放位置,这个与初始化时候的路径一样即可
networkid网络ID,该值与创世纪区块中的chainId一致即可,否则就会连到别人的服务上去了
portgeth当前节点暴露的通信端口,默认是30303。其他节点可以通过此端口进行通信
nodiscover关闭广播,防止别人接入,但其他节点还是可以用admin.addPeer(enode)加入
maxpeers最大节点连接数
identity设置节点名称
rpc开启HTTP-RPC服务器,此处也可以不开启,使用admin.startRPC(addr,port)来开启
rpcaddr当前节点的rpc地址,默认是localhost
rpcportrpc暴露的端口,默认是8545。json rpc通过此端口获取数据
rpccorsdomain“*” :允许跨域请求的域名列表,此处为允许全部
rpcapi允许rpc接入的方式
cache调整内存分配 最小16MB,默认128MB
verbosity日志等级:0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default: 3)
console开启控制台

进入JavaScript console 控制台,即可用以下命令测试基本功能。

console常用命令

Geth Console一个交互式的 JavaScript 执行环境,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:

  • eth:包含一些跟操作区块链相关的方法;
  • net:包含一些查看p2p网络状态的方法;
  • admin:包含一些与管理节点相关的方法;
  • miner:包含启动&停止挖矿的一些方法;
  • personal:主要包含一些管理账户的方法;
  • txpool:包含一些查看交易内存池的方法;
  • web3:包含了以上对象,还包含一些单位换算的方法。

节点信息

1
2
> admin
直接输入admin对象查询,可以查询到节点相关信息和方法,如下图所示;其他对象内容查询,方法类似。

添加账户

1
2
3
> personal.newAccount("123456")
或者
> personal.newAccount()
  • 带上密码可以直接创建一个新账户,如果不带密码,就会提示2次输入密码
  • 注:如果没有创建过初始账户,此处创建的第一个账户将作为挖矿人

查看账户

1
2
3
4
返回本地节点中,有秘钥文件的所有账户的地址列表,是个字符串数组
> eth.accounts
或者指定返回账户
> eth.accounts[0]

设置为变量

1
> acc0 = web3.eth.accounts[0]
  • JavaScript console 控制台,可以直接使用js的语法,此处是获取节点第一个账户地址。频繁使用到的数据,设置变量存储,提高效率。

查看钱包

1
2
3
4
5
6
7
8
9
返回账户的余额,默认单位是Wei
> eth.getBalance(acc0)
或者
> eth.getBalance(eth.accounts[0])

Wei 转换 ether
> web3.fromWei(eth.getBalance(acc0),'ether')
或者
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

解锁账户

1
2
3
> personal.unlockAccount(acc0,"123456")
或者
> personal.unlockAccount(eth.accounts[0],"123456")
  • 交易或者是对数据签名的时候需要解锁账户,也就是验证密码和秘钥

  • 注1:此账户所在节点必须要有keystore密钥才能解锁成功

  • 注2:每隔5分账会重新上锁,未解锁的账户不能进行转账

  • 注3:每次解锁完成业务后应该立即锁定账户,避免危险

  • 1
    2
    3
    > personal.lockAccount(acc0)
    或者
    > personal.lockAccount(eth.accounts[0])

转账

1
2
3
4
5
6
7
8
9
10
11
12
13
14
示例:节点中的第1个账户转账1个以太币给第2个账户
> acc0 = eth.accounts[0]
> acc1 = eth.accounts[1]
> personal.unlockAccount(acc0,"123456")
方法一:
使用eth.sendTransaction方法
> eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(1,"ether")})

方法二:
使用personal.sendTransaction方法,该方法允许带上密码,方便测试时频繁解锁(生产环境禁用)
> personal.sendTransaction({from:acc0,to:acc1,value:web3.toWei(1,"ether")},"123456")

查看转账进度状态,转账交易会发送至此,等待打包
> tool
  • from:发送人,to:接收人,value:金额(单位是Wei,使用 web3.toWei(1,”ether”) 将1个 ether 转换为10的18次方 Wei )

  • 注:所有值都是字符串类型,需要带上双引号

挖矿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
新建账户,注:如果节点没有账户,无法启动挖矿
> personal.newAccount("123456")

该步骤非必须,指定挖矿地址为第2个账户,默认是第一个账户
> miner.setEtherbase(eth.accounts[1])

开启1个线程挖矿
> miner.start(1)
停止挖矿
> miner.stop()
查询挖矿状态
> eth.mining

组合形式:开启1个线程挖矿,当节点挖到3个区块时,就停止挖矿
> miner.start(1);admin.sleepBlocks(3);miner.stop();
  • 注1:节点没有账户存在,直接挖矿会报错,该示例设置了节点的第2个账户为挖矿地址
  • 注2:挖矿时会显示Generating DAG in progress,此进度达到100时才会开始挖,配置差的机器会等很久

查看区块数据

1
2
3
4
5
6
7
列出区块总数
> eth.blockNumer

通过区块编号,查询区块详细信息
- 第一个参数为:获取区块的编号,以16进制表示
- 第二个参数为:是否获取每笔交易的详细数据
> eth.getBlockByNumber("0x6", false)

节点通信地址

1
> admin.nodeInfo.enode

多节点通信

此部分内容将演示节点与节点之间建立通信。

启动另一节点

与启动第一个节点的步骤一样,只需注意以下几点即可:

  1. 建立新目录存储新节点数据,路径、名称自定义;
  2. 由于是在windows单机测试,启动新节点,注意port、rpcport 端口与第一个节点端口不一样即可;
  3. networkid 保持一致创世文件内容保持一致
  4. nodiscoveripcdisable,这两个参数很关键,如果在windows没有ipcdisable参数,第二个节点启动会报错的。nodiscover让节点2不会被节点1自动扫描到。
1
2
3
4
5
初始化新节点,目录名 01,创世文件是一样一样的
geth --datadir ./data/01 init ./genesis.json

启动新节点,--port 30304 区别第1节点的30303,--networkid 100 是一样一样的
geth --datadir ./data/01 --networkid 100 --port 30304 --nodiscover --ipcdisable console
连接节点
  • 原则:一个节点加入另一个节点,拿到另一个节点的enode链接信息即可。以下演示节点2加入节点1:
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
27
28
29
30
31
32
33
34
35
36
37
节点1:
- 获取enode
> admin.nodeInfo.enode
"enode://c796622eb536ffe8506f38d5689017cc16a57c6387609884f6fec6fb9f002aad7c5e132be294095f6ae8ef59839ab503c3a254908ed0ae43e04d01cfd84d90b2@[::]:30303?discport=0"

节点2:
- 加入节点1
> admin.addPeer("enode://c796622eb536ffe8506f38d5689017cc16a57c6387609884f6fec6fb9f002aad7c5e132be294095f6ae8ef59839ab503c3a254908ed0ae43e04d01cfd84d90b2@[::]:30303?discport=0")

- 查询是否加入成功:
> admin.peers

- 返回如下信息即表示成功加入:
[{
caps: ["eth/63"],
id: "c796622eb536ffe8506f38d5689017cc16a57c6387609884f6fec6fb9f002aad7c5e132be294095f6ae8ef59839ab503c3a254908ed0ae43e04d01cfd84d90b2",
name: "Geth/v1.8.3-stable-329ac18e/windows-amd64/go1.10",
network: {
inbound: false,
localAddress: "127.0.0.1:52306",
remoteAddress: "127.0.0.1:30303",
static: true,
trusted: false
},
protocols: {
eth: {
difficulty: 10684130,
head: "0xf265af80eb34696a82444f93143b9b1191ea85df1823f43001d7b21dd02beaa6",
version: 63
}
}
}]

- 查看节点连接数
> net.peerCount

- 链接成功后会自动同步网络区块

导入账户

1
2
3
personal.importRawKey("2ddf482f643d75f166e1204bda8ccc124556f6ec951f838ebbb803d022d72a69","123456")

返回值:"0x455856e8e7419218d8e4c9d1fc1aa237fca9cf54"
  • 新节点没有账户,但是转账需要解锁账户,因此需要密钥文件,该文件根据账户秘钥以及密码生成;geth默认生成账户的时候并没有提供秘钥的明文,只提供了密钥文件,所以后台设计应该在用户注册时,根据密钥文件生成秘钥提供给用户,用户只需要记得秘钥以及密码即可在任意节点操作

  • 需要账户的keystore文件,通过下面的node获取到私钥,传入私钥以及密码,在节点下生成keystore文件

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    var keythereum = require("keythereum");
    //keystore密钥存放目录,在当前目录下的keystore目录下,密钥以address命名
    var datadir = "./";
    var address= "455856e8e7419218d8e4c9d1fc1aa237fca9cf54"; //不能包含其他符号
    const password = "123456";

    var keyObject = keythereum.importFromFile(address, datadir);
    var privateKey = keythereum.recover(password, keyObject);
    console.log(privateKey.toString('hex'));
  • 操作步骤:

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mkdir keythereum
    cd keythereum
    cp -r 节点的keystore目录 ./
    文件名不能包含其他符号,例如:
    "UTC--2019-10-23T06-04-06.582047059Z--455856e8e7419218d8e4c9d1fc1aa237fca9cf54"
    修改为"455856e8e7419218d8e4c9d1fc1aa237fca9cf54"
    mv keythereum/UTC--2019-10-23T06-04-06.582047059Z--455856e8e7419218d8e4c9d1fc1aa237fca9cf54 keythereum/455856e8e7419218d8e4c9d1fc1aa237fca9cf54

    npm install keythereum
    vi ks2pk.js
    填入上面代码,修改address为密钥文件名
    保存,运行
    node ks2pk.js
    返回秘钥:2ddf482f643d75f166e1204bda8ccc124556f6ec951f838ebbb803d022d72a69
  • 注:复制密钥文件到节点下的keystore目录中,则不需要用到上面的操作

总结

感谢阅读本教程,如有其他需求帮助,请联系相关人员,谢谢!

-------------------本文结束 感谢您的阅读-------------------
0%