Skip to content

Commit b27508d

Browse files
committed
fix: handle oracle messages as a tlv
1 parent e161cff commit b27508d

8 files changed

Lines changed: 119 additions & 13 deletions

File tree

β€Žddk/src/ddk.rsβ€Ž

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,3 +415,18 @@ where
415415
})
416416
}
417417
}
418+
419+
#[cfg(test)]
420+
mod tests {
421+
use ddk_messages::oracle_msgs::OracleAnnouncement;
422+
use lightning::{io::Cursor, util::ser::Readable};
423+
424+
#[test]
425+
fn oracle_announcement_tlv() {
426+
let bytes = hex::decode("fdd824fd012a6d9f8eb0ad220690c328fc3bf0a5f063687bdd5e40ddcf37e8ad1fad86c2dc71eb891df5cb225af2085ec2e1767c724b0f0e2a47e3defdb4d9716ea5baba0421ba9ead06ccc4aa156fb6f7e014951413ca47194c6c8fecca83a1e28830c061d0fdd822c600016961420d0edf1d96ad8c376634d797a46d8b25886e61716bb3c63ddfed260b8668eefda5fdd8064e0004086e6f742d70616964067265706169641d6c6971756964617465642d62792d6d617475726174696f6e2d646174651d6c6971756964617465642d62792d70726963652d7468726573686f6c644d6c6f616e2d6d6174757265642d31653665356635383537333866383036343338623833333134623932653161303739366462353432646237643636323630656564306530666239623530616538").unwrap();
427+
let mut cursor = Cursor::new(bytes);
428+
let announcement = OracleAnnouncement::read(&mut cursor);
429+
println!("{:?}", announcement);
430+
assert!(announcement.is_ok())
431+
}
432+
}

β€Ždlc-messages/src/oracle_msgs.rsβ€Ž

Lines changed: 104 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! Structs containing oracle information.
22
33
use crate::ser_impls::{
4-
read_as_tlv, read_i32, read_schnorr_pubkey, read_schnorrsig, read_strings_u16, write_as_tlv,
5-
write_i32, write_schnorr_pubkey, write_schnorrsig, write_strings_u16, BigSize,
4+
read_as_tlv, read_i32, read_schnorr_pubkey, read_strings_u16, write_as_tlv, write_i32,
5+
write_schnorr_pubkey, write_schnorrsig, write_strings_u16, BigSize,
66
};
77
use bitcoin::hashes::{Hash, HashEngine};
88
use ddk_dlc::{Error, OracleInfo as DlcOracleInfo};
@@ -224,11 +224,18 @@ impl OracleAnnouncement {
224224
}
225225
}
226226

227-
impl_dlc_writeable!(OracleAnnouncement, {
228-
(announcement_signature, {cb_writeable, write_schnorrsig, read_schnorrsig}),
229-
(oracle_public_key, {cb_writeable, write_schnorr_pubkey, read_schnorr_pubkey}),
230-
(oracle_event, {cb_writeable, write_as_tlv, read_as_tlv})
231-
});
227+
// fn read_oracle_message<T: Readable>(msg: MagnoliaResponse) -> Result<T, Error> {
228+
// let bytes = hex::decode(msg.hex).map_err(|e| Error::OracleError(e.to_string()))?;
229+
// let mut cursor = Cursor::new(bytes);
230+
// let _type_id: u64 = lightning::util::ser::BigSize::read(&mut cursor).unwrap().0;
231+
// let _length: u64 = lightning::util::ser::BigSize::read(&mut cursor).unwrap().0;
232+
// T::read(&mut cursor).map_err(|e| Error::OracleError(e.to_string()))
233+
// }
234+
// impl_dlc_writeable!(OracleAnnouncement, {
235+
// (announcement_signature, {cb_writeable, write_schnorrsig, read_schnorrsig}),
236+
// (oracle_public_key, {cb_writeable, write_schnorr_pubkey, read_schnorr_pubkey}),
237+
// (oracle_event, {cb_writeable, write_as_tlv, read_as_tlv})
238+
// });
232239

233240
impl From<&OracleAnnouncement> for DlcOracleInfo {
234241
fn from(input: &OracleAnnouncement) -> DlcOracleInfo {
@@ -239,6 +246,49 @@ impl From<&OracleAnnouncement> for DlcOracleInfo {
239246
}
240247
}
241248

249+
impl Readable for OracleAnnouncement {
250+
fn read<R: bitcoin::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
251+
let _type_id: u64 = BigSize::read(reader)?.0;
252+
let _length: u64 = BigSize::read(reader)?.0;
253+
254+
let announcement_signature = crate::ser_impls::read_schnorrsig(reader)?;
255+
let oracle_public_key = crate::ser_impls::read_schnorr_pubkey(reader)?;
256+
let _type_id: u64 = BigSize::read(reader)?.0;
257+
let _length: u64 = BigSize::read(reader)?.0;
258+
let oracle_event = OracleEvent::read(reader)?;
259+
260+
Ok(Self {
261+
announcement_signature,
262+
oracle_public_key,
263+
oracle_event,
264+
})
265+
}
266+
}
267+
268+
impl Writeable for OracleAnnouncement {
269+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), lightning::io::Error> {
270+
BigSize(self.type_id() as u64).write(writer)?;
271+
BigSize(self.serialized_length() as u64).write(writer)?;
272+
write_schnorrsig(&self.announcement_signature, writer)?;
273+
write_schnorr_pubkey(&self.oracle_public_key, writer)?;
274+
write_as_tlv(&self.oracle_event, writer)?;
275+
Ok(())
276+
}
277+
278+
fn serialized_length(&self) -> usize {
279+
// Calculate size without the outer TLV wrapper (type + length)
280+
64 + // announcement_signature
281+
32 + // oracle_public_key
282+
{
283+
// oracle_event as TLV
284+
let event_size = self.oracle_event.serialized_length();
285+
BigSize(self.oracle_event.type_id() as u64).serialized_length() +
286+
BigSize(event_size as u64).serialized_length() +
287+
event_size
288+
}
289+
}
290+
}
291+
242292
#[derive(Clone, Eq, PartialEq, Debug)]
243293
#[cfg_attr(
244294
feature = "use-serde",
@@ -446,12 +496,53 @@ impl Type for OracleAttestation {
446496
}
447497
}
448498

449-
impl_dlc_writeable!(OracleAttestation, {
450-
(event_id, string),
451-
(oracle_public_key, {cb_writeable, write_schnorr_pubkey, read_schnorr_pubkey}),
452-
(signatures, {vec_u16_cb, write_schnorrsig, read_schnorrsig}),
453-
(outcomes, {cb_writeable, write_strings_u16, read_strings_u16})
454-
});
499+
impl Readable for OracleAttestation {
500+
fn read<R: bitcoin::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
501+
let _type_id: u64 = BigSize::read(reader)?.0;
502+
let _length: u64 = BigSize::read(reader)?.0;
503+
504+
Ok(Self {
505+
event_id: Readable::read(reader)?,
506+
oracle_public_key: crate::ser_impls::read_schnorr_pubkey(reader)?,
507+
signatures: {
508+
let len: u16 = Readable::read(reader)?;
509+
let mut signatures = Vec::with_capacity(len as usize);
510+
for _ in 0..len {
511+
signatures.push(crate::ser_impls::read_schnorrsig(reader)?);
512+
}
513+
signatures
514+
},
515+
outcomes: crate::ser_impls::read_strings_u16(reader)?,
516+
})
517+
}
518+
}
519+
520+
impl Writeable for OracleAttestation {
521+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), lightning::io::Error> {
522+
BigSize(self.type_id() as u64).write(writer)?;
523+
BigSize(self.serialized_length() as u64).write(writer)?;
524+
self.event_id.write(writer)?;
525+
write_schnorr_pubkey(&self.oracle_public_key, writer)?;
526+
(self.signatures.len() as u16).write(writer)?;
527+
for sig in &self.signatures {
528+
write_schnorrsig(sig, writer)?;
529+
}
530+
write_strings_u16(&self.outcomes, writer)?;
531+
Ok(())
532+
}
533+
534+
fn serialized_length(&self) -> usize {
535+
// Calculate size without the outer TLV wrapper (type + length)
536+
self.event_id.serialized_length() +
537+
32 + // oracle_public_key
538+
2 + // signatures length u16
539+
(64 * self.signatures.len()) + // each signature is 64 bytes
540+
{
541+
// outcomes as u16 length + strings
542+
2 + self.outcomes.iter().map(|s| s.as_bytes().len() + 2).sum::<usize>()
543+
}
544+
}
545+
}
455546

456547
#[cfg(test)]
457548
mod tests {
154 Bytes
Binary file not shown.
157 Bytes
Binary file not shown.
154 Bytes
Binary file not shown.
154 Bytes
Binary file not shown.
157 Bytes
Binary file not shown.
154 Bytes
Binary file not shown.

0 commit comments

Comments
Β (0)