@@ -36,7 +36,7 @@ use prelude::*;
36
36
use core:: cmp;
37
37
use ln:: chan_utils;
38
38
use util:: transaction_utils:: sort_outputs;
39
- use ln:: channel:: INITIAL_COMMITMENT_NUMBER ;
39
+ use ln:: channel:: { INITIAL_COMMITMENT_NUMBER , ANCHOR_OUTPUT_VALUE } ;
40
40
use core:: ops:: Deref ;
41
41
use chain;
42
42
@@ -771,7 +771,7 @@ impl HolderCommitmentTransaction {
771
771
funding_outpoint : Some ( chain:: transaction:: OutPoint { txid : Default :: default ( ) , index : 0 } )
772
772
} ;
773
773
let mut htlcs_with_aux: Vec < ( _ , ( ) ) > = Vec :: new ( ) ;
774
- let inner = CommitmentTransaction :: new_with_auxiliary_htlc_data ( 0 , 0 , 0 , keys, 0 , & mut htlcs_with_aux, & channel_parameters. as_counterparty_broadcastable ( ) ) ;
774
+ 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 ( ) ) ;
775
775
HolderCommitmentTransaction {
776
776
inner,
777
777
counterparty_sig : dummy_sig,
@@ -858,6 +858,7 @@ pub struct CommitmentTransaction {
858
858
to_countersignatory_value_sat : u64 ,
859
859
feerate_per_kw : u32 ,
860
860
htlcs : Vec < HTLCOutputInCommitment > ,
861
+ opt_anchors : bool ,
861
862
// A cache of the parties' pubkeys required to construct the transaction, see doc for trust()
862
863
keys : TxCreationKeys ,
863
864
// For access to the pre-built transaction, see doc for trust()
@@ -871,6 +872,7 @@ impl PartialEq for CommitmentTransaction {
871
872
self . to_countersignatory_value_sat == o. to_countersignatory_value_sat &&
872
873
self . feerate_per_kw == o. feerate_per_kw &&
873
874
self . htlcs == o. htlcs &&
875
+ self . opt_anchors == o. opt_anchors &&
874
876
self . keys == o. keys ;
875
877
if eq {
876
878
debug_assert_eq ! ( self . built. transaction, o. built. transaction) ;
@@ -888,6 +890,7 @@ impl_writeable_tlv_based!(CommitmentTransaction, {
888
890
( 8 , keys, required) ,
889
891
( 10 , built, required) ,
890
892
( 12 , htlcs, vec_type) ,
893
+ ( 14 , opt_anchors, required) ,
891
894
} ) ;
892
895
893
896
impl CommitmentTransaction {
@@ -901,9 +904,9 @@ impl CommitmentTransaction {
901
904
/// Only include HTLCs that are above the dust limit for the channel.
902
905
///
903
906
/// (C-not exported) due to the generic though we likely should expose a version without
904
- pub fn new_with_auxiliary_htlc_data < T > ( commitment_number : u64 , to_broadcaster_value_sat : u64 , to_countersignatory_value_sat : u64 , keys : TxCreationKeys , feerate_per_kw : u32 , htlcs_with_aux : & mut Vec < ( HTLCOutputInCommitment , T ) > , channel_parameters : & DirectedChannelTransactionParameters ) -> CommitmentTransaction {
907
+ pub fn new_with_auxiliary_htlc_data < T > ( commitment_number : u64 , to_broadcaster_value_sat : u64 , to_countersignatory_value_sat : u64 , opt_anchors : bool , broadcaster_funding_key : PublicKey , countersignatory_funding_key : PublicKey , keys : TxCreationKeys , feerate_per_kw : u32 , htlcs_with_aux : & mut Vec < ( HTLCOutputInCommitment , T ) > , channel_parameters : & DirectedChannelTransactionParameters ) -> CommitmentTransaction {
905
908
// Sort outputs and populate output indices while keeping track of the auxiliary data
906
- let ( outputs, htlcs) = Self :: internal_build_outputs ( & keys, to_broadcaster_value_sat, to_countersignatory_value_sat, htlcs_with_aux, channel_parameters) . unwrap ( ) ;
909
+ let ( outputs, htlcs) = Self :: internal_build_outputs ( & keys, to_broadcaster_value_sat, to_countersignatory_value_sat, htlcs_with_aux, channel_parameters, opt_anchors , & broadcaster_funding_key , & countersignatory_funding_key ) . unwrap ( ) ;
907
910
908
911
let ( obscured_commitment_transaction_number, txins) = Self :: internal_build_inputs ( commitment_number, channel_parameters) ;
909
912
let transaction = Self :: make_transaction ( obscured_commitment_transaction_number, txins, outputs) ;
@@ -914,6 +917,7 @@ impl CommitmentTransaction {
914
917
to_countersignatory_value_sat,
915
918
feerate_per_kw,
916
919
htlcs,
920
+ opt_anchors,
917
921
keys,
918
922
built : BuiltCommitmentTransaction {
919
923
transaction,
@@ -922,11 +926,11 @@ impl CommitmentTransaction {
922
926
}
923
927
}
924
928
925
- fn internal_rebuild_transaction ( & self , keys : & TxCreationKeys , channel_parameters : & DirectedChannelTransactionParameters ) -> Result < BuiltCommitmentTransaction , ( ) > {
929
+ fn internal_rebuild_transaction ( & self , keys : & TxCreationKeys , channel_parameters : & DirectedChannelTransactionParameters , broadcaster_funding_key : & PublicKey , countersignatory_funding_key : & PublicKey ) -> Result < BuiltCommitmentTransaction , ( ) > {
926
930
let ( obscured_commitment_transaction_number, txins) = Self :: internal_build_inputs ( self . commitment_number , channel_parameters) ;
927
931
928
932
let mut htlcs_with_aux = self . htlcs . iter ( ) . map ( |h| ( h. clone ( ) , ( ) ) ) . collect ( ) ;
929
- let ( outputs, _) = Self :: internal_build_outputs ( keys, self . to_broadcaster_value_sat , self . to_countersignatory_value_sat , & mut htlcs_with_aux, channel_parameters) ?;
933
+ let ( outputs, _) = Self :: internal_build_outputs ( keys, self . to_broadcaster_value_sat , self . to_countersignatory_value_sat , & mut htlcs_with_aux, channel_parameters, self . opt_anchors , broadcaster_funding_key , countersignatory_funding_key ) ?;
930
934
931
935
let transaction = Self :: make_transaction ( obscured_commitment_transaction_number, txins, outputs) ;
932
936
let txid = transaction. txid ( ) ;
@@ -950,7 +954,7 @@ impl CommitmentTransaction {
950
954
// - initial sorting of outputs / HTLCs in the constructor, in which case T is auxiliary data the
951
955
// caller needs to have sorted together with the HTLCs so it can keep track of the output index
952
956
// - building of a bitcoin transaction during a verify() call, in which case T is just ()
953
- fn internal_build_outputs < T > ( keys : & TxCreationKeys , to_broadcaster_value_sat : u64 , to_countersignatory_value_sat : u64 , htlcs_with_aux : & mut Vec < ( HTLCOutputInCommitment , T ) > , channel_parameters : & DirectedChannelTransactionParameters ) -> Result < ( Vec < TxOut > , Vec < HTLCOutputInCommitment > ) , ( ) > {
957
+ fn internal_build_outputs < T > ( keys : & TxCreationKeys , to_broadcaster_value_sat : u64 , to_countersignatory_value_sat : u64 , htlcs_with_aux : & mut Vec < ( HTLCOutputInCommitment , T ) > , channel_parameters : & DirectedChannelTransactionParameters , opt_anchors : bool , broadcaster_funding_key : & PublicKey , countersignatory_funding_key : & PublicKey ) -> Result < ( Vec < TxOut > , Vec < HTLCOutputInCommitment > ) , ( ) > {
954
958
let countersignatory_pubkeys = channel_parameters. countersignatory_pubkeys ( ) ;
955
959
let contest_delay = channel_parameters. contest_delay ( ) ;
956
960
@@ -982,6 +986,30 @@ impl CommitmentTransaction {
982
986
) ) ;
983
987
}
984
988
989
+ if opt_anchors {
990
+ if to_broadcaster_value_sat > 0 || !htlcs_with_aux. is_empty ( ) {
991
+ let anchor_script = get_anchor_redeemscript ( broadcaster_funding_key) ;
992
+ txouts. push ( (
993
+ TxOut {
994
+ script_pubkey : anchor_script. to_v0_p2wsh ( ) ,
995
+ value : ANCHOR_OUTPUT_VALUE ,
996
+ } ,
997
+ None ,
998
+ ) ) ;
999
+ }
1000
+
1001
+ if to_countersignatory_value_sat > 0 || !htlcs_with_aux. is_empty ( ) {
1002
+ let anchor_script = get_anchor_redeemscript ( countersignatory_funding_key) ;
1003
+ txouts. push ( (
1004
+ TxOut {
1005
+ script_pubkey : anchor_script. to_v0_p2wsh ( ) ,
1006
+ value : ANCHOR_OUTPUT_VALUE ,
1007
+ } ,
1008
+ None ,
1009
+ ) ) ;
1010
+ }
1011
+ }
1012
+
985
1013
let mut htlcs = Vec :: with_capacity ( htlcs_with_aux. len ( ) ) ;
986
1014
for ( htlc, _) in htlcs_with_aux {
987
1015
let script = chan_utils:: get_htlc_redeemscript ( & htlc, & keys) ;
@@ -1098,7 +1126,7 @@ impl CommitmentTransaction {
1098
1126
if keys != self . keys {
1099
1127
return Err ( ( ) ) ;
1100
1128
}
1101
- let tx = self . internal_rebuild_transaction ( & keys, channel_parameters) ?;
1129
+ let tx = self . internal_rebuild_transaction ( & keys, channel_parameters, & broadcaster_keys . funding_pubkey , & countersignatory_keys . funding_pubkey ) ?;
1102
1130
if self . built . transaction != tx. transaction || self . built . txid != tx. txid {
1103
1131
return Err ( ( ) ) ;
1104
1132
}
0 commit comments