Skip to content

Commit 6098edf

Browse files
committed
Initial version of CIP for introducing a default SPO vote
1 parent 21c3a58 commit 6098edf

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

CIP-XXXX/README.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
---
2+
CIP: XXXX
3+
Title: Default SPO vote
4+
Category: Ledger
5+
Authors:
6+
- Teodora Danciu <teodora.danciu@iohk.io>
7+
- Alexey Kuleshevich <alexey.kuleshevich@iohk.io>
8+
Implementors: N/A
9+
Status: Proposed
10+
Discussions:
11+
- https://github.com/cardano-foundation/CIPs/pull/XXX
12+
- https://github.com/IntersectMBO/cardano-ledger/issues/4645
13+
Created: 2025-10-28
14+
License: CC-BY-4.0
15+
---
16+
17+
## Abstract
18+
19+
We propose introducing an explicit mechanism for SPOs to define their default governance vote as part of their pool's registration parameters.
20+
This would replace the current indirect approach, which relies on delegating the pool’s reward account to predefined DReps AlwaysNoConfidence and AlwaysAbstain.
21+
22+
## Motivation: why is this CIP necessary?
23+
24+
The current approach was always intended as a temporary workaround. While it solved the immediate problem (as discussed in [cardano-ledger#4645](https://github.com/IntersectMBO/cardano-ledger/issues/4645)), it introduces several issues:
25+
* It is not transparent or easily inspectable what a pool’s default vote actually is, making it difficult to understand how undelegated or non-voting stake will behave in governance actions.
26+
* It couples operational reward accounts with governance semantics, constraining how SPOs can use their reward accounts.
27+
* It can distort governance outcomes, as SPOs who do not configure their reward accounts may unintentionally default to voting No, potentially skewing proposal results.
28+
29+
By contrast, providing SPOs with a clear, explicit default vote parameter allows them to opt in or out of governance participation transparently, mitigating the coupling between financial and governance mechanisms and reducing long-term bias in voting behavior.
30+
31+
## Specification
32+
33+
### Current behavior
34+
35+
The "default vote" determines how not voting counts toward the ratification of a proposal.
36+
For SPOs, this is how this is currently implemented as folllows:
37+
* `HardForkInitiation` proposals: default is `No`
38+
* `NoConfidence` proposals:
39+
- if the pool reward account is delegated to `AlwaysNoConfidence`, the default is `Yes`
40+
- otherwise, it is `No`
41+
* `UpdateCommittee` and `ParameterUpdate` (for security-group parameters) proposals:
42+
- if the pool reward accout is delegated to `AlwaysAbstain`, the default is `Abstain`
43+
- otherwise, it is `No`
44+
45+
### Proposed changes
46+
Add a new non-optional field to the pool parameters that specifies the SPO's default vote.
47+
48+
Currently the pool parameters are specified in cddl like this:
49+
50+
```cddl
51+
pool_params =
52+
( operator : pool_keyhash
53+
, vrf_keyhash : vrf_keyhash
54+
, pledge : coin
55+
, cost : coin
56+
, margin : unit_interval
57+
, reward_account : reward_account
58+
, pool_owners : set<addr_keyhash>
59+
, relays : [* relay]
60+
, pool_metadata : pool_metadata/ nil
61+
)
62+
```
63+
64+
The proposed definition is:
65+
```cddl
66+
pool_params =
67+
( operator : pool_keyhash
68+
, vrf_keyhash : vrf_keyhash
69+
, pledge : coin
70+
, cost : coin
71+
, margin : unit_interval
72+
, reward_account : reward_account
73+
, pool_owners : set<addr_keyhash>
74+
, relays : [* relay]
75+
, pool_metadata : pool_metadata/ nil
76+
, default_vote : vote
77+
)
78+
79+
vote = 0 .. 2
80+
```
81+
82+
This change requires a hard fork, since it modifies transaction serialization.
83+
84+
### Migration of currently configured default votes
85+
86+
At the hard-fork boundary, the pool parameters of each existing pool will be updated to reflect the implicit preference currently expressed through its reward account delegation.
87+
For each pool, we'll set the new `defaultVote` parameter to:
88+
* `Abstain`, if the reward account is delegated to `AlwaysAbstain`
89+
* `No`, otherwise
90+
91+
## Path to Active
92+
93+
### Acceptance Criteria
94+
95+
- [ ] Transaction serializers and deserializers in [cardano-ledger](https://github.com/IntersectMBO/cardano-ledger) are implemented such that they follow the cddl specification described above, and reflected in the cddl specs
96+
- [ ] The migration of the existing default vote preferences is implemented in ledger
97+
- [ ] The feature is integrated into [cardano-node](https://github.com/IntersectMBO/cardano-node) with necessary adjustments made to [ouroboros-consensus](https://github.com/IntersectMBO/ouroboros-consensus) and released as part of the Dijkstra era hard fork
98+
99+
### Implementation Plan
100+
101+
- [ ] Add support for a new pool parameter without changing serialization in existing eras
102+
- [ ] Implement and test migration logic to populate the new parameter at the hard-fork boundary.
103+
104+
## Copyright
105+
106+
This CIP is licensed under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/legalcode).

0 commit comments

Comments
 (0)