Good morning lists, Let me summarize concerns brought up:
* Chris concern, is that an ordinary UTXO that is not allocated for `SIGHASH_NOINPUT` use, is inadvertently spent using `SIGHASH_NOINPUT`. * My concern, is that unless a UTXO allocated for `SIGHASH_NOINPUT` use, is *indeed* used with SIGHASH_NOINPUT`, it should look exactly the same as any other SegWit v1 output. I propose the below instead: * Do ***NOT*** allocate SegWit v16 for `SIGHASH_NOINPUT`. * Instead, allocate SegWit v1 Tapscript v16 for `SIGHASH_NOINPUT`. Then, on usage: * Exchange hoards can be protected by simple MuSig bip-schnorr SegWit v1 outputs, or a NUMS Taproot internal point with a MAST branch Tapscript v0 `OP_CHECKSIG_ADD` sequence. * Decker-Russell-Osuntokun constructions are backed by a n-of-n MuSig Taproot internal point, with a MAST branch containing a Tapscript v16 with `OP_1 OP_CHECKSIG`. This solves both concerns: * Ordinary UTXOs not allocated for `SIGHASH_NOINPUT` use simply do not commit to any Taproot that has a Tapscript v16 branch, and thus `SIGHASH_NOINPUT` is unuseable to claim it. * If a UTXO used for an offchain protocol ends up in a cooperative-resolution state, nobody has to know that a Tapscript v16 branch existed that could have used `SIGHASH_NOINPUT`. Again, my objection to output tagging is that it is **publicly visible** as soon as the funding transaction is confirmed onchain that this is a special output used for a Decker-Russell-Osuntokun construction, greatly damaging privacy. But if this fact is kept secret *unless* the very specific case of unilateral uncooperative enforcement, then it is quite fine with me. Would this alternate proposal hold better muster? Regards, ZmnSCPxj > I do have some concerns about SIGHASH_NOINPUT, mainly that it does introduce > another footgun into the bitcoin protocol with address reuse. It's common > practice for bitcoin businesses to re-use addresses. Many exchanges [1] reuse > addresses for cold storage with very large sums of money that is stored in > these addreses. > > It is my understanding with this part of BIP118 > > >Using NOINPUT the input containing the signature no longer references a > >specific output. Any participant can take a transaction and rewrite it by > >changing the hash reference to the previous output, without invalidating the > >signatures. This allows transactions to be bound to any output that matches > >the value committed to in the witness and whose witnessProgram, combined > >with the spending transaction's witness returns true. > > if an exchange were to once produce a digital signature from that cold > storage address with a SIGHASH_NOINPUT signature, that signature can be > replayed again and again on the blockchain until their wallet is drained. > This might be able to mitigated since the signatures commit to outputs, which > may be small in value for the transaction that SIGHASH_NOINPUT was used. This > means that an exchange could move coins from the address with a larger > transaction that spends money to a new output (and presumably pays a higher > fee than the smaller transactions). > > ### Why does this matter? > > It seems that SIGHASH_NOINPUT will be an extremely useful tool for offchain > protocols like Lightning. This gives us the building blocks for enforcing > specific offchain states to end up onchain [2]. > > Since this tool is useful, we can presume that it will be integrated into the > signing path of large economic entities in bitcoin -- namely exchanges. Many > exchanges have specific signing procedures for transactions that are leaving > an exchange that is custom software. Now -- presuming wide adoption of off > chain protocols -- they will need to have a _second unique signing path that > uses SIGHASH_NOINPUT_. > > It is imperative that this second signing path -- which uses SIGHASH_NOINPUT > -- does NOT get mixed up with the first signing path that controls an > exchanges onchain funds. If this were to happen, fund lost could occur if the > exchange is reusing address, which seems to be common practice. > > This is stated here in BIP118: > > >This also means that particular care has to be taken in order to avoid > >unintentionally enabling this rebinding mechanism. NOINPUT MUST NOT be used, > >unless it is explicitly needed for the application, e.g., it MUST NOT be a > >default signing flag in a wallet implementation. Rebinding is only possible > >when the outputs the transaction may bind to all use the same public keys. > >Any public key that is used in a NOINPUT signature MUST only be used for > >outputs that the input may bind to, and they MUST NOT be used for > >transactions that the input may not bind to. For example an application > >SHOULD generate a new key-pair for the application instance using NOINPUT > >signatures and MUST NOT reuse them afterwards. > > This means we need to encourage onchain hot wallet signing procedures to be > kept separate from offchain hot wallet signing procedures, which introduces > more complexity for key management (two keychains). > > One (of the few) upsides of the current Lightning penalty mechanism is that > fund loss can be contained to balance of the channel. You cannot do something > in the current protocol that will effect your funds outside of that channel. > With SIGHASH_NOINPUT, that property changes. > > ### A side note > In general, i think we should start disallowing uses of the SIGHASH protocols > that have unexpected behavior. The classic example of this is SIGHASH_SINGLE > [3]. I get uneasy about adding more footguns to the protocol, which with > current network behavior (address re-use) SIGHASH_NOINPUT would be a big one. > > [1] - https://bitinfocharts.com/top-100-richest-bitcoin-addresses.html > [2] - > https://lists.linuxfoundation.org/pipermail/lightning-dev/2019-September/002136.html > [3] - > https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-May/016048.html > > On Mon, Sep 30, 2019 at 9:24 AM Christian Decker via bitcoin-dev > <bitcoin-dev@lists.linuxfoundation.org> wrote: > > > With the recently renewed interest in eltoo, a proof-of-concept > > implementation > > [1], and the discussions regarding clean abstractions for off-chain > > protocols > > [2,3], I thought it might be time to revisit the `sighash_noinput` proposal > > (BIP-118 [4]), and AJ's `bip-anyprevout` proposal [5]. > > > > (sorry for the long e-mail. I wanted to give enough context and describe the > > various tradeoffs so people don't have to stitch them together from memory. > > If > > you're impatient there are a couple of open questions at the bottom) > > > > Both proposals are ways to allow rebinding of transactions to new outputs, > > by > > adding a sighash flag that excludes the output when signing. This allows the > > transaction to be bound to any output, without needing a new signature, as > > long as output script and input script are compatible, e.g., the signature > > matches the public key specified in the output. > > > > BIP-118 is limited to explaining the details of signature verification, and > > omits anything related to deployment and dependency on other proposals. This > > was done in order not to depend on bip-taproot which is also in draft-phase > > currently, and to allow deployment alongside the next version of segwit > > script. `bip-anyprevout` builds on top of BIP-118, adding integration with > > `bip-taproot`, chaperone signatures, limits the use of the sighash flag to > > script path spends, as well as a new pubkey serialization which uses the > > first > > byte to signal opt-in. > > > > I'd like to stress that both proposals are complementary and not competing, > > which is something that I've heard a couple of times. > > > > There remain a couple of unclear points which I hope we can address in the > > coming days, to get this thing moving again, and hopefully get a new tool in > > our toolbox soon(ish). > > > > In the following I will quote a couple of things that were discussed during > > the CoreDev meeting earlier this year, but not everybody could join, and it > > is > > important that we engage the wider community, to get a better picture, and I > > think not everybody is up-to-date about the current state. > > > > ## Dangers of `sighash_noinput` > > > > An argument I have heard against noinput is that it is slightly less complex > > or compute intensive than `sighash_all` signatures, which may encourage > > wallet > > creators to only implement the noinput variant, and use it indiscrimi- > > nately. This is certainly a good argument, and indeed we have seen at least > > one developer proposing to use noinput for all transactions to discourage > > address reuse. > > > > This was also mentioned at CoreDev [6]: > > > > > When [...] said he wanted to write a wallet that only used > > > SIGHASH\_NOINPUT, > > > that was pause for concern. Some people might want to use > > > SIGHASH\_NOINPUT as a > > > way to cheapen or reduce the complexity of making a wallet > > > implementation. SIGHASH\_NOINPUT is from a purely procedural point of view > > > easier than doing a SIGHASH\_ALL, that's all I'm saying. So you're hashing > > > less. It's way faster. That concern has been brought to my attention and > > > it's > > > something I can see. Do we want to avoid people being stupid and shooting > > > themselves and their customers in the foot? Or do we treat this as a > > > special > > > case where you mark we're aware of how it should be used and we just try > > > to > > > get that awareness out? > > > > Another issue that is sometimes brought up is that an external user may > > attempt to send funds to a script that was really part of a higher-level > > protocol. This leads to those funds becoming inaccessible unless you gather > > all the participants and sign off on those funds. I don't believe this is > > anything new, and if users really want to shoot themselves in the foot and > > send funds to random addresses they fish out of a blockexplorer there's > > little > > we can do. What we could do is make the scripts used internally in our > > protocols unaddressable (see output tagging below), removing this issue > > altogether. > > > > ## Chaperone signatures > > > > Chaperone signatures are signatures that ensure that there is no third-party > > malleability of transactions. The idea is to have an additional signature, > > that doesn't use noinput, or any of its variants, and therefore needs to be > > authored by one of the pubkeys in the output script, i.e., one or more of > > the > > participants of the contract the transaction belongs to. Concretely in eltoo > > we'd be using a shared key known to all participants in the eltoo instance, > > so > > any participant can sign an update to rebind it to the desired output. > > > > Chaperone signatures have a number of downsides however: > > > > - Additional size: both the public key and the signature actually need to > > be > > stored along with the real noinput signature, resulting in transfer, > > computational and storage overhead. We can't reuse the same pubkey from > > the > > noinput signature since that'd require access to the matching privkey > > which > > is what we want to get rid of using noinput in the first place. > > - Protocols can still simply use a globally known privkey, voiding the > > benefit of chaperone signatures, since third-parties can sign again. I > > argue that third-party malleability is a subset of first-party > > malleability, and we should protect against first-party malleability > > first > > and foremost. My counterparty has the incentive to trick me, a > > third-party > > may not. > > > > On the plus side chaperone signatures certainly address the lazy-wallet-dev > > scenario, and as AJ points out in [bip-anyprevout] we get back the same > > security guarantees as we had without noinput. > > > > From what I remember and the transcript (thanks Kanzure for your awesome > > work > > by the way), there was no strong support for chaperone signatures during the > > meeting [6], but feedback from people that were not present is needed: > > > > > if everyone who wanted to use NOINPUT was convinced there was a problem, > > > then > > > they would pick the right thing, but clearly people aren't. It's not a > > > foot-gun defense mechanism because it's easily bypassed, and it's easier > > > to > > > bypass it than to use it. Whereas for tagged outputs, it's that if you > > > want > > > any NOINPUT then you must tag. > > > > ## Output tagging > > > > One proposal that I found rather fascinating during the discussion in > > Amsterdam was that we could achieve the same disincentive to use on > > non-smart-contract cases by simply making the output scripts > > unaddressable. This can be done by specifying a version of taproot outputs > > for > > which the bech32 addressing scheme simply doesn't have a representation [6]: > > > > > The tagged outputs idea is that we don't have NOINPUT ANYPREVOUT > > > supported for > > > taproot v1 outputs, instead we have a segwit version 16 v16 that supports > > > taproot. The reason for v16 is that we redefine bech32 to not cover > > > v16. There's no addresses for this type of output. If you're an exchange > > > and > > > receive a bech32 address, you declare it invalid. You make it less user > > > friendly here; and there shouldn't be an address anyway. You might want > > > to see > > > it on a block explorer, but you don't want to pass it around to anyone. > > > > We don't need addresses in our contract constructions because we deal > > directly > > with the scripts. This would also have the desired effect of no allowing > > generic wallets to send to these addresses, or users accidentally sending > > funds to what was supposed to be a one-off script used internally in the > > off-chain contract. > > > > Notice that this idea was already used by Russell O'Connor when performing a > > transaction on elements using his new scripting language simplicity > > [7]: > > > > > For this experimental development, we created an improper segwit version, > > > "version 31" for Simplicity addresses. The payload of this segwit version > > > 31 > > > address contains a commitment Merkle root of a Simplicity program to > > > control > > > the UTXO. > > > > The concern with output tagging is that it hurts fungibility, marking > > outputs > > used in a contract as such and making them identifiable. But maybe it would > > be > > a good idea to create two domains anyway: one for user-addressable > > destinations which users can use with their general purpose wallets, and one > > domain for contracts, which users cannot send to directly. > > > > This also came up during the CoreDev meeting [ams-coredev]: > > > > > these sort of NOINPUT signatures are only things that are within some > > > application or within some protocol that gets negotiated between > > > participants, > > > but they don't cross-independent domains where you see a wallet or a > > > protocol > > > as a kind of domain. You can't tell the difference, is this an address I > > > can > > > give to someone else or not? It's all scripts, no real addresses. There > > > are > > > types of outputs that are completely insecure unconditionally; there are > > > things that are protected and I can give to anyone, you don't want to > > > reuse > > > it, but there's no security issue from doing so. This is an additional > > > class > > > that is secure perfectly but only when used in the right way. > > > > ## Open questions > > > > The questions that remain to be addressed are the following: > > > > 1. General agreement on the usefulness of noinput / anyprevoutanyscript / > > anyprevout. While at the CoreDev meeting I think everybody agreed that > > these proposals a useful, also beyond eltoo, not everybody could be > > there. I'd therefore like to elicit some feedback from the wider > > community. > > 2. Is there strong support or opposition to the chaperone signatures > > introduced in anyprevout / anyprevoutanyscript? I think it'd be best to > > formulate a concrete set of pros and contras, rather than talk about > > abstract dangers or advantages. > > 3. The same for output tagging / explicit opt-in. What are the advantages > > and > > disadvantages? > > 4. Shall we merge BIP-118 and bip-anyprevout. This would likely reduce the > > confusion and make for simpler discussions in the end. > > 5. Anything I forgot to mention :-) > > > > Cheers, > > Christian > > > > [1] > > <https://lists.linuxfoundation.org/pipermail/lightning-dev/2019-September/002131.html> > > [2] > > <https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2019-September/017285.html> > > [3] > > <https://lists.linuxfoundation.org/pipermail/lightning-dev/2018-August/001383.html> > > [4] <https://github.com/bitcoin/bips/blob/master/bip-0118.mediawiki> > > [5] > > <https://github.com/ajtowns/bips/blob/bip-anyprevout/bip-anyprevout.mediawiki> > > [6] > > <http://diyhpl.us/wiki/transcripts/bitcoin-core-dev-tech/2019-06-06-noinput-etc/> > > [7] <https://lists.ozlabs.org/pipermail/simplicity/2019/000018.html> > > _______________________________________________ > > bitcoin-dev mailing list > > bitcoin-dev@lists.linuxfoundation.org > > https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev _______________________________________________ bitcoin-dev mailing list bitcoin-dev@lists.linuxfoundation.org https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev