You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Updates the ballot definition of the voting to clarify that it is
possible to vote with a fraction of ones voting power if desired.
Also update `nextAddress` to `nextRollup` in the diagrams for clarity.
Copy file name to clipboardexpand all lines: yellow-paper/docs/decentralisation/governance.md
+29-45
Original file line number
Diff line number
Diff line change
@@ -45,25 +45,20 @@ In addition to the current rollup implementation deciding to propose a vote, tok
45
45
46
46
In a worst case scenario, the rollup's sequencer set could be malicious and censor potentially honest upgrade proposals from going through. In this scenario, there needs to be the ability to add a proposal "to the queue" via the token locking mechanism articulated above which is guaranteed to be executed when the previous vote completes.
47
47
48
+
#### Quorum
49
+
For any proposal to be considered valid and ready for voting, there must be a quorum of voting power eligible to participate. The purpose of this is to ensure that the network cannot be upgraded without a minimum of participation, keeping the governance more protected from takeover at genesis.
50
+
51
+
The exact amount of voting power required is to be determined through modelling, but we expect that around 5% of total supply. Assuming that 20% of the supply is circulating at launch and that 25% of this is staked towards the initial instance, this would allow the initial instance to reach quorum on its own.
52
+
48
53
### Voting
49
54
50
55
#### Participation
51
56
Aztec's governance voting occurs within the governance contract, and the tokens being utilized must be "locked within governance" i.e., non-transferable.
52
57
53
-
Any token holder is able to directly vote via an interaction with the governance contract. Specifically, this includes those with locked, non-circulating tokens.
58
+
Any token holder is able to directly vote via an interaction with the governance contract. Specifically, this includes those with locked, non-circulating tokens. The "ballot" is a simple yes/no/abstain vote on a proposal, and the amount of tokens being voted with. Note that this allows the same actor to vote multiple times, and even vote both yes and no with shares of their power. This allows for a more nuanced vote for contracts that control power for multiple users, such as a DAO, a rollup instance or a portal.
54
59
55
60
The current canonical rollup can choose to implement its internal voting however it would like, with the weight of the tokens staked in that instance. This is likely to be a majority of voting weight, which we can reliably assume will vote each time. Generally this addresses the problems of low token holder participation! In the initial instance, we envision a version of the Empire Stakes back, where sequencers are voting during part of their block proposal phases. Not all sequencers will win a block proposal/election during the time period of the vote, this leads it to being a randomized sampling of the current sequencer set.
56
61
57
-
:::danger
58
-
Question: how to implement the votes?
59
-
60
-
Option 1 - The initial instance's version of the Empire Stakes back could be implemented on a per sequencer vote, where the governance contract see's and calculates each individual vote.
61
-
62
-
Option 2 - Alternatively the voting could be implemented on a rollup wide basis, where the current rollup calculates the results & votes with the weight of the entire rollup in a singular call to the governance contract.
63
-
64
-
@Lasse has some opinions
65
-
:::
66
-
67
62
#### Exiting
68
63
The duration of the token lock depends on the action a user participated in. Tokens that have been locked to vote "yes" to changing the canonical instance are locked within the governance contract until the "upgrade" has been performed *or* when the voting period ends without the proposal gaining sufficient traction to reach quorum.
69
64
@@ -72,21 +67,14 @@ Tokens whose power did not vote "yes" are free to leave whenever they chose. Thi
72
67
Rollup instances themselves will need to deposit their stake into the governance, in order to earn rewards and participate within the vote. Further, they can apply their own enter/exit delays on top of the governance contract's. For example to ensure stability of the sequencer set over short timeframes, if using $AZTC stake as a requirement for sequencing, they may wish to impose longer entry and exit queues.
73
68
74
69
#### Results
75
-
If the vote fails, there is no action needed.
70
+
A vote is defined as passing if a majority of the voting weight votes "yes" to the proposal.
76
71
77
-
If the vote passes, and a new rollup has been determined to be the next canonical instance, it will become canonical in the amount of days defined within the vote's timelock. It is likely there are defined limitations around this parameter, e.g.,it must be a 3-30 day timelock. This is explained more in the timing section below. At this block height, portals that desire to follow governance should start referencing the new canonical instance to ensure as many bridged assets are backed on the latest version as possible.
78
-
79
-
:::danger
80
-
Question: what is needed to pass a vote?
81
-
82
-
Current thinking is that it should likely be the amount expected to be held in the initial instance of the rollup, e.g. 20% circulating & 25% of that is staked -> 5% of total supply, so locked tokens do not need to participate whatsoever in a happy path upgrade to v1.
72
+
If the vote fails, there is no action needed.
83
73
84
-
:::warning
85
-
This needs to be clarified.
86
-
:::
74
+
If the vote passes, and a new rollup has been determined to be the next canonical instance, it will become canonical in the amount of days defined within the vote's timelock. It is likely there are defined limitations around this parameter, e.g., it must be a 3-30 day timelock. This is explained more in the timing section below. At this block height, portals that desire to follow governance should start referencing the new canonical instance to ensure as many bridged assets are backed on the latest version as possible.
87
75
88
76
:::danger
89
-
Lasse: note that if the portals follow the governance registry blindly, they assume that new inbox/outbox will always be backwards compatible
77
+
Portals that blindly follow governance inherently assume that the new inbox/outbox will always be backwards compatible. If it is not, it might break the portals.
90
78
:::
91
79
92
80
### Timing
@@ -98,16 +86,12 @@ After setup has completed, there is a 7-30 day (TBD) period during which votes c
98
86
99
87
#### Phase 3 - Execution Delay (Timelock)
100
88
101
-
If a vote passes, there is a timelocked period before it becomes the new canonical rollup. This specific time period must be more than a minimum, e.g., 3 days, but is defined by the current rollup and in v1 may be controlled by both the sequencers in a happy path, and an emergency security council in a worst case scenario (articulated [below](#Emergency-mode)). In a typical happy path scenario, we suggest this is at least 30 days, and in an emergency, the shortest period possible.
89
+
If a vote passes, there is a timelocked period before it becomes the new canonical rollup. This specific time period must be more than a minimum, e.g., 3 days, but is defined by the current rollup and in v1 may be controlled by both the sequencers in a happy path, and an emergency security council in a worst case scenario (articulated [below](#Emergency-mode)). In a typical happy path scenario, we suggest this is at least 30 days, and in an emergency, the shortest period possible. A maximum period may also be defined, e.g., 60 days to ensure that the network cannot be kept from upgrading by having a delay of 200 years.
102
90
103
91
:::info
104
92
It is worth acknowledging that this configurability on upgrade delay windows will likely be flagged on L2 beat as a "medium" centralization risk, due to the ability to quickly upgrade the software (e.g., a vacation attack). Explicitly this decision could cause us to be labeled a "stage 1" rather than "stage 2" rollup. However, if a vote is reasonably long, then it should be fine as you can argue that the "upgrade period" is the aggregate of all 3 periods.
105
93
:::
106
94
107
-
:::danger
108
-
Lasse: We need to also include a maximum value, such that you cannot brick upgrades because you are still to execute the current one, but it is 200 years in the future.
109
-
:::
110
-
111
95
### Diagrams
112
96
Importantly we differentiate between `Aztec Governance`, and the governance of a particular instance of Aztec. This diagram articulates the high level of Aztec Governance, specifically how the network can deploy new versions overtime which will be part of a cohesive ecosystem, sharing a single token. In this case, we are not concerned with how the current canonical rollup chooses to implement it's decision to propose a new version, nor how it implements voting. It can be reasonably assumed that this is a version of The Empire Stakes back, where a majority of the current rollup sequencers are agreeing to propose and want to upgrade.
113
97
@@ -121,20 +105,20 @@ participant Version Registry as Governance
121
105
participant Next Rollup
122
106
participant Anyone
123
107
124
-
Current Canonical Rollup ->> Version Registry: proposeCanonicalRollup(nextAddress)
108
+
Current Canonical Rollup ->> Version Registry: proposeCanonicalRollup(nextRollup)
125
109
loop Voting
126
110
loop Canonical Rollup Voting
127
-
Sequencers ->> Current Canonical Rollup: canonicalVote(nextAddress, yes | no, amount)
111
+
Sequencers ->> Current Canonical Rollup: canonicalVote(yes | no | abstain, amount)
128
112
Current Canonical Rollup --> Current Canonical Rollup: Count votes
129
113
end
130
-
Current Canonical Rollup ->> Version Registry: publishVoteResult(yes | no | abstain)
131
-
Anyone ->> Version Registry: addVote(yes | no | abstain)
114
+
Current Canonical Rollup ->> Version Registry: publishVoteResult(yes | no | abstain, amount)
115
+
Anyone ->> Version Registry: addVote(yes | no | abstain, amount)
132
116
Version Registry --> Version Registry: Count votes
133
117
end
134
118
Note right of Version Registry: Vote passed!
135
-
Version Registry ->> Version Registry: markPendingCanonical(nextAddress)
119
+
Version Registry ->> Version Registry: markPendingCanonical(nextRollup)
136
120
Note right of Version Registry: Wait at least 30 days!
137
-
Next Rollup ->> Version Registry: markCanonical(nextAddress)
121
+
Next Rollup ->> Version Registry: markCanonical(nextRollup)
138
122
Sequencers ->> Next Rollup: Proposing new blocks here!
139
123
```
140
124
@@ -150,16 +134,16 @@ participant Version Registry as Governance
150
134
participant Next Rollup
151
135
participant Anyone
152
136
153
-
Anyone ->> Version Registry: lockTokensAndVote(1% of total supply, nextAddress)
137
+
Anyone ->> Version Registry: lockTokensAndVote(1% of total supply, nextRollup)
154
138
loop Voting
155
-
Anyone ->> Version Registry: addVote(yes | no | abstain)
139
+
Anyone ->> Version Registry: addVote(yes | no | abstain, amount)
156
140
Version Registry --> Version Registry: Count votes
157
141
end
158
142
Note right of Version Registry: Vote passed!
159
-
Version Registry ->> Version Registry: markPendingCanonical(nextAddress)
143
+
Version Registry ->> Version Registry: markPendingCanonical(nextRollup)
160
144
Note right of Version Registry: Wait at least 30 days!
161
145
Note left of Sequencers: Upgrade to new client
162
-
Next Rollup ->> Version Registry: markCanonical(nextAddress)
146
+
Next Rollup ->> Version Registry: markCanonical(nextRollup)
163
147
Sequencers ->> Next Rollup: Proposing new blocks here!
164
148
```
165
149
@@ -181,24 +165,24 @@ participant Version Registry as Governance
181
165
participant Next Rollup
182
166
participant Anyone
183
167
184
-
Current Canonical Rollup ->> Version Registry: proposeCanonicalRollup(nextAddress)
185
-
Note right of Version Registry: Vote starts in N days, e.g.,7
168
+
Current Canonical Rollup ->> Version Registry: proposeCanonicalRollup(nextRollup)
169
+
Note right of Version Registry: Vote starts in N days, e.g.,7
186
170
Anyone ->> Version Registry: delegateTo(otherAddress)
187
171
Anyone ->> Current Canonical Rollup: delegateTo()
188
172
Note right of Version Registry: Must be delegated before vote starts
189
173
loop Voting
190
174
loop Canonical Rollup Voting
191
-
Sequencers ->> Current Canonical Rollup: canonicalVote(nextAddress, yes | no, amount)
175
+
Sequencers ->> Current Canonical Rollup: canonicalVote(yes | no | abstain, amount)
192
176
Current Canonical Rollup --> Current Canonical Rollup: Count votes
193
177
end
194
-
Current Canonical Rollup ->> Version Registry: publishVoteResult(yes | no | abstain)
195
-
Anyone ->> Version Registry: addVote(yes | no | abstain)
178
+
Current Canonical Rollup ->> Version Registry: publishVoteResult(yes | no | abstain, amount)
179
+
Anyone ->> Version Registry: addVote(yes | no | abstain, amount)
196
180
Version Registry --> Version Registry: Count votes
197
181
end
198
182
Note right of Version Registry: Vote passed!
199
-
Version Registry ->> Version Registry: markPendingCanonical(nextAddress)
183
+
Version Registry ->> Version Registry: markPendingCanonical(nextRollup)
200
184
Note right of Version Registry: Wait at least 30 days!
201
-
Next Rollup ->> Version Registry: markCanonical(nextAddress)
185
+
Next Rollup ->> Version Registry: markCanonical(nextRollup)
202
186
Sequencers ->> Next Rollup: Proposing new blocks here!
203
187
```
204
188
@@ -208,7 +192,7 @@ Emergency mode is proposed to be introduced to the initial instance "v0" or "v1"
In the first instance, it's expected that this security council can _only_ pause the rollup instance, not make any other changes to the instance's functionality. It is important that after N days (e.g.,180), or after another rollup has been marked canonical and Y days (e.g.,60), this rollup _must_ become unpaused eventually - otherwise it's practically bricked from the perspective of those users choosing immutable portals, and could leave funds or other things belonging to users (e.g., identity credentials or something wacky) permanently inside of it. The same is true for all future instances that have pause functionalities.
195
+
In the first instance, it's expected that this security council can _only_ pause the rollup instance, not make any other changes to the instance's functionality. It is important that after N days (e.g.,180), or after another rollup has been marked canonical and Y days (e.g.,60), this rollup _must_ become unpaused eventually - otherwise it's practically bricked from the perspective of those users choosing immutable portals, and could leave funds or other things belonging to users (e.g., identity credentials or something wacky) permanently inside of it. The same is true for all future instances that have pause functionalities.
212
196
213
197
#### Removing the emergency mode
214
198
The emergency mode articulated here may be implemented as part of the next instance of Aztec - "v1" or whatever it ends up being called, when mainnet blocks are enabled. The current sequencer set on v0 (the initial instance) would then need to vote as outlined above on marking this new deployment as the "canonical v1" or predecessor to the initial instance. This would then have all of the portal contracts follow v1, which may or may not have other [training wheels](https://discourse.aztec.network/t/aztec-upgrade-training-wheels/641). If the community wishes, they can always deploy a new instance of the rollup which removes the emergency mode and therefore the pause-only multisig.
0 commit comments