0049 XLS-49d: Multiple Signer Lists #144
Replies: 4 comments 8 replies
-
|
Any thoughts around maybe a fee limit on the list? Allow signing up to a fee limit.
|
Beta Was this translation helpful? Give feedback.
-
|
Will the TransactionTypeBitmask and SignerListID correspond? If so, is it correct that there can be only one list with the same TransactionTypeBitmask, and that when deleting a SignerList, the TransactionTypeBitmask is used as the key? |
Beta Was this translation helpful? Give feedback.
-
|
Regarding the calculation of the For instance, this proposal could cause a collision between I found it hard to test this, because |
Beta Was this translation helpful? Give feedback.
-
|
I like that we can modify multiple transaction types in a single shot. Otherwise, it is difficult for the account administrators to set up a signer_list for every transaction type (assuming they don't want to fall back on the global signer_list) |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Multiple Signer Lists
Abstract
The XRP Ledger currently only supports one global signer list per account. However, many users (such as token issuers) require more granularity. For example, they might want to have one signer list with the ability to mint new tokens, and another signer list with the ability to create and edit trustlines.
This document describes a proposal for supporting multiple signer lists per account. The current system of global signer lists will continue to be supported, but we propose adding per-transaction-type signer lists. Accounts can set up signer lists that only have the power to send transactions of one specific type on behalf of the account.
This proposal is related to XLS-31d, but broader in scope.
1. Overview
We propose modifying one ledger object and one transaction:
SignerListledger objectSignerListSettransactionThis change will require an amendment.
The important considerations to keep in mind are:
rippledmust be able to retrieve all possible signer lists for a transaction type quickly and easily, in order to check if a transaction has a valid multisign list.2. On-Ledger Object:
SignerListThere is no change to the shape of a
SignerListledger object, only in how it's used.2.1. Fields
As a reference, the
SignerListobject currently has the following fields:LedgerIndexstringHASH256LedgerEntryTypestringUINT16SignerEntriesarraySTARRAYSignerQuorumnumberUINT32SignerListIDnumberUINT32OwnerNodestringUINT64PreviousTxnIDstringHASH256PreviousTxnLgrSeqnumberUINT32The ledger index of this object is calculated by hashing together the owner's account ID with the value of
0.The only field whose usage is changing is
SignerListID. All other fields will be used the same as they are now.2.1.1.
SignerListIDThis field is currently always set to
0. The originalMultisignimplementation only allowed for one signer list per account, but left the door open for the possibility of more.We propose that this field is instead used for the transaction type that the signer is allowed to sign for, with
0being the value for the global signer list (to ensure backwards compatibility). There is enough space inSignerListIDfor this field, becauseTxTypeis aUInt16andSignerListIDis aUInt32. Since theUInt32is so much larger than theUInt16, there is extra room in the valid values for additional signer list usage proposals. The value of this field will also be used in theindexcalculation.One problem:
Paymenthas transaction type0, which would conflict with the global signer list. To get around that, we will instead use1+TxTypein theSignerListIDfield. It is then very easy to check whether a multisign transaction is valid: the code can check the global signer list (look at the signer list with indexaccount + 0), and the transaction-type-specific signer list (look at the signer list with indexaccount + (1+TxType)).Each additional
SignerListthat an account owns will, of course, cost an additional owner reserve (2 XRP at the time of writing).3. Transaction:
SignerListSetThe
SignerListSettransaction already exists on the XRPL. We propose a slight modification to support per-transaction-type signer lists.3.1. Fields
As a reference, the
SignerListSettransaction already has the following fields:TransactionTypestringUInt16SignerEntriesarraySTARRAYSignerQuorumnumberUInt32We propose adding a new optional field:
TransactionTypeBitmaskarrayHASH2563.1.1.
TransactionTypeBitmaskThis field accepts a bitmask of transaction types, much like the
HookOnfield. A0bit is "on" and a1bit is "off". A value of0changes the global signer list. All other values change the many signer lists of the transactions they apply to, so that it is easier to modify many signer lists at once. The JSON will show a list of transactions.4. Security
One important fact to remember is that any signer list that can sign transactions can drain the account's XRP via fees. This was why multiple signer lists were never implemented originally. There is an open issue proposing potential ways to prevent accidental high fees on transactions.
Also, any signer list that is added to
SignerListSetcan effectively give themselves powers over any other transaction(s) they desire.Appendix
Appendix A: FAQ
A.1: Should global signer lists still be able to send transactions that have specific signer lists enabled?
Yes, because global signer lists should be able to act exactly like master and regular keys. This proposal does not support changing that.
A.2: Why not also use a bitmask for storage?
This design was strongly considered, but this spec is easier to use and understand. See Appendix B for more details.
A.3: Why not just take a transaction type in the
TransactionTypeBitmaskfield?That was part of the original design, because it would be more user-friendly and easier to read. It was changed to allow accounts to modify multiple signer lists with one transaction.
A.4: Can you remove the global signer list after removing the master and regular key?
No, you need to go through the standard blackhole procedure (setting the regular key to
ACCOUNT_ZERO).Theoretically, an account could only have a specific signer list on at least one of
SignerListSet/SetRegularKey/AccountSetso that the blackholing can be changed. However, this addition seems unnecessary since the standard blackhole procedure already exists.A.5: Why not use crypto-conditions?
This was briefly considered, but we decided to go with this design instead. See Appendix C for more details.
Appendix B: Bitmasks for
SignerListIDAnother design we developed (and seriously considered) was using a bitmask to determine which transaction types a signer list could sign for. This took inspiration from the
HookOnfield in the hooks proposal.The ledger modifications necessary for this design:
index) is now derived from the sequence of the transaction that created the signer list (similar to how escrow hashes are derived). This sequence is stored in theSignerListIDfield.SignerListIDin theSignerListSettransaction.SignerListIDin the transaction (a new global optional field).Ultimately, due to the pros and cons, we decided against this spec. If you have strong feelings about this design (positive or negative), please comment, because it's still in consideration.
B.1. Pros and Cons
Existing Spec
Bitmask
SignerListIDin the transaction. This is all less compatible with the existing UX for the global signer list.Appendix C: Crypto-Conditions
Using crypto-conditions for implementing per-transaction-type multisign was considered, but it seemed overly complex for the use-cases that people have. If a crypto-condition-based multisign approach is implemented, it should probably be integrated into all signatures, and apply to both multi-sign and single-sign.
Beta Was this translation helpful? Give feedback.
All reactions