Hi,

Another thing to consider when comparing these two techniques is anti-fee 
sniping protection. If you are going to feebump directly
your revocation transaction by adding inputs to it, the nLockTime has already 
been signed in advance. Therefore your are sponsoring
a transaction that could be included in any reorged block.

This is not a big deal for now but i'm concerned it may become one, especially 
since this type of transaction might be the highest fee-paying
ones on the network (there is a lot at stake). Having a new sighash type not 
masking the nLockTime so that it can be set by the feebumper
could help with this, even though the presumably low pre-signed fee can still 
be snipped (since the ALL signature is added to the feebump inputs).

The recent BIP proposal by Chris Belcher [0] also just uncovered (to me) a new 
hack: if the feebumping coins are less than 65,535 blocks old, we
could also set the nSequence of these coins to achieve the same purpose [1]. 
And this can be done with today's Bitcoin!

Antoine P.

[0] 
https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2021-June/019048.html
[1] 
https://lists.linuxfoundation.org/pipermail/lightning-dev/2020-January/002412.html
‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
Le vendredi 28 mai 2021 à 6:13 AM, Antoine Riard <antoine.ri...@gmail.com> a 
écrit :

>> Unfortunately, ACP | SINGLE is trivially pinable [0] (TL;DR: i can just 
>> attach an output paying immediately to me, and construct a tx chain spending 
>> it). We are using ACP | ALL for Revault,
>> which is the reason why we need a well laid-out pool of fee-bumping UTXOs 
>> (as you need to consume them entirely).
>
> Oh yes, I should have mentioned this pinning vector. The witnessScript I've 
> in mind to make secure that type of chain of transactions would be one MuSig 
> key for all contract participants, where signature are committed with 
> SIGHASH_ANYPREVOUT | SIGHASH_IOMAP, one pubkey per participant to lockdown 
> the transaction with SIGHASH_ALL. I think it works and prevents malicious 
> in-flight attachment of input/output to a multi-party transaction ?
>
>> I believe that it's better to broadcast a single fan-out transaction 
>> creating your entire UTXO pool in advance. You could create one coin per 
>> contract you are watching which value would be
>> used to bump your transaction feerate from the presigned one to -say- the 
>> average feerate over the past month, and then have smaller coins that you 
>> could attach to any transaction to bump
>> by a certain threshold (say, 10sat/vbyte). You would create as many small 
>> coin as your reserve algorithm tells you (which could be "i need to be able, 
>> worst case, to close all my contracts
>> with the worst historical feerate." or (fractional reserve version) "i need 
>> to be able, worst case, to close 10% of my contracts at the average feerate 
>> of the past year, the remaining ones sorry
>> for my loss"). [1]
>
>> This method is both much more optimal (though you need to sometimes incur 
>> the cost of many small additional inputs) and also makes sure that your 
>> feebump does not depend on the confirmation of a first stage transaction (as 
>> you can only RBF with new inputs if they are confirmed).
>
> I see, so you spread your bumping UTXO pool in two ranges : at least one 
> bumping utxo per contract, and a subpool of emergency smaller coins, ready to 
> be attached on any contract. I think this strategy makes sense for vaults as 
> you can afford a bunch of small coins at different feerates, spending the 
> ones not used afterwards. And higher cells of feerate reserve as the worst 
> historical feerate are relatively not that much compared to locked-in vaults 
> value. That said, I'm more dubious about LN, where node operators might not 
> keep the worst-case fee-bumping reserve, as the time value of the coins 
> aren't worth the channel liquidity at stake.
>
>> Why not just attaching it at the tail of the chain? Bumping the last child 
>> with additional input would effectively be a CPFP for the entire chain in 
>> this case.
>
> Yes, input-based bumping targeting the tail of the chain works at the 
> transaction level. But if you assume bounded visibility of network mempools, 
> one of your counterparties might have broadcast a concurrent state, thus 
> making your CPFP irrelevant for propagation. Though smarter tx-relay 
> techniques such as "attach-on-contract-utxo-root" CPFP (or also known as 
> "blinded CPFP") might solve this issue.
>
> Le jeu. 27 mai 2021 à 17:45, darosior <daros...@protonmail.com> a écrit :
>
>> Hi,
>>
>>> ## Input-Based
>>>
>>> I think input-based fee-bumping has been less studied as fee-bumping 
>>> primitive for L2s [1]. One variant of input-based fee-bumping usable today 
>>> is the leverage of the SIGHASH_ANYONECANPAY/SIGHASH_SINGLE malleability 
>>> flags. If the transaction is the latest stage of the contract, a bumping 
>>> input can be attached just-in-time, thus increasing the feerate of the 
>>> whole package.
>>
>> Unfortunately, ACP | SINGLE is trivially pinable [0] (TL;DR: i can just 
>> attach an output paying immediately to me, and construct a tx chain spending 
>> it). We are using ACP | ALL for Revault,
>> which is the reason why we need a well laid-out pool of fee-bumping UTXOs 
>> (as you need to consume them entirely).
>>
>>> Input-based (today): If the bumping utxo is offering an adequate feerate 
>>> point in function of network mempools congestion at time of broadcast, only 
>>> 1 input. If a preliminary fan-out transaction to adjust feerate point must 
>>> be broadcasted first, 1 input and 2 outputs more must be accounted for. 
>>> Onchain footprint: 2 inputs + 3 outputs.
>>
>> I believe that it's better to broadcast a single fan-out transaction 
>> creating your entire UTXO pool in advance. You could create one coin per 
>> contract you are watching which value would be
>> used to bump your transaction feerate from the presigned one to -say- the 
>> average feerate over the past month, and then have smaller coins that you 
>> could attach to any transaction to bump
>> by a certain threshold (say, 10sat/vbyte). You would create as many small 
>> coin as your reserve algorithm tells you (which could be "i need to be able, 
>> worst case, to close all my contracts
>> with the worst historical feerate." or (fractional reserve version) "i need 
>> to be able, worst case, to close 10% of my contracts at the average feerate 
>> of the past year, the remaining ones sorry
>> for my loss"). [1]
>>
>> This method is both much more optimal (though you need to sometimes incur 
>> the cost of many small additional inputs) and also makes sure that your 
>> feebump does not depend on the confirmation
>> of a first stage transaction (as you can only RBF with new inputs if they 
>> are confirmed).
>>
>>> Input-based (today): In case of rebroadcast, the fee-bumping input is 
>>> attached to the root of the chain of transactions and as such breaks the 
>>> chain validity in itself. Beyond the rebroadcast of the updated root under 
>>> replacement policy, the remaining transactions must be updated and 
>>> rebroadcast. Rebroadcast footprint: the whole chain of transactions.
>>
>> Why not just attaching it at the tail of the chain? Bumping the last child 
>> with additional input would effectively be a CPFP for the entire chain in 
>> this case.
>>
>> Thanks for starting this discussion :)
>> Antoine
>>
>> [0] 
>> https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2020-May/017835.html
>> [1] Credits to Jacob Swambo, who came up with the single fan-out transaction 
>> and with whom i'm discussing how to practically apply these ideas to Revault.
_______________________________________________
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev

Reply via email to