@@ -40,14 +40,34 @@ use core::ops::Deref;
40
40
const MAX_ALLOC_SIZE : usize = 64 * 1024 ;
41
41
42
42
43
- // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
44
- pub ( crate ) const WEIGHT_REVOKED_OFFERED_HTLC : u64 = 1 + 1 + 73 + 1 + 33 + 1 + 133 ;
45
- // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
46
- pub ( crate ) const WEIGHT_REVOKED_RECEIVED_HTLC : u64 = 1 + 1 + 73 + 1 + 33 + 1 + 139 ;
47
- // number_of_witness_elements + sig_length + counterpartyhtlc_sig + preimage_length + preimage + witness_script_length + witness_script
48
- pub ( crate ) const WEIGHT_OFFERED_HTLC : u64 = 1 + 1 + 73 + 1 + 32 + 1 + 133 ;
49
- // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
50
- pub ( crate ) const WEIGHT_RECEIVED_HTLC : u64 = 1 + 1 + 73 + 1 + 1 + 1 + 139 ;
43
+ pub ( crate ) fn weight_revoked_offered_htlc ( opt_anchors : bool ) -> u64 {
44
+ // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
45
+ const WEIGHT_REVOKED_OFFERED_HTLC : u64 = 1 + 1 + 73 + 1 + 33 + 1 + 133 ;
46
+ const WEIGHT_REVOKED_OFFERED_HTLC_ANCHORS : u64 = WEIGHT_REVOKED_OFFERED_HTLC + 3 ;
47
+ if opt_anchors { WEIGHT_REVOKED_OFFERED_HTLC_ANCHORS } else { WEIGHT_REVOKED_OFFERED_HTLC }
48
+ }
49
+
50
+ pub ( crate ) fn weight_revoked_received_htlc ( opt_anchors : bool ) -> u64 {
51
+ // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
52
+ const WEIGHT_REVOKED_RECEIVED_HTLC : u64 = 1 + 1 + 73 + 1 + 33 + 1 + 139 ;
53
+ const WEIGHT_REVOKED_RECEIVED_HTLC_ANCHORS : u64 = WEIGHT_REVOKED_RECEIVED_HTLC + 3 ;
54
+ if opt_anchors { WEIGHT_REVOKED_RECEIVED_HTLC_ANCHORS } else { WEIGHT_REVOKED_RECEIVED_HTLC }
55
+ }
56
+
57
+ pub ( crate ) fn weight_offered_htlc ( opt_anchors : bool ) -> u64 {
58
+ // number_of_witness_elements + sig_length + counterpartyhtlc_sig + preimage_length + preimage + witness_script_length + witness_script
59
+ const WEIGHT_OFFERED_HTLC : u64 = 1 + 1 + 73 + 1 + 32 + 1 + 133 ;
60
+ const WEIGHT_OFFERED_HTLC_ANCHORS : u64 = WEIGHT_OFFERED_HTLC + 3 ;
61
+ if opt_anchors { WEIGHT_OFFERED_HTLC_ANCHORS } else { WEIGHT_OFFERED_HTLC }
62
+ }
63
+
64
+ pub ( crate ) fn weight_received_htlc ( opt_anchors : bool ) -> u64 {
65
+ // number_of_witness_elements + sig_length + revocation_sig + pubkey_length + revocationpubkey + witness_script_length + witness_script
66
+ const WEIGHT_RECEIVED_HTLC : u64 = 1 + 1 + 73 + 1 + 1 + 1 + 139 ;
67
+ const WEIGHT_RECEIVED_HTLC_ANCHORS : u64 = WEIGHT_RECEIVED_HTLC + 3 ;
68
+ if opt_anchors { WEIGHT_RECEIVED_HTLC_ANCHORS } else { WEIGHT_RECEIVED_HTLC }
69
+ }
70
+
51
71
// number_of_witness_elements + sig_length + revocation_sig + true_length + op_true + witness_script_length + witness_script
52
72
pub ( crate ) const WEIGHT_REVOKED_OUTPUT : u64 = 1 + 1 + 73 + 1 + 1 + 1 + 77 ;
53
73
@@ -118,8 +138,8 @@ pub(crate) struct RevokedHTLCOutput {
118
138
}
119
139
120
140
impl RevokedHTLCOutput {
121
- pub ( crate ) fn build ( per_commitment_point : PublicKey , counterparty_delayed_payment_base_key : PublicKey , counterparty_htlc_base_key : PublicKey , per_commitment_key : SecretKey , amount : u64 , htlc : HTLCOutputInCommitment ) -> Self {
122
- let weight = if htlc. offered { WEIGHT_REVOKED_OFFERED_HTLC } else { WEIGHT_REVOKED_RECEIVED_HTLC } ;
141
+ pub ( crate ) fn build ( per_commitment_point : PublicKey , counterparty_delayed_payment_base_key : PublicKey , counterparty_htlc_base_key : PublicKey , per_commitment_key : SecretKey , amount : u64 , htlc : HTLCOutputInCommitment , opt_anchors : bool ) -> Self {
142
+ let weight = if htlc. offered { weight_revoked_offered_htlc ( opt_anchors ) } else { weight_revoked_received_htlc ( opt_anchors ) } ;
123
143
RevokedHTLCOutput {
124
144
per_commitment_point,
125
145
counterparty_delayed_payment_base_key,
@@ -292,12 +312,12 @@ impl PackageSolvingData {
292
312
} ;
293
313
amt
294
314
}
295
- fn weight ( & self ) -> usize {
315
+ fn weight ( & self , opt_anchors : bool ) -> usize {
296
316
let weight = match self {
297
317
PackageSolvingData :: RevokedOutput ( ref outp) => { outp. weight as usize } ,
298
318
PackageSolvingData :: RevokedHTLCOutput ( ref outp) => { outp. weight as usize } ,
299
- PackageSolvingData :: CounterpartyOfferedHTLCOutput ( ..) => { WEIGHT_OFFERED_HTLC as usize } ,
300
- PackageSolvingData :: CounterpartyReceivedHTLCOutput ( ..) => { WEIGHT_RECEIVED_HTLC as usize } ,
319
+ PackageSolvingData :: CounterpartyOfferedHTLCOutput ( ..) => { weight_offered_htlc ( opt_anchors ) as usize } ,
320
+ PackageSolvingData :: CounterpartyReceivedHTLCOutput ( ..) => { weight_received_htlc ( opt_anchors ) as usize } ,
301
321
// Note: Currently, weights of holder outputs spending witnesses aren't used
302
322
// as we can't malleate spending package to increase their feerate. This
303
323
// should change with the remaining anchor output patchset.
@@ -568,13 +588,13 @@ impl PackageTemplate {
568
588
self . inputs . iter ( ) . map ( |( _, outp) | outp. absolute_tx_timelock ( self . height_original ) )
569
589
. max ( ) . expect ( "There must always be at least one output to spend in a PackageTemplate" )
570
590
}
571
- pub ( crate ) fn package_weight ( & self , destination_script : & Script ) -> usize {
591
+ pub ( crate ) fn package_weight ( & self , destination_script : & Script , opt_anchors : bool ) -> usize {
572
592
let mut inputs_weight = 0 ;
573
593
let mut witnesses_weight = 2 ; // count segwit flags
574
594
for ( _, outp) in self . inputs . iter ( ) {
575
595
// previous_out_point: 36 bytes ; var_int: 1 byte ; sequence: 4 bytes
576
596
inputs_weight += 41 * WITNESS_SCALE_FACTOR ;
577
- witnesses_weight += outp. weight ( ) ;
597
+ witnesses_weight += outp. weight ( opt_anchors ) ;
578
598
}
579
599
// version: 4 bytes ; count_tx_in: 1 byte ; count_tx_out: 1 byte ; lock_time: 4 bytes
580
600
let transaction_weight = 10 * WITNESS_SCALE_FACTOR ;
@@ -1027,6 +1047,8 @@ mod tests {
1027
1047
let package = PackageTemplate :: build_package ( txid, 0 , revk_outp, 0 , true , 100 ) ;
1028
1048
// (nVersion (4) + nLocktime (4) + count_tx_in (1) + prevout (36) + sequence (4) + script_length (1) + count_tx_out (1) + value (8) + var_int (1)) * WITNESS_SCALE_FACTOR
1029
1049
// + witness marker (2) + WEIGHT_REVOKED_OUTPUT
1030
- assert_eq ! ( package. package_weight( & Script :: new( ) ) , ( 4 + 4 + 1 + 36 + 4 + 1 + 1 + 8 + 1 ) * WITNESS_SCALE_FACTOR + 2 + WEIGHT_REVOKED_OUTPUT as usize ) ;
1050
+ for opt_anchors in & [ false , true ] {
1051
+ assert_eq ! ( package. package_weight( & Script :: new( ) , * opt_anchors) , ( 4 + 4 + 1 + 36 + 4 + 1 + 1 + 8 + 1 ) * WITNESS_SCALE_FACTOR + 2 + WEIGHT_REVOKED_OUTPUT as usize ) ;
1052
+ }
1031
1053
}
1032
1054
}
0 commit comments