当前位置: 首页 > 工具软件 > cosmos4j > 使用案例 >

Cosmos开发(三)通过Gaia 客户端完成一笔交易去了解gaia网络的功能。

连德义
2023-12-01

今天,我们学习一下gaia客户端gaiacli,gaiacli是一种客户端工具,是让你与cosmos Hub网络进行交互的。类似以太坊geth客户端,EOS网络中cleos客户端。

参考地址:https://github.com/cosmos/gaia/blob/master/docs/gaiacli.md

1、设置你的客户端 gaiacli

gaiacli config < flag >  < value >

它允许您为每个给定标志设置默认值。
首先,设置要连接的全节点的地址:

gaiacli config node < host >:< port # example:gaiacli config node https://77.87.106.33:26657

如果您运行自己的全节点,只需使用tcp://localhost:26657地址即可。
然后,让我们设置–trust-node标志的默认值:

gaiacli config trust-node true 

#如果您信任要连接的全节点,则设置为true,否则设置为false

最后,让我们设置chain-id我们想要与之交互的区块链:

gaiacli config chain-id cosmoshub-2

2、Keys
Key Types
使用了三种类型的键表示:

  • cosmos
    1. 生成账户私钥,命令如下:gaiacli keys add
    2. 收款:cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292
  • cosmosvaloper
    1. 用于将验证器与其运算符相关联;
    2. 用于调用放样命令;例如 cosmosvaloper1carzvgq3e6y3z5kz5y6gxp3wpy3qdrv928vyah
  • cosmospub
    1. 用来生成账户私钥 gaiacli keys add
  • cosmosvalconspub
    1. 创建节点时生成 gaiad init
    2. 获得此值 gaiad tendermint show-validator

3、生成私钥
您需要一个帐户私钥和公钥对(也称为sk, pk分别)用来收款和转账。
生成新的私钥,采用secp256k1的加密方式:

gaiacli keys add < account_name >

接下来,您必须创建一个密码来保护磁盘上的密钥。上述命令的输出将包含种子短语。建议将种子短语保存在安全的地方,以便在忘记密码的情况下,最终可以使用以下命令从种子短语重新生成密钥:

gaiacli keys add <keys_name> --recover

如果你检查你的私钥,你现在会看到<account_name>:

gaiacli keys show < account_name >

通过以下方式查看验证人操作员的地址:

gaiacli keys show <account_name> --bech=val

您可以输入以下内容查看所有可用密钥:

gaiacli keys list

键入以下命令查看节点的验证器pubkey:

gaiad tendermint show-validator

请注意,这是Tendermint签名密钥,而不是您将在委派事务中使用的操作员密钥。
:::危险警告我们强烈建议不要对多个密钥使用相同的密码。Tendermint团队和Interchain Foundation将不承担资金损失的责任。:::

4、生成多重签名(Multisig)公钥

通过以下命令来生成并打印多重公钥:

gaiacli keys add --multisig = name1,name2,name3 [...] --multisig-threshold = K new_key_name

K 是必须签署带有公钥地址作为签名者的事务的最小私钥数。

该–multisig标志必须包含公钥的名称,这些公钥将组合成一个公钥,该公钥将new_key_name在本地数据库中生成和存储。提供的所有名称–multisig必须已存在于本地数据库中。除非–nosort设置了标志,否则在命令行上提供密钥的顺序无关紧要,即以下命令生成两个相同的密钥:

gaiacli keys add --multisig = foo,bar,baz --multisig-threshold = 2 multisig_address 
gaiacli keys add --multisig = baz,foo,bar --multisig-threshold = 2 multisig_address

Multisig地址也可以在运行中生成并通过which命令打印:

gaiacli keys show --multisig-threshold K name1 name2 name3 [...]

有关如何使用多签名帐户生成,签名和广播事务的详细信息,请参阅Multisig事务。

5、Tx Broadcasting 交易广播
广播交易时,gaiacli接受一个–broadcast-mode标志。此标志的值可以是sync(default),async或者block,其中sync使客户端返回CheckTx响应,async使客户端立即返回,block并使客户端等待tx被提交(或超时)。

值得注意的是,这是很重要的block模式应该不会在大多数情况下使用。这是因为广播可以超时但是tx仍然可以包括在块中。这可能导致许多不良情况。因此,最好使用sync或async通过tx hash查询以确定tx何时包含在块中。
6、Fees & Gas
每笔交易需要提供一些交易费用或者gas,不是说,两个都必须要。
验证器的具有最小气体价格(多DENOM)构型并且它们使用确定何时当该值,如果它们应包括过程中以块中的事务CheckTx,其中gasPrices >= minGasPrices。请注意,您的交易必须提供大于或等于验证者要求的任何面额的费用。

注意:有了这样的机制,验证器可能会开始gasPrice在mempool中优先考虑txs ,因此提供更高的费用或汽油价格可能会产生更高的tx优先级。

例如

gaiacli tx发送... --fees = 50000uatom

或者

gaiacli tx发送...  -  gas-prices = 0.025uatom

7、Account
获取token
获得令牌的最佳方式来自Cosmos Testnet龙头。如果水龙头不适合您,请尝试询问#cosmos-validators。水龙头需要cosmos您希望用于放样的帐户。

8、Query Account Balance
收到代币到您的地址后,您可以输入以下内容查看帐户的余额:

gaiacli query account <account_cosmos>

::: warning注意当您使用零令牌查询帐户余额时,您将收到以下错误:No account with address <account_cosmos> was found in the state.如果您在节点与链完全同步之前为帐户提供资金,也会发生这种情况。这些都很正常。:::

9、Send Tokens 发送交易
以下命令可用于将硬币从一个帐户发送到另一个帐户:

gaiacli tx send <sender_key_name_or_address> <recipient_address> 10faucetToken \
  --chain-id=<chain_id>

我们开始做一笔转账交易
查询发送者账户余额

cuijb@cuijb-VirtualBox:~$ gaiacli q account cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292 --chain-id gaia-13006
|
  address: cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292
  coins:
  - denom: muon
    amount: "9999890"
  pubkey: cosmospub1addwnpepqwcrhu5a7uwj5xf72u24m342nzs232r6szfw8fp8htk6j7vxcpp9van3zpw
  accountnumber: 45197
  sequence: 3

余额: amount: “9999890”

查询接收者余额

cuijb@cuijb-VirtualBox:~$ gaiacli q account cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2 --chain-id gaia-13006
|
  address: cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2
  coins:
  - denom: muon
    amount: "10097612"
  pubkey: cosmospub1addwnpepqdd0y6rq6wl2ynkyl0ccrjq8gd9etmfwshmvtv3l58j3mdknthpl69qjk29
  accountnumber: 44509
  sequence: 1

余额 :amount: “10097612”
我们从发送者账户转账100muon到接收者账户,然后,再查询两个账户。

cuijb@cuijb-VirtualBox:~$ gaiacli tx send cjb  cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2  100muon  --chain-id gaia-13006
{"chain_id":"gaia-13006","account_number":"45197","sequence":"3","fee":{"amount":[],"gas":"200000"},"msgs":[{"type":"cosmos-sdk/MsgSend","value":{"from_address":"cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292","to_address":"cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2","amount":[{"denom":"muon","amount":"100"}]}}],"memo":""}

confirm transaction before signing and broadcasting [y/N]: y
Password to sign with 'cjb':
height: 0
txhash: BE8987BB9F5BB2214A43E8B30010BCF5951387226760B70FB6309EA4663EB6B0
code: 0
data: ""
rawlog: '[{"msg_index":0,"success":true,"log":""}]'
logs:
- msgindex: 0
  success: true
  log: ""
info: ""
gaswanted: 0
gasused: 0
events: []
codespace: ""
tx: null
timestamp: ""

查询发送者账户

cuijb@cuijb-VirtualBox:~$ gaiacli q account cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292 --chain-id gaia-13006
|
  address: cosmos1zdkfdqr7uj4cd3vrz2grg3ypy3adajvxsdu292
  coins:
  - denom: muon
    amount: "9999790"
  pubkey: cosmospub1addwnpepqwcrhu5a7uwj5xf72u24m342nzs232r6szfw8fp8htk6j7vxcpp9van3zpw
  accountnumber: 45197
  sequence: 4

余额: amount: “9999790” 发送前 余额:amount: “9999890” 明显看到,少了100个单位

查询接受者账户

cuijb@cuijb-VirtualBox:~$ gaiacli q account cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2 --chain-id gaia-13006
|
  address: cosmos1nrztc90apf8du9xw85dm0hq2mfyx5syqy8elt2
  coins:
  - denom: muon
    amount: "10097712"
  pubkey: cosmospub1addwnpepqdd0y6rq6wl2ynkyl0ccrjq8gd9etmfwshmvtv3l58j3mdknthpl69qjk29
  accountnumber: 44509
  sequence: 1

余额: amount: “10097712” 接收前余额 :amount: “10097612”,明显看到增加了100个单位。
转账成功。
10、您可以通过将–dry-run标志附加到命令行来模拟事务而不实际广播它 :

gaiacli tx send < sender_key_name_or_address >  < destination_cosmosaccaddr > 10faucetToken \
  --chain-id = < chain_id > \
  --dry-run

11、此外,您可以通过附加–generate-only到命令行参数列表来构建事务并将其JSON格式打印到STDOUT :

gaiacli tx send < sender_address >  < recipient_address > 10faucetToken \
  --chain-id = < chain_id > \
  --generate-only > unsignedSendTx.json
gaiacli tx sign
  --chain-id = < chain_id > \
  --from = < key_name > \
  unsignedSendTx.json > signedSendTx.json

::: tip注意该–generate-only标志阻止gaiacli访问本地密钥库。因此,当提供这样的标志时<sender_key_name_or_address>必须是地址。:::

12、您可以通过键入以下内容来验证事务的签名:

gaiacli tx sign --validate-signatureatures signedSendTx.json

13、您可以通过将JSON文件提供给以下命令,将已签名的事务广播到节点:

gaiacli tx broadcast --node = < node > signedSendTx.json

14、查询交易
匹配一组标签
您可以使用事务搜索命令查询与tags每个事务上添加的特定集匹配的事务。

每个标签都由一个键值对符合:。还可以组合标签以使用&符号查询更具体的结果。

使用a查询事务的命令tag如下:

gaiacli query txs --tags = ' <tag>:<value> '

并使用多个tags:

gaiacli query txs --tags = ' <tag1>:<value1>&<tag2>:<value2> '

分页支持,以及通过page和limit:

gaiacli query txs --tags = ' <tag>:<value> ' - page = 1 --limit = 20

您还可以使用以下命令通过其哈希查询单个事务:

gaiacli query tx [hash]

15、签名信息
要检索验证者的签名信息:

gaiacli query slashing signing-info <validator-pubkey>

16、查询参数
您可以通过以下方式获取当前的削减参数:

gaiacli query slashing params

17、挖矿
您可以通过以下方式查询挖矿/膨胀参数:

gaiacli query mint params
cuijb@cuijb-VirtualBox:~/gaiadata/test$ gaiacli q mint params
mint_denom: muon
inflation_rate_change: "0.130000000000000000"
inflation_max: "0.200000000000000000"
inflation_min: "0.070000000000000000"
goal_bonded: "0.670000000000000000"
blocks_per_year: 4855015

要查询当前的通胀值:

gaiacli query mint inflation
cuijb@cuijb-VirtualBox:~/gaiadata/test$ gaiacli query mint inflation
"0.188046665229348070"

要查询当前的年度拨备值:

gaiacli query mint annual-provisions
cuijb@cuijb-VirtualBox:~$ gaiacli query mint annual-provisions
"2226997224450.737688768336604800"

18、抵押
设定验证人(生产节点)
查询验证人
您可以查询特定链的所有验证器列表:

gaiacli query staking validators

如果您想获得单个验证器的信息,可以查看:

gaiacli query staking validator <account_cosmosval>

具体抵押问题,可以查看我的上面一篇文章《 Cosmos开发(二)Gaia 在测试网中运行一个验证人》,这里在再赘述。

19、重新授予令牌
重新授权是一种类型委派,允许您将非流动令牌从一个验证者绑定到另一个验证者:

gaiacli tx staking redelegate \
  <src-validator-operator-addr> \
  <dst-validator-operator-addr> \
  10atom \
  --from=<key_name> \
  --chain-id=<chain_id>

在这里,您还可以使用相应的标志重新显示特定shares-amount或a shares-fraction。

当无约束期过去时,重新授权将自动完成。
20、查询重新授权
开始重新授权后,您可以使用以下命令查看其信息:

gaiacli query staking redelegation <delegator_addr> <src_val_addr> <dst_val_addr>

或者,如果要使用不同的验证器检查所有当前的未绑定委托:

gaiacli query staking redelegations-from <account_cosmosval>

21、查询参数
参数定义放样的高级设置。您可以使用以下方法获取当前值:

gaiacli query staking params

22、查询池
抵押池Pool定义了当前状态的动态参数。您可以使用以下命令查询它们:

gaiacli query staking pool

23、查询委托给验证者
您还可以查询特定验证器的所有委托:

  gaiacli query delegations-to <account_cosmosval>

24、社区治理
治理是Cosmos Hub中的用户可以通过文本提议就软件升级,主网络参数或信令机制达成共识的过程。这是通过对提案进行表决来完成的,提案将由ATOM主网上的持有人提交。
关于投票过程的一些考虑因素:

  • 投票由ATOM债券持有人以ATOM1票1票的方式进行
  • 如果他们不投票,代表们继承其验证人的投票
  • 投票期结束时(主网上2周),每个地址可以多次投票以更新其Option价值(每次支付交易费用), 只有最近投票的投票才算有效
  • 选民可以选择之间进行选择Yes,No,NoWithVeto和Abstain
  • 在投票期结束时,如果:
    1. (YesVotes / (YesVotes+NoVotes+NoWithVetoVotes)) > 1/2
    2. (NoWithVetoVotes / (YesVotes+NoVotes+NoWithVetoVotes)) < 1/3
    3. ((YesVotes+NoVotes+NoWithVetoVotes) / totalBondedStake) >= quorum

有关治理流程及其工作原理的更多信息,请查看治理模块规范。

25、创建治理建议
要创建治理建议,您必须提交初始存款以及标题和说明。治理之外的各种模块可以实现自己的提议类型和处理程序(例如,参数更改),其中治理模块本身支持Text提议。治理之外的任何模块都将命令安装在其上submit-proposal。
提交Text提案:

gaiacli tx gov submit-proposal \ 
  --title = < title > \ 
  --description = < description > \ 
  --type = “ Text ” \ 
  --deposit = “ 1000000uatom ” \ --from 
  = < name > \ 
  --chain -id = < chain_id >

您也可以直接通过–proposal指向包含提案的JSON文件的标志提供提案。

要提交参数更改提议,您必须提供提案文件,因为其内容对CLI输入不太友好:

gaiacli tx gov submit-proposal param-change < path / to / proposal.json > \ 
  --from = < name > \ 
  --chain-id = < chain_id >

其中proposal.json包含以下内容:

{
  "title": "Param Change",
  "description": "Update max validators",
  "changes": [
    {
      "subspace": "staking",
      "key": "MaxValidators",
      "value": 105
    }
  ],
  "deposit": [
    {
      "denom": "stake",
      "amount": "10000000"
    }
  ]
}

:::危险警告
目前,参数更改已经过评估但未经过验证,因此value对于其相应参数,任何更改都是有效的(即正确类型和边界内)非常重要,例如。MaxValidators应该是整数而不是小数。

正确审查参数变更提案应该可以防止这种情况发生(在治理过程中不会发生存款),但无论如何都应该注意。
:::
:::提示注意
的SoftwareUpgrade,因为它是没有实现,目前不从的语义不同,目前不支持Text的建议。
:::
查询提案
创建后,您现在可以查询提案的信息:

gaiacli query gov proposal <proposal_id>

或查询所有可用的提案:

gaiacli query gov proposals

您还可以查询通过voter或depositor使用相应标志过滤的提案。

要查询给定治理建议的提议者:

gaiacli query gov proposer <proposal_id>

26、增加存款
为了将提案广播到网络,存入的金额必须高于一个minDeposit值(初始值:) 512000000uatom。如果您之前创建的提案不符合此要求,您仍可以增加存入的总金额以激活它。达到最低存款后,提案进入投票期:

gaiacli tx gov deposit < proposal_id >  “ 10000000uatom ” \ 
  --from = < name > \ 
  --chain-id = < chain_id >

注意:达到此要求后,将删除不符合此要求的提案MaxDepositPeriod。

27、查询存款

创建新提案后,您可以查询提交给它的所有存款:

gaiacli query gov deposits <proposal_id>

您还可以查询特定地址提交的存款:

gaiacli query  gov deposit < proposal_id >  < depositor_address >

28、投票提案
提案存款达到MinDeposit价值后,投票期开始。保税Atom持有人可以投票:

gaiacli tx gov vote <proposal_id> <Yes/No/NoWithVeto/Abstain> \
  --from=<name> \
  --chain-id=<chain_id>

29、查询投票
使用您刚刚提交的选项检查投票:

gaiacli query gov vote <proposal_id> <voter_address>

您还可以获得提交给提案的所有先前投票:

gaiacli query gov votes <proposal_id>

30、查询提案计算结果

要检查给定提案的当前计数,您可以使用以下tally命令:

gaiacli query gov tally <proposal_id>

31、查询治理参数
查询当前治理参数,运行如下命令:

gaiacli query gov params

要查询运行的治理参数的子集:

gaiacli query gov param voting
gaiacli query gov param tallying
gaiacli query gov param deposit

32、费用分配
查询分发参数
要检查当前分发参数,请运行:

gaiacli query distribution params

33、查询分发社区池
要查询受治理控制的社区池中的所有硬币:

gaiacli query distribution community-pool

34、查询优秀奖励
要检查当前未结(未撤回)奖励,请运行:

gaiacli query distribution validator-outstanding-rewards

35、查询验证器委员会
要检查验证器当前的未结佣金,请运行:

gaiacli query distribution commission <validator_address>

36、查询验证人的减持
查询验证人的历史减持,请运行:

gaiacli query distribution slashes <validator_address> <start_height> <end_height>

37、查询委托人奖励
要检查代理的当前奖励(如果要撤回),请运行:

gaiacli query distribution rewards <delegator_address> <validator_address>

38、查询所有代理商奖励
要检查委托的所有当前奖励(如果要撤销),请运行:

gaiacli query distribution rewards <delegator_address>

39、多重签名交易
多重签名事务需要多个私钥的签名。因此,从多重账户生成和签署交易涉及有关各方之间的合作。任何密钥持有者都可以发起多重签名事务,并且其中至少有一个需要将其他方的公钥导入其密钥库并生成多重公钥以便最终确定和广播该事务。

例如,给定一个键multisig包括键p1,p2和p3,其中的每一个由不同方保持,用户保持p1将需要同时导入p2并p3在为了产生multisig帐户公钥

gaiacli keys add \
  p2 \
  --pubkey=cosmospub1addwnpepqtd28uwa0yxtwal5223qqr5aqf5y57tc7kk7z8qd4zplrdlk5ez5kdnlrj4

gaiacli keys add \
  p3 \
  --pubkey=cosmospub1addwnpepqgj04jpm9wrdml5qnss9kjxkmxzywuklnkj0g3a3f8l5wx9z4ennz84ym5t

gaiacli keys add \
  p1p2p3 \
  --multisig-threshold=2 \
  --multisig=p1,p2,p3

p1p2p3已存储新的multisig公钥,其地址将用作multisig事务的签名者:

gaiacli keys show --address p1p2p3

您还可以通过查看密钥的JSON输出或传递–show-multisig标记来查看multisig阈值,pubkey组件和相应的权重:

gaiacli keys show p1p2p3 -o json
gaiacli keys show p1p2p3 --show-multisig

创建multisig事务的第一步是代表上面创建的multisig地址启动它:

gaiacli tx send cosmos1570v2fq3twt0f0x02vhxpuzc9jc4yl30q2qned 1000000uatom \
  --from=<multisig_address> \
  --generate-only > unsignedTx.json

该文件unsignedTx.json包含以JSON编码的无符号事务。 p1现在可以使用自己的私钥对事务进行签名:

gaiacli tx sign \
  unsignedTx.json \
  --multisig=<multisig_address> \
  --from=p1 \
  --output-document=p1signature.json 

生成签名后,将p1传输unsignedTx.json和 传输p1signature.json,p2或者p3生成其各自的签名:

gaiacli tx sign \
  unsignedTx.json \
  --multisig=<multisig_address> \
  --from=p2 \
  --output-document=p2signature.json

p1p2p3是一个2比3的多重键,因此一个额外的签名就足够了。现在,任何密钥持有者都可以通过组合所需的签名文件来生成multisig事务:

gaiacli tx multisign \ 
  unsignedTx.json \ 
  p1p2p3 \ 
  p1signature.json p2signature.json > signedTx.json

现在可以将事务发送到节点:

gaiacli tx broadcast signedTx.json

2019年9月10日于深圳。

 类似资料: