Skip to content

治理

摘要

本文明确了治理模块。

該模組使基於 Cosmos-SDK 的區塊鏈能夠支持鏈上治理系統。 在此系統中,鏈的原生抵押代幣持有者可以按照 1 代幣 1 票的基礎進行投票。 接下來是該模組目前支持的功能列表:

  • 提案提交: 用戶可以提交帶有押金的提案。一旦達到最低押金,提案便進入投票期。
  • 投票: 參與者可以對達到 MinDeposit 的提案進行投票。
  • 繼承和懲罰: 如果代表人自己不投票,他們將繼承其驗證者的投票。
  • 申領押金: 如果提案被接受或提案從未進入投票期,押金支付的用戶可以收回他們的押金。

內容

概念

免責聲明:這是一個進行中的工作。機制可能會發生變化。

治理過程可分為以下幾個步驟:

  • 提案提交: 向區塊鏈提交提案時,需要附上一定數量的押金。
  • 投票: 一旦押金達到一定的數值(MinDeposit),提案就會得到確認,投票便會開始。綁定Atom持有者隨後可以發送TxGovVote交易來對提案進行投票。
  • 如果提案涉及軟體升級:
  • 信號: 驗證者開始發出信號,表示他們已準備好切換到新版本。
  • 切換: 一旦超過75%的驗證者發出信號表示他們已準備好切換,他們的軟件將自動切換到新版本。

提案提交

提交提案的權利

任何 Dst 持有者,無論是綁定還是未綁定,都可以通過發送一個 TxGovProposal 交易來提交提案。 一旦提交提案,它將由其唯一的 proposalID 進行識別。

提案類型

在治理模組的初始版本中,有五種類型的提案:

  • TextProposal(文本提案) 所有不涉及源代碼修改的提案都屬於此類型。 例如,意見調查將使用類型為TextProposal的提案。 這種提案主要用於在社區中徵求意見、進行討論或建議,對區塊鏈網絡本身沒有直接影響。 通過這種方式,社區成員可以參與決策過程,分享他們的觀點和想法。
  • SoftwareUpgradeProposal(軟件升級提案). 若提案被接受,驗證者需按照提案的要求更新他們的軟件。
  • CommunityPoolSpendProposal(社區基金提案 ) 社區基金提案(Community Pool Proposal)詳細說明了如何使用社區基金, 包括建議使用多少代幣以及接收方賬戶。
  • ParameterChangeProposal(參數更改提案) 定義更改一個或多個參數的提案。 如果被接受,在投票期結束後,提案處理器將自動更新所要求的參數更改。

其他模塊可以通過實現自己的提案類型和處理器來擴展治理模塊。 這些類型通過治理模塊(例如ParamChangeProposal)進行註冊和處理, 然後在提案通過時執行相應模塊的提案處理器。 這個自定義處理器可以執行任意狀態更改。

保證金

為了防止垃圾訊息,提案必須在MinDeposit參數中定義的貨幣中提交保證金。只有當提案的保證金等於MinDeposit時,投票期才會開始。

提交提案時,必須附帶一個保證金,該保證金必須是正數,但可以小於MinDeposit。提交者不需要自己支付全部保證金。如果提案的保證金小於MinDeposit,其他代幣持有者可以通過發送Deposit交易來增加提案的保證金。保證金將被存放在治理ModuleAccount的託管中,直到提案最終確定(通過或拒絕)。

一旦提案的保證金達到MinDeposit,它將進入投票期。如果提案的保證金在MaxDepositPeriod之前未達到MinDeposit,提案將關閉,任何人都不能再向其存款。

保證金退款和銷毀

當提案最終確定時,保證金中的代幣將根據提案的最終結果進行退款或銷毀:

  • 如果提案被批准,或者被拒絕但未被否決,保證金將自動退還給各自的存款人(從治理ModuleAccount轉移)。這意味著只要提案得到處理並且未被否決,參與者就不會失去他們的保證金,從而鼓勵用戶積極參與治理過程。
  • 當提案以超級多數票被否決時,保證金將從治理ModuleAccount中被銷毀。

Vote

Participants

參與者 是指在區塊鏈治理過程中有權對提案進行投票的用戶。 參與者是綁定的Dst持有者。 未綁定的Dst持有者和其他用戶無權參與治理。 然而,他們可以提交和為提案付保證金。

請注意,在以下情況下,某些“參與者”可能被禁止在特定驗證者下對提案進行投票:

  • 當提案進入投票期後,參與者將Dst綁定或解綁到該驗證者。
  • 在提案進入投票期後,參與者成為了驗證者。

這並不妨礙“參與者”將Dst綁定到其他驗證者並進行投票。 例如,如果一個“參與者”在提案進入投票期之前將一些Atoms綁定到驗證者A,而在提案進入投票期之後將其他Dst綁定到驗證者B,那麼只有在驗證者B下的投票會被禁止。

投票期

一旦提案達到MinDeposit(最小保證金),它將立即進入Voting period(投票期)。 我們將投票期定義為投票開始和投票結束之間的時間間隔。 投票期應始終短於Unbonding period(解綁期),以防止雙重投票。投票期的初始值為2周。

選項集

提案的選項集指的是參與者在投票時可以選擇的一組選項。

初始選項集包括以下選項:

  • Yes
  • No
  • NoWithVeto
  • Abstain

NoWithVeto (否決)被算作No (反對),但同時也增加了一個Veto (否決)票。Abstain(棄權)選項允許投票者表示他們無意支持或反對該提案,但接受投票結果。

注意:對於緊急提案,我們或許應該在使用者介面中添加一個“非緊急”選項,該選項將投下一個NoWithVeto(否決)票。 這樣做的目的是讓投票者能夠明確表示他們認為該提案並不緊急,應該將其否決。這將有助於區分那些真正緊急的提案與不緊急的提案,從而使治理過程更加有效。

法定人数(Quorum)

法定人數(Quorum)定義為在提案結果有效的情況下,需要投下的最低投票權重百分比。 在區塊鏈治理中,法定人數確保了足夠多的投票者參與投票過程,從而使提案的結果具有代表性並確保治理決策的合法性。 如果未達到法定人數要求,那麼提案將被認為是無效的,無論其投票結果如何。

閾值

閾值定義為提案被接受所需的最低Yes(贊成)票比例(不包括Abstain(棄權)票)。

最初,閾值設定為 50%,如果超過 1/3 的投票(不包括 Abstain(棄權)票)是 NoWithVeto(否決)票,則有否決的可能性。 這意味著在投票期結束時,如果 Yes(贊成)票的比例(不包括 Abstain(棄權)票)超過 50%,並且 NoWithVeto(否決)票的比例低於 1/3(不包括 Abstain(棄權)票),則提案被接受。

對於未投票的驗證人的懲罰

目前,验证人未投票不会受到惩罚。

治理地址

稍後,我們可能會添加有權限的密鑰,這些密鑰只能從某些模塊簽名交易。 對於MVP(最小可行產品),治理地址將是在帳戶創建時生成的主驗證人地址。 此地址對應的私鑰(PrivKey)與負責簽名共識消息的Tendermint私鑰不同。 因此,驗證人無需使用敏感的Tendermint私鑰簽署治理交易。

通過這種方式,驗證人可以保護其關鍵的Tendermint私鑰,同時使用不同的私鑰進行治理活動。 這有助於提高區塊鏈網絡的安全性,確保驗證人在參與治理活動時不會將Tendermint私鑰暴露給潛在的攻擊者。

軟體升級

如果提案属于SoftwareUpgradeProposal类型,那么节点需要将其软件升级到经过投票的新版本。这个过程分为两个步骤。

訊號

在 SoftwareUpgradeProposal 被接受后,验证者预计会在继续运行之前的版本的同时下载并安装新版本的软件。一旦验证者下载并安装了升级,它将通过在其 precommits 中包含提案的 proposalID 向网络发出信号,表明它已准备好切换。(注意:我们需要确认是否希望将其包含在 precommit 中?)

注意:每个 precommit 只有一个信号插槽。如果在短时间内接受了多个 SoftwareUpgradeProposals,那么将形成一个流水线,它们将按照被接受的顺序依次实施

切換

當一個塊包含超過2/3的 precommits,其中一個常見的SoftwareUpgradeProposal被發出信號, 所有節點(包括驗證器節點、非驗證完整節點和輕節點)都應該切換到軟件的新版本。

注意:不清楚如何在程式中處理翻轉操作。

狀態

參數和基本類型

參數 定義了運行投票的規則。在任何給定時間,只能有一個活動參數集。 如果治理希望更改參數集,無論是修改值還是添加/刪除參數字段,都必須創建一個新的參數集,並使先前的參數集無效。

保證金參數

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/gov.proto#L127-L145

投票參數

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/gov.proto#L147-L156

統計參數

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/gov.proto#L158-L183

參數存儲在全局的 GlobalParams KVStore 中。

此外,我們引入了一些基本類型:

type Vote byte

const (
    VoteYes         = 0x1
    VoteNo          = 0x2
    VoteNoWithVeto  = 0x3
    VoteAbstain     = 0x4
)

type ProposalType  string

const (
    ProposalTypePlainText       = "Text"
    ProposalTypeSoftwareUpgrade = "SoftwareUpgrade"
)

type ProposalStatus byte


const (
    StatusNil           ProposalStatus = 0x00
    StatusDepositPeriod ProposalStatus = 0x01  // Proposal is submitted. Participants can deposit on it but not vote
    StatusVotingPeriod  ProposalStatus = 0x02  // MinDeposit is reached, participants can vote
    StatusPassed        ProposalStatus = 0x03  // Proposal passed and successfully executed
    StatusRejected      ProposalStatus = 0x04  // Proposal has been rejected
    StatusFailed        ProposalStatus = 0x05  // Proposal passed but failed execution
)

存款

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/gov.proto#L43-L53

驗證器治理資訊

This type is used in a temp map when tallying

  type ValidatorGovInfo struct {
    Minus     sdk.Dec
    Vote      Vote
  }

Proposals

Proposal對象用於記錄投票和跟踪提案的狀態。它們包含Content,表示此提案的主題,以及其他字段,這些字段是治理過程的可變狀態。

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/gov.proto#L55-L77

type Content interface {
    GetTitle() string
    GetDescription() string
    ProposalRoute() string
    ProposalType() string
    ValidateBasic() sdk.Error
    String() string
}

提案中的Content是一個接口,其中包含有關Proposal的信息,例如標題、描述和任何顯著變化。 此外,該Content類型可以由任何模塊實現。 ContentProposalRoute返回一個字符串,該字符串必須用於在治理保管器中路由ContentHandler。 這允許治理保管器執行由任何模塊實現的提案邏輯。 如果提案通過,則執行處理程序。 只有在處理程序成功執行後,狀態才會被持久化,提案才最終通過。 否則,提案將被拒絕。

type Handler func(ctx sdk.Context, content Content) sdk.Error

Handler負責實際執行提案並處理提案指定的任何狀態變更。只有在EndBlock期間提案通過時,才會執行它。

我們還提到了一種更新給定提案的統計數字的方法:

  func (proposal Proposal) updateTally(vote byte, amount sdk.Dec)

存儲

存儲庫是多存儲系統中的KVStores。查找存儲庫的鍵是列表中的第一個參數。`

我們將使用一個KVStore Governance來存儲兩個映射:

  • proposalID|'proposal'Proposal 的映射.
  • proposalID|'addresses'|address 到 `Vote1 的映射。這個映射允許我們通過對 1proposalID:addresses1 進行範圍查詢,查詢對提案進行投票的所有地址以及它們的投票。

為了方便閱讀偽代碼,以下是我們用來在存儲庫中讀取或寫入的兩個函數:

  • load(StoreKey, Key): 在多存儲系統中,在鍵 Key 下檢索存儲的項目。
  • store(StoreKey, Key, value): 在多存儲系統中,在鍵 Key 下寫入值 Value。

提案處理隊列

存儲:

  • 提案處理隊列: 一個包含所有達到 MinDeposit 的提案的 提案id 的隊列 queue[proposalID]。在每個 EndBlock 期間,所有已結束投票期的提案都將被處理。

為了處理完成的提案,應用程序對投票進行統計,計算每個驗證者的投票,並檢查驗證者集合中的每個驗證者是否都已投票。如果提案被接受,存款將被退還。最後,執行提案內容 Handler

在這個過程中,queue[proposalID] 隊列將確保按照適當的順序處理各個提案,並根據投票結果決定提案的執行與否。這有助於實現對區塊鏈網絡治理的公平和有序操作。

以下是 ProposalProcessingQueue 的偽代碼:

  in EndBlock do

    for finishedProposalID in GetAllFinishedProposalIDs(block.Time)
      proposal = load(Governance, <proposalID|'proposal'>) // proposal is a const key

      validators = Keeper.getAllValidators()
      tmpValMap := map(sdk.AccAddress)ValidatorGovInfo

      // Initiate mapping at 0. This is the amount of shares of the validator's vote that will be overridden by their delegator's votes
      for each validator in validators
        tmpValMap(validator.OperatorAddr).Minus = 0

      // Tally
      voterIterator = rangeQuery(Governance, <proposalID|'addresses'>) //return all the addresses that voted on the proposal
      for each (voterAddress, vote) in voterIterator
        delegations = stakingKeeper.getDelegations(voterAddress) // get all delegations for current voter

        for each delegation in delegations
          // make sure delegation.Shares does NOT include shares being unbonded
          tmpValMap(delegation.ValidatorAddr).Minus += delegation.Shares
          proposal.updateTally(vote, delegation.Shares)

        _, isVal = stakingKeeper.getValidator(voterAddress)
        if (isVal)
          tmpValMap(voterAddress).Vote = vote

      tallyingParam = load(GlobalParams, 'TallyingParam')

      // Update tally if validator voted they voted
      for each validator in validators
        if tmpValMap(validator).HasVoted
          proposal.updateTally(tmpValMap(validator).Vote, (validator.TotalShares - tmpValMap(validator).Minus))



      // Check if proposal is accepted or rejected
      totalNonAbstain := proposal.YesVotes + proposal.NoVotes + proposal.NoWithVetoVotes
      if (proposal.Votes.YesVotes/totalNonAbstain > tallyingParam.Threshold AND proposal.Votes.NoWithVetoVotes/totalNonAbstain  < tallyingParam.Veto)
        //  proposal was accepted at the end of the voting period
        //  refund deposits (non-voters already punished)
        for each (amount, depositor) in proposal.Deposits
          depositor.AtomBalance += amount

        stateWriter, err := proposal.Handler()
        if err != nil
            // proposal passed but failed during state execution
            proposal.CurrentStatus = ProposalStatusFailed
         else
            // proposal pass and state is persisted
            proposal.CurrentStatus = ProposalStatusAccepted
            stateWriter.save()
      else
        // proposal was rejected
        proposal.CurrentStatus = ProposalStatusRejected

      store(Governance, <proposalID|'proposal'>, proposal)

消息

提案提交

提案可以由任何帳戶通過 MsgSubmitProposal 交易提交。

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/tx.proto#L24-L39

MsgSubmitProposal 消息的 Content 必須在治理模塊中設置一個適當的路由。

狀態修改:

  • 生成新的 proposalID
  • 創建新的 Proposal:
  • 初始化 Proposals 屬性:
  • 將發送者的餘額減少 InitialDeposit
  • 如果達到 Deposit
  • ProposalProcessingQueue 中加入 proposalID
  • InitialDepositProposer 轉移到治理 ModuleAccount`。

根據以下偽代碼,可以處理 MsgSubmitProposal 交易。

// PSEUDOCODE //
// Check if MsgSubmitProposal is valid. If it is, create proposal //

upon receiving txGovSubmitProposal from sender do

  if !correctlyFormatted(txGovSubmitProposal)
    // check if proposal is correctly formatted. Includes fee payment.
    throw

  initialDeposit = txGovSubmitProposal.InitialDeposit
  if (initialDeposit.Atoms <= 0) OR (sender.AtomBalance < initialDeposit.Atoms)
    // InitialDeposit is negative or null OR sender has insufficient funds
    throw

  if (txGovSubmitProposal.Type != ProposalTypePlainText) OR (txGovSubmitProposal.Type != ProposalTypeSoftwareUpgrade)

  sender.AtomBalance -= initialDeposit.Atoms

  depositParam = load(GlobalParams, 'DepositParam')

  proposalID = generate new proposalID
  proposal = NewProposal()

  proposal.Title = txGovSubmitProposal.Title
  proposal.Description = txGovSubmitProposal.Description
  proposal.Type = txGovSubmitProposal.Type
  proposal.TotalDeposit = initialDeposit
  proposal.SubmitTime = <CurrentTime>
  proposal.DepositEndTime = <CurrentTime>.Add(depositParam.MaxDepositPeriod)
  proposal.Deposits.append({initialDeposit, sender})
  proposal.Submitter = sender
  proposal.YesVotes = 0
  proposal.NoVotes = 0
  proposal.NoWithVetoVotes = 0
  proposal.AbstainVotes = 0
  proposal.CurrentStatus = ProposalStatusOpen

  store(Proposals, <proposalID|'proposal'>, proposal) // Store proposal in Proposals mapping
  return proposalID

投票

一旦達到 ActiveParam.MinDeposit,投票期就開始了。從那時起,綁定的 Dst 持有者可以發送 MsgVote 交易,對提案投票。

+++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/gov/v1beta1/tx.proto#L46-L56

狀態修改:

  • 記錄發送者的 Vote

注意:此消息的 Gas 成本必须考虑到 EndBlocker 中未来的投票统计。

接下來是處理 MsgVote 交易的偽代碼概述:

  // PSEUDOCODE //
  // Check if MsgVote is valid. If it is, count vote//

  upon receiving txGovVote from sender do
    // check if proposal is correctly formatted. Includes fee payment.

    if !correctlyFormatted(txGovDeposit)
      throw

    proposal = load(Proposals, <txGovDeposit.ProposalID|'proposal'>)

    if (proposal == nil)
      // There is no proposal for this proposalID
      throw


    if  (proposal.CurrentStatus == ProposalStatusActive)


        // Sender can vote if
        // Proposal is active
        // Sender has some bonds

        store(Governance, <txGovVote.ProposalID|'addresses'|sender>, txGovVote.Vote)   // Voters can vote multiple times. Re-voting overrides previous vote. This is ok because tallying is done once at the end.

事件

治理模組發出以下事件:

EndBlocker

Type Attribute Key Attribute Value
inactive_proposal proposal_id {proposalID}
inactive_proposal proposal_result {proposalResult}
active_proposal proposal_id {proposalID}
active_proposal proposal_result {proposalResult}

Handlers

MsgSubmitProposal
Type Attribute Key Attribute Value
submit_proposal proposal_id {proposalID}
submit_proposal [0] voting_period_start {proposalID}
proposal_deposit amount {depositAmount}
proposal_deposit proposal_id {proposalID}
message module governance
message action submit_proposal
message sender {senderAddress}
  • [0] Event only emitted if the voting period starts during the submission.
MsgVote
Type Attribute Key Attribute Value
proposal_vote option {voteOption}
proposal_vote proposal_id {proposalID}
message module governance
message action vote
message sender {senderAddress}
MsgDeposit
Type Attribute Key Attribute Value
proposal_deposit amount {depositAmount}
proposal_deposit proposal_id {proposalID}
proposal_deposit [0] voting_period_start {proposalID}
message module governance
message action deposit
message sender {senderAddress}
  • [0] 如果投票期在提交期間開始,則僅發出事件。

Parameters

治理模組包含以下參數:

Key Type Example
depositparams object {"min_deposit":[{"denom":"uatom","amount":"10000000"}],"max_deposit_period":"172800000000000"}
votingparams object {"voting_period":"172800000000000"}
tallyparams object {"quorum":"0.334000000000000000","threshold":"0.500000000000000000","veto":"0.334000000000000000"}

SubKeys

Key Type Example
min_deposit array (coins) [{"denom":"uatom","amount":"10000000"}]
max_deposit_period string (time ns) "172800000000000"
voting_period string (time ns) "172800000000000"
quorum string (dec) "0.334000000000000000"
threshold string (dec) "0.500000000000000000"
veto string (dec) "0.334000000000000000"

注意: 治理模組包含與其他模組不同的對象類型參數。如果只希望更改一部分參數,則只需包含它們,而不是整個參數對象結構。

客戶端

CLI

使用者可以使用CLI查詢和與gov模組互動。

查詢

查詢命令允許用戶查詢gov狀態。

stcd query gov --help
deposit

The deposit command allows users to query a deposit for a given proposal from a given depositor.

stcd query gov deposit [proposal-id] [depositer-addr] [flags]

範例:

stcd query gov deposit 1 cosmos1..

範例輸出:

amount:
- amount: "100"
  denom: stake
depositor: cosmos1..
proposal_id: "1"
deposits

deposits命令允許用戶查詢給定提案的所有存款。

stcd query gov deposits [proposal-id] [flags]

範例:

stcd query gov deposits 1

範例輸出:

deposits:
- amount:
  - amount: "100"
    denom: stake
  depositor: cosmos1..
  proposal_id: "1"
pagination:
  next_key: null
  total: "0"
param

param命令允許用戶查詢gov模組的給定參數。

stcd query gov param [param-type] [flags]

範例:

stcd query gov param voting

範例輸出:

voting_period: "172800000000000"
params

params命令允許用戶查詢gov模組的所有參數。

stcd query gov params [flags]

範例:

stcd query gov params

範例輸出:

deposit_params:
  max_deposit_period: "172800000000000"
  min_deposit:
  - amount: "10000000"
    denom: stake
tally_params:
  quorum: "0.334000000000000000"
  threshold: "0.500000000000000000"
  veto_threshold: "0.334000000000000000"
voting_params:
  voting_period: "172800000000000"
proposal

proposal命令允許用戶查詢給定的提案。

stcd query gov proposal [proposal-id] [flags]

範例:

stcd query gov proposal 1

範例輸出:

content:
  '@type': /cosmos.gov.v1beta1.TextProposal
  description: testing, testing, 1, 2, 3
  title: Test Proposal
deposit_end_time: "2021-09-17T23:36:18.254995423Z"
final_tally_result:
  abstain: "0"
  "no": "0"
  no_with_veto: "0"
  "yes": "0"
proposal_id: "1"
status: PROPOSAL_STATUS_DEPOSIT_PERIOD
submit_time: "2021-09-15T23:36:18.254995423Z"
total_deposit:
- amount: "100"
  denom: stake
voting_end_time: "0001-01-01T00:00:00Z"
voting_start_time: "0001-01-01T00:00:00Z"
proposals

proposals命令允許用戶使用可選篩選器查詢所有提案。

stcd query gov proposals [flags]

範例:

stcd query gov proposals

範例輸出:

pagination:
  next_key: null
  total: "1"
proposals:
- content:
    '@type': /cosmos.gov.v1beta1.TextProposal
    description: testing, testing, 1, 2, 3
    title: Test Proposal
  deposit_end_time: "2021-09-17T23:36:18.254995423Z"
  final_tally_result:
    abstain: "0"
    "no": "0"
    no_with_veto: "0"
    "yes": "0"
  proposal_id: "1"
  status: PROPOSAL_STATUS_DEPOSIT_PERIOD
  submit_time: "2021-09-15T23:36:18.254995423Z"
  total_deposit:
  - amount: "100"
    denom: stake
  voting_end_time: "0001-01-01T00:00:00Z"
  voting_start_time: "0001-01-01T00:00:00Z"
proposer

proposer命令允許用戶查詢給定提案的提議人。

stcd query gov proposer [proposal-id] [flags]

範例:

simd query gov proposer 1

範例輸出:

proposal_id: "1"
proposer: cosmos1r0tllwu5c9dtgwg3wr28lpvf76hg85f5zmh9l2
tally

tally命令允許用戶查詢給定提案投票的統計結果。

stcd query gov tally [proposal-id] [flags]

範例:

simd query gov tally 1

範例輸出:

abstain: "0"
"no": "0"
no_with_veto: "0"
"yes": "1"
vote

vote命令允許用戶查詢給定提案的投票情況。

stcd query gov vote [proposal-id] [voter-addr] [flags]

範例:

simd query gov vote 1 cosmos1..

範例輸出:

option: VOTE_OPTION_YES
options:
- option: VOTE_OPTION_YES
  weight: "1.000000000000000000"
proposal_id: "1"
voter: cosmos1..
votes

votes命令允許用戶查詢給定提案的所有投票情況。

stcd query gov votes [proposal-id] [flags]

範例:

simd query gov votes 1

範例輸出:

pagination:
  next_key: null
  total: "0"
votes:
- option: VOTE_OPTION_YES
  options:
  - option: VOTE_OPTION_YES
    weight: "1.000000000000000000"
  proposal_id: "1"
  voter: cosmos1r0tllwu5c9dtgwg3wr28lpvf76hg85f5zmh9l2
交易

tx命令允許用戶與gov模塊進行交互。

stcd tx gov --help
deposit

deposit命令允許用戶為給定的提案存入代幣。

stcd tx gov deposit [proposal-id] [deposit] [flags]

範例:

stcd tx gov deposit 1 10000000stake --from cosmos1..
submit-proposal

The submit-proposal command allows users to submit a governance proposal and to optionally include an initial deposit.

simd tx gov submit-proposal [command] [flags]

範例:

stcd tx gov submit-proposal --title="Test Proposal" --description="testing, testing, 1, 2, 3" --type="Text" --deposit="10000000stake" --from cosmos1..

範例 (cancel-software-upgrade):

stcd tx gov submit-proposal cancel-software-upgrade --title="Test Proposal" --description="testing, testing, 1, 2, 3" --deposit="10000000stake" --from cosmos1..

Example (community-pool-spend):

stcd tx gov submit-proposal community-pool-spend proposal.json --from cosmos1..
{
  "title": "Test Proposal",
  "description": "testing, testing, 1, 2, 3",
  "recipient": "cosmos1..",
  "amount": "10000000stake",
  "deposit": "10000000stake"
}

範例 (param-change):

stcd tx gov submit-proposal param-change proposal.json --from cosmos1..
{
  "title": "Test Proposal",
  "description": "testing, testing, 1, 2, 3",
  "changes": [
    {
      "subspace": "staking",
      "key": "MaxValidators",
      "value": 100
    }
  ],
  "deposit": "10000000stake"
}

範例 (software-upgrade):

stcd tx gov submit-proposal software-upgrade v2 --title="Test Proposal" --description="testing, testing, 1, 2, 3" --upgrade-height 1000000 --from cosmos1..
vote

vote命令允許用戶提交對給定治理提案的投票。

stcd tx gov vote [command] [flags]

範例:

stcd tx gov vote 1 yes --from cosmos1..

gRPC

用戶可以使用gRPC端點查詢gov模塊。

Proposal

Proposal端點允許用戶查詢給定的提案。

cosmos.gov.v1beta1.Query/Proposal

範例:

grpcurl -plaintext \
    -d '{"proposal_id":"1"}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Proposal

範例輸出:

{
  "proposal": {
    "proposalId": "1",
    "content": {"@type":"/cosmos.gov.v1beta1.TextProposal","description":"testing, testing, 1, 2, 3","title":"Test Proposal"},
    "status": "PROPOSAL_STATUS_VOTING_PERIOD",
    "finalTallyResult": {
      "yes": "0",
      "abstain": "0",
      "no": "0",
      "noWithVeto": "0"
    },
    "submitTime": "2021-09-16T19:40:08.712440474Z",
    "depositEndTime": "2021-09-18T19:40:08.712440474Z",
    "totalDeposit": [
      {
        "denom": "stake",
        "amount": "10000000"
      }
    ],
    "votingStartTime": "2021-09-16T19:40:08.712440474Z",
    "votingEndTime": "2021-09-18T19:40:08.712440474Z"
  }
}
Proposals

Proposals端點允許用戶使用可選過濾器查詢所有提案。

cosmos.gov.v1beta1.Query/Proposals

範例:

grpcurl -plaintext \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Proposals

範例輸出:

{
  "proposals": [
    {
      "proposalId": "1",
      "content": {"@type":"/cosmos.gov.v1beta1.TextProposal","description":"testing, testing, 1, 2, 3","title":"Test Proposal"},
      "status": "PROPOSAL_STATUS_VOTING_PERIOD",
      "finalTallyResult": {
        "yes": "0",
        "abstain": "0",
        "no": "0",
        "noWithVeto": "0"
      },
      "submitTime": "2021-09-16T19:40:08.712440474Z",
      "depositEndTime": "2021-09-18T19:40:08.712440474Z",
      "totalDeposit": [
        {
          "denom": "stake",
          "amount": "10000000"
        }
      ],
      "votingStartTime": "2021-09-16T19:40:08.712440474Z",
      "votingEndTime": "2021-09-18T19:40:08.712440474Z"
    },
    {
      "proposalId": "2",
      "content": {"@type":"/cosmos.upgrade.v1beta1.CancelSoftwareUpgradeProposal","description":"Test Proposal","title":"testing, testing, 1, 2, 3"},
      "status": "PROPOSAL_STATUS_DEPOSIT_PERIOD",
      "finalTallyResult": {
        "yes": "0",
        "abstain": "0",
        "no": "0",
        "noWithVeto": "0"
      },
      "submitTime": "2021-09-17T18:26:57.866854713Z",
      "depositEndTime": "2021-09-19T18:26:57.866854713Z",
      "votingStartTime": "0001-01-01T00:00:00Z",
      "votingEndTime": "0001-01-01T00:00:00Z"
    }
  ],
  "pagination": {
    "total": "2"
  }
}
Vote

Vote端點允許用戶查詢給定提案的投票。

cosmos.gov.v1beta1.Query/Vote

Example:

grpcurl -plaintext \
    -d '{"proposal_id":"1","voter":"cosmos1.."}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Vote

範例輸出:

{
  "vote": {
    "proposalId": "1",
    "voter": "cosmos1..",
    "option": "VOTE_OPTION_YES",
    "options": [
      {
        "option": "VOTE_OPTION_YES",
        "weight": "1000000000000000000"
      }
    ]
  }
}
Votes

The Votes endpoint allows users to query all votes for a given proposal.

cosmos.gov.v1beta1.Query/Votes

Example:

grpcurl -plaintext \
    -d '{"proposal_id":"1"}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Votes

範例輸出:

{
  "votes": [
    {
      "proposalId": "1",
      "voter": "cosmos1..",
      "option": "VOTE_OPTION_YES",
      "options": [
        {
          "option": "VOTE_OPTION_YES",
          "weight": "1000000000000000000"
        }
      ]
    }
  ],
  "pagination": {
    "total": "1"
  }
}
Params

Params端點允許用戶查詢gov模塊的所有參數。

cosmos.gov.v1beta1.Query/Params

範例:

grpcurl -plaintext \
    -d '{"params_type":"voting"}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Params

範例輸出:

{
  "votingParams": {
    "votingPeriod": "172800s"
  },
  "depositParams": {
    "maxDepositPeriod": "0s"
  },
  "tallyParams": {
    "quorum": "MA==",
    "threshold": "MA==",
    "vetoThreshold": "MA=="
  }
}
Deposit

Deposit端點允許用戶查詢給定提案的存款,該存款來自特定的存款人。

cosmos.gov.v1beta1.Query/Deposit

範例:

grpcurl -plaintext \
    '{"proposal_id":"1","depositor":"cosmos1.."}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Deposit

範例輸出:

{
  "deposit": {
    "proposalId": "1",
    "depositor": "cosmos1..",
    "amount": [
      {
        "denom": "stake",
        "amount": "10000000"
      }
    ]
  }
}
deposits

Deposits端點允許用戶查詢給定提案的所有存款。

cosmos.gov.v1beta1.Query/Deposits

範例:

grpcurl -plaintext \
    -d '{"proposal_id":"1"}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/Deposits

範例輸出:

{
  "deposits": [
    {
      "proposalId": "1",
      "depositor": "cosmos1..",
      "amount": [
        {
          "denom": "stake",
          "amount": "10000000"
        }
      ]
    }
  ],
  "pagination": {
    "total": "1"
  }
}
TallyResult

TallyResult端點允許用戶查詢給定提案的統計結果。

cosmos.gov.v1beta1.Query/TallyResult

Example:

grpcurl -plaintext \
    -d '{"proposal_id":"1"}' \
    localhost:9090 \
    cosmos.gov.v1beta1.Query/TallyResult

範例輸出:

{
  "tally": {
    "yes": "1000000",
    "abstain": "0",
    "no": "0",
    "noWithVeto": "0"
  }
}

REST

用戶可以使用REST端點查詢gov模塊。

proposal

proposals端點允許用戶查詢給定的提案。

/cosmos/gov/v1beta1/proposals/{proposal_id}

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1

範例輸出:

{
  "proposal": {
    "proposal_id": "1",
    "content": {
      "@type": "/cosmos.gov.v1beta1.TextProposal",
      "title": "Test Proposal",
      "description": "testing, testing, 1, 2, 3"
    },
    "status": "PROPOSAL_STATUS_VOTING_PERIOD",
    "final_tally_result": {
      "yes": "0",
      "abstain": "0",
      "no": "0",
      "no_with_veto": "0"
    },
    "submit_time": "2021-09-16T19:40:08.712440474Z",
    "deposit_end_time": "2021-09-18T19:40:08.712440474Z",
    "total_deposit": [
      {
        "denom": "stake",
        "amount": "10000000"
      }
    ],
    "voting_start_time": "2021-09-16T19:40:08.712440474Z",
    "voting_end_time": "2021-09-18T19:40:08.712440474Z"
  }
}
proposals

proposals端點還允許用戶使用可選過濾器查詢所有提案。

/cosmos/gov/v1beta1/proposals

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals

範例輸出:

{
  "proposals": [
    {
      "proposal_id": "1",
      "content": {
        "@type": "/cosmos.gov.v1beta1.TextProposal",
        "title": "Test Proposal",
        "description": "testing, testing, 1, 2, 3"
      },
      "status": "PROPOSAL_STATUS_VOTING_PERIOD",
      "final_tally_result": {
        "yes": "0",
        "abstain": "0",
        "no": "0",
        "no_with_veto": "0"
      },
      "submit_time": "2021-09-16T19:40:08.712440474Z",
      "deposit_end_time": "2021-09-18T19:40:08.712440474Z",
      "total_deposit": [
        {
          "denom": "stake",
          "amount": "10000000"
        }
      ],
      "voting_start_time": "2021-09-16T19:40:08.712440474Z",
      "voting_end_time": "2021-09-18T19:40:08.712440474Z"
    },
    {
      "proposal_id": "2",
      "content": {
        "@type": "/cosmos.upgrade.v1beta1.CancelSoftwareUpgradeProposal",
        "title": "Test Proposal",
        "description": "testing, testing, 1, 2, 3"
      },
      "status": "PROPOSAL_STATUS_DEPOSIT_PERIOD",
      "final_tally_result": {
        "yes": "0",
        "abstain": "0",
        "no": "0",
        "no_with_veto": "0"
      },
      "submit_time": "2021-09-17T18:26:57.866854713Z",
      "deposit_end_time": "2021-09-19T18:26:57.866854713Z",
      "total_deposit": [
      ],
      "voting_start_time": "0001-01-01T00:00:00Z",
      "voting_end_time": "0001-01-01T00:00:00Z"
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "2"
  }
}
voter vote

votes端點允許用戶查詢給定提案的投票。

/cosmos/gov/v1beta1/proposals/{proposal_id}/votes/{voter}

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1/votes/cosmos1..

範例輸出:

{
  "vote": {
    "proposal_id": "1",
    "voter": "cosmos1..",
    "option": "VOTE_OPTION_YES",
    "options": [
      {
        "option": "VOTE_OPTION_YES",
        "weight": "1.000000000000000000"
      }
    ]
  }
}
votes

votes端點允許用戶查詢給定提案的所有投票。

/cosmos/gov/v1beta1/proposals/{proposal_id}/votes

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1/votes

範例輸出:

{
  "votes": [
    {
      "proposal_id": "1",
      "voter": "cosmos1..",
      "option": "VOTE_OPTION_YES",
      "options": [
        {
          "option": "VOTE_OPTION_YES",
          "weight": "1.000000000000000000"
        }
      ]
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "1"
  }
}
params

params端點允許用戶查詢gov模塊的所有參數。

/cosmos/gov/v1beta1/params/{params_type}

範例:

curl localhost:1317/cosmos/gov/v1beta1/params/voting

範例輸出:

{
  "voting_params": {
    "voting_period": "172800s"
  },
  "deposit_params": {
    "min_deposit": [
    ],
    "max_deposit_period": "0s"
  },
  "tally_params": {
    "quorum": "0.000000000000000000",
    "threshold": "0.000000000000000000",
    "veto_threshold": "0.000000000000000000"
  }
}
deposits

deposits端點允許用戶查詢來自給定存款人的給定提案的存款。

/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits/{depositor}

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1/deposits/cosmos1..

範例輸出:

{
  "deposit": {
    "proposal_id": "1",
    "depositor": "cosmos1..",
    "amount": [
      {
        "denom": "stake",
        "amount": "10000000"
      }
    ]
  }
}
proposal deposits

deposits端點允許用戶查詢給定提案的所有存款。

/cosmos/gov/v1beta1/proposals/{proposal_id}/deposits

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1/deposits

範例輸出:

{
  "deposits": [
    {
      "proposal_id": "1",
      "depositor": "cosmos1..",
      "amount": [
        {
          "denom": "stake",
          "amount": "10000000"
        }
      ]
    }
  ],
  "pagination": {
    "next_key": null,
    "total": "1"
  }
}
tally

tally端點允許用戶查詢給定提案的統計結果。

/cosmos/gov/v1beta1/proposals/{proposal_id}/tally

範例:

curl localhost:1317/cosmos/gov/v1beta1/proposals/1/tally

範例輸出:

{
  "tally": {
    "yes": "1000000",
    "abstain": "0",
    "no": "0",
    "no_with_veto": "0"
  }
}