Merge PR #4827: ADR 007 / 008: Specialization Groups Abstraction / CERT Group
* draft ADR 7 * working * new CERT ADR seperated * working * ... * complete ADR 007 * CERT Group ADR * dCERT * @fede membership admittance discussion * @fedekunze comments * @AdityaSripal CERT usefulness * @AdityaSripal @jleni circuit breaker discussion * proposal ids discussion * Update docs/architecture/adr-008-dCERT-group.md Co-Authored-By: Aditya <adityasripal@gmail.com> * @AdityaSripal comments * Apply suggestions from @alexanderbez Co-Authored-By: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> * Update docs/architecture/adr-007-specialization-groups.md * Update docs/architecture/adr-008-dCERT-group.md * Update docs/architecture/adr-008-dCERT-group.md * Update docs/architecture/adr-008-dCERT-group.md * Update docs/architecture/adr-008-dCERT-group.md * Update docs/architecture/adr-008-dCERT-group.md Co-Authored-By: Marko <marbar3778@yahoo.com> * @alexanderbez comments * blockchain agnostic per @cwgoes comment * Apply suggestions from code review Co-Authored-By: Alexander Bezobchuk <alexanderbez@users.noreply.github.com> * @alexanderbez second pass comments * stablization period, and delegating dCERT stake discussion
This commit is contained in:
parent
6db739823b
commit
87740a53c3
|
@ -0,0 +1,179 @@
|
||||||
|
# ADR 007: Specialization Groups
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
- 2019 Jul 31: Initial Draft
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
This idea was first conceived of in order to fulfill the use case of the
|
||||||
|
creation of a decentralized Computer Emergency Response Team (dCERT), whose
|
||||||
|
members would be elected by a governing community and would fulfill the role of
|
||||||
|
coordinating the community under emergency situations. This thinking
|
||||||
|
can be further abstracted into the conception of "blockchain specialization
|
||||||
|
groups".
|
||||||
|
|
||||||
|
The creation of these groups are the beginning of specialization capabilities
|
||||||
|
within a wider blockchain community which could be used to enable a certain
|
||||||
|
level of delegated responsibilities. Examples of specialization which could be
|
||||||
|
beneficial to a blockchain community include: code auditing, emergency response,
|
||||||
|
code development etc. This type of community organization paves the way for
|
||||||
|
individual stakeholders to delegate votes by issue type, if in the future
|
||||||
|
governance proposals include a field for issue type.
|
||||||
|
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
A specialization group can be broadly broken down into the following functions
|
||||||
|
(herein containing examples):
|
||||||
|
|
||||||
|
- Membership Admittance
|
||||||
|
- Membership Acceptance
|
||||||
|
- Membership Revocation
|
||||||
|
- (probably) Without Penalty
|
||||||
|
- member steps down (self-Revocation)
|
||||||
|
- replaced by new member from governance
|
||||||
|
- (probably) With Penalty
|
||||||
|
- due to breach of soft-agreement (determined through governance)
|
||||||
|
- due to breach of hard-agreement (determined by code)
|
||||||
|
- Execution of Duties
|
||||||
|
- Special transactions which only execute for members of a specialization
|
||||||
|
group (for example, dCERT members voting to turn off transaction routes in
|
||||||
|
an emergency scenario)
|
||||||
|
- Compensation
|
||||||
|
- Group compensation (further distribution decided by the specialization group)
|
||||||
|
- Individual compensation for all constituents of a group from the
|
||||||
|
greater community
|
||||||
|
|
||||||
|
Membership admittance to a specialization group could take place over a wide
|
||||||
|
variety of mechanisms. The most obvious example is through a general vote among
|
||||||
|
the entire community, however in certain systems a community may want to allow
|
||||||
|
the members already in a specialization group to internally elect new members,
|
||||||
|
or maybe the community may assign a permission to a particular specialization
|
||||||
|
group to appoint members to other 3rd party groups. The sky is really the limit
|
||||||
|
as to how membership admittance can be structured. We attempt to capture
|
||||||
|
some of these possiblities in a common interface dubbed the `Electionator`. For
|
||||||
|
its initial implementation as a part of this ADR we recommend that the general
|
||||||
|
election abstraction (`Electionator`) is provided as well as a basic
|
||||||
|
implementation of that abstraction which allows for a continuous election of
|
||||||
|
members of a specialization group.
|
||||||
|
|
||||||
|
``` golang
|
||||||
|
// The Electionator abstraction covers the concept space for
|
||||||
|
// a wide variety of election kinds.
|
||||||
|
type Electionator interface {
|
||||||
|
|
||||||
|
// is the election object accepting votes.
|
||||||
|
Active() bool
|
||||||
|
|
||||||
|
// functionality to execute for when a vote is cast in this election, here
|
||||||
|
// the vote field is anticipated to be marshalled into a vote type used
|
||||||
|
// by an election.
|
||||||
|
//
|
||||||
|
// NOTE There are no explicit ids here. Just votes which pertain specifically
|
||||||
|
// to one electionator. Anyone can create and send a vote to the electionator item
|
||||||
|
// which will presumably attempt to marshal those bytes into a particular struct
|
||||||
|
// and apply the vote information in some arbitrary way. There can be multiple
|
||||||
|
// Electionators within the Cosmos-Hub for multiple specialization groups, votes
|
||||||
|
// would need to be routed to the Electionator upstream of here.
|
||||||
|
Vote(addr sdk.AccAddress, vote []byte)
|
||||||
|
|
||||||
|
// here lies all functionality to authenticate and execute changes for
|
||||||
|
// when a member accepts being elected
|
||||||
|
AcceptElection(sdk.AccAddress)
|
||||||
|
|
||||||
|
// Register a revoker object
|
||||||
|
RegisterRevoker(Revoker)
|
||||||
|
|
||||||
|
// No more revokers may be registered after this function is called
|
||||||
|
SealRevokers()
|
||||||
|
|
||||||
|
// register hooks to call when an election actions occur
|
||||||
|
RegisterHooks(ElectionatorHooks)
|
||||||
|
|
||||||
|
// query for the current winner(s) of this election based on arbitrary
|
||||||
|
// election ruleset
|
||||||
|
QueryElected() []sdk.AccAddress
|
||||||
|
|
||||||
|
// query metadata for an address in the election this
|
||||||
|
// could include for example position that an address
|
||||||
|
// is being elected for within a group
|
||||||
|
//
|
||||||
|
// this metadata may be directly related to
|
||||||
|
// voting information and/or privileges enabled
|
||||||
|
// to members within a group.
|
||||||
|
QueryMetadata(sdk.AccAddress) []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
// ElectionatorHooks, once registered with an Electionator,
|
||||||
|
// trigger execution of relevant interface functions when
|
||||||
|
// Electionator events occur.
|
||||||
|
type ElectionatorHooks interface {
|
||||||
|
AfterVoteCast(addr sdk.AccAddress, vote []byte)
|
||||||
|
AfterMemberAccepted(addr sdk.AccAddress)
|
||||||
|
AfterMemberRevoked(addr sdk.AccAddress, cause []byte)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Revoker defines the function required for a membership revocation rule-set
|
||||||
|
// used by a specialization group. This could be used to create self revoking,
|
||||||
|
// and evidence based revoking, etc. Revokers types may be created and
|
||||||
|
// reused for different election types.
|
||||||
|
//
|
||||||
|
// When revoking the "cause" bytes may be arbitrarily marshalled into evidence,
|
||||||
|
// memos, etc.
|
||||||
|
type Revoker interface {
|
||||||
|
RevokeName() string // identifier for this revoker type
|
||||||
|
RevokeMember(addr sdk.AccAddress, cause []byte) error
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Certain level of commonality likely exists between the existing code within
|
||||||
|
`x/governance` and required functionality of elections. This common
|
||||||
|
functionality should be abstracted during implementation. Similarly for each
|
||||||
|
vote implementation client CLI/REST functionality should be abstracted
|
||||||
|
to be reused for multiple elections.
|
||||||
|
|
||||||
|
The specialization group abstraction firstly extends the `Electionator`
|
||||||
|
but also further defines traits of the group.
|
||||||
|
|
||||||
|
``` golang
|
||||||
|
type SpecializationGroup interface {
|
||||||
|
Electionator
|
||||||
|
GetName() string
|
||||||
|
GetDescription() string
|
||||||
|
|
||||||
|
// general soft contract the group is expected
|
||||||
|
// to fulfill with the greater community
|
||||||
|
GetContract() string
|
||||||
|
|
||||||
|
// messages which can be executed by the members of the group
|
||||||
|
Handler(ctx sdk.Context, msg sdk.Msg) sdk.Result
|
||||||
|
|
||||||
|
// logic to be executed at endblock, this may for instance
|
||||||
|
// include payment of a stipend to the group members
|
||||||
|
// for participation in the security group.
|
||||||
|
EndBlocker(ctx sdk.Context)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
> Proposed
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
### Positive
|
||||||
|
|
||||||
|
- increases specialization capabilities of a blockchain
|
||||||
|
- improve abstractions in `x/gov/` such that they can be used with specialization groups
|
||||||
|
|
||||||
|
### Negative
|
||||||
|
|
||||||
|
- could be used to increase centralization within a community
|
||||||
|
|
||||||
|
### Neutral
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- (dCERT ADR)[./adr-008-dCERT-group.md]
|
||||||
|
|
|
@ -0,0 +1,167 @@
|
||||||
|
# ADR 008: Decentralized Computer Emergency Response Team (dCERT) Group
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
- 2019 Jul 31: Initial Draft
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
In order to reduce the number of parties involved with handling sensitive
|
||||||
|
information in an emergency scenario, we propose the creation of a
|
||||||
|
specialization group named The Decentralized Computer Emergency Response Team
|
||||||
|
(dCERT). Initially this group's role is intended to serve as coordinators
|
||||||
|
between various actors within a blockchain community such as validators,
|
||||||
|
bug-hunters, and developers. During a time of crisis, the dCERT group would
|
||||||
|
aggregate and relay input from a variety of stakeholders to the developers who
|
||||||
|
are actively devising a patch to the software, this way sensitive information
|
||||||
|
does not need to be publicly disclosed while some input from the community can
|
||||||
|
still be gained.
|
||||||
|
|
||||||
|
Additionally, a special privilege is proposed for the dCERT group: the capacity
|
||||||
|
to "circuit-break" (aka. temporarily disable) a particular message path. Note
|
||||||
|
that this privilege should be enabled/disabled globally with a governance
|
||||||
|
parameter such that this privilege could start disabled and later be enabled
|
||||||
|
through a parameter change proposal, once a dCERT group has been established.
|
||||||
|
|
||||||
|
In the future it is foreseeable that the community may wish to expand the roles
|
||||||
|
of dCERT with further responsibilities such as the capacity to "pre-approve" a
|
||||||
|
security update on behalf of the community prior to a full community
|
||||||
|
wide vote whereby the sensitive information would be revealed prior to a
|
||||||
|
vulnerability being patched on the live network.
|
||||||
|
|
||||||
|
## Decision
|
||||||
|
|
||||||
|
The dCERT group is proposed to include an implementation of a `SpecializationGroup`
|
||||||
|
as defined in [ADR 007](./adr-007-specialization-groups.md). This will include the
|
||||||
|
implementation of:
|
||||||
|
- continuous voting
|
||||||
|
- slashing due to breach of soft contract
|
||||||
|
- revoking a member due to breach of soft contract
|
||||||
|
- emergency disband of the entire dCERT group (ex. for colluding maliciously)
|
||||||
|
- compensation stipend from the community pool or other means decided by
|
||||||
|
governance
|
||||||
|
|
||||||
|
This system necessitates the following new parameters:
|
||||||
|
- blockly stipend allowance per dCERT member
|
||||||
|
- maximum number of dCERT members
|
||||||
|
- required staked slashable tokens for each dCERT member
|
||||||
|
- quorum for suspending a particular member
|
||||||
|
- proposal wager for disbanding the dCERT group
|
||||||
|
- stabilization period for dCERT member transition
|
||||||
|
- circuit break dCERT privileges enabled
|
||||||
|
|
||||||
|
These parameters are expected to be implemented through the param keeper such
|
||||||
|
that governance may change them at any given point.
|
||||||
|
|
||||||
|
### Continuous Voting Electionator
|
||||||
|
|
||||||
|
An `Electionator` object is to be implemented as continuous voting and with the
|
||||||
|
following specifications:
|
||||||
|
- All delegation addresses may submit votes at any point which updates their
|
||||||
|
preferred representation on the dCERT group.
|
||||||
|
- Preferred representation may be arbitrarily split between addresses (ex. 50%
|
||||||
|
to John, 25% to Sally, 25% to Carol)
|
||||||
|
- In order for a new member to be added to the dCERT group they must
|
||||||
|
send a transaction accepting their admission at which point the validity of
|
||||||
|
their admission is to be confirmed.
|
||||||
|
- A sequence number is assigned when a member is added to dCERT group.
|
||||||
|
If a member leaves the dCERT group and then enters back, a new sequence number
|
||||||
|
is assigned.
|
||||||
|
- Addresses which control the greatest amount of preferred-representation are
|
||||||
|
eligible to join the dCERT group (up the _maximum number of dCERT members_).
|
||||||
|
If the dCERT group is already full and new member is admitted, the existing
|
||||||
|
dCERT member with the lowest amount of votes is kicked from the dCERT group.
|
||||||
|
- In the split situation where the dCERT group is full but a vying candidate
|
||||||
|
has the same amount of vote as an existing dCERT member, the existing
|
||||||
|
member should maintain its position.
|
||||||
|
- In the split situation where somebody must be kicked out but the two
|
||||||
|
addresses with the smallest number of votes have the same number of votes,
|
||||||
|
the address with the smallest sequence number maintains its position.
|
||||||
|
- A stabilization period can be optionally included to reduce the
|
||||||
|
"flip-flopping" of the dCERT membership tail members. If a stabilization
|
||||||
|
period is provided which is greater than 0, when members are kicked due to
|
||||||
|
insufficient support, a queue entry is created which documents which member is
|
||||||
|
to replace which other member. While this entry is in the queue, no new entries
|
||||||
|
to kick that same dCERT member can be made. When the entry matures at the
|
||||||
|
duration of the stabilization period, the new member is instantiated, and old
|
||||||
|
member kicked.
|
||||||
|
|
||||||
|
### Staking/Slashing
|
||||||
|
|
||||||
|
All members of the dCERT group must stake tokens _specifically_ to maintain
|
||||||
|
eligibility as a dCERT member. These tokens can be staked directly by the vying
|
||||||
|
dCERT member or out of the good will of a 3rd party (who shall gain no on-chain
|
||||||
|
benefits for doing so). This staking mechanism should use the existing global
|
||||||
|
unbonding time of tokens staked for network validator security. A dCERT member
|
||||||
|
can _only be_ a member if it has the required tokens staked under this
|
||||||
|
mechanism. If those tokens are unbonded then the dCERT member must be
|
||||||
|
automatically kicked from the group.
|
||||||
|
|
||||||
|
Slashing of a particular dCERT member due to soft-contract breach should be
|
||||||
|
performed by governance on a per member basis based on the magnitude of the
|
||||||
|
breach. The process flow is anticipated to be that a dCERT member is suspended
|
||||||
|
by the dCERT group prior to being slashed by governance.
|
||||||
|
|
||||||
|
Membership suspension by the dCERT group takes place through a voting procedure
|
||||||
|
by the dCERT group members. After this suspension has taken place, a governance
|
||||||
|
proposal to slash the dCERT member must be submitted, if the proposal is not
|
||||||
|
approved by the time the rescinding member has completed unbonding their
|
||||||
|
tokens, then the tokens are no longer staked and unable to be slashed.
|
||||||
|
|
||||||
|
Additionally in the case of an emergency situation of a colluding and malicious
|
||||||
|
dCERT group, the community needs the capability to disband the entire dCERT
|
||||||
|
group and likely fully slash them. This could be achieved though a special new
|
||||||
|
proposal type (implemented as a general governance proposal) which would halt
|
||||||
|
the functionality of the dCERT group until the proposal was concluded. This
|
||||||
|
special proposal type would likely need to also have a fairly large wager which
|
||||||
|
could be slashed if the proposal creator was malicious. The reason a large
|
||||||
|
wager should be required is because as soon as the proposal is made, the
|
||||||
|
capability of the dCERT group to halt message routes is put on temporarily
|
||||||
|
suspended, meaning that a malicious actor who created such a proposal could
|
||||||
|
then potentially exploit a bug during this period of time, with no dCERT group
|
||||||
|
capable of shutting down the exploitable message routes.
|
||||||
|
|
||||||
|
### dCERT membership transactions
|
||||||
|
|
||||||
|
Active dCERT members
|
||||||
|
- change of the description of the dCERT group
|
||||||
|
- circuit break a message route
|
||||||
|
- vote to suspend a dCERT member.
|
||||||
|
|
||||||
|
Here circuit-breaking refers to the capability to disable a groups of messages,
|
||||||
|
This could for instance mean: "disable all staking-delegation messages", or
|
||||||
|
"disable all distribution messages". This could be accomplished by verifying
|
||||||
|
that the message route has not been "circuit-broken" at CheckTx time (in
|
||||||
|
`baseapp/baseapp.go`).
|
||||||
|
|
||||||
|
"unbreaking" a circuit is anticipated only to occur during a hard fork upgrade
|
||||||
|
meaning that no capability to unbreak a message route on a live chain is
|
||||||
|
required.
|
||||||
|
|
||||||
|
Note also, that if there was a problem with governance voting (for instance a
|
||||||
|
capability to vote many times) then governance would be broken and should be
|
||||||
|
halted with this mechanism, it would be then up to the validator set to
|
||||||
|
coordinate and hard-fork upgrade to a patched version of the software where
|
||||||
|
governance is re-enabled (and fixed). If the dCERT group abuses this privilege
|
||||||
|
they should all be severely slashed.
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
> Proposed
|
||||||
|
|
||||||
|
## Consequences
|
||||||
|
|
||||||
|
### Positive
|
||||||
|
|
||||||
|
- Potential to reduces the number of parties to coordinate with during an emergency
|
||||||
|
- Reduction in possibility of disclosing sensitive information to malicious parties
|
||||||
|
|
||||||
|
### Negative
|
||||||
|
|
||||||
|
- Centralization risks
|
||||||
|
|
||||||
|
### Neutral
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
(Specialization Groups ADR)[./adr-007-specialization-groups.md]
|
Loading…
Reference in New Issue