安装ClevelDB
若要使用ClevelDB可先安装ClevelDB
sudo apt-get update
sudo apt install build-essential
sudo apt-get install libsnappy-dev
wget https://github.com/google/leveldb/archive/v1.20.tar.gz && \
tar -zxvf v1.20.tar.gz && \
cd leveldb-1.20/ && \
make && \
sudo cp -r out-static/lib* out-shared/lib* /usr/local/lib/ && \
cd include/ && \
sudo cp -r leveldb /usr/local/include/ && \
sudo ldconfig && \
rm -f v1.20.tar.gz
修改配置文件,数据库后端设置为cleveldb
db_backend = “cleveldb”
build tendermint 支持cleveldb
CGO_LDFLAGS="-lsnappy" make install TENDERMINT_BUILD_OPTIONS=cleveldb
Makefile入门:
Makefile与Cmake的联系与区别:
Cmake是一种跨平台编译工具,比make方便
CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库
Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。make命令和Makefile文件:
make命令会读取makefile文件的内容,make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。
Makefile文件中的命令:
make命令:make -C转到目录
$(CURDIR) 是一个 GNU Make 内置的 Makefile 变量,用于获取当前工作目录的绝对路径。
定义$(MAKE)宏变量的意思是,也许我们的make需要一些参数,所以定义成一个变量比较有利于维护。两个例子意思都是先进入"subdir"目录,然后执行make命令
- 变量:$ 符号表示取变量的值
- 变量赋值:
“=”赋值
“:=”表示直接赋值,赋予当前位置的值。
"?="表示如果该变量没有被赋值,赋值予等号后面的值。
"+="和平时写代码的理解是一样的,表示将符号后面的值添加到前面的变量上 - 回显问题,Makefile中的命令都会被打印出来。如果不想打印命令部分 可以使用@去除回显
@echo "clean done!"
- 伪目标.PHONY
伪目标只是一个标签,伪目标的作用:(1)避免命令与目录下的文件名重复;(2)make的并行和递归执行过程中;(3)生成多个应用程序 - 嵌套执行Makefile
Docker知识:
- docker build
//从Dokcerfile文件建立镜像,寻找Dockerfile文件,Dockerfile是一个文本格式的配置文件,可以使用Dockerfile来快速创建自定义的镜像,包含一条条的指令。Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、构建镜像的指令信息、容器启动时执行指令信息
Dockerfile常用指令:
from:基础镜像 run:RUN command为shell命令 RUN
[“executable”, “param1”, “param2”] executable为可执行程序,param1,param2分别为参数
CMD:CMD [“executable”,“param1”,“param2”] (首选形式) CMD command param1
param2 (shell命令形式) 在Dockerfile中,只能有一条CMD指令,如果出现多个CMD命令,则只有最后一个命令会生效。
LABEL:使用LABEL指令来添加镜像的作者信息等
EXPOSE:EXPOSE [/…]
EXPOSE指令通知Docker容器在运行时监听指定的网络端口,可以指定端口的协议(TCP/UDP),如果不指定默认为TCP协议
COPY:docker默认会在上下文目录的根目录去找Dockerfile文件
ENTRYPOINT:ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2
Docker运行时,可以使用–entrypoint来覆盖ENTRYPOINT指令
VOLUME:[ /tendermint ]
Docker运行会在宿主机生成数据卷并挂载VOLUME指令指定的位置。
WORKDIR:/tendermint
WORKDIR指令为任意的RUN、CMD、ENTRYPOINT、ADD、COPY指令设置工作目录。如果指定的目录不存在,将会被默认创建。
2.使用Dockerfile构建项目镜像
上下文目录:发出docker build指令所在目录就是上下文目录。默认情况下,docker会在当前目录中寻找Dockerfile文件,我们也可以使用-f参数来指定Dockerfile的位置。无论Dockerfile处于什么位置,上下文目录以及子目录的所有内容都会被发送到Docker daemon中。:Z 命令是用于设置 SELinux 安全上下文的选项,它在 Docker 中用于提高容器中数据的安全性。
docker run --rm/如果容器存在的话自动移除容器
docker run -v /
docker build --tag tendermint/localnode localnode //创建docker image标签
docker-compose up //创建和开启容器
docker-compose down//停止和移除容器和网络
tendermint test命令参数:
--config /etc/tendermint/config-template.toml: 使用指定路径下的 config-template.toml 配置文件来配置 Tendermint 节点
--o .: 将生成的测试网络配置文件输出到当前目录(.)中,以便将其用于启动测试网络
--starting-ip-address 192.167.10.2: 指定测试网络的起始 IP 地址,用于为测试网络中的节点分配 IP 地址
docker-compose.yaml配置文件详解
docker-compose.yaml 是 docker compose 工具使用的配置文件,用于定义多个 Docker 容器的服务、网络和卷等信息。如下是tendermint多节点网络的docker-compose配置文件,有5个容器服务,每个服务运行一个 “tendermint/localnode” Docker镜像的实例:所有服务都使用相同的卷./build,挂载到容器内的/tendermint目录。它们还使用相同的网络localnet,该网络被定义为一个网桥网络,IP地址范围为192.167.10.0/16。其中IPAM是指IP地址管理,它定义了一个子网,其中每个容器都可以使用自己的IP地址。driver: default表示使用默认的IP地址分配驱动程序,subnet: 192.167.10.0/16表示子网的地址范围。
version: '3'
services:
node0:
container_name: node0
image: "tendermint/localnode"
ports:
- "26656-26657:26656-26657"
environment:
- ID=0
- LOG=${LOG:-tendermint.log}
volumes:
- ./build:/tendermint:Z
networks:
localnet:
ipv4_address: 192.167.10.2
node1:
container_name: node1
image: "tendermint/localnode"
ports:
- "26659-26660:26656-26657"
environment:
- ID=1
- LOG=${LOG:-tendermint.log}
volumes:
- ./build:/tendermint:Z
networks:
localnet:
ipv4_address: 192.167.10.3
node2:
container_name: node2
image: "tendermint/localnode"
environment:
- ID=2
- LOG=${LOG:-tendermint.log}
ports:
- "26661-26662:26656-26657"
volumes:
- ./build:/tendermint:Z
networks:
localnet:
ipv4_address: 192.167.10.4
node3:
container_name: node3
image: "tendermint/localnode"
environment:
- ID=3
- LOG=${LOG:-tendermint.log}
ports:
- "26663-26664:26656-26657"
volumes:
- ./build:/tendermint:Z
networks:
localnet:
ipv4_address: 192.167.10.5
node4:
container_name: node4
image: "tendermint/localnode"
environment:
- ID=4
- LOG=${LOG:-tendermint.log}
ports:
- "26665-26666:26656-26657"
volumes:
- ./build:/tendermint:Z
networks:
localnet:
ipv4_address: 192.167.10.6
networks:
localnet:
driver: bridge
ipam:
driver: default
config:
-
subnet: 192.167.10.0/16
Docker运行Tendermint网络具体流程
1.若拉取的是tendermint源码,使用如下命令在build目录下生成tendermint二进制文件
make build-linux
note:若拉取的是tendermint二进制文件,将tendermint二进制文件放到/tendermint/build/目录。
2.使用如下命令建立tendermint/localnode image(此项可选择,启动网络时会自动建立docker image)
make build-docker-localnode
3.启动Tendermint网络
make localnet-start
# Run a 4-node testnet locally
localnet-start: localnet-stop build-docker-localnode
@if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2; fi
docker-compose up
.PHONY: localnet-start
会在build目录下生成node0-3四个节点文件,如本地部署Tendermint网络。
note: 若要部署任意节点的Tendermint网络,(1)首先需要修改Makefile文件中的localnet-start命令:testnet --v 5 --v 3,–v参数的意思是设置验证节点的数量;–n设置非验证节点的数量如下所示;
localnet-start: localnet-stop build-docker-localnode
@if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --v 5 --n 3 --o . --populate-persistent-peers --starting-ip-address 192.167.10.2 ; fi
docker-compose up
以上命令是设置5个验证节点,3个非验证节点。如果内存较小,节点数量设置较小即可,本人在16g内存上部署了8节点导致资源不够用,有些节点未运行;然后部署了5个节点成功运行。
(2)然后要根据部署的节点数量修改docker-compose.yaml文件的配置。
具体执行流程如下:
(1)首先要启动docker,如果以前开启过网络,则会执行localnet-stop关闭网络,localnet-stop命令会调用docker-compose down命令关闭已经存在的容器
(2)然后执行build-docker-localnode,通过Docker建立网络,build-docker-localnode命令先进入networks/local目录下,然后执行make命令,makefile文件中的命令“docker build --tag tendermint/localnode localnode”
(3)通过[ -f build/node0/config/genesis.json ]判断build/node0/config/genesis.json是否存在,若不存在,执行“docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode”,用 Docker 运行一个名为 tendermint/localnode 的镜像,并将当前目录下的 build 目录挂载到容器中的 /tendermint 目录下,并设置挂载路径为可共享(shared)模式,最后启动一个新的容器来执行 tendermint/localnode 镜像中的命令。
(4)执行“testnet --config /etc/tendermint/config-template.toml --o . --starting-ip-address 192.167.10.2”命令启动tendermint网络,若没有指定节点数量,默认生成4个验证节点。(5)执行“docker-compose up”创建和开启容器。首先,Docker Compose 会检查当前目录下是否存在 docker-compose.yaml 配置文件,根据配置文件创建所需的容器。
4.验证测试
执行如下命令,会出现“We need more addresses. Sending pexRequest to random peer…”的错误
make localnet-start
是因为needAddressThreshold 阈值在/tendermint/p2p/pex/params.go文件中被设置为1000,可以将其设置为较小数值,然后重新编译tendermint二进制文件,按以上步骤重新部署tendermitn多节点网络就不会出错了。
func (a *addrBook) NeedMoreAddrs() bool {
return a.Size() < needAddressThreshold //阈值1000
}