cosmos 运行

admin
admin 2023年07月05日
  • 在其它设备中阅读本文章

运行基于 cosmos sdk 开发的区块链程序

一、环境

  1. 操作系统:linux
  2. go 版本:1.20.4 以上
  3. ignite 版本:0.27.1 以上

二、约定

  1. 开发区块链应用程序可以参考文档 ignite
  2. 为了方便运行 go 语言程序,需要将目录$HOME/go/bin/加入到环境变量 PATH 里面
  3. 可以在项目根目录运行ignite chain build命令来生成二进制程序(通常放到目录$HOME/go/bin/
  4. 为了方便解说,可以为区块链程序统一起个别名,例如:alias chaind=gaiad
  5. 程序可以使用-h选项来查看更多配置参数,为了简单尽量使用了默认参数

一般来说基于 cosmos sdk 开发的区块链,如果项目名称为 appname,那么默认的程序和工作目录分别是appnamed$HOME/.appname,默认的链 id 为appname

三、节点配置

1、初始化

chaind init [moniker]命令创建节点工作目录,moniker是自定义的节点名称,生成默认配置文件、基础创世文件和随机节点密钥,目录主要包括以下文件

├── config
│   ├── app.toml                                # 应用程序相关的配置文件
│   ├── config.toml                            # CometBFT相关配置文件
│   ├── genesis.json                          # 创世文件
│   ├── node_key.json                       # p2p协议中用于节点身份验证的私钥
│   └── priv_validator_key.json        # 在共识协议中用作验证节点的私钥
└── data                                             # 节点使用的数据存储目录
  • --home string:自定义工作目录
  • --chain-id string:自定义创世文件中的链 id
  • --staking-bond-denom string:自定义质押币名称

2、账户

chaind keys add [name]命令创建新的密钥,name是密钥名称,可以重复执行创建多个不同的账户

  • --keyring-backend string:自定义密钥后端,参考文档 keyring
  • --keyring-dir string:自定义密钥文件存放目录

3、创世账户

chaind add-genesis-account [address_or_key_name] [coin][,[coin]] 命令添加账户到创世文件中,address_or_key_name是之前创建的密钥名称或任意账户地址,coin是资产(例如 1000 个质押币1000stake),可以重复执行配置多个创世账户

4、创世交易

chaind gentx [key_name] [amount]命令构造并签名创世交易,key_name是之前创建的密钥名称,amount只能是质押币(至少是1000000000stake),交易内容是质押账户一定数量质押币来成为创世验证者

  • --pubkey string:自定义节点公钥(默认由工作目录中priv_validator_key文件确定)
  • --node-id string:自定义节点 id(默认由工作目录中node_key.json文件确定)

5、创世文件

chaind collect-gentxs命令将创世交易写入到创世文件中,所有验证者签署交易后,由其中一个收集齐全后执行生成最终的创世文件

  • --gentx-dir string:自定义创世交易目录

6、启动节点

chaind start命令将启动区块链节点,如果在一台电脑上运行多个节点需要分配端口避免端口冲突

  • --home string:自定义节点工作目录
  • --p2p.laddr string:默认 tcp://0.0.0.0:26656
  • --rpc.laddr string:默认 tcp://127.0.0.1:26657
  • --grpc.address string:默认 0.0.0.0:9090
  • --grpc-web.address string:默认 0.0.0.0:9091
  • --rpc.pprof_laddr string:默认 0.0.0.0:6060
  • --p2p.persistent_peers:持久的对等节点(逗号分割,ID@host:port)
  • --p2p.seeds:种子节点(逗号分割,ID@host:port)

除了通过命令行设置参数,也能通过修改节点配置文件(工作目录中的config/config.toml文件),例如:

# persistent_peers = "[validator_address]@[ip_address]:[port],..."
persistent_peers = "58811401b7b84caebea3cf674577a879dc53fdb1@127.0.0.1:26656"

7、查询

  • chaind tendermint show-validator:节点公钥
  • chaind tendermint show-node-id:节点 id
  • chaind keys list:账户列表
  • chaind keys show [name_or_address [name_or_address...]]:显示指定账户信息

四、节点实例

如果运行过区块链程序,可能需要删除之前的数据(包括但不限于工作目录)

1、单节点

推荐使用默认的工作目录、密钥后端、链 id、质押币名称和端口号

使用一个验证者创世

# 初始化工作目录
chaind init testnode

# 创建账户
chaind keys add key0

# 添加账户到创世文件
chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os

# 签名创世交易
chaind gentx key0 100000000stake

# 打包创世交易到创世文件中
chaind collect-gentxs

# 启动节点
chaind start

加入已存在的区块链网络
需要准备指定区块链的程序、创世文件和对等节点地址列表等等,参考 gaia 的 官方文档

chaind init testnode

# 复制指定区块链网络的创世文件genesis.json到工作目录中
# 参考章节:https://hub.cosmos.network/main/hub-tutorials/join-mainnet.html#genesis-file

# 修改配置文件(config/config.toml)添加对等节点(种子节点)或在命令行中指定
# 参考章节:https://hub.cosmos.network/main/hub-tutorials/join-mainnet.html#seeds-peers

chaind start

2、多节点

多节点需要配置区块链节点的工作目录和端口以避免程序冲突,其中包括

  • --home string:指定工作目录
  • --p2p.laddr string:默认 tcp://0.0.0.0:26656
  • --rpc.laddr string:默认 tcp://127.0.0.1:26657
  • --grpc.address string:默认 0.0.0.0:9090
  • --grpc-web.address string:默认 0.0.0.0:9091
  • --rpc.pprof_laddr string:默认 0.0.0.0:6060
  • --address string:默认 tcp://0.0.0.0:26658
  • --api.address string:默认 tcp://0.0.0.0:1317

一个验证者节点和一个同步节点
创世并启动验证者节点 node0

# 初始化工作目录node0
chaind init testnode --home node0

# 创建账户key0
chaind keys add key0 --home node0

# 添加账户key0到创世文件
chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os --home node0

# 签名创世交易
chaind gentx key0 100000000stake --home node0

# 打包创世交易到创世文件中
chaind collect-gentxs --home node0

# 启动节点node0
chaind start --home node0

启动同步节点 node1

# 初始化工作目录node1
chaind init testnode --home node1

# 创建账户key1
chaind keys add key1 --home node1

# 复制node0的创世文件到node1的工作目录中
cp node0/config/genesis.json node1/config/genesis.json

# 启动节点node1
chaind start --home node1 --p2p.seeds $(chaind tendermint show-node-id --home node0)@127.0.0.1:26656  --rpc.laddr tcp://127.0.0.1:26667 --p2p.laddr tcp://0.0.0.0:26666 --grpc.address 0.0.0.0:9000 --grpc-web.address 0.0.0.0:9001 --rpc.pprof_laddr 0.0.0.0:6070

将同步节点变成验证者节点

# 给key1账户转账
chaind tx bank send key0 $(chaind keys show key1 -a --home node1) 100000000000stake --home node0

# 质押key1账户的币将node1节点变为验证者
chaind tx staking create-validator --amount 1000000000stake --from key1 --pubkey $(chaind tendermint show-validator --home node1) --node-id $(chaind tendermint show-node-id --home node1) --commission-rate 0.1 --commission-max-rate 0.2 --commission-max-change-rate 0.01 --min-self-delegation 1  --home node1

两个验证者节点创世

chaind init testnode --home node0

chaind init testnode --home node1

chaind keys add key0 --home node0

chaind keys add key1 --home node1

chaind add-genesis-account key0 10000000000000000000000000000stake --keyring-backend os --home node0

chaind add-genesis-account key1 10000000000000000000000000000stake --keyring-backend os --home node0

chaind gentx key0 100000000stake --home node0

chaind gentx key1 100000000stake --home node0 --pubkey $(chaind tendermint show-validator --home node1) --node-id $(chaind tendermint show-node-id --home node1)

chaind collect-gentxs --home node0

cp node0/config/genesis.json node1/config/genesis.json

chaind start --home node0 

chaind start --home node1 --p2p.seeds $(chaind tendermint show-node-id --home node0)@127.0.0.1:26656  --rpc.laddr tcp://127.0.0.1:26667 --p2p.laddr tcp://0.0.0.0:26666 --grpc.address 0.0.0.0:9000 --grpc-web.address 0.0.0.0:9001 --rpc.pprof_laddr 0.0.0.0:6070

五、节点交互

运行了一个节点之后,可以查询其中的数据或者发送签名交易,节点程序内置客户端功能,也可以使用其他方式与节点交互,可以参考文档cosmos sdk,一般通过--node参数指定节点地址(默认值:tcp://localhost:26656)

# 节点状态查询
chaind status

# 查询账户key0资产
chaind query bank balances $(chaind keys show key0 -a)

# 从账户key0到账户key1转账
chaind tx bank send key0 $(chaind keys show key1 -a) 1000000000000stake

# 账户key1委托给验证者账户key0
chaind tx staking delegate $(chaind keys show key0 --bech val -a) 100000000stake --from key1

# 查询账户key1的所有委托详情
chaind query staking delegations $(chaind keys show key1 -a)

# 查询账户key1的所有委托奖励
chaind query distribution rewards $(chaind keys show key1 -a)

# 领取账户key1的所有委托奖励(验证者是自委托)
chaind tx distribution withdraw-all-rewards --from key1

# 查询所有验证者详情(包括入狱的)
chaind query staking validators

# 查询所有验证者详情(实际参与共识的)
chaind query tendermint-validator-set

# 账户key1自委托成为验证者(绑定节点node1)
chaind tx staking create-validator --amount 1000000000stake --from key1 --pubkey $(chaind tendermint show-validator --home node1) --commission-rate 0.1 --commission-max-rate 0.2 --commission-max-change-rate 0.01 --min-self-delegation 1

# 把账户key1给验证者账户key0的委托取消
chaind tx staking unbond $(chaind keys show key0 --bech val -a) 100000000stake --from key1

# 把账户key1给验证者账户key1的自委托取消(可能会导致此验证者入狱)
chaind tx staking unbond $(chaind keys show key1 --bech val -a) 100000000stake --from key1

验证者入狱:保留验证者身份,但不参与共识流程,验证者身份无法撤销,但可以撤销验证者自质押的所有币,验证者有不良行为或质押币不够多时可能会入狱