- ADR
- ADR-008: Automatic Signer List
Status
DesignProblem 1: Two gov proposals
Currently, thex/bridge module’s signers list does not update automatically when a new pool public key is generated via TSS. So, one additional government proposal is required to update this list and complete the key generation process. Without this update, the list of authorized signers for outbound and inbound transfer would be inconsistent.
Problem 2: Uncontrolled committee participants
At present, when peers generate the keygen request, they query all online peers from the TSS server and include them in the keygen message. This scenario can lead to problems:- If a peer has a different list of peers (due to unforeseen circumstances like network issues), the keygen process may fail as consensus on the list of participants would not be possible. This could trigger multiple attempts before a successful result is achieved.
- There is no control over the committee participants. The list of online peers may not align with our expectations.
Current Keygen Process
Now, the complete process of key generation is the following: The current key generation process is as follows:- Create a government proposal that includes a keygen block, and approve it.
- Witness the keygen block with observers.
- Form a committee based on all the online peers.
- <— At this point, the committee used for outbound transfer varies from the list of signers for inbound transfer. Also, the committee was created based on online peers, so we cannot know the list of participants beforehand.
- Request validator public keys from all validators.
- Create another government proposal that includes the updated signer list (with all those validator public keys) and approve it.
- <— By now, the keygen process is fully complete.
Accepted Approach: Returning Keygen Result
Design
One proposed solution is to return the keygen result to the Int3face chain after the TSS keygen procedure is completed. Here, all validators will need to automatically submit a message listing new committee peers and a new pool public key to Int3face. Once Int3face receives these messages, and their count surpasses the threshold (more than 2/3 of the number of participants), the keygen block is considered to be successfully executed. Following the success, Int3face auto-updates the list of signers, including all the signers listed in the accepted keygen block result. For Int3face to correctly handle the threshold, it needs to know the count of signers beforehand. Hence, it is recommended to incorporate the list of all expected peers in the keygen block. This adjustment can make the keygen process more transparent and manageable. In addition, the keygen government proposal will include new peers, allowing voters to verify the committee participants and vote for them in advance.Schema
State
KeyGen When accepting the keygen results, theKeyGenResult object is saved in the state.
- KeyGen:
0x04 | hash(keygen_id + participants_pks + pool_pk) -> ProtocolBuffer(KeyGen)
KeyGen accumulates a sufficient number of votes.
- KeyGenResult:
0x05 | pool_pk -> ProtocolBuffer(KeyGenResult)
Unresolved Issues
- Observers have public keys and validator private keys, that are different. The first is utilized during the TSS signing while the second is applied during the inbound transfer signing. How to associate the observer public key with the validator public key?
Implementation Steps
- Research how to associate the validator address with the observer address.
- Modify
MsgKeygento include the expected list of signers. - Modify the observer to work with the list of signers instead of online peers.
- Add a message to submit the keygen results to Int3face.
- Store keygen results in the state: pool public key along with related participants.
- Add a mechanism to vote on keygen results and accept the one with the super majority of votes.
- Auto-update the list of legit signers after the keygen result is accepted.