Skip to content

Commit 166e364

Browse files
committed
Fix tx-add-input serialization
1 parent be8f7a6 commit 166e364

File tree

1 file changed

+75
-12
lines changed

1 file changed

+75
-12
lines changed

lightning/src/ln/msgs.rs

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use bitcoin::hash_types::Txid;
2929
use bitcoin::script::ScriptBuf;
3030
use bitcoin::secp256k1::ecdsa::Signature;
3131
use bitcoin::secp256k1::PublicKey;
32-
use bitcoin::{secp256k1, Witness};
32+
use bitcoin::{secp256k1, Transaction, Witness};
3333

3434
use crate::blinded_path::payment::{
3535
BlindedPaymentTlvs, ForwardTlvs, ReceiveTlvs, UnauthenticatedReceiveTlvs,
@@ -2664,15 +2664,60 @@ impl_writeable_msg!(SpliceLocked, {
26642664
splice_txid,
26652665
}, {});
26662666

2667-
impl_writeable_msg!(TxAddInput, {
2668-
channel_id,
2669-
serial_id,
2670-
prevtx_out,
2671-
sequence,
2672-
}, {
2673-
(0, prevtx, option),
2674-
(1, shared_input_txid, option), // `funding_txid`
2675-
});
2667+
impl Writeable for TxAddInput {
2668+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2669+
self.channel_id.write(w)?;
2670+
self.serial_id.write(w)?;
2671+
if let Some(prevtx) = self.prevtx.as_ref() {
2672+
debug_assert!(self.shared_input_txid.is_none());
2673+
prevtx.write(w)?;
2674+
} else {
2675+
debug_assert!(self.shared_input_txid.is_some());
2676+
0u16.write(w)?;
2677+
}
2678+
self.prevtx_out.write(w)?;
2679+
self.sequence.write(w)?;
2680+
2681+
if let Some(shared_input_txid) = self.shared_input_txid.as_ref() {
2682+
encode_tlv_stream!(w, { (0, shared_input_txid, required) });
2683+
} else {
2684+
encode_tlv_stream!(w, {});
2685+
}
2686+
2687+
Ok(())
2688+
}
2689+
}
2690+
2691+
impl LengthReadable for TxAddInput {
2692+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
2693+
let channel_id = Readable::read(r)?;
2694+
let serial_id = Readable::read(r)?;
2695+
let prevtx_len = <u16 as Readable>::read(r)?;
2696+
let mut prevtx = None;
2697+
if prevtx_len > 0 {
2698+
let mut tx_reader = FixedLengthReader::new(r, prevtx_len as u64);
2699+
let tx: Transaction = Readable::read(&mut tx_reader)?;
2700+
if tx_reader.bytes_remain() {
2701+
return Err(DecodeError::BadLengthDescriptor);
2702+
}
2703+
prevtx =
2704+
Some(TransactionU16LenLimited::new(tx).map_err(|_| DecodeError::InvalidValue)?);
2705+
}
2706+
let prevtx_out = Readable::read(r)?;
2707+
let sequence = Readable::read(r)?;
2708+
2709+
let mut shared_input_txid = None;
2710+
if prevtx_len > 0 {
2711+
decode_tlv_stream!(r, {});
2712+
} else {
2713+
decode_tlv_stream!(r, {
2714+
(0, shared_input_txid, required),
2715+
});
2716+
}
2717+
2718+
Ok(Self { channel_id, serial_id, prevtx, prevtx_out, sequence, shared_input_txid })
2719+
}
2720+
}
26762721

26772722
impl_writeable_msg!(TxAddOutput, {
26782723
channel_id,
@@ -5230,10 +5275,28 @@ mod tests {
52305275
}).unwrap()),
52315276
prevtx_out: 305419896,
52325277
sequence: 305419896,
5233-
shared_input_txid: Some(Txid::from_str("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e").unwrap()),
5278+
shared_input_txid: None,
5279+
};
5280+
let encoded_value = tx_add_input.encode();
5281+
let target_value = "0202020202020202020202020202020202020202020202020202020202020202000000012345678900de02000000000101779ced6c148293f86b60cb222108553d22c89207326bb7b6b897e23e64ab5b300200000000fdffffff0236dbc1000000000016001417d29e4dd454bac3b1cde50d1926da80cfc5287b9cbd03000000000016001436ec78d514df462da95e6a00c24daa8915362d420247304402206af85b7dd67450ad12c979302fac49dfacbc6a8620f49c5da2b5721cf9565ca502207002b32fed9ce1bf095f57aeb10c36928ac60b12e723d97d2964a54640ceefa701210301ab7dc16488303549bfcdd80f6ae5ee4c20bf97ab5410bbd6b1bfa85dcd6944000000001234567812345678";
5282+
assert_eq!(encoded_value.as_hex().to_string(), target_value);
5283+
}
5284+
5285+
#[test]
5286+
fn encoding_tx_add_input_shared() {
5287+
let tx_add_input = msgs::TxAddInput {
5288+
channel_id: ChannelId::from_bytes([2; 32]),
5289+
serial_id: 4886718345,
5290+
prevtx: None,
5291+
prevtx_out: 305419896,
5292+
sequence: 305419896,
5293+
shared_input_txid: Some(
5294+
Txid::from_str("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e")
5295+
.unwrap(),
5296+
),
52345297
};
52355298
let encoded_value = tx_add_input.encode();
5236-
let target_value = "02020202020202020202020202020202020202020202020202020202020202020000000123456789123456781234567800e000de02000000000101779ced6c148293f86b60cb222108553d22c89207326bb7b6b897e23e64ab5b300200000000fdffffff0236dbc1000000000016001417d29e4dd454bac3b1cde50d1926da80cfc5287b9cbd03000000000016001436ec78d514df462da95e6a00c24daa8915362d420247304402206af85b7dd67450ad12c979302fac49dfacbc6a8620f49c5da2b5721cf9565ca502207002b32fed9ce1bf095f57aeb10c36928ac60b12e723d97d2964a54640ceefa701210301ab7dc16488303549bfcdd80f6ae5ee4c20bf97ab5410bbd6b1bfa85dcd69440000000001206e96fe9f8b0ddcd729ba03cfafa5a27b050b39d354dd980814268dfa9a44d4c2";
5299+
let target_value = "020202020202020202020202020202020202020202020202020202020202020200000001234567890000123456781234567800206e96fe9f8b0ddcd729ba03cfafa5a27b050b39d354dd980814268dfa9a44d4c2";
52375300
assert_eq!(encoded_value.as_hex().to_string(), target_value);
52385301
}
52395302

0 commit comments

Comments
 (0)