Skip to main content

Voting on governance actions as a multisignature DRep

Pre-requisites

To vote on governance actions, follow this process:

  1. Obtain the action ID of an ongoing governance action from Discord or query the governance state.
  2. Determine your voting stance; engage in discussion if required
  3. Construct your vote file through the Cardano CLI. The example below demonstrates voting --yes, although options for --no or --abstain are also available.

Verify the content of the governance action

Assume that we have been given the action ID df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79#0 for a new constitution proposal.

  1. Obtain the URL and hash of the new constitution proposal from the governance state:
cardano-cli conway query gov-state --testnet-magic 4 | \
jq -r --arg govActionId "df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79" '.proposals | to_entries[] | select(.value.actionId.txId | contains($govActionId)) | .value'
{
"action": {
"contents": [
null,
{
"anchor": {
"dataHash": "5d372dca1a4cc90d7d16d966c48270e33e3aa0abcb0e78f0d5ca7ff330d2245d",
"url": "https://tinyurl.com/mr3ferf9"
}
}
],
"tag": "NewConstitution"
},
"actionId": {
"govActionIx": 0,
"txId": "df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79"
},
"committeeVotes": {
"keyHash-c8ac605b25d6084c2ceb28043c8f01b62629966d038a249c7847d66d": "VoteYes",
"keyHash-d13507f7e7fb8ac3ce2094187c9d99d4601021e9ef5a5f310567765d": "VoteYes"
},
"dRepVotes": {
"keyHash-16faaf6daa2635bbf53bbbaf38b3a6040adf7ced2f7f08952592cf5b": "VoteYes",
"keyHash-57cb90cfb635e76af648abf1b6a91519218a5919b3cba2527e3725d1": "VoteYes",
"keyHash-7d84808d563f0f258ad7e4337c2c4bd13010930ebdf7b86c3bfd9ef8": "VoteYes"
},
"deposit": 0,
"expiresAfter": 80,
"proposedIn": 78,
"returnAddr": {
"credential": {
"keyHash": "f925cbd4eb78aad49ec7bf9b4ddfa4cc4486c967e392699d143c81aa"
},
"network": "Testnet"
},
"stakePoolVotes": {}
}
  1. Download the file from the URL registered on the ledger state:
wget https://tinyurl.com/mr3ferf9 -O constitution.txt
  1. Verify that the hash of the file matches the dataHashfrom the ledger state:
b2sum -l 256 constitution.txt
5d372dca1a4cc90d7d16d966c48270e33e3aa0abcb0e78f0d5ca7ff330d2245d constitution.txt

Everything is in order; the text at the URL matches the dataHash, confirming that the text at the URL is precisely what we are voting for.

In the future, voting apps, explorers, wallets, and other tools could perform the filtering, ensuring that they only display actions whose URL content has been verified against the hash on the ledger state.

Create the vote file

  1. Vote with DRep keys:
cardano-cli conway governance vote create \
--yes \
--governance-action-tx-id "df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79" \
--governance-action-index "0" \
--drep-script-hash $(cat drep-multisig.id) \
--out-file df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79-constitution.vote

Include the vote in a transaction

  1. Build the transaction:
cardano-cli conway transaction build \
--testnet-magic 4 \
--tx-in-script-file drep-multisig.json \
--tx-in "$(cardano-cli query utxo --address $(cat payment.addr) --testnet-magic 4 --output-json | jq -r 'keys[0]')" \
--change-address $(cat payment.addr) \
--vote-file df58f714c0765f3489afb6909384a16c31d600695be7e86ff9c59cf2e8a48c79-constitution.vote \
--witness-override 4 \
--out-file vote-tx.raw
  1. Every member of the DRep witnesses the transaction with their respective signing keys. Additionally, we need to witness the transaction with the payment signing key:
cardano-cli conway transaction witness \
--tx-body-file vote-tx.raw \
--signing-key-file drep1.skey \
--out-file drep1.witness
cardano-cli conway transaction witness \
--tx-body-file vote-tx.raw \
--signing-key-file drep2.skey \
--out-file drep2.witness
cardano-cli conway transaction witness \
--tx-body-file vote-tx.raw \
--signing-key-file drep3.skey \
--out-file drep3.witness
cardano-cli conway transaction witness \
--tx-body-file vote-tx.raw \
--signing-key-file payment.skey \
--out-file payment.witness
  1. Assemble the transaction:
cardano-cli transaction assemble \
--tx-body-file vote-tx.raw \
--witness-file payment.witness \
--witness-file drep1.witness \
--witness-file drep2.witness \
--witness-file drep3.witness \
--out-file vote-tx.signed
  1. Submit the transaction:
cardano-cli transaction submit --testnet-magic 4 --tx-file vote-tx.signed