Hashgard 客户端

Hashgard CLI

hashgardcli是一个工具,使您能够与 Hashgard 网络中的节点进行交互,无论您是否自己运行它。 让我们恰当的设置它。 要安装它,请按照安装步骤进行安装。

配置 hashgardcli

设置hashgardcli的主要命令如下:

hashgardcli config <flag> <value>

该命令能为每个标志设置默认值。

首先,设置要连接的全节点的地址:

hashgardcli config node <host>:<port

# example: hashgardcli config node https://77.87.106.33:26657

如果您运行自己的全节点,只需使用tcp://localhost:26657地址即可。

然后,让我们设置--trust-node标志的默认值:

hashgardcli config trust-node true

# Set to true if you trust the full-node you are connecting to, false otherwise

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

hashgardcli config chain-id cosmoshub-2

Key

Key类型

有如下类型的key:

  • gard
    • 从通过hashgardcli keys add生成的账户私钥中产生
    • 用于接收资金
    • 例如 gard15h6vd5f0wqps26zjlwrc6chah08ryu4hzzdwhc
  • gardvaloper
    • 用于关联一个验证人和其操作者
    • 用于发起staking操作命令
    • 例如 gardvaloper1carzvgq3e6y3z5kz5y6gxp3wpy3qdrv928vyah
  • gardpub
    • 从通过hashgardcli keys add生成的账户私钥中产生
    • 例如 gardpub1zcjduc3q7fu03jnlu2xpl75s2nkt7krm6grh4cc5aqth73v0zwmea25wj2hsqhlqzm
  • gardvalconspub
    • 在使用hashgard init创建节点时生成
    • 使用hashgard tendermint show-validator获得该值
    • 例如 gardvalconspub1zcjduepq0ms2738680y72v44tfyqm3c9ppduku8fs6sr73fx7m666sjztznqzp2emf

生成 Key

你需要一个帐户的私钥公钥对(分别称作skpk)才能接收资金,发送交易,绑定交易等等。

生成一个新的secp256k1密钥:

hashgardcli keys add <account_name>

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

hashgardcli keys add --recover

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

hashgardcli keys show <account_name>

通过下面的命令查看验证人操作者的地址:

hashgardcli keys show <account_name> --bech=val

你可以查看你所有的可以使用的密钥:

hashgardcli keys list

查看你节点的验证人公钥:

hashgard tendermint show-validator

请注意,这是Tendermint的签名密钥,而不是你在委托交易中使用的操作员密钥。

Warning

我们强烈建议不要对多个密钥使用相同的密码。Hashgard 团队和 Hashgard Foundation 将不承担资金损失的责任。

生成多签公钥

你可以生成一个多签公钥并将其打印:

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

K是将要对多签公钥发起的交易进行签名的最小私钥数。

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

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

多签地址也可以在运行中生成并通过以下命令打印:

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

有关如何生成多签帐户,使用其签名和广播多签交易的详细信息,请参阅多签交易

Tx 广播

在广播交易时,hashgardcli接受--broadcast-mode标识。 这个标识的值可以是sync(默认值)、asyncblock, 其中sync使客户端返回 CheckTx 响应,async使客户端立即返回,而block使得 客户端等待 tx 被提交(或超时)。

值得注意的是,在大多数情况下应该使用block模式。 这是因为广播可以超时但是 tx 仍然可能存在在块中,这可能导致很多不良结果。 因此,最好使用syncasync并通过 tx hash 查询以确定 tx 何时包含在块中。

Fees 和 Gas

每笔交易可能会提供 fees 或 gas price,但不能同时提供。

验证人可以配置最低 gas price(多币种的),并且在决定它们是否能被包含在区块中的CheckTx期间使用改值, 其中 gasPrices >= minGasPrices。请注意,你的交易必须提供大于或等于验证人要求的任何接受币种的费用。

注意:有了这样的机制,验证人可能会开始在 mempool 中通过 gasPrice 来优先处理某些 txs, 因此提供更高 fee 或 gas price可能会产生更高的tx优先级。

比如:

hashgardcli tx send ... --fees=50000agard

或:

hashgardcli tx send ... --gas-prices=0.025agard

账户

获取 Token

获取token的最佳方式是通过GARDBOX 钱包水龙头。 水龙头需要你打算用于抵押股权的gard开头的地址。

查询账户余额

在你的地址收到token后,你可以通过以下命令查看账户的余额:

hashgardcli query account <account_cosmos>

Note

当你查询余额为零的帐户时,你将收到以下错误:No account with address <account_cosmos> was found in the state. 如果你在节点与区块链完全同步之前就查询,也会发生这种情况。这些都很正常。

发送 Token

你可以通过如下命令从一个账户发送资金到另一个账户:

hashgardcli tx send <destination_cosmos> 10faucetToken \
  --chain-id=<chain_id> \
  --from=<key_name> 

Note

--amount标识接收格式:--amount=<value|coin_name>

Note

你可能希望通过--gas标识限制交易可以消耗的最大燃料。如果你通过--gas=auto,将在执行交易前自动估gas。 gas估算可能是不准确的,因为状态变化可能发生在模拟结束和交易的实际执行之间, 因此在原始估计之上应用调整以确保能够成功地广播交易。可以通过--gas-adjustment标识控制调整,其默认值为1.0。

现在,查看源账户和目标账户的更新后的余额:

hashgardcli query account <account_cosmos>
hashgardcli query account <destination_cosmos>

你还可以使用--block标识查询在特定高度区块下你的余额:

hashgardcli query account <account_cosmos> --block=<block_height>

你可以通过在命令行中附加--dry-run标识来模拟交易而不实际广播它:

hashgardcli tx send <destination_cosmosaccaddr> 10faucetToken \
  --chain-id=<chain_id> \
  --from=<key_name> \
  --dry-run

此外,你可以通过将--generate-only附加到命令行参数列表来构建交易并将其JSON格式打印到STDOUT:

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

Note

标识 --generate-only 只能在访问本地 keybase 时使用。

你可以通过下面的命令验证交易的签名:

hashgardcli tx sign --validate-signatures signedSendTx.json

你可以将由JSON文件提供的已签名的交易广播至指定节点:

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

查询交易

匹配一组tag

你可以使用交易搜索命令查询与每个交易上添加的特定标签集匹配的交易。

每个标签都由<tag>:<value>形式的键值对形成。还可以使用符号组合标签来查询更具体的结果。

使用标签查询交易的命令如下:

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

使用多个标签:

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

通过pagelimit来实现分页:

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

注意

action标签始终等于相关message的Type()函数返回的消息类型。

匹配一笔交易的hash

你一可以通过指定hash值查询该笔交易:

hashgardcli query tx [hash]

Slashing

Unjailing

将你入狱的验证人释放出狱:

hashgardcli tx slashing unjail --from <validator-operator-addr>

Signing Info

检索一个验证人的签名信息:

hashgardcli query slashing signing-info <validator-pubkey>

查询参数

你可以查询当前的slashing参数:

hashgardcli query slashing params

Staking

设置一个验证人

有关如何设置验证人候选者的完整指南,请参阅验证人设置章节

向一个验证人委托

一旦主网上线,你可以把GARD委托给一个验证人。这些委托人可以收到部分验证人的收益。 阅读委托人指南了解更多信息。

查询验证人

你可以查询指定链的验证人:

hashgardcli query staking validators

如果你想要获得单个验证人的信息,你可以使用下面的命令:

hashgardcli query staking validator <account_gardval>

绑定 Token

在 Hashgard 网络中,我们绑定agard1gard = 1000000000000000000agard。 你可以把token绑定在一个测试网验证人节点上(即委托):

hashgardcli tx staking delegate \
  --amount=10000000gard \
  --validator=<validator> \
  --from=<key_name> \
  --chain-id=<chain_id>

<validator>是你要委托的验证人的操作者地址。如果你运行的是本地testnet,可以通过以下方式找到:

hashgardcli keys show [name] --bech val

其中[name]是初始化hashgard时指定的键的名称。

虽然token是绑定的,但它们与网络中的所有其他绑定的token汇集在一起。验证人和委托人获得一定比例的股权, 这些股权等于他们在这个资产池中的抵押。

查询委托

一旦提交了一笔对验证人的委托,你可以使用下面的命令查看委托详情:

hashgardcli query staking delegation <delegator_addr> <validator_addr>

或者你想查看所有当前的委托:

hashgardcli query staking delegations <delegator_addr>

你还可以通过添加--height标识来获取先前的委托状态。

解绑 Token

如果出于一些原因验证人行为异常,或者你想解绑一定数量的token,请使用以下命令。

hashgardcli tx staking unbond \
  <validator_addr> \
  10atom \
  --from=<key_name> \
  --chain-id=<chain_id>

经过解绑期后,解绑自动完成。

查询Unbonding-Delegations

一旦你开始了一笔unbonding-delegation,你可以使用以下命令查看信息:

hashgardcli query staking unbonding-delegation <delegator_addr> <validator_addr>

或者你可以查看当前你所有的unbonding-delegation:

hashgardcli query staking unbonding-delegations <account_cosmos>

此外,你可以从特定验证人获取所有unbonding-delegation:

hashgardcli query staking unbonding-delegations-from <account_gardval>

要获取指定区块时的unbonding-delegation状态,请尝试添加--height标识。

重新委托token

重新授权是一种委托类型,允许你将非流动token从一个验证人上绑定到另一个验证人:

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

这里,你还可以使用shares-amountshares-fraction标识重新委托。

经过解绑期后,重新委托自动完成。

查询重新委托

开始重新授权后,你可以使用以下命令查看其信息:

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

或者,如果你可以检查所有当前的unbonding-delegation:

hashgardcli query staking redelegations <account_cosmos>

此外,你可以查询某个特定验证人的所有转出的重新绑定:

hashgardcli query staking redelegations-from <account_gardval>

添加--height标识来查询之前某个特定区块的redelegation。

查询参数

参数定义了staking的高级参数。你可以使用以下方法获取:

hashgardcli query staking params

使用上面的命令,你将获得以下值:

  • unbonding时间
  • 验证人的最大数量
  • 用于抵押的币种

所有这些值都将通过对一个ParameterChange提案的governance流程进行更新。

查询抵押池

一个抵押池定义了当前状态的动态参数。你可以通过以下命令查询:

hashgardcli query staking pool

使用pool命令,你将获得以下值:

  • 未绑定和已绑定的token
  • token总量
  • 当前的年度通货膨胀率以及上次发生通货膨胀的区块
  • 最后记录的绑定股权

查询对验证人的绑定

你可以查询对某个验证人的所有绑定:

hashgardcli query delegations-to <account_gardval>

治理

治理是 Hashgard 的用户可以就软件升级、参数或自定义文本提案并达成共识的过程。 这是通过对提案进行投票来完成的,提案将由主要网络上的GARD持有者提交。

关于投票过程的一些考虑因素:

  • 投票由绑定GARD的持有者以1个绑定的GARD对应1票方式投出
  • 委托人不投票的话会将票权继承给其验证人
  • 验证人必须对每个提案进行投票。如果验证人未对提案进行投票,则会对其进行削减处罚。
  • 投票期结束时(主网上是2周)统计投票。每个地址可以多次投票以更新其Option值(每次支付交易费用), 只有最后一次投票将被视为有效。
  • 选民可以选择YesNoNoWithVetoAbstain选项。在投票结束时, 如果( YesVotes / ( YesVotes + NoVotes + NoWithVetoVotes ) ) > 1/2( NoWithVetoVotes / ( YesVotes + NoVotes + NoWithVetoVotes )) < 1/3提案通过,否则就拒绝。

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

创建一个治理提案

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

提交一个文本类型的提案:

hashgardcli tx gov submit-proposal \
  --title=<title> \
  --description=<description> \
  --type="Text" \
  --deposit="1000000agard" \
  --from=<name> \
  --chain-id=<chain_id>

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

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

hashgardcli 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"
    }
  ]
}

Warning

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

正确审查参数变更提案应该可以防止这种情况发生(在治理过程中不会发生抵押),但无论如何都应该注意。

Note

目前不支持SoftwareUpgrade,因为它没有实现,目前与Text提议的语义没有区别。

查询提案

一旦创建,你就可以查询提案的信息:

hashgardcli query gov proposal <proposal_id>

或者查询所有的有效提案:

hashgardcli query gov proposals

你还可以使用voterdepositor标识来过滤查询提案。

要查询特定提案的提议人:

hashgardcli query gov proposer <proposal_id>

增加存入金

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

hashgardcli tx gov deposit <proposal_id> "10000000gard" \
  --from=<name> \
  --chain-id=<chain_id>

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

查询存入金

创建新提案后,你可以查询提交其所有存款:

hashgardcli query gov deposits <proposal_id>

你还可以查询特定地址提交的存入金:

hashgardcli query gov deposit <proposal_id> <depositor_address>

投票给一个提案

在提案的存入金达到MinDeposit后,投票期将开放。抵押了GARD的持有人可以投票:

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

查询投票

使用您刚才提交的参数检查投票:

hashgardcli query gov vote <proposal_id> <voter_address>

你还可以查询提交给所有此前投给指定提案的投票:

hashgardcli query gov votes <proposal_id>

查询提案的计票结果

要检查指定提案的当前计票,你可以使用tally命令:

hashgardcli query gov tally <proposal_id>

查询治理参数

要检查当前的治理参数,请运行:

hashgardcli query gov params

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

hashgardcli query gov param voting
hashgardcli query gov param tallying
hashgardcli query gov param deposit

费用分配

查询分配参数

查询当前的分配参数:

hashgardcli query distribution params

查询

查询当前未结算的(未提取)的奖励:

hashgardcli query distribution outstanding-rewards

查询验证人佣金

查询对一个验证人的未结算的佣金:

hashgardcli query distribution commission <validator_address>

查询验证人的削减处罚

查询一个验证人的处罚历史记录:

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

查询委托人奖励

查询某笔委托当前的奖励(如果要取回):

hashgardcli query distribution rewards <delegator_address> <validator_address>

查询所有的委托人奖励

要查询委托人的所有当前奖励(如果要取回),请运行:

hashgardcli query distribution rewards <delegator_address>

多签交易

多签交易需要多个私钥的签名。因此,从多签账户生成和签署交易涉及有关各方之间的合作。 密钥持有者的任何一方都可以发起多签,并且至少要有其中一方需要将其他账户的公钥导入到本地的数据库 并生成多签公钥来完成和广播该笔交易。

例如,给定包含密钥p1p2p3的多签密钥,每个密钥由不同方持有, 持有p1的用户将需要导入p2p3的公钥以生成多签帐户公钥:

hashgardcli keys add \
  p2 \
  --pubkey=cosmospub1addwnpepqtd28uwa0yxtwal5223qqr5aqf5y57tc7kk7z8qd4zplrdlk5ez5kdnlrj4

hashgardcli keys add \
  p3 \
  --pubkey=cosmospub1addwnpepqgj04jpm9wrdml5qnss9kjxkmxzywuklnkj0g3a3f8l5wx9z4ennz84ym5t

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

已存储新的多签公钥p1p2p3,其地址将用作多签交易的签名者:

hashgardcli keys show --address p1p2p3

您还可以通过查看 key 的 JSON 输出或增加--show-multisig标识来查看multisig阈值,pubkey构成和相应的权重:

hashgardcli keys show p1p2p3 -o json

hashgardcli keys show p1p2p3 --show-multisig

创建多签交易的第一步是使用上面创建的多签地址初始化:

hashgardcli tx send cosmos1570v2fq3twt0f0x02vhxpuzc9jc4yl30q2qned 10000000gard \
  --from=<multisig_address> \
  --generate-only > unsignedTx.json

unsignedTx.json文件包含以JSON编码的未签署交易。p1现在可以使用自己的私钥对交易进行签名:

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

生成签名后,p1unsignedTx.jsonp1signature.json都发送到p2p3, 然后p2p3将生成它们各自的签名:

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

p1p2p3 是 2-of-3 多签key,因此一个的签名就足够了。 现在,任何密钥持有者都可以通过组合所需的签名文件来生成多签交易:

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

现在可以把交易发送给节点:

hashgardcli tx broadcast signedTx.json

智能合约

Hashgard 在 cosmos-sdk 的基础上首次实现了智能合约虚拟机的支持。 开发者可以使用 Python 3.x 编写智能合约,在 Hashgard 虚拟机中运行。

智能合约编写

开发者可以使用 Python 3.x 编写智能合约,智能合约中支持的指令见Hashgard VM 指令集

智能合约部署

部署命令用法:

hashgardcli tx contract deploy [contract_code] [contract_name] [flags]

部署命令示例:

hashgardcli tx contract deploy sc-hello.hvm sc-hello --from foo

智能合约调用

合约调用命令用法:

hashgardcli tx contract call [contract_address] [params] [flags]

合约调用命令示例:

hashgardcli tx contract call contract60cb028ff7e2cbf5d9883577ef6caf6c6c045b0b "string:hello,[string:world]" --from foo

智能合约查询

查询命令:

  1. query contract detail 查询合约部署信息。
  2. query contract method 查询合约中提供的查询方法。
  3. query contract data 查询合约内部状态信息。
  4. query contract token 查询合约发行的代币信息。

查询合约部署信息命令用法及示例:

hashgardcli query contract detail [contract_address] [flags]
hashgardcli query contract detail contract60cb028ff7e2cbf5d9883577ef6caf6c6c045b0b

查询合约的查询方法命令用法及示例:

hashgardcli query contract method [contract_address] [params] [flags]
hashgardcli query contract method contract60cb028ff7e2cbf5d9883577ef6caf6c6c045b0b "string:hello,[string:world]"

查询合约内部状态信息命令用法及示例:

hashgardcli query contract data [contract_address] [flags]
hashgardcli query contract data contract60cb028ff7e2cbf5d9883577ef6caf6c6c045b0b

查询合约发行的代币信息命令用法及示例:

hashgardcli query contract token [contract_address] [flags]
hashgardcli query contract token contract60cb028ff7e2cbf5d9883577ef6caf6c6c045b0b

shell 自动补全脚本

可以通过完全命令生成主流的UNIX shell解释器(如BashZsh)的completion命令, 该命令可用于hashgardhashgardcli

如果要生成Bash完成脚本,请运行以下命令:

hashgard completion > hashgard_completion
hashgardcli completion > hashgardcli_completion

如果要生成Zsh完成脚本,请运行以下命令:

hashgard completion --zsh > hashgard_completion
hashgardcli completion --zsh > hashgardcli_completion

::: 在大多数UNIX系统上,可以在.bashrc.bash_profile中加载此类脚本以启用Bash自动完成:

echo '. hashgard_completion' >> ~/.bashrc
echo '. hashgardcli_completion' >> ~/.bashrc

有关如何启用shell自动完成的信息,请参阅操作系统提供的解释器用户手册。 :::

Last Updated: 9/29/2019, 4:35:51 PM