Hi Greg,

Thank you very much for sharing your proposal!

I think there's one thing about the second part of your proposal that I'm 
missing. Specifically, assuming the scenario of a v3 transaction with three 
outputs, A, B, and the ephemeral anchor OP_TRUE. If a child transaction spends 
A and OP_TRUE, does that effectively mark output B as unspendable once the 
child gets confirmed? If so, isn't the implication therefore that to safely 
spend a transaction with an ephemeral anchor, all outputs must be spent? Thanks!

Best,
Arik

On Tue, Oct 18, 2022, at 6:52 AM, Greg Sanders via bitcoin-dev wrote:
> Hello Everyone,
> 
> 
> Following up on the "V3 Transaction" discussion here 
> https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2022-September/020937.html
>  , I would like to elaborate a bit further on some potential follow-on work 
> that would make pinning severely constrained in many setups].
> 
> 
> V3 transactions may solve bip125 rule#3 and rule#5 pinning attacks under some 
> constraints[0]. This means that when a replacement is to be made and 
> propagated, it costs the expected amount of fees to do so. This is a great 
> start. What's left in this subset of pinning is *package limit* pinning. In 
> other words, a fee-paying transaction cannot enter the mempool due to the 
> existing mempool package it is being added to already being too large in 
> count or vsize.
> 
> 
> Zooming into the V3 simplified scenario for sake of discussion, though this 
> problem exists in general today:
> 
> 
> V3 transactions restrict the package limit of a V3 package to one parent and 
> one child. If the parent transaction includes two outputs which can be 
> immediately spent by separate parties, this allows one party to disallow a 
> spend from the other. In Gloria's proposal for ln-penalty, this is worked 
> around by reducing the number of anchors per commitment transaction to 1, and 
> each version of the commitment transaction has a unique party's key on it. 
> The honest participant can spend their version with their anchor and package 
> RBF the other commitment transaction safely.
> 
> 
> What if there's only one version of the commitment transaction, such as in 
> other protocols like duplex payment channels, eltoo? What about multi party 
> payments?
> 
> 
> In the package RBF proposal, if the parent transaction is identical to an 
> existing transaction in the mempool, the parent will be detected and removed 
> from the package proposal. You are then left with a single V3 child 
> transaction, which is then proposed for entry into the mempool. In the case 
> of another parent output already being spent, this is simply rejected, 
> regardless of feerate of the new child.
> 
> 
> I have two proposed solutions, of which I strongly prefer the latter:
> 
> 
> 1) Expand a carveout for "sibling eviction", where if the new child is paying 
> "enough" to bump spends from the same parent, it knocks its sibling out of 
> the mempool and takes the one child slot. This would solve it, but is a new 
> eviction paradigm that would need to be carefully worked through.
> 
> 
> 2) Ephemeral Anchors (my real policy-only proposal)
> 
> 
> Ephemeral Anchors is a term which means an output is watermarked as an output 
> that MUST be spent in a V3 package. We mark this anchor by being the bare 
> script `OP_TRUE` and of course make these outputs standard to relay and spend 
> with empty witness data.
> 
> 
> Also as a simplifying assumption, we require the parent transaction with such 
> an output to be 0-fee. This makes mempool reasoning simpler in case the 
> child-spend is somehow evicted, guaranteeing the parent will be as well.
> 
> 
> Implications:
> 
> 
> a) If the ephemeral anchor MUST be spent, we can allow *any* value, even 
> dust, even 0, without worrying about bloating the utxo set. We relax this 
> policy for maximum smart contract flexibility and specification simplicity..
> 
> 
> b) Since this anchor MUST be spent, any spending of other outputs in the same 
> parent transaction MUST directly double-spend prior spends of the ephemeral 
> anchor. This causes the 1 block CSV timelock on outputs to be removed in 
> these situations. This greatly magnifies composability of smart contracts, as 
> now we can do things like safely splice directly into new channels, into 
> statechains, your custodial wallet account, your cold wallet, wherever, 
> without requiring other wallets to support arbitrary scripts. Also it hurts 
> that 1 CSV time locked scripts may not be miniscript compatible to begin 
> with...
> 
> 
> c) *Anyone* can bump the transaction, without any transaction key material. 
> This is essentially achieving Jeremy's Transaction Sponsors 
> (https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2020-September/018168.html)
>  proposal without consensus changes. As long as someone gets a fully signed 
> parent, they can execute a bump with minimal wallet tooling. If a transaction 
> author doesn’t want a “sponsor”, do not include the output.
> 
> 
> d) Lightning 
> Carve-out(https://lists.linuxfoundation.org/pipermail/lightning-dev/2019-October/002240.html)
>   is superseded by this logic, as we are not restricted to two immediately 
> spendable output scenarios. In its place, robust multi-party fee bumping is 
> possible.
> 
> 
> e) This also benefits more traditional wallet scenarios, as change outputs 
> can no longer be pinned, and RBF/CPFP becomes robust. Payees in simple spends 
> cannot pin you. Batched payouts become a lot less painful. This was one of 
> the motivating use cases that created the term “pinning” in the first 
> place(https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2018-February/015717.html),
>  even if LN/L2 discussion has largely overtaken it due to HTLC theft risks.
> 
> 
> Open Question(s):
> 
> 
>  1. If we allow non-zero value in ephemeral outputs, does this open up a MEV 
> we are worried about? Wallets should toss all the value directly to fees, and 
> add their own additional fees on top, otherwise miners have incentive to make 
> the smallest utxo burn transaction to claim those funds. They just confirmed 
> your parent transaction anyways, so do we care?
> 
>  2. SIGHASH_GROUP like constructs would allow uncommitted ephemeral anchors 
> to be added at spend time, depending on spending requirements. SIGHASH_SINGLE 
> already allows this.
> 
> 
> 
> 
> Hopefully this gives people something to consider as we move forward in 
> thinking about mempool design within the constraints we have today.
> 
> 
> 
> Greg
> 
> 
> 0: With V3 transactions where you have "veto power" over all the inputs in 
> that transaction. Therefore something like ANYONECANPAY is still broken. We 
> need a more complex solution, which I’m punting for the sake of progress.
> 
> _______________________________________________
> 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

Reply via email to