Hi Oli,
Concept ACK on the direction. Good to see this this moving forward.
I work on PSBT tooling (author of BTSL [1], a declarative validation layer for multi-party PSBT workflows) so the PSBT parts caught my attention.
On PSBT_IN_GENERIC_SIGNED_MESSAGE (0x21)
Why a per-input field rather than global? The signed message is a property of the whole `to_sign` transaction, not of input 0 specifically. Placing it there works but creates an implicit convention that the first input carries transaction-wide metadata. Was there a reason to avoid PSBT_GLOBAL_*?
On Proof of Funds as finalized PSBT
Clean choice. One question: how does a parser that ingests PSBTs generically distinguish a BIP-322 proof-of-funds from a regular transaction PSBT? Is 0x21 on the first input sufficient as discriminant, or does this need an explicit marker?
The problem you identify — signer sees a zero-value-to-OP_RETURN transaction with no idea they're signing a message — extends beyond BIP-322 to any multi-party PSBT workflow where the signer lacks semantic context. I've been working on the same gap from a different angle with BTSL [1][2]. Different mechanism, same problem. Worth noting because it suggests "signer context" deserves to be a first-class concern in PSBT design broadly.
Cheers,
Thomas
[1] https://github.com/tsua0002/btsl-standard
[2] https://btsl-playground.vercel.app
Hi Oli,
Thanks for the detailedd reply and for the detection section — the five checks are solid, especially the cryptographic binding via to_spend.txid in in check 4.
On the per-input vs global question: since you're open to either, I'd argue for a global field (PSBT_GLOBAL_GENERIC_SIGNED_MESSAGE).
The message text isn't data required to satisfy input 0's script — it's semantic context about what the whole transaction represents. That maps cleanly to the global/per-input split in BIP-174: global fields carry transaction-wide metadata, per-input fields carry what's needed to sign that specific input.
Putting it on input 0 works mechanically but sets a precedent where transaction-level metadata lives on an arbitrary input by convention. A global field avoids that and keeps the detection logic just as simple — check 1 moves from input-level to global-level, everything else stays the same.
Thomas
--
You received this message because you are subscribed to a topic in the Google Groups "Bitcoin Development Mailing List" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/bitcoindev/qd6BNz9gxCk/unsubscribe.
To unsubscribe from this group and all its topics, send an email to bitcoindev+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/bitcoindev/6dc35b8a-e837-4fc9-9a17-ca29204bf738n%40googlegroups.com.