cosmos 运行
运行基于 cosmos sdk 开发的区块链程序
一、环境
- 操作系统:linux
- go 版本:1.20.4 以上
- ignite 版本:0.27.1 以上
二、约定
- 开发区块链应用程序可以参考文档 ignite
- 为了方便运行 go 语言程序,需要将目录
$HOME/go/bin/
加入到环境变量 PATH 里面 - 可以在项目根目录运行
ignite chain build
命令来生成二进制程序(通常放到目录$HOME/go/bin/
) - 为了方便解说,可以为区块链程序统一起个别名,例如:
alias chaind=gaiad
- 程序可以使用
-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
:节点 idchaind 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
验证者入狱:保留验证者身份,但不参与共识流程,验证者身份无法撤销,但可以撤销验证者自质押的所有币,验证者有不良行为或质押币不够多时可能会入狱