Add never_valid
transaction parameter to permit proof-of-capability signing
#4309
Labels
needs-refinement
unclear, incomplete, or stub issue that needs work
Is your feature request related to a problem? Please describe.
As a user of Penumbra, I want to be able to prove that I could perform some transaction without authorizing the transaction itself. Examples of situations where this would be useful:
If there was a way to prove capability of doing a transaction, without ever authorizing a valid transaction, then these use-cases would be unlocked. It turns out there is a backwards-compatible, non-consensus-breaking, straightforward way to accomplish this.
Describe the solution you'd like
TransactionParameters
namednever_valid
, whose default value if absent isfalse
, as is the default in protobuf.never_valid
field istrue
is still rejected.never_valid
field totrue
.pd
which checks a transaction for validity, returning at least one of three values, corresponding to the statuses: "invalid", "would have been valid except for thenever_valid
field", and "valid".Having done this, users can prove that they hold at least a certain balance of a particular token by building a
never_valid
transaction which consists only of spends and outputs, which outputs the specified amount of the token to an ephemeral address, and then revealing the output action. A counterparty can check the proof using the RPC in (4), and all they will learn is whether or not the person had sufficient value to cover the revealed output, not their total funds, and not any other information about their wallet balance. Similar protocols can be used for partial disclosure of other types of on-chain capability.Describe alternatives you've considered
This could also be accomplished by setting an incorrect chain ID or an already-expired expiry time, but neither of these solutions are as clean or easy to present to the user. It would be good for users to have assurance that they are signing a proof of capability which can in no circumstance ever be used to authorize a real transaction, rather than having to carefully inspect an approval dialog to ensure that the chain ID is bogus or the expiry height is past (a moving target!).
The text was updated successfully, but these errors were encountered: