Skip to content

Commit aab2d29

Browse files
carlaKCTheBlueMatt
andcommitted
ln: do not set or accept non-zero feerates in open_channel for v3
Sender: MUST set `feerate_per_kw` to zero Receiver: MUST fail the channel if `feerate_per_kw` != 0 Co-authored-by: Matt Corallo <[email protected]>
1 parent e4465c4 commit aab2d29

File tree

1 file changed

+57
-6
lines changed

1 file changed

+57
-6
lines changed

lightning/src/ln/channel.rs

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3077,12 +3077,18 @@ impl<SP: Deref> ChannelContext<SP> where SP::Target: SignerProvider {
30773077
debug_assert!(!channel_type.supports_any_optional_bits());
30783078
debug_assert!(!channel_type.requires_unknown_bits_from(&channelmanager::provided_channel_type_features(&config)));
30793079

3080-
let (commitment_conf_target, anchor_outputs_value_msat) = if channel_type.supports_anchors_zero_fee_htlc_tx() {
3081-
(ConfirmationTarget::AnchorChannelFee, ANCHOR_OUTPUT_VALUE_SATOSHI * 2 * 1000)
3082-
} else {
3083-
(ConfirmationTarget::NonAnchorChannelFee, 0)
3084-
};
3085-
let commitment_feerate = fee_estimator.bounded_sat_per_1000_weight(commitment_conf_target);
3080+
let (commitment_feerate, anchor_outputs_value_msat) =
3081+
if channel_type.supports_anchor_zero_fee_commitments() {
3082+
(0, 0)
3083+
} else if channel_type.supports_anchors_zero_fee_htlc_tx() {
3084+
let feerate = fee_estimator
3085+
.bounded_sat_per_1000_weight(ConfirmationTarget::AnchorChannelFee);
3086+
(feerate, ANCHOR_OUTPUT_VALUE_SATOSHI * 2 * 1000)
3087+
} else {
3088+
let feerate = fee_estimator
3089+
.bounded_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
3090+
(feerate, 0)
3091+
};
30863092

30873093
let value_to_self_msat = channel_value_satoshis * 1000 - push_msat;
30883094
let commitment_tx_fee = commit_tx_fee_sat(commitment_feerate, MIN_AFFORDABLE_HTLC_COUNT, &channel_type) * 1000;
@@ -5290,6 +5296,15 @@ impl<SP: Deref> FundedChannel<SP> where
52905296
feerate_per_kw: u32, cur_feerate_per_kw: Option<u32>, logger: &L
52915297
) -> Result<(), ChannelError> where F::Target: FeeEstimator, L::Target: Logger,
52925298
{
5299+
if channel_type.supports_anchor_zero_fee_commitments() {
5300+
if feerate_per_kw != 0 {
5301+
let err = "Zero Fee Channels must never attempt to use a fee".to_owned();
5302+
return Err(ChannelError::close(err));
5303+
} else {
5304+
return Ok(());
5305+
}
5306+
}
5307+
52935308
let lower_limit_conf_target = if channel_type.supports_anchors_zero_fee_htlc_tx() {
52945309
ConfirmationTarget::MinAllowedAnchorChannelRemoteFee
52955310
} else {
@@ -13323,6 +13338,34 @@ mod tests {
1332313338
do_test_supports_channel_type(config, expected_channel_type)
1332413339
}
1332513340

13341+
#[test]
13342+
fn test_supports_zero_fee_commitments() {
13343+
// Tests that if both sides support and negotiate `anchors_zero_fee_commitments`, it is
13344+
// the resulting `channel_type`.
13345+
let mut config = UserConfig::default();
13346+
config.channel_handshake_config.negotiate_anchor_zero_fee_commitments = true;
13347+
13348+
let mut expected_channel_type = ChannelTypeFeatures::empty();
13349+
expected_channel_type.set_anchor_zero_fee_commitments_required();
13350+
13351+
do_test_supports_channel_type(config, expected_channel_type)
13352+
}
13353+
13354+
#[test]
13355+
fn test_supports_zero_fee_commitments_and_htlc_tx_fee() {
13356+
// Tests that if both sides support and negotiate `anchors_zero_fee_commitments` and
13357+
// `anchors_zero_fee_htlc_tx`, the resulting `channel_type` is
13358+
// `anchors_zero_fee_commitments`.
13359+
let mut config = UserConfig::default();
13360+
config.channel_handshake_config.negotiate_anchors_zero_fee_htlc_tx = true;
13361+
config.channel_handshake_config.negotiate_anchor_zero_fee_commitments = true;
13362+
13363+
let mut expected_channel_type = ChannelTypeFeatures::empty();
13364+
expected_channel_type.set_anchor_zero_fee_commitments_required();
13365+
13366+
do_test_supports_channel_type(config, expected_channel_type)
13367+
}
13368+
1332613369
fn do_test_supports_channel_type(config: UserConfig, expected_channel_type: ChannelTypeFeatures) {
1332713370
let secp_ctx = Secp256k1::new();
1332813371
let fee_estimator = LowerBoundedFeeEstimator::new(&TestFeeEstimator{fee_est: 15000});
@@ -13356,6 +13399,14 @@ mod tests {
1335613399

1335713400
assert_eq!(channel_a.funding.get_channel_type(), &expected_channel_type);
1335813401
assert_eq!(channel_b.funding.get_channel_type(), &expected_channel_type);
13402+
13403+
if expected_channel_type.supports_anchor_zero_fee_commitments() {
13404+
assert_eq!(channel_a.context.feerate_per_kw, 0);
13405+
assert_eq!(channel_b.context.feerate_per_kw, 0);
13406+
} else {
13407+
assert_ne!(channel_a.context.feerate_per_kw, 0);
13408+
assert_ne!(channel_b.context.feerate_per_kw, 0);
13409+
}
1335913410
}
1336013411

1336113412
#[test]

0 commit comments

Comments
 (0)