Skip to content

Commit 2c4b1aa

Browse files
committed
Drop MsgEncodable in favor of default fns on Writeable
1 parent 6f27210 commit 2c4b1aa

File tree

5 files changed

+39
-182
lines changed

5 files changed

+39
-182
lines changed

src/ln/channel.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ use crypto::digest::Digest;
1414
use crypto::hkdf::{hkdf_extract,hkdf_expand};
1515

1616
use ln::msgs;
17-
use ln::msgs::{ErrorAction, HandleError, MsgEncodable};
17+
use ln::msgs::{ErrorAction, HandleError};
1818
use ln::channelmonitor::ChannelMonitor;
1919
use ln::channelmanager::{PendingHTLCStatus, HTLCSource, PendingForwardHTLCInfo, HTLCFailReason, HTLCFailureMsg};
2020
use ln::chan_utils::{TxCreationKeys,HTLCOutputInCommitment,HTLC_SUCCESS_TX_WEIGHT,HTLC_TIMEOUT_TX_WEIGHT};
2121
use ln::chan_utils;
2222
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
2323
use chain::transaction::OutPoint;
2424
use util::{transaction_utils,rng};
25+
use util::ser::Writeable;
2526
use util::sha2::Sha256;
2627
use util::logger::Logger;
2728
use util::errors::APIError;

src/ln/channelmanager.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ use ln::channel::{Channel, ChannelKeys};
1616
use ln::channelmonitor::ManyChannelMonitor;
1717
use ln::router::{Route,RouteHop};
1818
use ln::msgs;
19-
use ln::msgs::{HandleError,ChannelMessageHandler,MsgEncodable};
19+
use ln::msgs::{HandleError,ChannelMessageHandler};
2020
use util::{byte_utils, events, internal_traits, rng};
2121
use util::sha2::Sha256;
22-
use util::ser::Readable;
22+
use util::ser::{Readable, Writeable};
2323
use util::chacha20poly1305rfc::ChaCha20;
2424
use util::logger::Logger;
2525
use util::errors::APIError;
@@ -2252,11 +2252,12 @@ mod tests {
22522252
use ln::channelmanager::{ChannelManager,OnionKeys};
22532253
use ln::router::{Route, RouteHop, Router};
22542254
use ln::msgs;
2255-
use ln::msgs::{MsgEncodable,ChannelMessageHandler,RoutingMessageHandler};
2255+
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler};
22562256
use util::test_utils;
22572257
use util::events::{Event, EventsProvider};
2258-
use util::logger::Logger;
22592258
use util::errors::APIError;
2259+
use util::logger::Logger;
2260+
use util::ser::Writeable;
22602261

22612262
use bitcoin::util::hash::Sha256dHash;
22622263
use bitcoin::blockdata::block::{Block, BlockHeader};

src/ln/msgs.rs

Lines changed: 1 addition & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ use secp256k1::key::PublicKey;
22
use secp256k1::{Secp256k1, Signature};
33
use secp256k1;
44
use bitcoin::util::hash::Sha256dHash;
5-
use bitcoin::network::serialize::serialize;
65
use bitcoin::blockdata::script::Script;
76

87
use std::error::Error;
@@ -13,19 +12,6 @@ use std::result::Result;
1312
use util::{byte_utils, internal_traits, events};
1413
use util::ser::{Readable, Writeable, Writer};
1514

16-
pub trait MsgEncodable {
17-
fn encode(&self) -> Vec<u8>;
18-
#[inline]
19-
fn encoded_len(&self) -> usize { self.encode().len() }
20-
#[inline]
21-
fn encode_with_len(&self) -> Vec<u8> {
22-
let enc = self.encode();
23-
let mut res = Vec::with_capacity(enc.len() + 2);
24-
res.extend_from_slice(&byte_utils::be16_to_array(enc.len() as u16));
25-
res.extend_from_slice(&enc);
26-
res
27-
}
28-
}
2915
#[derive(Debug)]
3016
pub enum DecodeError {
3117
/// Unknown realm byte in an OnionHopData packet
@@ -553,167 +539,6 @@ impl From<::std::io::Error> for DecodeError {
553539
}
554540
}
555541

556-
impl MsgEncodable for GlobalFeatures {
557-
fn encode(&self) -> Vec<u8> {
558-
let mut res = Vec::with_capacity(self.flags.len() + 2);
559-
res.extend_from_slice(&byte_utils::be16_to_array(self.flags.len() as u16));
560-
res.extend_from_slice(&self.flags[..]);
561-
res
562-
}
563-
fn encoded_len(&self) -> usize { self.flags.len() + 2 }
564-
}
565-
566-
impl MsgEncodable for ChannelReestablish {
567-
fn encode(&self) -> Vec<u8> {
568-
let mut res = Vec::with_capacity(if self.data_loss_protect.is_some() { 32+2*8+33+32 } else { 32+2*8 });
569-
570-
res.extend_from_slice(&serialize(&self.channel_id).unwrap()[..]);
571-
res.extend_from_slice(&byte_utils::be64_to_array(self.next_local_commitment_number));
572-
res.extend_from_slice(&byte_utils::be64_to_array(self.next_remote_commitment_number));
573-
574-
if let &Some(ref data_loss_protect) = &self.data_loss_protect {
575-
res.extend_from_slice(&data_loss_protect.your_last_per_commitment_secret[..]);
576-
res.extend_from_slice(&data_loss_protect.my_current_per_commitment_point.serialize());
577-
}
578-
res
579-
}
580-
}
581-
582-
impl MsgEncodable for UnsignedNodeAnnouncement {
583-
fn encode(&self) -> Vec<u8> {
584-
let features = self.features.encode();
585-
let mut res = Vec::with_capacity(74 + features.len() + self.addresses.len()*7 + self.excess_address_data.len() + self.excess_data.len());
586-
res.extend_from_slice(&features[..]);
587-
res.extend_from_slice(&byte_utils::be32_to_array(self.timestamp));
588-
res.extend_from_slice(&self.node_id.serialize());
589-
res.extend_from_slice(&self.rgb);
590-
res.extend_from_slice(&self.alias);
591-
let mut addr_slice = Vec::with_capacity(self.addresses.len() * 18);
592-
let mut addrs_to_encode = self.addresses.clone();
593-
addrs_to_encode.sort_unstable_by(|a, b| { a.get_id().cmp(&b.get_id()) });
594-
addrs_to_encode.dedup_by(|a, b| { a.get_id() == b.get_id() });
595-
for addr in addrs_to_encode.iter() {
596-
match addr {
597-
&NetAddress::IPv4{addr, port} => {
598-
addr_slice.push(1);
599-
addr_slice.extend_from_slice(&addr);
600-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
601-
},
602-
&NetAddress::IPv6{addr, port} => {
603-
addr_slice.push(2);
604-
addr_slice.extend_from_slice(&addr);
605-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
606-
},
607-
&NetAddress::OnionV2{addr, port} => {
608-
addr_slice.push(3);
609-
addr_slice.extend_from_slice(&addr);
610-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
611-
},
612-
&NetAddress::OnionV3{ed25519_pubkey, checksum, version, port} => {
613-
addr_slice.push(4);
614-
addr_slice.extend_from_slice(&ed25519_pubkey);
615-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(checksum));
616-
addr_slice.push(version);
617-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
618-
},
619-
}
620-
}
621-
res.extend_from_slice(&byte_utils::be16_to_array((addr_slice.len() + self.excess_address_data.len()) as u16));
622-
res.extend_from_slice(&addr_slice[..]);
623-
res.extend_from_slice(&self.excess_address_data[..]);
624-
res.extend_from_slice(&self.excess_data[..]);
625-
res
626-
}
627-
}
628-
629-
impl MsgEncodable for UnsignedChannelAnnouncement {
630-
fn encode(&self) -> Vec<u8> {
631-
let features = self.features.encode();
632-
let mut res = Vec::with_capacity(172 + features.len() + self.excess_data.len());
633-
res.extend_from_slice(&features[..]);
634-
res.extend_from_slice(&self.chain_hash[..]);
635-
res.extend_from_slice(&byte_utils::be64_to_array(self.short_channel_id));
636-
res.extend_from_slice(&self.node_id_1.serialize());
637-
res.extend_from_slice(&self.node_id_2.serialize());
638-
res.extend_from_slice(&self.bitcoin_key_1.serialize());
639-
res.extend_from_slice(&self.bitcoin_key_2.serialize());
640-
res.extend_from_slice(&self.excess_data[..]);
641-
res
642-
}
643-
}
644-
645-
impl MsgEncodable for UnsignedChannelUpdate {
646-
fn encode(&self) -> Vec<u8> {
647-
let mut res = Vec::with_capacity(64 + self.excess_data.len());
648-
res.extend_from_slice(&self.chain_hash[..]);
649-
res.extend_from_slice(&byte_utils::be64_to_array(self.short_channel_id));
650-
res.extend_from_slice(&byte_utils::be32_to_array(self.timestamp));
651-
res.extend_from_slice(&byte_utils::be16_to_array(self.flags));
652-
res.extend_from_slice(&byte_utils::be16_to_array(self.cltv_expiry_delta));
653-
res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_minimum_msat));
654-
res.extend_from_slice(&byte_utils::be32_to_array(self.fee_base_msat));
655-
res.extend_from_slice(&byte_utils::be32_to_array(self.fee_proportional_millionths));
656-
res.extend_from_slice(&self.excess_data[..]);
657-
res
658-
}
659-
}
660-
661-
impl MsgEncodable for ChannelUpdate {
662-
fn encode(&self) -> Vec<u8> {
663-
let mut res = Vec::with_capacity(128);
664-
res.extend_from_slice(&self.signature.serialize_compact(&Secp256k1::without_caps())[..]);
665-
res.extend_from_slice(&self.contents.encode()[..]);
666-
res
667-
}
668-
}
669-
670-
impl MsgEncodable for OnionRealm0HopData {
671-
fn encode(&self) -> Vec<u8> {
672-
let mut res = Vec::with_capacity(32);
673-
res.extend_from_slice(&byte_utils::be64_to_array(self.short_channel_id));
674-
res.extend_from_slice(&byte_utils::be64_to_array(self.amt_to_forward));
675-
res.extend_from_slice(&byte_utils::be32_to_array(self.outgoing_cltv_value));
676-
res.resize(32, 0);
677-
res
678-
}
679-
}
680-
681-
impl MsgEncodable for OnionHopData {
682-
fn encode(&self) -> Vec<u8> {
683-
let mut res = Vec::with_capacity(65);
684-
res.push(self.realm);
685-
res.extend_from_slice(&self.data.encode()[..]);
686-
res.extend_from_slice(&self.hmac);
687-
res
688-
}
689-
}
690-
691-
impl MsgEncodable for OnionPacket {
692-
fn encode(&self) -> Vec<u8> {
693-
let mut res = Vec::with_capacity(1 + 33 + 20*65 + 32);
694-
res.push(self.version);
695-
match self.public_key {
696-
Ok(pubkey) => res.extend_from_slice(&pubkey.serialize()),
697-
Err(_) => res.extend_from_slice(&[0; 33]),
698-
}
699-
res.extend_from_slice(&self.hop_data);
700-
res.extend_from_slice(&self.hmac);
701-
res
702-
}
703-
}
704-
705-
impl MsgEncodable for DecodedOnionErrorPacket {
706-
fn encode(&self) -> Vec<u8> {
707-
let mut res = Vec::with_capacity(32 + 4 + self.failuremsg.len() + self.pad.len());
708-
res.extend_from_slice(&self.hmac);
709-
res.extend_from_slice(&[((self.failuremsg.len() >> 8) & 0xff) as u8, (self.failuremsg.len() & 0xff) as u8]);
710-
res.extend_from_slice(&self.failuremsg);
711-
res.extend_from_slice(&[((self.pad.len() >> 8) & 0xff) as u8, (self.pad.len() & 0xff) as u8]);
712-
res.extend_from_slice(&self.pad);
713-
res
714-
}
715-
}
716-
717542
impl_writeable_len_match!(AcceptChannel, {
718543
{AcceptChannel{ shutdown_scriptpubkey: Some(ref script), ..}, 270 + 2 + script.len()},
719544
{_, 270}
@@ -1339,8 +1164,8 @@ impl_writeable_len_match!(NodeAnnouncement, {
13391164
#[cfg(test)]
13401165
mod tests {
13411166
use hex;
1342-
use ln::msgs::MsgEncodable;
13431167
use ln::msgs;
1168+
use util::ser::Writeable;
13441169
use secp256k1::key::{PublicKey,SecretKey};
13451170
use secp256k1::Secp256k1;
13461171

src/ln/router.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ use bitcoin::blockdata::opcodes;
88

99
use chain::chaininterface::{ChainError, ChainWatchInterface};
1010
use ln::channelmanager;
11-
use ln::msgs::{ErrorAction,HandleError,RoutingMessageHandler,MsgEncodable,NetAddress,GlobalFeatures};
11+
use ln::msgs::{ErrorAction,HandleError,RoutingMessageHandler,NetAddress,GlobalFeatures};
1212
use ln::msgs;
13+
use util::ser::Writeable;
1314
use util::logger::Logger;
1415

1516
use std::cmp;

src/util/ser.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use bitcoin::util::hash::Sha256dHash;
99
use bitcoin::blockdata::script::Script;
1010
use std::marker::Sized;
1111
use ln::msgs::DecodeError;
12+
use util::byte_utils;
1213

1314
use util::byte_utils::{be64_to_array, be32_to_array, be16_to_array, slice_to_be16, slice_to_be32, slice_to_be64};
1415

@@ -35,10 +36,38 @@ impl<W: ::std::io::Write> Writer for W {
3536
fn size_hint(&mut self, _size: usize) { }
3637
}
3738

39+
struct VecWriter(Vec<u8>);
40+
impl Writer for VecWriter {
41+
fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> {
42+
self.0.extend_from_slice(buf);
43+
Ok(())
44+
}
45+
fn size_hint(&mut self, size: usize) {
46+
self.0.reserve_exact(size);
47+
}
48+
}
49+
3850
/// A trait that various rust-lightning types implement allowing them to be written out to a Writer
3951
pub trait Writeable {
4052
/// Writes self out to the given Writer
4153
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error>;
54+
55+
/// Writes self out to a Vec<u8>
56+
fn encode(&self) -> Vec<u8> {
57+
let mut msg = VecWriter(Vec::new());
58+
self.write(&mut msg).unwrap();
59+
msg.0
60+
}
61+
62+
/// Writes self out to a Vec<u8>
63+
fn encode_with_len(&self) -> Vec<u8> {
64+
let mut msg = VecWriter(Vec::new());
65+
0u16.write(&mut msg).unwrap();
66+
self.write(&mut msg).unwrap();
67+
let len = msg.0.len();
68+
msg.0[..2].copy_from_slice(&byte_utils::be16_to_array(len as u16 - 2));
69+
msg.0
70+
}
4271
}
4372

4473
/// A trait that various rust-lightning types implement allowing them to be read in from a Read

0 commit comments

Comments
 (0)