6
6
// accordance with one or both of these licenses.
7
7
8
8
use lightning:: ln:: msgs:: DecodeError ;
9
- use lightning:: util:: ser:: { BigSize , FixedLengthReader , Readable , Writeable , Writer } ;
9
+ use lightning:: util:: ser:: {
10
+ BigSize , FixedLengthReader , Readable , RequiredWrapper , Writeable , Writer ,
11
+ } ;
12
+ use lightning:: { decode_tlv_stream, encode_tlv_stream} ;
10
13
11
14
use bdk_chain:: bdk_core:: { BlockId , ConfirmationBlockTime } ;
12
15
use bdk_chain:: indexer:: keychain_txout:: ChangeSet as BdkIndexerChangeSet ;
@@ -19,7 +22,7 @@ use bdk_wallet::keys::DescriptorPublicKey;
19
22
20
23
use bitcoin:: hashes:: sha256:: Hash as Sha256Hash ;
21
24
use bitcoin:: p2p:: Magic ;
22
- use bitcoin:: { Network , Transaction , Txid } ;
25
+ use bitcoin:: { BlockHash , Network , OutPoint , Transaction , TxOut , Txid } ;
23
26
24
27
use std:: collections:: { BTreeMap , BTreeSet } ;
25
28
use std:: str:: FromStr ;
@@ -28,6 +31,24 @@ use std::sync::Arc;
28
31
pub ( crate ) struct ChangeSetSerWrapper < ' a , T > ( pub & ' a T ) ;
29
32
pub ( crate ) struct ChangeSetDeserWrapper < T > ( pub T ) ;
30
33
34
+ macro_rules! write_len_prefixed_field {
35
+ ( $writer: expr, $field: expr ) => { {
36
+ // We serialize a length header to make sure we can accommodate future changes to the
37
+ // BDK types.
38
+ let len = BigSize ( $field. serialized_length( ) as u64 ) ;
39
+ len. write( $writer) ?;
40
+ $field. write( $writer)
41
+ } } ;
42
+ }
43
+
44
+ macro_rules! read_len_prefixed_field {
45
+ ( $reader: expr) => { {
46
+ let field_len: BigSize = Readable :: read( $reader) ?;
47
+ let mut fixed_reader = FixedLengthReader :: new( $reader, field_len. 0 ) ;
48
+ Readable :: read( & mut fixed_reader)
49
+ } } ;
50
+ }
51
+
31
52
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , Descriptor < DescriptorPublicKey > > {
32
53
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
33
54
self . 0 . to_string ( ) . write ( writer)
@@ -60,55 +81,58 @@ impl Readable for ChangeSetDeserWrapper<Network> {
60
81
61
82
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , BdkLocalChainChangeSet > {
62
83
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
63
- // We serialize a length header to make sure we can accommodate future changes to the
64
- // BDK types.
65
- let total_len = BigSize ( self . 0 . blocks . serialized_length ( ) as u64 ) ;
66
- total_len. write ( writer) ?;
67
-
68
- self . 0 . blocks . write ( writer)
84
+ encode_tlv_stream ! ( writer, {
85
+ ( 0 , self . 0 . blocks, required) ,
86
+ } ) ;
87
+ Ok ( ( ) )
69
88
}
70
89
}
71
90
72
91
impl Readable for ChangeSetDeserWrapper < BdkLocalChainChangeSet > {
73
92
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
74
- let total_len: BigSize = Readable :: read ( reader) ?;
75
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
76
- let blocks = Readable :: read ( & mut fixed_reader) ?;
77
- Ok ( Self ( BdkLocalChainChangeSet { blocks } ) )
93
+ let mut blocks = RequiredWrapper ( None ) ;
94
+ decode_tlv_stream ! ( reader, {
95
+ ( 0 , blocks, required) ,
96
+ } ) ;
97
+ Ok ( Self ( BdkLocalChainChangeSet { blocks : blocks. 0 . unwrap ( ) } ) )
78
98
}
79
99
}
80
100
81
101
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , BdkTxGraphChangeSet < ConfirmationBlockTime > > {
82
102
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
83
- // We serialize a length header to make sure we can accommodate future changes to the
84
- // BDK types.
85
- let txs_len = ChangeSetSerWrapper ( & self . 0 . txs ) . serialized_length ( ) as u64 ;
86
- let txouts_len = self . 0 . txouts . serialized_length ( ) as u64 ;
87
- let anchors_len = ChangeSetSerWrapper ( & self . 0 . anchors ) . serialized_length ( ) as u64 ;
88
- let last_seen_len = self . 0 . last_seen . serialized_length ( ) as u64 ;
89
- let total_len = BigSize ( txs_len + txouts_len + anchors_len + last_seen_len) ;
90
- total_len. write ( writer) ?;
91
-
92
- ChangeSetSerWrapper ( & self . 0 . txs ) . write ( writer) ?;
93
- self . 0 . txouts . write ( writer) ?;
94
- ChangeSetSerWrapper ( & self . 0 . anchors ) . write ( writer) ?;
95
- self . 0 . last_seen . write ( writer) ?;
103
+ encode_tlv_stream ! ( writer, {
104
+ ( 0 , ChangeSetSerWrapper ( & self . 0 . txs) , required) ,
105
+ ( 2 , self . 0 . txouts, required) ,
106
+ ( 4 , ChangeSetSerWrapper ( & self . 0 . anchors) , required) ,
107
+ ( 6 , self . 0 . last_seen, required) ,
108
+ } ) ;
96
109
Ok ( ( ) )
97
110
}
98
111
}
99
112
100
113
impl Readable for ChangeSetDeserWrapper < BdkTxGraphChangeSet < ConfirmationBlockTime > > {
101
114
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
102
- let total_len: BigSize = Readable :: read ( reader) ?;
103
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
104
-
105
- let txs: ChangeSetDeserWrapper < BTreeSet < Arc < Transaction > > > =
106
- Readable :: read ( & mut fixed_reader) ?;
107
- let txouts = Readable :: read ( & mut fixed_reader) ?;
108
- let anchors: ChangeSetDeserWrapper < BTreeSet < ( ConfirmationBlockTime , Txid ) > > =
109
- Readable :: read ( & mut fixed_reader) ?;
110
- let last_seen = Readable :: read ( & mut fixed_reader) ?;
111
- Ok ( Self ( BdkTxGraphChangeSet { txs : txs. 0 , txouts, anchors : anchors. 0 , last_seen } ) )
115
+ let mut txs: RequiredWrapper < ChangeSetDeserWrapper < BTreeSet < Arc < Transaction > > > > =
116
+ RequiredWrapper ( None ) ;
117
+ let mut txouts: RequiredWrapper < BTreeMap < OutPoint , TxOut > > = RequiredWrapper ( None ) ;
118
+ let mut anchors: RequiredWrapper <
119
+ ChangeSetDeserWrapper < BTreeSet < ( ConfirmationBlockTime , Txid ) > > ,
120
+ > = RequiredWrapper ( None ) ;
121
+ let mut last_seen: RequiredWrapper < BTreeMap < Txid , u64 > > = RequiredWrapper ( None ) ;
122
+
123
+ decode_tlv_stream ! ( reader, {
124
+ ( 0 , txs, required) ,
125
+ ( 2 , txouts, required) ,
126
+ ( 4 , anchors, required) ,
127
+ ( 6 , last_seen, required) ,
128
+ } ) ;
129
+
130
+ Ok ( Self ( BdkTxGraphChangeSet {
131
+ txs : txs. 0 . unwrap ( ) . 0 ,
132
+ txouts : txouts. 0 . unwrap ( ) ,
133
+ anchors : anchors. 0 . unwrap ( ) . 0 ,
134
+ last_seen : last_seen. 0 . unwrap ( ) ,
135
+ } ) )
112
136
}
113
137
}
114
138
@@ -117,8 +141,8 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeSet<(ConfirmationBlockTime,
117
141
let len = BigSize ( self . 0 . len ( ) as u64 ) ;
118
142
len. write ( writer) ?;
119
143
for ( time, txid) in self . 0 . iter ( ) {
120
- ChangeSetSerWrapper ( time) . write ( writer ) ?;
121
- txid . write ( writer) ?;
144
+ write_len_prefixed_field ! ( writer , ChangeSetSerWrapper ( time) ) ?;
145
+ write_len_prefixed_field ! ( writer, txid ) ?;
122
146
}
123
147
Ok ( ( ) )
124
148
}
@@ -129,8 +153,9 @@ impl Readable for ChangeSetDeserWrapper<BTreeSet<(ConfirmationBlockTime, Txid)>>
129
153
let len: BigSize = Readable :: read ( reader) ?;
130
154
let mut set = BTreeSet :: new ( ) ;
131
155
for _ in 0 ..len. 0 {
132
- let time: ChangeSetDeserWrapper < ConfirmationBlockTime > = Readable :: read ( reader) ?;
133
- let txid = Readable :: read ( reader) ?;
156
+ let time: ChangeSetDeserWrapper < ConfirmationBlockTime > =
157
+ read_len_prefixed_field ! ( reader) ?;
158
+ let txid: Txid = read_len_prefixed_field ! ( reader) ?;
134
159
set. insert ( ( time. 0 , txid) ) ;
135
160
}
136
161
Ok ( Self ( set) )
@@ -142,7 +167,7 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeSet<Arc<Transaction>>> {
142
167
let len = BigSize ( self . 0 . len ( ) as u64 ) ;
143
168
len. write ( writer) ?;
144
169
for tx in self . 0 . iter ( ) {
145
- tx . write ( writer) ?;
170
+ write_len_prefixed_field ! ( writer, tx ) ?;
146
171
}
147
172
Ok ( ( ) )
148
173
}
@@ -153,83 +178,78 @@ impl Readable for ChangeSetDeserWrapper<BTreeSet<Arc<Transaction>>> {
153
178
let len: BigSize = Readable :: read ( reader) ?;
154
179
let mut set = BTreeSet :: new ( ) ;
155
180
for _ in 0 ..len. 0 {
156
- let tx = Arc :: new ( Readable :: read ( reader) ?) ;
157
- set. insert ( tx ) ;
181
+ let tx: Transaction = read_len_prefixed_field ! ( reader) ?;
182
+ set. insert ( Arc :: new ( tx ) ) ;
158
183
}
159
184
Ok ( Self ( set) )
160
185
}
161
186
}
162
187
163
188
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , ConfirmationBlockTime > {
164
189
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
165
- // We serialize a length header to make sure we can accommodate future changes to the
166
- // BDK types.
167
- let block_id_len = ChangeSetSerWrapper ( & self . 0 . block_id ) . serialized_length ( ) as u64 ;
168
- let confirmation_time_len = self . 0 . confirmation_time . serialized_length ( ) as u64 ;
169
- let total_len = BigSize ( block_id_len + confirmation_time_len) ;
170
- total_len. write ( writer) ?;
171
-
172
- ChangeSetSerWrapper ( & self . 0 . block_id ) . write ( writer) ?;
173
- self . 0 . confirmation_time . write ( writer)
190
+ encode_tlv_stream ! ( writer, {
191
+ ( 0 , ChangeSetSerWrapper ( & self . 0 . block_id) , required) ,
192
+ ( 2 , self . 0 . confirmation_time, required) ,
193
+ } ) ;
194
+ Ok ( ( ) )
174
195
}
175
196
}
176
197
177
198
impl Readable for ChangeSetDeserWrapper < ConfirmationBlockTime > {
178
199
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
179
- let total_len: BigSize = Readable :: read ( reader) ?;
180
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
181
-
182
- let block_id: ChangeSetDeserWrapper < BlockId > = Readable :: read ( & mut fixed_reader) ?;
183
- let confirmation_time = Readable :: read ( & mut fixed_reader) ?;
184
-
185
- Ok ( Self ( ConfirmationBlockTime { block_id : block_id. 0 , confirmation_time } ) )
200
+ let mut block_id: RequiredWrapper < ChangeSetDeserWrapper < BlockId > > = RequiredWrapper ( None ) ;
201
+ let mut confirmation_time: RequiredWrapper < u64 > = RequiredWrapper ( None ) ;
202
+
203
+ decode_tlv_stream ! ( reader, {
204
+ ( 0 , block_id, required) ,
205
+ ( 2 , confirmation_time, required) ,
206
+ } ) ;
207
+
208
+ Ok ( Self ( ConfirmationBlockTime {
209
+ block_id : block_id. 0 . unwrap ( ) . 0 ,
210
+ confirmation_time : confirmation_time. 0 . unwrap ( ) ,
211
+ } ) )
186
212
}
187
213
}
188
214
189
215
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , BlockId > {
190
216
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
191
- // We serialize a length header to make sure we can accommodate future changes to the
192
- // BDK types.
193
- let height_len = self . 0 . height . serialized_length ( ) as u64 ;
194
- let hash_len = self . 0 . hash . serialized_length ( ) as u64 ;
195
- let total_len = BigSize ( height_len + hash_len) ;
196
- total_len. write ( writer) ?;
197
-
198
- self . 0 . height . write ( writer) ?;
199
- self . 0 . hash . write ( writer)
217
+ encode_tlv_stream ! ( writer, {
218
+ ( 0 , self . 0 . height, required) ,
219
+ ( 2 , self . 0 . hash, required) ,
220
+ } ) ;
221
+ Ok ( ( ) )
200
222
}
201
223
}
202
224
203
225
impl Readable for ChangeSetDeserWrapper < BlockId > {
204
226
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
205
- let total_len: BigSize = Readable :: read ( reader) ?;
206
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
207
- let height = Readable :: read ( & mut fixed_reader) ?;
208
- let hash = Readable :: read ( & mut fixed_reader) ?;
209
- Ok ( Self ( BlockId { height, hash } ) )
227
+ let mut height: RequiredWrapper < u32 > = RequiredWrapper ( None ) ;
228
+ let mut hash: RequiredWrapper < BlockHash > = RequiredWrapper ( None ) ;
229
+ decode_tlv_stream ! ( reader, {
230
+ ( 0 , height, required) ,
231
+ ( 2 , hash, required) ,
232
+ } ) ;
233
+
234
+ Ok ( Self ( BlockId { height : height. 0 . unwrap ( ) , hash : hash. 0 . unwrap ( ) } ) )
210
235
}
211
236
}
212
237
213
238
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , BdkIndexerChangeSet > {
214
239
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
215
- // We serialize a length header to make sure we can accommodate future changes to the
216
- // BDK types.
217
- let last_revealed_len =
218
- ChangeSetSerWrapper ( & self . 0 . last_revealed ) . serialized_length ( ) as u64 ;
219
- let total_len = BigSize ( last_revealed_len) ;
220
- total_len. write ( writer) ?;
221
-
222
- ChangeSetSerWrapper ( & self . 0 . last_revealed ) . write ( writer)
240
+ encode_tlv_stream ! ( writer, { ( 0 , ChangeSetSerWrapper ( & self . 0 . last_revealed) , required) } ) ;
241
+ Ok ( ( ) )
223
242
}
224
243
}
225
244
226
245
impl Readable for ChangeSetDeserWrapper < BdkIndexerChangeSet > {
227
246
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
228
- let total_len: BigSize = Readable :: read ( reader) ?;
229
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
230
- let last_revealed: ChangeSetDeserWrapper < BTreeMap < DescriptorId , u32 > > =
231
- Readable :: read ( & mut fixed_reader) ?;
232
- Ok ( Self ( BdkIndexerChangeSet { last_revealed : last_revealed. 0 } ) )
247
+ let mut last_revealed: RequiredWrapper < ChangeSetDeserWrapper < BTreeMap < DescriptorId , u32 > > > =
248
+ RequiredWrapper ( None ) ;
249
+
250
+ decode_tlv_stream ! ( reader, { ( 0 , last_revealed, required) } ) ;
251
+
252
+ Ok ( Self ( BdkIndexerChangeSet { last_revealed : last_revealed. 0 . unwrap ( ) . 0 } ) )
233
253
}
234
254
}
235
255
@@ -238,8 +258,8 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeMap<DescriptorId, u32>> {
238
258
let len = BigSize ( self . 0 . len ( ) as u64 ) ;
239
259
len. write ( writer) ?;
240
260
for ( descriptor_id, last_index) in self . 0 . iter ( ) {
241
- ChangeSetSerWrapper ( descriptor_id) . write ( writer ) ?;
242
- last_index . write ( writer) ?;
261
+ write_len_prefixed_field ! ( writer , ChangeSetSerWrapper ( descriptor_id) ) ?;
262
+ write_len_prefixed_field ! ( writer, last_index ) ?;
243
263
}
244
264
Ok ( ( ) )
245
265
}
@@ -250,8 +270,9 @@ impl Readable for ChangeSetDeserWrapper<BTreeMap<DescriptorId, u32>> {
250
270
let len: BigSize = Readable :: read ( reader) ?;
251
271
let mut set = BTreeMap :: new ( ) ;
252
272
for _ in 0 ..len. 0 {
253
- let descriptor_id: ChangeSetDeserWrapper < DescriptorId > = Readable :: read ( reader) ?;
254
- let last_index = Readable :: read ( reader) ?;
273
+ let descriptor_id: ChangeSetDeserWrapper < DescriptorId > =
274
+ read_len_prefixed_field ! ( reader) ?;
275
+ let last_index: u32 = read_len_prefixed_field ! ( reader) ?;
255
276
set. insert ( descriptor_id. 0 , last_index) ;
256
277
}
257
278
Ok ( Self ( set) )
@@ -260,22 +281,18 @@ impl Readable for ChangeSetDeserWrapper<BTreeMap<DescriptorId, u32>> {
260
281
261
282
impl < ' a > Writeable for ChangeSetSerWrapper < ' a , DescriptorId > {
262
283
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , lightning:: io:: Error > {
263
- // We serialize a length header to make sure we can accommodate future changes to the
264
- // BDK types.
265
- let hash_len = ChangeSetSerWrapper ( & self . 0 . 0 ) . serialized_length ( ) as u64 ;
266
- let total_len = BigSize ( hash_len) ;
267
- total_len. write ( writer) ?;
268
-
269
- ChangeSetSerWrapper ( & self . 0 . 0 ) . write ( writer)
284
+ encode_tlv_stream ! ( writer, { ( 0 , ChangeSetSerWrapper ( & self . 0 . 0 ) , required) } ) ;
285
+ Ok ( ( ) )
270
286
}
271
287
}
272
288
273
289
impl Readable for ChangeSetDeserWrapper < DescriptorId > {
274
290
fn read < R : lightning:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
275
- let total_len: BigSize = Readable :: read ( reader) ?;
276
- let mut fixed_reader = FixedLengthReader :: new ( reader, total_len. 0 ) ;
277
- let hash: ChangeSetDeserWrapper < Sha256Hash > = Readable :: read ( & mut fixed_reader) ?;
278
- Ok ( Self ( DescriptorId ( hash. 0 ) ) )
291
+ let mut hash: RequiredWrapper < ChangeSetDeserWrapper < Sha256Hash > > = RequiredWrapper ( None ) ;
292
+
293
+ decode_tlv_stream ! ( reader, { ( 0 , hash, required) } ) ;
294
+
295
+ Ok ( Self ( DescriptorId ( hash. 0 . unwrap ( ) . 0 ) ) )
279
296
}
280
297
}
281
298
0 commit comments