-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs(adr): ADR-045 Admin module #9708
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,142 @@ | ||||||
|
||||||
# ADR 045: Admin module | ||||||
|
||||||
## Changelog | ||||||
|
||||||
- 2021/07/16: Initial draft | ||||||
|
||||||
## Status | ||||||
|
||||||
Proposed | ||||||
|
||||||
## Abstract | ||||||
|
||||||
This ADR proposes a new module - admin module, that adds simplified governance workflow with authority-based proposal acceptance. A new role is added - administrator. Admins will be capable of: | ||||||
- submitting a proposal that will automatically be accepted; | ||||||
- add/remove other admins; | ||||||
|
||||||
## Context | ||||||
|
||||||
The current proposal workflow is based on a concept of validators (token holders) who vote to accept/reject a proposal. The tallying of those votes is based on the voting power (stake-based voting) of validators and their delegators. This stake-based multi-step approach provides a high level of security necessary for mainnets. | ||||||
|
||||||
However, the specifics of testnets - often updates with new features that need to be well tested. | ||||||
|
||||||
Almost every feature and every scenario require some proposals to be accepted. For example, changing a test account's balance (thanks to blockchain technology) is not as easy as changing some number in a bank database. Any modification of a blockchain state requires a full proposal workflow with the majority of stakeholders to participate in voting. The situation is even more complicated in testnet - there's no motivation for users to participate in voting/governance. The full governance process is too long, so it slows down testing and the delivery of new features. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think in the context of testnets mainly, this makes a lot of sense. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. exactly, this is really only meant for testnet environments (altho technically a chain may want it on mainnet for things like emergency upgrades) |
||||||
|
||||||
## Decision | ||||||
|
||||||
We propose to create an admin module with simplified governance functionality. Admin module allows submitting proposals that are automatically accepted after verifying the Proposer ID, and managing the list of admins. | ||||||
|
||||||
Admin module `Msg` and `Query` services will have the following interface: | ||||||
``` | ||||||
type MsgService interface { | ||||||
// SubmitProposal defines a method to create new proposal with a given content. | ||||||
SubmitProposal(context.Context, *MsgSubmitProposal) (*MsgSenMsgSubmitProposalResponsedResponse, error) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Was that a copy paste error or intended as before? |
||||||
|
||||||
// AddAdmin defines a method to add a new admin | ||||||
AddAdmin(context.Context, *MsgAddAdmin) error | ||||||
|
||||||
// DeleteAdmin defines a method to delete an admin | ||||||
DeleteAdmin(context.Context, *MsgDeleteAdmin) error | ||||||
} | ||||||
|
||||||
type MsgSubmitProposal struct { | ||||||
Content *types.Any | ||||||
|
||||||
//This field is generally unnecessary and kept only for similarity with the Gov module, can be removed | ||||||
InitialDeposit github_com_cosmos_cosmos_sdk_types.Coins | ||||||
|
||||||
Proposer string | ||||||
} | ||||||
|
||||||
type MsgSubmitProposalResponse struct { | ||||||
ProposalId uint64 | ||||||
} | ||||||
|
||||||
type MsgAddAdminRequest struct { | ||||||
Admin string | ||||||
Requester string | ||||||
} | ||||||
|
||||||
type MsgDeleteAdminRequest struct { | ||||||
Admin string | ||||||
Requester string | ||||||
} | ||||||
|
||||||
type QueryService interface { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. could be nice to have some convenience queries like |
||||||
// ListAdmins defines a method to list admins | ||||||
ListAdmins(context.Context) (*QueryListAdminsResponse, error) | ||||||
} | ||||||
|
||||||
type QueryListAdminsResponse struct { | ||||||
AdminAddresses []string | ||||||
} | ||||||
``` | ||||||
|
||||||
### Submitting a Proposal | ||||||
|
||||||
`MsgService.SubmitProposal` verifies the `MsgSubmitProposal.Proposer` to be in the list of admins. If so, the proposal is successfully submitted and added to the execution queue. | ||||||
|
||||||
Admin module will have a separate `KVStore` with Addresses of the current admins' accounts. | ||||||
|
||||||
Admin `KVStore` stores pairs in the following way: | ||||||
``` | ||||||
{sdk.Address: true} | ||||||
``` | ||||||
|
||||||
The Admin module `EndBlock` handler executes all proposals in the queue and calls logic in other modules (as the Governance module does). | ||||||
|
||||||
Admin module will be able to exist alongside with running Governance module. They will manage two independent proposal queues, and each module will handle proposals only from its own queue. | ||||||
|
||||||
The logic of proposal acceptance in `EndBlocker` handler | ||||||
``` | ||||||
func EndBlocker { | ||||||
// logic to automatically accept any proposal from the admin module proposal queue and call state transitions in other modules similar to the Governance module https://github.com/cosmos/cosmos-sdk/blob/e17be874bb0e3a246b74752e9b8894855cab9b03/x/gov/abci.go#L58 | ||||||
} | ||||||
``` | ||||||
|
||||||
### Adding a new admin | ||||||
- First admin address should be in `genesis.json`. | ||||||
- `MsgService.AddAdmin` handler verifies `MsgAddAdminRequest.Requester` to be in the list of admins. If so, it adds `MsgAddAdminRequest.Admin` to the list of admins. | ||||||
|
||||||
### Removing an admin | ||||||
`MsgService.DeleteAdmin` handler verifies `MsgDeleteAdminRequest.Requester` to be in the list of admins. If so, it deletes `MsgDeleteAdminRequest.Admin` from the list of admins. | ||||||
|
||||||
### Turning the admin module off | ||||||
There'll be two ways to switch off the admin module: | ||||||
Mar-Alex marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
- the last admin deletes themself; | ||||||
- the admin module is removed via software upgrade mechanism. | ||||||
|
||||||
It will allow using the admin module during the first stages after a network launch and switcing it off later. | ||||||
|
||||||
### Adding the admin module to existing testnets | ||||||
Software upgrade mechanism allow adding the admins module to existing testnets via governance. | ||||||
Mar-Alex marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
### Interaction with the admin module | ||||||
There'll be new CLI commands for admin module functionality: | ||||||
Mar-Alex marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
```sh | ||||||
# submit proposal | ||||||
simd tx admin submit-proposal --title="Test Proposal" --description="My awesome proposal" --type="Text" --deposit="10test" --from <mykey> | ||||||
# adding new admin | ||||||
simd tx admin add-admin [new_admin_address] --from <mykey> | ||||||
# removing admin | ||||||
simd tx admin delete-admin [admin_address] --from <mykey> | ||||||
# query list of admins | ||||||
simd query admin list | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe a command for adding the admin to the genesis file before launch? |
||||||
``` | ||||||
|
||||||
We also propose to create a simple web interface that demonstrates the work of the admin module. It will include the following features: | ||||||
- review the current parameters of some existing modules; | ||||||
- connect a wallet; | ||||||
- submit a proposal; | ||||||
- modify the list of admins. | ||||||
|
||||||
### Positive | ||||||
- Simplifies updating and applying new changes for the modules -> accelerates development and testing | ||||||
|
||||||
### Negative | ||||||
`None` | ||||||
|
||||||
### Neutral | ||||||
- Needs minor changes to simapp. | ||||||
- Need changes to genesis.json (to add first admins). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
note, it's not just validators -- any token holder can vote to accept or reject a proposal.