剖析Cosmos SDK(十六):运行节点、API 和 CLI(1)

煤油灯科技2022-07-28 10:01

设置keyring

本文描述了如何为应用程序配置和使用keyring及其各种后端。

keyring包含用于与节点交互的私钥/公钥对。例如,需要在运行区块链节点之前设置验证器密钥,以便正确签署区块。 私钥可以存储在不同的位置,称为“后端”,例如文件或操作系统自己的密钥存储。

keyring的可用后端

从v0.38.0版本开始,Cosmos SDK附带了一个新的keyring实现,它提供了一组命令来以安全的方式管理加密密钥。 新的keyring支持多个存储后端,其中一些可能不适用于所有操作系统。

os后端

os后端依赖于操作系统特定的默认值来安全地处理密钥存储。通常,操作系统的凭证子系统根据用户的密码策略处理密码提示、私钥存储和用户会话。以下是最流行的操作系统及其各自的密码管理器的列表:

  • macOS(自Mac OS 8.6起):Keychain
  • Windows:凭据管理API
  • GNU/Linux:

libsecret

kwallet

使用GNOME作为默认桌面环境的GNU/Linux发行版通常附带Seahorse。 基于KDE的发行版的用户通常使用KDE钱包管理器。虽然前者实际上是一个 ibsecret方便的前端,但后者是一个kwallet客户端。

os是默认选项,因为操作系统的默认凭证管理器是为了满足用户最常见的需求,在不影响安全的情况下为他们提供舒适的体验。

建议无头环境的后端是文件和传递。

文件后端

文件后端更接近于0.38.1版之前使用的钥匙库实现。它在应用程序的配置目录中加密存储keyring。这个钥匙圈在每次被访问时都会要求输入密码,这在一个命令中可能会出现多次,导致重复的密码提示。如果使用bash脚本来执行使用文件选项的命令,可能想利用以下格式来进行多次提示。

# assuming that KEYPASSWD is set in the environment
$ gaiacli config keyring-backend file                             # use file backend
$ (echo $KEYPASSWD; echo $KEYPASSWD) | gaiacli keys add me        # multiple prompts
$ echo $KEYPASSWD | gaiacli keys show me                          # single prompt

第一次将密钥添加到空 keyring时,系统会提示输入两次密码。

通行证后端

通行证后端使用通行证实用程序来管理密钥敏感数据和元数据的磁盘加密。密钥存储在应用程序特定目录中的gpg加密文件中。pass 适用于最流行的UNIX操作系统以及GNU/Linux发行版。有关如何下载和安装它的信息,请参阅其手册页。

pass使用GnuPG进行加密。gpg在执行时会自动调用gpg-agent守护进程,该守护进程处理GnuPG凭据的缓存。有关如何配置缓存参数(例如凭据TTL和密码过期)的更多信息,请参阅gpg-agent手册页。

密码存储必须在首次使用前设置:

pass init <GPG_KEY_ID>

将<GPG_KEY_ID>替换为GPG密钥ID。可以使用个人GPG密钥或可能想要专门用于加密密码存储的替代密钥。

kwallet的后端

kwallet后端使用KDE钱包管理器,该管理器默认安装在以KDE为默认桌面环境的GNU/Linux发行版中。请参考KWallet手册了解更多信息。

测试后端

测试后端是一个没有密码的文件后端的变种。密钥未加密地存储在磁盘上。

仅为测试目的而提供。测试后端不建议在生产环境中使用。

内存后端

内存后端在内存中存储密钥。程序退出后,钥匙会立即被删除。

仅为测试目的而提供。不建议在生产环境中使用内存后端。

将钥匙添加到keyring中

请确保能构建自己的二进制文件,并在代码段中用二进制文件的名称替换simd。

使用Cosmos SDK开发的应用程序自带keys子命令。在本教程中,我们将运行simd CLI,它是一个使用Cosmos SDK开发的应用程序,用于测试和教育目的。欲了解更多信息,请参见simapp。

可以使用simd keys获得关于keys命令的帮助,simd keys [command] --help获得关于某个特定子命令的更多信息。

也可以用simd completion命令启用自动补全功能。例如,在一个bash会话的开始,运行. <(simd completion),所有simd子命令都会被自动完成。

要在keyring中创建一个新的钥匙,运行带有<key_name>参数的add子命令。在本教程中,我们将只使用测试后端,并称我们的新钥匙为my_validator。这把钥匙将在下一节中使用。

$ simd keys add my_validator --keyring-backend test

# Put the generated address in a variable for later use.
MY_VALIDATOR_ADDRESS=$(simd keys show my_validator -a --keyring-backend test)

该命令生成一个新的24词助记词,将其持久化到相关后端,并输出有关密钥对的信息。 如果此密钥对将用于保存具有价值的令牌,请务必在安全的地方写下助记词!

默认情况下,keyring会生成一个secp256k1密钥对。keyring还支持ed25519密钥,可以通过传递--algo ed25519标志来创建。keyring当然可以同时持有这两种类型的密钥,并且Cosmos SDK的x/auth模块(尤其是它的中间件)本身就支持这两种公钥算法。


运行节点

现在应用程序已准备好并且keyring已填充,是时候看看如何运行区块链节点了。在本节中,我们正在运行的应用程序称为simapp,及其对应的CLI二进制simd。

初始化链

确保可以构建自己的二进制文件,并将simd替换为片段中二进制文件的名称。

在实际运行节点之前,我们需要初始化链,最重要的是它的genesis文件。 这是通过init子命令完成的:

# The argument <moniker> is the custom username of your node, it should be human-readable.
simd init <moniker> --chain-id my-test-chain

上面的命令创建了节点运行所需的所有配置文件,以及一个默认的genesis文件,它定义了网络的初始状态。默认情况下,所有这些配置文件都在~/.simapp中,但可以通过传递--home标志来覆盖此文件夹的位置。

~/.simapp文件夹具有以下结构:

.                                   # ~/.simapp
  |- data                           # Contains the databases used by the node.
  |- config/
      |- app.toml                   # Application-related configuration file.
      |- config.toml                # Tendermint-related configuration file.
      |- genesis.json               # The genesis file.
      |- node_key.json              # Private key to use for node authentication in the p2p protocol.
      |- priv_validator_key.json    # Private key to use as a validator in the consensus protocol.

更新一些默认设置

如果想更改配置文件中的任何字段值(例如:genesis.json),可以使用jq (installation (opens new window)&docs )&sed命令来做到这一点。这里列出了几个例子:

# to change the chain-id
jq '.chain_id = "testing"' genesis.json > temp.json && mv temp.json genesis.json

# to enable the api server
sed -i '/\[api\]/,+3 s/enable = false/enable = true/' app.toml

# to change the voting_period
jq '.app_state.gov.voting_params.voting_period = "600s"' genesis.json > temp.json && mv temp.json genesis.json

# to change the inflation
jq '.app_state.mint.minter.inflation = "0.300000000000000000"' genesis.json > temp.json && mv temp.json genesis.json

添加Genesis账户

在启动链之前,需要使用至少一个账户填充状态。为此,首先在测试密钥环后端下名为my_validator的keyring中创建一个新帐户(随意选择另一个名称和另一个后端)。

现在已经创建了一个本地帐户,继续在链的genesis文件中授予它一些权益代币。这样做还可以确保连锁店知道此帐户的存在:

simd add-genesis-account $MY_VALIDATOR_ADDRESS 100000000000stake

回顾一下,$MY_VALIDATOR_ADDRESS是一个变量,用于保存钥匙圈中my_validator钥匙的地址。还请注意,Cosmos SDK中的代币有{amount}{denom}的格式:金额是18位精确的十进制数字,denom是唯一的代币标识符,并有其面值密钥(例如atom或uatom)。在这里,我们授予的是stake代币,因为stake是在simapp中用于stake的代币标识。对于自己的链,有自己的赌注面额,应该使用该代币标识符来代替。

现在账户有一些代币,需要在链上添加一个验证器。验证者是特殊的全节点,他们参与共识过程(在底层共识引擎中实现),以便向链上添加新的区块。任何账户都可以声明其成为验证者的意图,但只有那些有足够授权的账户才能进入活跃的集合(例如,只有拥有最多授权的前125名验证者候选人才能成为宇宙中心的验证者)。在本指南中,将把本地节点(通过上面的init命令创建)作为链的验证者。验证器可以在链条首次启动前通过Genesis文件中的一个特殊交易(称为gentx)来声明。

# Create a gentx.
simd gentx my_validator 100000000stake --chain-id my-test-chain --keyring-backend test

# Add the gentx to the genesis file.
simd collect-gentxs

gentx做三件事:

  • 将创建的验证器账户注册为验证器操作员账户(即控制验证器的账户)。
  • 自我授权所提供的质押代币的数量。
  • 用Tendermint节点的pubkey链接操作者账户,该pubkey将用于签署区块。如果没有提供-pubkey标志,它默认为通过上述simd init命令创建的本地节点pubkey。

关于gentx的更多信息,请使用以下命令。

simd gentx --help

使用app.toml和config.toml配置节点

Cosmos SDK在~/.simapp/config中自动生成了两个配置文件:

  • config.toml:用于配置Tendermint,了解更多关于Tendermint的文档。
  • app.toml:由Cosmos SDK生成,用于配置应用程序,如状态修剪策略、遥测、gRPC和REST服务器配置、状态同步...

这两个文件都有大量的注释,请直接参考它们来调整你的节点。

一个需要调整的配置例子是app.toml里面的minimum-gas-prices字段,它定义了验证器节点在处理一个交易时愿意接受的最低汽油价格。根据不同的链,它可能是一个空字符串,也可能不是。如果它是空的,请确保用一些值来编辑这个字段,例如10token,否则节点将在启动时停止工作。为了本教程的目的,让我们把最低汽油价格设置为0。

 # The minimum gas prices a validator is willing to accept for processing a
 # transaction. A transaction's fees must meet the minimum of any denomination
 # specified in this config (e.g. 0.25token1;0.0001token2).
 minimum-gas-prices = "0stake"

运行一个本地网络

现在一切都设置好了,终于可以启动节点了。

simd start --mode validator

注意:默认情况下,节点以全节点模式运行。运行本地网络意味着在大多数情况下,该节点是网络中唯一的节点,需要设置模式。

应该看到块进来了。

前面的命令允许运行一个单一的节点。这对于下一节与该节点的互动来说已经足够了,但可能希望同时运行多个节点,看看它们之间的共识是如何发生的。

天真的方法是在不同的终端窗口中再次运行相同的命令。这是可能的,但是在Cosmos SDK中,我们利用Docker Compose的力量来运行一个本地网络。如果需要关于如何用Docker Compose建立自己的本地网络的灵感,可以看看Cosmos SDK的docker-compose.yml。


原文链接:https://docs.cosmos.network/main/run-node/run-node.html


---煤油灯科技victorlamp.com翻译整理---


你可能也喜欢这些文章

科技互联网,科技,资讯,动态,洞察,量子,计算,AI,人工智能,机器人,区块链,Web3,分布式,操作系统,OS,芯片,视频,深度,论文