-
Couldn't load subscription status.
- Fork 421
Re-add support for non-zero-fee-anchors to chan_utils #1828
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -660,7 +660,7 @@ pub fn make_funding_redeemscript(broadcaster: &PublicKey, countersignatory: &Pub | |
| /// | ||
| /// Panics if htlc.transaction_output_index.is_none() (as such HTLCs do not appear in the | ||
| /// commitment transaction). | ||
| pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, contest_delay: u16, htlc: &HTLCOutputInCommitment, opt_anchors: bool, broadcaster_delayed_payment_key: &PublicKey, revocation_key: &PublicKey) -> Transaction { | ||
| pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, contest_delay: u16, htlc: &HTLCOutputInCommitment, opt_anchors: bool, use_non_zero_fee_anchors: bool, broadcaster_delayed_payment_key: &PublicKey, revocation_key: &PublicKey) -> Transaction { | ||
| let mut txins: Vec<TxIn> = Vec::new(); | ||
| txins.push(TxIn { | ||
| previous_output: OutPoint { | ||
|
|
@@ -677,7 +677,7 @@ pub fn build_htlc_transaction(commitment_txid: &Txid, feerate_per_kw: u32, conte | |
| } else { | ||
| htlc_success_tx_weight(opt_anchors) | ||
| }; | ||
| let output_value = if opt_anchors { | ||
| let output_value = if opt_anchors && !use_non_zero_fee_anchors { | ||
| htlc.amount_msat / 1000 | ||
| } else { | ||
| let total_fee = feerate_per_kw as u64 * weight / 1000; | ||
|
|
@@ -765,7 +765,11 @@ pub struct ChannelTransactionParameters { | |
| pub funding_outpoint: Option<chain::transaction::OutPoint>, | ||
| /// Are anchors (zero fee HTLC transaction variant) used for this channel. Boolean is | ||
| /// serialization backwards-compatible. | ||
| pub opt_anchors: Option<()> | ||
| pub opt_anchors: Option<()>, | ||
| /// Are non-zero-fee anchors are enabled (used in conjuction with opt_anchors) | ||
| /// It is intended merely for backwards compatibility with signers that need it. | ||
| /// There is no support for this feature in LDK channel negotiation. | ||
| pub opt_non_zero_fee_anchors: Option<()>, | ||
| } | ||
|
|
||
| /// Late-bound per-channel counterparty data used to build transactions. | ||
|
|
@@ -820,6 +824,7 @@ impl_writeable_tlv_based!(ChannelTransactionParameters, { | |
| (6, counterparty_parameters, option), | ||
| (8, funding_outpoint, option), | ||
| (10, opt_anchors, option), | ||
| (12, opt_non_zero_fee_anchors, option), | ||
| }); | ||
|
|
||
| /// Static channel fields used to build transactions given per-commitment fields, organized by | ||
|
|
@@ -942,7 +947,8 @@ impl HolderCommitmentTransaction { | |
| is_outbound_from_holder: false, | ||
| counterparty_parameters: Some(CounterpartyChannelTransactionParameters { pubkeys: channel_pubkeys.clone(), selected_contest_delay: 0 }), | ||
| funding_outpoint: Some(chain::transaction::OutPoint { txid: Txid::all_zeros(), index: 0 }), | ||
| opt_anchors: None | ||
| opt_anchors: None, | ||
| opt_non_zero_fee_anchors: None, | ||
| }; | ||
| let mut htlcs_with_aux: Vec<(_, ())> = Vec::new(); | ||
| let inner = CommitmentTransaction::new_with_auxiliary_htlc_data(0, 0, 0, false, dummy_key.clone(), dummy_key.clone(), keys, 0, &mut htlcs_with_aux, &channel_parameters.as_counterparty_broadcastable()); | ||
|
|
@@ -1160,6 +1166,8 @@ pub struct CommitmentTransaction { | |
| htlcs: Vec<HTLCOutputInCommitment>, | ||
| // A boolean that is serialization backwards-compatible | ||
| opt_anchors: Option<()>, | ||
| // Whether non-zero-fee anchors should be used | ||
| opt_non_zero_fee_anchors: Option<()>, | ||
| // A cache of the parties' pubkeys required to construct the transaction, see doc for trust() | ||
| keys: TxCreationKeys, | ||
| // For access to the pre-built transaction, see doc for trust() | ||
|
|
@@ -1193,6 +1201,7 @@ impl_writeable_tlv_based!(CommitmentTransaction, { | |
| (10, built, required), | ||
| (12, htlcs, vec_type), | ||
| (14, opt_anchors, option), | ||
| (16, opt_non_zero_fee_anchors, option), | ||
| }); | ||
|
|
||
| impl CommitmentTransaction { | ||
|
|
@@ -1225,9 +1234,18 @@ impl CommitmentTransaction { | |
| transaction, | ||
| txid | ||
| }, | ||
| opt_non_zero_fee_anchors: None, | ||
| } | ||
| } | ||
|
|
||
| /// Use non-zero fee anchors | ||
| /// | ||
| /// (C-not exported) due to move, and also not likely to be useful for binding users | ||
| pub fn with_non_zero_fee_anchors(mut self) -> Self { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this needs: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
| self.opt_non_zero_fee_anchors = Some(()); | ||
| self | ||
| } | ||
|
|
||
| fn internal_rebuild_transaction(&self, keys: &TxCreationKeys, channel_parameters: &DirectedChannelTransactionParameters, broadcaster_funding_key: &PublicKey, countersignatory_funding_key: &PublicKey) -> Result<BuiltCommitmentTransaction, ()> { | ||
| let (obscured_commitment_transaction_number, txins) = Self::internal_build_inputs(self.commitment_number, channel_parameters); | ||
|
|
||
|
|
@@ -1492,7 +1510,7 @@ impl<'a> TrustedCommitmentTransaction<'a> { | |
|
|
||
| for this_htlc in inner.htlcs.iter() { | ||
| assert!(this_htlc.transaction_output_index.is_some()); | ||
| let htlc_tx = build_htlc_transaction(&txid, inner.feerate_per_kw, channel_parameters.contest_delay(), &this_htlc, self.opt_anchors(), &keys.broadcaster_delayed_payment_key, &keys.revocation_key); | ||
| let htlc_tx = build_htlc_transaction(&txid, inner.feerate_per_kw, channel_parameters.contest_delay(), &this_htlc, self.opt_anchors(), self.opt_non_zero_fee_anchors.is_some(), &keys.broadcaster_delayed_payment_key, &keys.revocation_key); | ||
|
|
||
| let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc, self.opt_anchors(), &keys.broadcaster_htlc_key, &keys.countersignatory_htlc_key, &keys.revocation_key); | ||
|
|
||
|
|
@@ -1514,7 +1532,7 @@ impl<'a> TrustedCommitmentTransaction<'a> { | |
| // Further, we should never be provided the preimage for an HTLC-Timeout transaction. | ||
| if this_htlc.offered && preimage.is_some() { unreachable!(); } | ||
|
|
||
| let mut htlc_tx = build_htlc_transaction(&txid, inner.feerate_per_kw, channel_parameters.contest_delay(), &this_htlc, self.opt_anchors(), &keys.broadcaster_delayed_payment_key, &keys.revocation_key); | ||
| let mut htlc_tx = build_htlc_transaction(&txid, inner.feerate_per_kw, channel_parameters.contest_delay(), &this_htlc, self.opt_anchors(), self.opt_non_zero_fee_anchors.is_some(), &keys.broadcaster_delayed_payment_key, &keys.revocation_key); | ||
|
|
||
| let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc, self.opt_anchors(), &keys.broadcaster_htlc_key, &keys.countersignatory_htlc_key, &keys.revocation_key); | ||
|
|
||
|
|
@@ -1614,7 +1632,8 @@ mod tests { | |
| is_outbound_from_holder: false, | ||
| counterparty_parameters: Some(CounterpartyChannelTransactionParameters { pubkeys: counterparty_pubkeys.clone(), selected_contest_delay: 0 }), | ||
| funding_outpoint: Some(chain::transaction::OutPoint { txid: Txid::all_zeros(), index: 0 }), | ||
| opt_anchors: None | ||
| opt_anchors: None, | ||
| opt_non_zero_fee_anchors: None, | ||
| }; | ||
|
|
||
| let mut htlcs_with_aux: Vec<(_, ())> = Vec::new(); | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alternatively, I can create a
const_false"TLV" directive for the macros, so that nothing is actually serialized for this field.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this either needs to be an odd type or an
unwrap_or(false)such that we can read it on new versions that didn't previously serialize this field.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think so? I think it should be even because old versions should reject it - technically this means a non-forwards-compatible change on VLS' end, but I assume that's okay, it shouldn't matter for LDK users.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am doing
self.opt_non_zero_fee_anchors.is_some()instead ofself.opt_non_zero_fee_anchors.unwrap_or(false), but they are equivalent.if it was serialized by an old version, the field won't exist, and that will be interpreted as
None.so this should work as written