Skip to content

Commit f3073ce

Browse files
optout21dunxen
authored andcommitted
Fix tx-add-input serialization
1 parent b6363fd commit f3073ce

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,
@@ -2732,15 +2732,60 @@ impl_writeable_msg!(SpliceLocked, {
27322732
splice_txid,
27332733
}, {});
27342734

2735-
impl_writeable_msg!(TxAddInput, {
2736-
channel_id,
2737-
serial_id,
2738-
prevtx_out,
2739-
sequence,
2740-
}, {
2741-
(0, prevtx, option),
2742-
(1, shared_input_txid, option), // `funding_txid`
2743-
});
2735+
impl Writeable for TxAddInput {
2736+
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2737+
self.channel_id.write(w)?;
2738+
self.serial_id.write(w)?;
2739+
if let Some(prevtx) = self.prevtx.as_ref() {
2740+
debug_assert!(self.shared_input_txid.is_none());
2741+
prevtx.write(w)?;
2742+
} else {
2743+
debug_assert!(self.shared_input_txid.is_some());
2744+
0u16.write(w)?;
2745+
}
2746+
self.prevtx_out.write(w)?;
2747+
self.sequence.write(w)?;
2748+
2749+
if let Some(shared_input_txid) = self.shared_input_txid.as_ref() {
2750+
encode_tlv_stream!(w, { (0, shared_input_txid, required) });
2751+
} else {
2752+
encode_tlv_stream!(w, {});
2753+
}
2754+
2755+
Ok(())
2756+
}
2757+
}
2758+
2759+
impl LengthReadable for TxAddInput {
2760+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
2761+
let channel_id = Readable::read(r)?;
2762+
let serial_id = Readable::read(r)?;
2763+
let prevtx_len = <u16 as Readable>::read(r)?;
2764+
let mut prevtx = None;
2765+
if prevtx_len > 0 {
2766+
let mut tx_reader = FixedLengthReader::new(r, prevtx_len as u64);
2767+
let tx: Transaction = Readable::read(&mut tx_reader)?;
2768+
if tx_reader.bytes_remain() {
2769+
return Err(DecodeError::BadLengthDescriptor);
2770+
}
2771+
prevtx =
2772+
Some(TransactionU16LenLimited::new(tx).map_err(|_| DecodeError::InvalidValue)?);
2773+
}
2774+
let prevtx_out = Readable::read(r)?;
2775+
let sequence = Readable::read(r)?;
2776+
2777+
let mut shared_input_txid = None;
2778+
if prevtx_len > 0 {
2779+
decode_tlv_stream!(r, {});
2780+
} else {
2781+
decode_tlv_stream!(r, {
2782+
(0, shared_input_txid, required),
2783+
});
2784+
}
2785+
2786+
Ok(Self { channel_id, serial_id, prevtx, prevtx_out, sequence, shared_input_txid })
2787+
}
2788+
}
27442789

27452790
impl_writeable_msg!(TxAddOutput, {
27462791
channel_id,
@@ -5315,10 +5360,28 @@ mod tests {
53155360
}).unwrap()),
53165361
prevtx_out: 305419896,
53175362
sequence: 305419896,
5318-
shared_input_txid: Some(Txid::from_str("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e").unwrap()),
5363+
shared_input_txid: None,
5364+
};
5365+
let encoded_value = tx_add_input.encode();
5366+
let target_value = "0202020202020202020202020202020202020202020202020202020202020202000000012345678900de02000000000101779ced6c148293f86b60cb222108553d22c89207326bb7b6b897e23e64ab5b300200000000fdffffff0236dbc1000000000016001417d29e4dd454bac3b1cde50d1926da80cfc5287b9cbd03000000000016001436ec78d514df462da95e6a00c24daa8915362d420247304402206af85b7dd67450ad12c979302fac49dfacbc6a8620f49c5da2b5721cf9565ca502207002b32fed9ce1bf095f57aeb10c36928ac60b12e723d97d2964a54640ceefa701210301ab7dc16488303549bfcdd80f6ae5ee4c20bf97ab5410bbd6b1bfa85dcd6944000000001234567812345678";
5367+
assert_eq!(encoded_value.as_hex().to_string(), target_value);
5368+
}
5369+
5370+
#[test]
5371+
fn encoding_tx_add_input_shared() {
5372+
let tx_add_input = msgs::TxAddInput {
5373+
channel_id: ChannelId::from_bytes([2; 32]),
5374+
serial_id: 4886718345,
5375+
prevtx: None,
5376+
prevtx_out: 305419896,
5377+
sequence: 305419896,
5378+
shared_input_txid: Some(
5379+
Txid::from_str("c2d4449afa8d26140898dd54d3390b057ba2a5afcf03ba29d7dc0d8b9ffe966e")
5380+
.unwrap(),
5381+
),
53195382
};
53205383
let encoded_value = tx_add_input.encode();
5321-
let target_value = "02020202020202020202020202020202020202020202020202020202020202020000000123456789123456781234567800e000de02000000000101779ced6c148293f86b60cb222108553d22c89207326bb7b6b897e23e64ab5b300200000000fdffffff0236dbc1000000000016001417d29e4dd454bac3b1cde50d1926da80cfc5287b9cbd03000000000016001436ec78d514df462da95e6a00c24daa8915362d420247304402206af85b7dd67450ad12c979302fac49dfacbc6a8620f49c5da2b5721cf9565ca502207002b32fed9ce1bf095f57aeb10c36928ac60b12e723d97d2964a54640ceefa701210301ab7dc16488303549bfcdd80f6ae5ee4c20bf97ab5410bbd6b1bfa85dcd69440000000001206e96fe9f8b0ddcd729ba03cfafa5a27b050b39d354dd980814268dfa9a44d4c2";
5384+
let target_value = "020202020202020202020202020202020202020202020202020202020202020200000001234567890000123456781234567800206e96fe9f8b0ddcd729ba03cfafa5a27b050b39d354dd980814268dfa9a44d4c2";
53225385
assert_eq!(encoded_value.as_hex().to_string(), target_value);
53235386
}
53245387

0 commit comments

Comments
 (0)