Skip to content

Commit 4b8becc

Browse files
committed
f impl read/write for TxIn,absolute::LockTime to use impl_writeable_tlv_based! everywhere
1 parent 70a8a62 commit 4b8becc

File tree

2 files changed

+34
-98
lines changed

2 files changed

+34
-98
lines changed

lightning/src/ln/interactivetxs.rs

+18-97
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
// licenses.
99

1010
use crate::io_extras::sink;
11-
use crate::{io, prelude::*};
11+
use crate::prelude::*;
1212

1313
use bitcoin::absolute::LockTime as AbsoluteLockTime;
1414
use bitcoin::amount::Amount;
1515
use bitcoin::consensus::Encodable;
1616
use bitcoin::constants::WITNESS_SCALE_FACTOR;
17-
use bitcoin::hashes::Hash;
1817
use bitcoin::policy::MAX_STANDARD_TX_WEIGHT;
1918
use bitcoin::secp256k1::PublicKey;
2019
use bitcoin::transaction::Version;
@@ -27,13 +26,11 @@ use crate::ln::msgs;
2726
use crate::ln::msgs::{MessageSendEvent, SerialId, TxSignatures};
2827
use crate::ln::types::ChannelId;
2928
use crate::sign::{EntropySource, P2TR_KEY_PATH_WITNESS_WEIGHT, P2WPKH_WITNESS_WEIGHT};
30-
use crate::util::ser::{Readable, TransactionU16LenLimited, Writeable, Writer};
29+
use crate::util::ser::TransactionU16LenLimited;
3130

3231
use core::fmt::Display;
3332
use core::ops::Deref;
3433

35-
use super::msgs::DecodeError;
36-
3734
/// The number of received `tx_add_input` messages during a negotiation at which point the
3835
/// negotiation MUST be failed.
3936
const MAX_RECEIVED_TX_ADD_INPUT_COUNT: u16 = 4096;
@@ -171,60 +168,17 @@ pub(crate) struct ConstructedTransaction {
171168
holder_sends_tx_signatures_first: bool,
172169
}
173170

174-
impl Writeable for ConstructedTransaction {
175-
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
176-
let lock_time = self.lock_time.to_consensus_u32();
177-
write_tlv_fields!(writer, {
178-
(1, self.holder_is_initiator, required),
179-
(3, self.inputs, required),
180-
(5, self.outputs, required),
181-
(7, self.local_inputs_value_satoshis, required),
182-
(9, self.local_outputs_value_satoshis, required),
183-
(11, self.remote_inputs_value_satoshis, required),
184-
(13, self.remote_outputs_value_satoshis, required),
185-
(15, lock_time, required),
186-
(17, self.holder_sends_tx_signatures_first, required),
187-
});
188-
Ok(())
189-
}
190-
}
191-
192-
impl Readable for ConstructedTransaction {
193-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
194-
let mut holder_is_initiator = false;
195-
let mut inputs: Vec<InteractiveTxInput> = vec![];
196-
let mut outputs: Vec<InteractiveTxOutput> = vec![];
197-
let mut local_inputs_value_satoshis: u64 = 0;
198-
let mut local_outputs_value_satoshis: u64 = 0;
199-
let mut remote_inputs_value_satoshis: u64 = 0;
200-
let mut remote_outputs_value_satoshis: u64 = 0;
201-
let mut lock_time: u32 = 0;
202-
let mut holder_sends_tx_signatures_first = false;
203-
read_tlv_fields!(reader, {
204-
(1, holder_is_initiator, required),
205-
(3, inputs, required),
206-
(5, outputs, required),
207-
(7, local_inputs_value_satoshis, required),
208-
(9, local_outputs_value_satoshis, required),
209-
(11, remote_inputs_value_satoshis, required),
210-
(13, remote_outputs_value_satoshis, required),
211-
(15, lock_time, required),
212-
(17, holder_sends_tx_signatures_first, required),
213-
});
214-
let lock_time = AbsoluteLockTime::from_consensus(lock_time);
215-
Ok(ConstructedTransaction {
216-
holder_is_initiator,
217-
inputs,
218-
outputs,
219-
local_inputs_value_satoshis,
220-
local_outputs_value_satoshis,
221-
remote_inputs_value_satoshis,
222-
remote_outputs_value_satoshis,
223-
lock_time,
224-
holder_sends_tx_signatures_first,
225-
})
226-
}
227-
}
171+
impl_writeable_tlv_based!(ConstructedTransaction, {
172+
(1, holder_is_initiator, required),
173+
(3, inputs, required),
174+
(5, outputs, required),
175+
(7, local_inputs_value_satoshis, required),
176+
(9, local_outputs_value_satoshis, required),
177+
(11, remote_inputs_value_satoshis, required),
178+
(13, remote_outputs_value_satoshis, required),
179+
(15, lock_time, required),
180+
(17, holder_sends_tx_signatures_first, required),
181+
});
228182

229183
impl ConstructedTransaction {
230184
fn new(context: NegotiationContext) -> Self {
@@ -1219,44 +1173,11 @@ pub struct LocalOrRemoteInput {
12191173
prev_output: TxOut,
12201174
}
12211175

1222-
impl Writeable for LocalOrRemoteInput {
1223-
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
1224-
write_tlv_fields!(writer, {
1225-
(1, self.serial_id, required),
1226-
(3, self.input.sequence.0, required),
1227-
(5, self.input.previous_output, required),
1228-
(7, self.input.script_sig, required),
1229-
(9, self.input.witness, required),
1230-
(11, self.prev_output, required),
1231-
});
1232-
Ok(())
1233-
}
1234-
}
1235-
1236-
impl Readable for LocalOrRemoteInput {
1237-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1238-
let mut serial_id: u64 = 0;
1239-
let mut sequence: u32 = 0;
1240-
let mut previous_output = OutPoint::new(Txid::from_byte_array([0; 32]), 0);
1241-
let mut script_sig = ScriptBuf::default();
1242-
let mut witness = Witness::new();
1243-
let mut prev_output =
1244-
TxOut { value: Amount::default(), script_pubkey: ScriptBuf::default() };
1245-
read_tlv_fields!(reader, {
1246-
(1, serial_id, required),
1247-
(3, sequence, required),
1248-
(5, previous_output, required),
1249-
(7, script_sig, required),
1250-
(9, witness, required),
1251-
(11, prev_output, required),
1252-
});
1253-
Ok(LocalOrRemoteInput {
1254-
serial_id,
1255-
input: TxIn { previous_output, script_sig, sequence: Sequence(sequence), witness },
1256-
prev_output,
1257-
})
1258-
}
1259-
}
1176+
impl_writeable_tlv_based!(LocalOrRemoteInput, {
1177+
(1, serial_id, required),
1178+
(3, input, required),
1179+
(5, prev_output, required),
1180+
});
12601181

12611182
#[derive(Clone, Debug, Eq, PartialEq)]
12621183
pub(crate) enum InteractiveTxInput {

lightning/src/util/ser.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use core::ops::Deref;
2424

2525
use alloc::collections::BTreeMap;
2626

27+
use bitcoin::absolute::LockTime as AbsoluteLockTime;
2728
use bitcoin::amount::Amount;
2829
use bitcoin::consensus::Encodable;
2930
use bitcoin::constants::ChainHash;
@@ -39,7 +40,7 @@ use bitcoin::secp256k1::ecdsa;
3940
use bitcoin::secp256k1::schnorr;
4041
use bitcoin::secp256k1::{PublicKey, SecretKey};
4142
use bitcoin::transaction::{OutPoint, Transaction, TxOut};
42-
use bitcoin::{consensus, Witness};
43+
use bitcoin::{consensus, TxIn, Witness};
4344

4445
use dnssec_prover::rr::Name;
4546

@@ -1349,6 +1350,19 @@ impl<T: LengthReadable> Readable for Option<T> {
13491350
}
13501351
}
13511352

1353+
impl Writeable for AbsoluteLockTime {
1354+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1355+
self.to_consensus_u32().write(w)
1356+
}
1357+
}
1358+
1359+
impl Readable for AbsoluteLockTime {
1360+
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1361+
let lock_time: u32 = Readable::read(r)?;
1362+
Ok(AbsoluteLockTime::from_consensus(lock_time))
1363+
}
1364+
}
1365+
13521366
impl Writeable for Amount {
13531367
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
13541368
self.to_sat().write(w)
@@ -1450,6 +1464,7 @@ macro_rules! impl_consensus_ser {
14501464
};
14511465
}
14521466
impl_consensus_ser!(Transaction);
1467+
impl_consensus_ser!(TxIn);
14531468
impl_consensus_ser!(TxOut);
14541469
impl_consensus_ser!(Witness);
14551470

0 commit comments

Comments
 (0)