Skip to content

Commit 7f2faaf

Browse files
committed
f Use LDK serialization macros
1 parent 6b8c57b commit 7f2faaf

File tree

1 file changed

+117
-100
lines changed

1 file changed

+117
-100
lines changed

src/wallet/ser.rs

Lines changed: 117 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
// accordance with one or both of these licenses.
77

88
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};
1013

1114
use bdk_chain::bdk_core::{BlockId, ConfirmationBlockTime};
1215
use bdk_chain::indexer::keychain_txout::ChangeSet as BdkIndexerChangeSet;
@@ -19,7 +22,7 @@ use bdk_wallet::keys::DescriptorPublicKey;
1922

2023
use bitcoin::hashes::sha256::Hash as Sha256Hash;
2124
use bitcoin::p2p::Magic;
22-
use bitcoin::{Network, Transaction, Txid};
25+
use bitcoin::{BlockHash, Network, OutPoint, Transaction, TxOut, Txid};
2326

2427
use std::collections::{BTreeMap, BTreeSet};
2528
use std::str::FromStr;
@@ -28,6 +31,24 @@ use std::sync::Arc;
2831
pub(crate) struct ChangeSetSerWrapper<'a, T>(pub &'a T);
2932
pub(crate) struct ChangeSetDeserWrapper<T>(pub T);
3033

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+
3152
impl<'a> Writeable for ChangeSetSerWrapper<'a, Descriptor<DescriptorPublicKey>> {
3253
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), lightning::io::Error> {
3354
self.0.to_string().write(writer)
@@ -60,55 +81,58 @@ impl Readable for ChangeSetDeserWrapper<Network> {
6081

6182
impl<'a> Writeable for ChangeSetSerWrapper<'a, BdkLocalChainChangeSet> {
6283
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(())
6988
}
7089
}
7190

7291
impl Readable for ChangeSetDeserWrapper<BdkLocalChainChangeSet> {
7392
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() }))
7898
}
7999
}
80100

81101
impl<'a> Writeable for ChangeSetSerWrapper<'a, BdkTxGraphChangeSet<ConfirmationBlockTime>> {
82102
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+
});
96109
Ok(())
97110
}
98111
}
99112

100113
impl Readable for ChangeSetDeserWrapper<BdkTxGraphChangeSet<ConfirmationBlockTime>> {
101114
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+
}))
112136
}
113137
}
114138

@@ -117,8 +141,8 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeSet<(ConfirmationBlockTime,
117141
let len = BigSize(self.0.len() as u64);
118142
len.write(writer)?;
119143
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)?;
122146
}
123147
Ok(())
124148
}
@@ -129,8 +153,9 @@ impl Readable for ChangeSetDeserWrapper<BTreeSet<(ConfirmationBlockTime, Txid)>>
129153
let len: BigSize = Readable::read(reader)?;
130154
let mut set = BTreeSet::new();
131155
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)?;
134159
set.insert((time.0, txid));
135160
}
136161
Ok(Self(set))
@@ -142,7 +167,7 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeSet<Arc<Transaction>>> {
142167
let len = BigSize(self.0.len() as u64);
143168
len.write(writer)?;
144169
for tx in self.0.iter() {
145-
tx.write(writer)?;
170+
write_len_prefixed_field!(writer, tx)?;
146171
}
147172
Ok(())
148173
}
@@ -153,83 +178,78 @@ impl Readable for ChangeSetDeserWrapper<BTreeSet<Arc<Transaction>>> {
153178
let len: BigSize = Readable::read(reader)?;
154179
let mut set = BTreeSet::new();
155180
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));
158183
}
159184
Ok(Self(set))
160185
}
161186
}
162187

163188
impl<'a> Writeable for ChangeSetSerWrapper<'a, ConfirmationBlockTime> {
164189
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(())
174195
}
175196
}
176197

177198
impl Readable for ChangeSetDeserWrapper<ConfirmationBlockTime> {
178199
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+
}))
186212
}
187213
}
188214

189215
impl<'a> Writeable for ChangeSetSerWrapper<'a, BlockId> {
190216
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(())
200222
}
201223
}
202224

203225
impl Readable for ChangeSetDeserWrapper<BlockId> {
204226
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() }))
210235
}
211236
}
212237

213238
impl<'a> Writeable for ChangeSetSerWrapper<'a, BdkIndexerChangeSet> {
214239
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(())
223242
}
224243
}
225244

226245
impl Readable for ChangeSetDeserWrapper<BdkIndexerChangeSet> {
227246
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 }))
233253
}
234254
}
235255

@@ -238,8 +258,8 @@ impl<'a> Writeable for ChangeSetSerWrapper<'a, BTreeMap<DescriptorId, u32>> {
238258
let len = BigSize(self.0.len() as u64);
239259
len.write(writer)?;
240260
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)?;
243263
}
244264
Ok(())
245265
}
@@ -250,8 +270,9 @@ impl Readable for ChangeSetDeserWrapper<BTreeMap<DescriptorId, u32>> {
250270
let len: BigSize = Readable::read(reader)?;
251271
let mut set = BTreeMap::new();
252272
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)?;
255276
set.insert(descriptor_id.0, last_index);
256277
}
257278
Ok(Self(set))
@@ -260,22 +281,18 @@ impl Readable for ChangeSetDeserWrapper<BTreeMap<DescriptorId, u32>> {
260281

261282
impl<'a> Writeable for ChangeSetSerWrapper<'a, DescriptorId> {
262283
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(())
270286
}
271287
}
272288

273289
impl Readable for ChangeSetDeserWrapper<DescriptorId> {
274290
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)))
279296
}
280297
}
281298

0 commit comments

Comments
 (0)