Governance Proposal
Okay so at a high level, here is what I am proposing for governance.
There are still some undefined details, but less critical.
It’s very stream of conscious so I’m sure I’ve missed something.
Feedback required!
Right now we use total pillars, but likely in the future we want to use total active pillars.
If this general direction makes sense, I will put it into a formal doc like I did with HTLCs.
I am adding in dynamic quorum: but only for sporks because without it, I am not sure that this governance proposal would be able to pass itself. I also think that resilient networks need well defined contingency plans even if the goal is to never have to use them.
Method List
- UpdateContractVariable
- ProposeSporkCreation
- SignalSporkActivation
- ProposeMajor
- Propose Minor (maybe)
- Vote
Standard Contract Variable Interface
- Start introducing variables in embedded contracts that can be modified through governance in a consistent way.
- For example, the bridge currently has a method like ChangeBridgeAdmin which takes in a address as data
- Instead contracts should have a method such as UpdateContractVariable which takes in a variable name/id and then the data.
- These methods are allowed to be called by their own contract and by the governance contract
- We can then have a section in genesis files for these UpdateContractVariable transactions, which allows extension chains to have custom values at launch
Governance Embedded Contract Handling 3 Lanes:
All proposal types can be only be initiated by pillars.
- Sporks
- Obviously only handle sporks (creation & activation)
- Initial supermajority of all pillars requirement
- Dynamic Quorum over lengthy period and balanced with strong deposit requirement
- Major Changes
- Default proposal type
- Supermajority requirement
- No dynamic quorum, fixed voting period
- Minor Changes
- The governance contract would need to maintain a list of whitelisted method calls that are considered minor
- Would use AZ style voting. To pass: 1/3 quorum, with 50+% of votes being YES
- But I really don’t know if this needs to exist
- It’s hard to come up with straighforward guidelines for what would be major vs minor
Spork Variables
Contract Variable |
Default |
HQZ |
Spork Proposal Deposit |
2500 ZNN |
|
Spork Phase Length |
30 Epochs |
7 Epochs |
Spork Quorum Delta |
12.5% |
|
Spork Activation Min Length |
30 Epoch |
7 Epochs |
Spork Activation Grace Length |
14 Epochs |
3 Epochs |
Notably the supermajority of votes requirement is not a contract variable.
For security purposes, we don’t allow this to be changed.
Spork Methods
- ProposeSporkCreation
- ProposeSporkActivation
ProposeSporkCreation
When should this method be called?
We want on-chain actions to be meaningful. When users see that a spork has been created, it should signal that an upgrade is going to happen and that action needs to taken to update their nodes. Sporks should only be initiated once consensus about a change is reached and implementations are ready.
To call this method, the pillar needs to deposit the Spork Proposal Deposit Amount. This deposit amount is returned only if the vote passes.
Once the proposal is created, a spork proposal phase is entered, starting at phase 0.
Each phase lasts the SporkPhaseLength variable.
At the end of each phase, 2 conditions are evaluated:
- Do the number of yes votes meet the phase requirements?
- Are there at least double the yes votes compared to no votes?
If both are True: Vote passes. Create Spork. Return Deposit.
Otherwise, next phase.
Votes do not reset between phases.
It should be noted that if >33% of total pillars vote NO. Then the proposal will never pass.
The number of YES votes must be >= double the number of NO votes no matter what phase.
The number of yes votes required is calculated as: (2/3) * (1 - SporkQuorumDelta * N) * Total Pillars
So using our default 12.5% quorum delta, we have the following requirements
Phase Number |
Min Total Pillar Yes % |
0 |
66.67% |
1 |
58.33% |
2 |
50% |
3 |
41.67% |
4 |
33.33% |
5 |
25% |
6 |
16.67% |
7 |
8.33% |
8 |
0% |
If phase 8 does not pass. Then the proposal is closed and the deposit is burned.
SignalSporkActivation
This method is used for pillars to signal that they have upgraded their nodes and are ready for activation.
After a spork is created, we record the total number of votes for its creation.
After 2/3 of that number has signaled that they have upgraded the node, the contract begins a countdown to activate.
The spork will consider two dates and will activate on whichever one is later:
- Spork Creation Date + Activation Min Length
- 2/3 Signaled Date + Activation Grace Length
Major and Minor Proposals
In comparison these are very straightforward.
These are fixed voting length and after that duration, the proposal either passes or fails.
If it passes, it immediately sends its proposed transaction.
They will have contract variables for things such as voting period.