@@ -15,6 +15,7 @@ use io;
1515use prelude:: * ;
1616use core:: cmp;
1717use sync:: { Mutex , Arc } ;
18+ #[ cfg( test) ] use sync:: MutexGuard ;
1819
1920use bitcoin:: blockdata:: transaction:: { Transaction , SigHashType } ;
2021use bitcoin:: util:: bip143;
@@ -74,6 +75,11 @@ impl EnforcingSigner {
7475 disable_revocation_policy_check
7576 }
7677 }
78+
79+ #[ cfg( test) ]
80+ pub fn get_enforcement_state ( & self ) -> MutexGuard < EnforcementState > {
81+ self . state . lock ( ) . unwrap ( )
82+ }
7783}
7884
7985impl BaseSign for EnforcingSigner {
@@ -84,12 +90,19 @@ impl BaseSign for EnforcingSigner {
8490 fn release_commitment_secret ( & self , idx : u64 ) -> [ u8 ; 32 ] {
8591 {
8692 let mut state = self . state . lock ( ) . unwrap ( ) ;
87- assert ! ( idx == state. revoked_commitment || idx == state. revoked_commitment - 1 , "can only revoke the current or next unrevoked commitment - trying {}, revoked {}" , idx, state. revoked_commitment) ;
88- state. revoked_commitment = idx;
93+ assert ! ( idx == state. last_holder_revoked_commitment || idx == state. last_holder_revoked_commitment - 1 , "can only revoke the current or next unrevoked commitment - trying {}, revoked {}" , idx, state. last_holder_revoked_commitment) ;
94+ assert ! ( idx > state. last_holder_commitment, "cannot revoke the last holder commitment - revoking {} last commit {}" , idx, state. last_holder_commitment) ;
95+ state. last_holder_revoked_commitment = idx;
8996 }
9097 self . inner . release_commitment_secret ( idx)
9198 }
9299
100+ fn validate_holder_commitment ( & self , idx : u64 , _holder_tx : & HolderCommitmentTransaction ) {
101+ let mut state = self . state . lock ( ) . unwrap ( ) ;
102+ assert ! ( idx == state. last_holder_commitment || idx == state. last_holder_commitment - 1 , "expecting to validate the current or next holder commitment - trying {}, current {}" , idx, state. last_holder_commitment) ;
103+ state. last_holder_commitment = idx;
104+ }
105+
93106 fn pubkeys ( & self ) -> & ChannelPublicKeys { self . inner . pubkeys ( ) }
94107 fn channel_keys_id ( & self ) -> [ u8 ; 32 ] { self . inner . channel_keys_id ( ) }
95108
@@ -99,11 +112,11 @@ impl BaseSign for EnforcingSigner {
99112 {
100113 let mut state = self . state . lock ( ) . unwrap ( ) ;
101114 let actual_commitment_number = commitment_tx. commitment_number ( ) ;
102- let last_commitment_number = state. last_commitment_number . unwrap_or ( actual_commitment_number) ;
115+ let last_commitment_number = state. last_counterparty_commitment_number . unwrap_or ( actual_commitment_number) ;
103116 // These commitment numbers are backwards counting. We expect either the same as the previously encountered,
104117 // or the next one.
105118 assert ! ( last_commitment_number == actual_commitment_number || last_commitment_number - 1 == actual_commitment_number, "{} doesn't come after {}" , actual_commitment_number, last_commitment_number) ;
106- state. last_commitment_number = Some ( cmp:: min ( last_commitment_number, actual_commitment_number) )
119+ state. last_counterparty_commitment_number = Some ( cmp:: min ( last_commitment_number, actual_commitment_number) )
107120 }
108121
109122 Ok ( self . inner . sign_counterparty_commitment ( commitment_tx, secp_ctx) . unwrap ( ) )
@@ -116,10 +129,10 @@ impl BaseSign for EnforcingSigner {
116129
117130 let state = self . state . lock ( ) . unwrap ( ) ;
118131 let commitment_number = trusted_tx. commitment_number ( ) ;
119- if state. revoked_commitment - 1 != commitment_number && state. revoked_commitment - 2 != commitment_number {
132+ if state. last_holder_revoked_commitment - 1 != commitment_number && state. last_holder_revoked_commitment - 2 != commitment_number {
120133 if !self . disable_revocation_policy_check {
121134 panic ! ( "can only sign the next two unrevoked commitment numbers, revoked={} vs requested={} for {}" ,
122- state. revoked_commitment , commitment_number, self . inner. commitment_seed[ 0 ] )
135+ state. last_holder_revoked_commitment , commitment_number, self . inner. commitment_seed[ 0 ] )
123136 }
124137 }
125138
@@ -210,18 +223,20 @@ impl EnforcingSigner {
210223#[ derive( Clone ) ]
211224pub struct EnforcementState {
212225 /// The last counterparty commitment number we signed, backwards counting
213- pub last_commitment_number : Option < u64 > ,
226+ pub last_counterparty_commitment_number : Option < u64 > ,
214227 /// The last holder commitment number we revoked, backwards counting
215- pub revoked_commitment : u64 ,
216-
228+ pub last_holder_revoked_commitment : u64 ,
229+ /// The last validated holder commitment number, backwards counting
230+ pub last_holder_commitment : u64 ,
217231}
218232
219233impl EnforcementState {
220234 /// Enforcement state for a new channel
221235 pub fn new ( ) -> Self {
222236 EnforcementState {
223- last_commitment_number : None ,
224- revoked_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER
237+ last_counterparty_commitment_number : None ,
238+ last_holder_revoked_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER ,
239+ last_holder_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER ,
225240 }
226241 }
227242}
0 commit comments