欢迎光临
我们一直在努力

在ubuntu上使用cosmos SDK + Docker搭建3节点分布式网络区块链

 搭建链所需的环境,参考文章:Cosmos环境搭建与simapp的基本操作_cosmos多节点环境搭建-CSDN博客

我们将创建一个主目录 cosmos-net,每个子目录表示一个节点:

mkdir -p $HOME/cosmos-net
cd $HOME/cosmos-net

# 创建 3 个节点目录
mkdir node0 node1 node2

# 复制的文件在参考文章中可以找到
cp ~/cosmos/cosmos-sdk/build/simd ./
chmod +x simd

目录结构最终会变成:

cosmos-net/
├── simd
├── node0/
├── node1/
├── node2/

我们先在 node0 中初始化整个链的 genesis 状态,其他节点将从它复制:

./simd init node0 –chain-id test-chain –home ./node0

添加 alice 账户并设为验证者:

./simd keys add alice –keyring-backend test –home ./node0

./simd add-genesis-account $(./simd keys show alice -a –keyring-backend test –home ./node0) 100000000stake –home ./node0

./simd gentx alice 70000000stake –keyring-backend test –home ./node0 –chain-id test-chain

./simd collect-gentxs –home ./node0

复制配置到 node1 和 node2

cp -r node0/config node1/
cp -r node0/config node2/

# 清理 node1 和 node2 复制过来的 priv_validator_state 和 node_key,后面需要自动生成
rm -f node1/config/priv_validator_key.json
rm -f node1/config/node_key.json

rm -f node2/config/priv_validator_key.json
rm -f node2/config/node_key.json

生成 node1 和 node2 独立的 node_key.json 和 priv_validator_key.json,以及必要文件

./simd init node1 –home ./node1
./simd init node2 –home ./node2

获取各节点的 Node ID

./simd tendermint show-node-id –home ./node0
./simd tendermint show-node-id –home ./node1
./simd tendermint show-node-id –home ./node2

截图或者复制下ID备用,如下

修改每个节点的 config.toml,例如node0在~/cosmos-net/node0/config/config.toml

需要在每个config.toml中配置rpc与p2p的端口号,因为在同一台主机上运行,所以不能冲突,端口号参考如下

rpc p2p
node0 26657 26656
node1 26659 26658
node2 26661 26660

例如node0中rpc的配置,大概在91行,上下文如下

#######################################################
### RPC Server Configuration Options ###
#######################################################
[rpc]

# TCP or UNIX socket address for the RPC server to listen on
laddr = "tcp://127.0.0.1:26657"

node0中p2p的配置,大概在202行,需要配置laddr与persistent_peers两部分,上下文如下

#######################################################
### P2P Configuration Options ###
#######################################################
[p2p]

# Address to listen for incoming connections
laddr = "tcp://0.0.0.0:26656"

# Address to advertise to peers for them to dial
# If empty, will use the same port as the laddr,
# and will introspect on the listener or use UPnP
# to figure out the address. ip and port are required
# example: 159.89.10.97:26656
external_address = ""

# Comma separated list of seed nodes to connect to
seeds = ""

# Comma separated list of nodes to keep persistent connections to
persistent_peers = "b98cb284f5be49db7355497ea3822e1d964d427c@cosmos-node1:26658,885ddf90b9576701494264a31e3913e583dd66fa@cosmos-node2:26660"

例如b98cb284f5be49db7355497ea3822e1d964d427c@cosmos-node1:26658 b98cb284f5be49db7355497ea3822e1d964d427c是node1的节no,之前保存过。

cosmos-node1是node1在docker中容器的名字

26658是node1的p2p端口

node1与node2的config.toml均按以上配置

node1 rpc

#######################################################
### RPC Server Configuration Options ###
#######################################################
[rpc]

# TCP or UNIX socket address for the RPC server to listen on
laddr = "tcp://127.0.0.1:26659"

node1 p2p

#######################################################
### P2P Configuration Options ###
#######################################################
[p2p]

# Address to listen for incoming connections
laddr = "tcp://0.0.0.0:26658"

# Address to advertise to peers for them to dial
# If empty, will use the same port as the laddr,
# and will introspect on the listener or use UPnP
# to figure out the address. ip and port are required
# example: 159.89.10.97:26656
external_address = ""

# Comma separated list of seed nodes to connect to
seeds = ""

# Comma separated list of nodes to keep persistent connections to
persistent_peers = "e7a91905295966a51d8c46a876504c308b9a0871@cosmos-node0:26656,885ddf90b9576701494264a31e3913e583dd66fa@cosmos-node2:26660"

node2 rpc

#######################################################
### RPC Server Configuration Options ###
#######################################################
[rpc]

# TCP or UNIX socket address for the RPC server to listen on
laddr = "tcp://127.0.0.1:26661"

node2 p2p

#######################################################
### P2P Configuration Options ###
#######################################################
[p2p]

# Address to listen for incoming connections
laddr = "tcp://0.0.0.0:26660"

# Address to advertise to peers for them to dial
# If empty, will use the same port as the laddr,
# and will introspect on the listener or use UPnP
# to figure out the address. ip and port are required
# example: 159.89.10.97:26656
external_address = ""

# Comma separated list of seed nodes to connect to
seeds = ""

# Comma separated list of nodes to keep persistent connections to
persistent_peers = "e7a91905295966a51d8c46a876504c308b9a0871@cosmos-node0:26656,b98cb284f5be49db7355497ea3822e1d964d427c@cosmos-node1:26658"

保存修改后,在cosmos-net目录下添加一个文件:Dockerfile

ubuntu我用的是22版本,这里写24是因为环境需要

# 基础镜像,使用 Ubuntu 24.04
FROM ubuntu:24.04

# 设置非交互模式,避免安装软件时卡住
ENV DEBIAN_FRONTEND=noninteractive

# 更新系统并安装必备依赖
RUN apt-get update && apt-get install -y \\
curl \\
git \\
build-essential \\
jq \\
lz4 \\
&& rm -rf /var/lib/apt/lists/*

# 复制本地编译好的 simd 二进制到镜像内
COPY simd /usr/bin/simd

# 给 simd 文件添加可执行权限
RUN chmod +x /usr/bin/simd

# 设置默认执行命令为 simd
ENTRYPOINT ["simd"]

在cosmos-net目录下再添加一个文件:docker-compose.yml

version: "3.8"

services:
node0:
build: .
container_name: cosmos-node0
command: ["start", "–home", "/root/.simapp"]
ports:
– "26656:26656" # P2P端口映射
– "26657:26657" # RPC端口映射
volumes:
– ./node0:/root/.simapp
restart: unless-stopped

node1:
build: .
container_name: cosmos-node1
command: ["start", "–home", "/root/.simapp"]
ports:
– "26658:26656" # P2P端口映射(容器内还是26656,宿主机映射成不同端口)
– "26659:26657" # RPC端口映射
volumes:
– ./node1:/root/.simapp
restart: unless-stopped

node2:
build: .
container_name: cosmos-node2
command: ["start", "–home", "/root/.simapp"]
ports:
– "26660:26656" # P2P端口映射
– "26661:26657" # RPC端口映射
volumes:
– ./node2:/root/.simapp
restart: unless-stopped

此时的目录结构为  

cosmos-net/
├── simd
├── node0/
├── node1/
├── node2/
├── Dockerfile
├── docker-compose.yml

在cosmos-net目录下打开终端,开始构建docker镜像

sudo docker build -t my-simd-node:latest .

如果你之后修改了 Dockerfile 或 simd 文件,可以重复这步更新镜像。

启动三个节点

sudo docker compose up -d

检查容器是否正常运行

sudo docker ps

会看到如下信息

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0acc2c089254 cosmos-net-node0 "simd start –home /…" 48 minutes ago Up 48 minutes 0.0.0.0:26656-26657->26656-26657/tcp, [::]:26656-26657->26656-26657/tcp cosmos-node0
42187c73acc0 cosmos-net-node2 "simd start –home /…" 48 minutes ago Up 48 minutes 0.0.0.0:26660->26656/tcp, [::]:26660->26656/tcp, 0.0.0.0:26661->26657/tcp, [::]:26661->26657/tcp cosmos-node2
2b74805af5b7 cosmos-net-node1 "simd start –home /…" 48 minutes ago Up 48 minutes 0.0.0.0:26658->26656/tcp, [::]:26658->26656/tcp, 0.0.0.0:26659->26657/tcp, [::]:26659->26657/tcp cosmos-node1

打开三个终端,分别运行命令,在三个节点中查看链的增长

sudo docker logs cosmos-node0 -f
sudo docker logs cosmos-node1 -f
sudo docker logs cosmos-node2 -f

最后关闭容器命令

sudo docker compose down -v

下次可重新构建启动

sudo docker compose up –build -d

赞(0)
未经允许不得转载:171主机测评 » 在ubuntu上使用cosmos SDK + Docker搭建3节点分布式网络区块链
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址