一、设置Ubuntu软件源。
清华源的设置可以参考如下网址。设置软件镜像源是为了加速一些软件的下载。
Ubuntu设置清华源_ubuntu清华源_there2belief的博客-CSDN博客
配置好清华源后,使用如下命令激活配置文件:
source /etc/apt/sources.list
二、Golang安装
- 下载安装包,目前使用的是go1.19.2版本,用更旧的版本是否会发生错误暂时未知。
mkdir ~/download
cd ~/download
wget https://golang.google.cn/dl/go1.19.2.linux-amd64.tar.gz
tar -zxvf ./go1.19.2.linux-amd64.tar.gz
- 解压go安装包
mkdir ~/env
mkdir ~/env/gobin
mkdir ~/env/gopath
mv ~/download/go ~/env/
- 配置~/.bashrc文件,在文件最后加入如下三行代码(##是注释部分)
## 配置须为绝对路径,将yourname改为自己的用户名
GOROOT=/home/yourname/env/go
GOBIN=/home/yourname/env/gobin
export PATH=$PATH:$GOROOT/bin:$GOBIN
然后使用source ~/.bashrc
激活配置文件。 - go环境变量配置
依次执行以下四条命令
## 配置须为绝对路径,将yourname改为自己的用户名
go env -w GOBIN=/home/yourname/env/gobin
go env -w GOPATH=/home/yourname/env/gopath
go env -w GOPROXY=https://goproxy.cn,direct
go env -w GO111MODULE=on
其中GOPROXY是镜像源,有些go语言包在外网中,直接go get可能会失败。
GO111MODULE是是否使用go mod配置环境。
可以通过go env
查看上述配置是否成功。
三、建立host映射
使用命令sudo vi /etc/hosts
进入hosts文件,输入i
可以进入编辑模式,可以按照下图格式设置IP地址映射关系。编辑结束后点击退出键(Esc)退出编辑模式,:wq
(保存退出),:q
(不保存退出)。
如果使用上图的映射,
ping node0
可以测试映射是否建立成功。
四、Visual Studio Code 安装:此步自行完成
五、Tendermint部署
首先设置工作目录
mkdir ~/workspace
进入该目录下:
cd ~/workspace
拉取Tendermint源码:
git clone https://github.com/tendermint/tendermint.git
接着进入Tendermint项目目录:
cd ~/workspace/tendermint
选择合适的分支:
git checkout v0.34.24
六、Tendermint的编译
进入项目目录:
cd ~/workspace/tendermint
编译:make install
编译文件会出现在$GOBIN路径下(如果按照上文配置,这个路径就是/home/yourname/env/gobin)。
七 tm-load-test工具安装
直接拉取相关源码,tm-load-test的版本目前来看影响不大。
git clone https://github.com/informalsystems/tm-load-test.git
-
编译
进入目录
cd tm-load-test/cmd/tm-load-test
编译
go build
-
书写自己的tm-load-test:目录tm-load-test/pkg/loadtest下,参考client_kvstore.go书写,需要实现如下接口:
八、单节点测试(以kvstore为例)
- 配置与启动节点
初始化:
tendermint init
此时会出现文件夹~/.tendermint,其中包含两个文件夹:config和data。config存储配置文件,包括创世区块、addressbook、config.coml等,data存储数据库文件。
通过以下命令启动单机测试:
tendermint init --proxy_app=kvstore
Tendermint命令行有home参数,可以设置目录文件夹,如tendermint init --home ~/tmtest
可以在~/tmtest文件夹下创建config和data两个文件夹(无则创建一个tmtest文件夹)。此时,使用命令tendermint init --proxy_app=kvstore --home=~/tmtest
可以在对应目录下启动Tendermint。 - 其它配置
共识参数:
- create_empty_blocks和create_empty_blocks_interval:tendermint默认允许产生空块,如果希望tendermint在无交易时不产生区块,则将config.toml文件的406行create_empty_blocks项改为false。create_empty_blocks_interval项在create_empty_blocks项为真时,表明每隔多少时间产生一个空块。
- timeout_propose:propose阶段的超时参数。该项设置较大时,一般不容易出现多个round。
- timeout_propose_delta:每个round的timeout_propose的增量,一般不需要修改。
- timeout_prevote:prevote阶段的超时参数。该项设置较大时,一般不容易出现多个round。
- timeout_prevote_delta:每个round的timeout_prevote的增量,一般不需要修改。
- timeout_precommit:precommit阶段的超时参数。该项设置较大时,一般不容易出现多个round。
- timeout_precommit_delta:每个round的timeout_precommit的增量,一般不需要修改。
- timeout_commit:提交区块后,等待所有节点precommit消息的时间,即使已经有超过2/3的precommit消息,也会继续等待。可以适当减小这个时间。
mempool参数
- version:mempool的版本,v0是先进先出内存池,v1是具有优先级的内存池。v1内存池中,旧交易优先级低于新交易,如果mempool已满,会导致mempool一直删除旧交易,所以v1暂时不适合负载测试。
- recheck:每个区块提交后,节点会重新检验内存池中交易是否合法,该选项用以开关该功能。
- broadcast:是否允许peer节点间的内存池广播交换交易。
- size:内存池中最大的交易数量。
- max_txs_bytes:内存池最大字节容量。目前是1GB,已经足够使用。
- cache_size:缓冲区大小,缓冲区的作用是方式交易重放,在broadcast开启时该项不宜过小,否则会导致相同的交易重复广播于各节点间并重复进入区块。
-
keep-invalid-txs-in-cache:不合法交易是否被cache记录。该项为false,表明client可以重新提交相同的交易。
3.查询
-
广播交易:通过如下语句向本机节点广播一个交易。
curl -s 'localhost:26657/broadcast_tx_commit?tx="abc"'
一般来说会出现类似如下的命令行
如果交易被成功包含进区块,会返回以下文本,文本中deliver_tx字段中有内容。
-
查询账户:可以通过如下命令查询kvstore中,对应的key中的内容:
curl -s 'localhost:26657/abci_query?data="abc"'
九、多节点测试
- 配置文件生成
使用如下命令可以一键在当前目录下生成4个节点的配置文件:
tendermint testnet --v 4
配置文件存储在mytestnet文件夹中,目录下有四个文件夹,分别名为node0,node1,node2,node3。
如果向配置其它节点数量,只要修改对应数值即可。 -
修改监听端口
mytestnet/node0/config地址下有文件config.coml,通过该文件可以配置区块链节点的一些参数。 一般情况下,至少需要修改RPC的监听地址和P2P的监听地址以及Peer节点地址。
(1)在文件的91行可以设置rpc地址,client广播交易等均需通过该地址。127.0.0.1表示仅监听本机tcp消息,0.0.0.0表示监听全网段tcp消息,如果多机测试,务必将监听范围设置成0.0.0.0。
默认的监听端口是26657,如果是单机四节点测试的话,可以将四个节点的配置文件中该项分别设置为26657、26658、26659、26660,其它情况以此类推。
(2)文件202行可以设置P2P地址监听端口,该端口用于共识过程中,对等节点间的通信。默认监听地址范围就是0.0.0.0,一般来说,不建议修改该网段。
默认的监听端口是26656。如果是单机四节点测试的话,可以将该项分别修改为26656、36656、46656、56656,其它情况自行调整。
(3)此外,由于P2P端口被修改了,相应的Peer节点信息也需要修改。
文件215行记录了Peer节点的ID、IP地址以及端口。第三节介绍了hosts的映射方式,node0、node1、node2、node3即为IP映射,读者若想采用自己的IP映射,须记住节点和IP的对应关系,以免出错。
如若上述(2)步,修改了P2P的监听端口,须记住节点与端口的对应情况,将对应节点的端口修改为(2)步中的结果。
此外,建议将node0的Peer节点中的node0(即自身)去掉,否则node0宕机后,会向自身询问新的区块,造成不必要的麻烦。
- 其它配置
见八.2节。 - 启动节点
首先进入mytestnet目录(mytestnet所在位置根据自身修改):
cd ~/mytestnet
分别在对应节点上运行以下命令启动节点:
tendermint start --proxy_app=kvstore --home=./node0
tendermint start --proxy_app=kvstore --home=./node1
tendermint start --proxy_app=kvstore --home=./node2
tendermint start --proxy_app=kvstore --home=./node3
十、负载测试
进入tm-load-test目录:
cd tm-load-test/cmd/tm-load-test
如果没有可执行文件tm-load-test,则需要编译一次
go build
接着可以进行负载测试:
./tm-load-test -c 1 -T 60 -r 6000 --broadcast-tx-method async --endpoints ws://node0:26657/websocket,ws://node1:26658/websocket,ws://node2:26659/websocket,ws://node3:26660/websocket --stats-output result.csv
参数含义:
- c : 每个节点的连接数
- T : 总时长
- r :每秒、每节点、每个连接上的负载大小。
- broadcast-tx-method : 有三种方式可选,async(不等待任何消息)、sync(等待CheckTx结果)、commit(等待CheckTx结果与DeliverTx结果)。不推荐使用commit方法,因为每个节点最多允许100个RPC订阅消息。
- endpoints : 节点地址,必须以ws://开头,以/websocket结尾,中间部分node0:26657为节点IP和端口。
- stats-output : 输出结果的记录位置,不过不需要记录结果则不用写这个标签。输出结果是mempool相应请求的速度,并不是交易实际上链的速度。