@@ -24,7 +24,8 @@ use util::ser::{Writeable, Writer, Readable};
24
24
use std:: io:: Error ;
25
25
use ln:: msgs:: DecodeError ;
26
26
27
- const INITIAL_COMMITMENT_NUMBER : u64 = ( 1 << 48 ) - 1 ;
27
+ /// Initial value for revoked commitment downward counter
28
+ pub const INITIAL_REVOKED_COMMITMENT_NUMBER : u64 = 1 << 48 ;
28
29
29
30
/// Enforces some rules on ChannelKeys calls. Eventually we will probably want to expose a variant
30
31
/// of this which would essentially be what you'd want to run on a hardware wallet.
@@ -40,7 +41,15 @@ impl EnforcingChannelKeys {
40
41
Self {
41
42
inner,
42
43
commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( ( None , 0 ) ) ) ,
43
- revoked_commitment : Arc :: new ( Mutex :: new ( INITIAL_COMMITMENT_NUMBER + 1 ) ) ,
44
+ revoked_commitment : Arc :: new ( Mutex :: new ( INITIAL_REVOKED_COMMITMENT_NUMBER ) )
45
+ }
46
+ }
47
+
48
+ pub fn new_with_revoked ( inner : InMemoryChannelKeys , revoked_commitment : Arc < Mutex < u64 > > ) -> Self {
49
+ Self {
50
+ inner,
51
+ commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( ( None , 0 ) ) ) ,
52
+ revoked_commitment
44
53
}
45
54
}
46
55
}
@@ -69,20 +78,14 @@ impl ChannelKeys for EnforcingChannelKeys {
69
78
70
79
fn release_commitment_secret ( & self , idx : u64 ) -> [ u8 ; 32 ] {
71
80
println ! ( "XXX revoke {} {}" , self . inner. commitment_seed[ 0 ] , idx) ;
72
- let res = {
73
- let mut revoked = self . revoked_commitment . lock ( ) . unwrap ( ) ;
74
- if idx != * revoked && idx != * revoked - 1 {
75
- panic ! ( "can only revoke the current or next unrevoked commitment - trying {}, revoked {}" , idx, * revoked)
76
- }
77
- * revoked = idx;
78
- self . inner . release_commitment_secret ( idx)
79
- } ;
80
- {
81
- let revoked = self . revoked_commitment . lock ( ) . unwrap ( ) ;
82
- assert_eq ! ( idx, * revoked) ;
81
+ let mut revoked = self . revoked_commitment . lock ( ) . unwrap ( ) ;
82
+ if idx != * revoked && idx != * revoked - 1 {
83
+ panic ! ( "can only revoke the current or next unrevoked commitment - trying {}, revoked {}" , idx, * revoked)
83
84
}
84
- res
85
+ * revoked = idx;
86
+ self . inner . release_commitment_secret ( idx)
85
87
}
88
+
86
89
fn pubkeys ( & self ) -> & ChannelPublicKeys { self . inner . pubkeys ( ) }
87
90
fn key_derivation_params ( & self ) -> ( u64 , u64 ) { self . inner . key_derivation_params ( ) }
88
91
@@ -112,10 +115,12 @@ impl ChannelKeys for EnforcingChannelKeys {
112
115
if keys. per_commitment_point != self . inner . get_per_commitment_point ( * revoked - 1 , secp_ctx) {
113
116
if keys. per_commitment_point != self . inner . get_per_commitment_point ( * revoked - 2 , secp_ctx) {
114
117
if keys. per_commitment_point == self . inner . get_per_commitment_point ( * revoked, secp_ctx) {
115
- panic ! ( "attempted to sign the latest revoked local commitment {}" , self . inner. commitment_seed[ 0 ] ) ;
118
+ println ! ( "attempted to sign the latest revoked local commitment {}" , self . inner. commitment_seed[ 0 ] ) ;
119
+ return Err ( ( ) )
116
120
} else {
117
- panic ! ( "can only sign the next two unrevoked commitment numbers, {} revoked={} point={}" ,
121
+ println ! ( "can only sign the next two unrevoked commitment numbers, {} revoked={} point={}" ,
118
122
self . inner. commitment_seed[ 0 ] , * revoked, keys. per_commitment_point) ;
123
+ return Err ( ( ) )
119
124
}
120
125
}
121
126
}
@@ -166,12 +171,11 @@ impl ChannelKeys for EnforcingChannelKeys {
166
171
}
167
172
}
168
173
174
+
169
175
impl Writeable for EnforcingChannelKeys {
170
176
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , Error > {
171
177
self . inner . write ( writer) ?;
172
- let revoked = * self . revoked_commitment . lock ( ) . unwrap ( ) ;
173
- revoked. write ( writer) ?;
174
- println ! ( "XXX write {} {}" , self . inner. commitment_seed[ 0 ] , revoked) ;
178
+ println ! ( "XXX write {}" , self . inner. commitment_seed[ 0 ] ) ;
175
179
176
180
let ( obscure, last) = * self . commitment_number_obscure_and_last . lock ( ) . unwrap ( ) ;
177
181
obscure. write ( writer) ?;
@@ -183,13 +187,12 @@ impl Writeable for EnforcingChannelKeys {
183
187
impl Readable for EnforcingChannelKeys {
184
188
fn read < R : :: std:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
185
189
let inner: InMemoryChannelKeys = Readable :: read ( reader) ?;
186
- let revoked = Readable :: read ( reader) ?;
187
190
let obscure_and_last = Readable :: read ( reader) ?;
188
- println ! ( "XXX read {} {} " , inner. commitment_seed[ 0 ] , revoked ) ;
191
+ println ! ( "XXX read {}" , inner. commitment_seed[ 0 ] ) ;
189
192
Ok ( EnforcingChannelKeys {
190
- inner : inner ,
191
- revoked_commitment : Arc :: new ( Mutex :: new ( revoked ) ) ,
192
- commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last ) )
193
+ inner,
194
+ commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last ) ) ,
195
+ revoked_commitment : Arc :: new ( Mutex :: new ( INITIAL_REVOKED_COMMITMENT_NUMBER ) ) ,
193
196
} )
194
197
}
195
198
}
0 commit comments