-
Notifications
You must be signed in to change notification settings - Fork 376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Expose impl_writeable_tlv_based
macro
#1823
Expose impl_writeable_tlv_based
macro
#1823
Conversation
Codecov ReportBase: 90.71% // Head: 90.72% // Increases project coverage by
Additional details and impacted files@@ Coverage Diff @@
## main #1823 +/- ##
=======================================
Coverage 90.71% 90.72%
=======================================
Files 96 96
Lines 50113 50134 +21
Branches 50113 50134 +21
=======================================
+ Hits 45459 45482 +23
+ Misses 4654 4652 -2
Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here. ☔ View full report at Codecov. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically fine, needs way more details in the docs, though. If you prefer to not write those just let me know and I can suggest concrete changes.
lightning/src/util/ser_macros.rs
Outdated
// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | ||
// the message contents. It should return `Ok(true)` if the custom message is successfully parsed, | ||
// `Ok(false)` if the message type is unknown, and `Err(DecodeError)` if parsing fails. | ||
/// Implements the TLVs deserialization part in a Readable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, this is confusing, it can be used anywhere, it doesn't have to be in a Readable
implementation - it just happens to return
Err(DecodeError)
so it has to be in a function which does so.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Right, I wrote this doc based on how the macro was used. But yeah this should be more generic.
lightning/src/util/ser_macros.rs
Outdated
/// `$decode_custom_tlv` is a closure that may be optionally provided to handle custom message types. | ||
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | ||
/// the message contents. It should return `Ok(true)` if the custom message is successfully parsed, | ||
/// `Ok(false)` if the message type is unknown, and `Err(DecodeError)` if parsing fails. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should have an example of how to call it if we're gonna make it for public consumption, including what the option
, required
, etc types mean and how to use them (we can leave off some of the more complicated ones, preferring to just document ones we want to support).
Also needs to note that it will always fully read the stream provided to the end.
lightning/src/util/ser_macros.rs
Outdated
@@ -351,17 +379,21 @@ macro_rules! read_ver_prefix { | |||
} } | |||
} | |||
|
|||
/// Reads a suffix added by write_tlv_fields. | |||
/// Reads a suffix added by write_tlv_fields!(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I dunno if we need to expose the lenght-prefixed versions of the macros.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aren't {write,read}_tlv_fields
length-prefixed already?
lightning/src/util/ser_macros.rs
Outdated
@@ -28,6 +34,8 @@ macro_rules! encode_tlv { | |||
}; | |||
} | |||
|
|||
/// Implements the TLVs serialization part in a Writeable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comments, basically, apply here - we need to describe what this does, when users should want to use it, and what they need to do to use it, including examples of how to call it with the behavior of the various types spelled out.
@@ -396,11 +431,12 @@ macro_rules! init_tlv_field_var { | |||
/// If $fieldty is `option`, then $field is optional field. | |||
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements | |||
/// serialized. | |||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, do you have an immediate need for this? If not we can skip it, but if so the same comments above apply, basically, needs way more docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough. It'd be nice to add an example for the docs here.
lightning/src/util/ser_macros.rs
Outdated
@@ -28,6 +34,8 @@ macro_rules! encode_tlv { | |||
}; | |||
} | |||
|
|||
/// Implements the TLVs serialization part in a Writeable implementation of a struct. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Implements the TLVs serialization part in a Writeable implementation of a struct. | |
/// Implements the TLVs serialization part in a [`Writeable`] implementation of a struct. |
lightning/src/util/ser_macros.rs
Outdated
} | ||
last_seen = Some($type); | ||
)* | ||
} | ||
} } | ||
} | ||
|
||
macro_rules! get_varint_length_prefixed_tlv_length { | ||
/// Adds the length of the serialized field to a LengthCalculatingWriter. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Adds the length of the serialized field to a LengthCalculatingWriter. | |
/// Adds the length of the serialized field to a [`LengthCalculatingWriter`]. |
lightning/src/util/ser_macros.rs
Outdated
@@ -78,32 +90,38 @@ macro_rules! get_varint_length_prefixed_tlv_length { | |||
}; | |||
} | |||
|
|||
macro_rules! encode_varint_length_prefixed_tlv { | |||
/// See the documentation of write_tlv_fields!(). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// See the documentation of write_tlv_fields!(). | |
/// See the documentation of [`write_tlv_fields`]. |
lightning/src/util/ser_macros.rs
Outdated
/// Implements the TLVs deserialization part in a Readable implementation of a struct. | ||
/// | ||
/// `$decode_custom_tlv` is a closure that may be optionally provided to handle custom message types. | ||
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// If it is provided, it will be called with the custom type and the `FixedLengthReader` containing | |
/// If it is provided, it will be called with the custom type and the [`FixedLengthReader`] containing |
Yes please, I spend hours overthinking what would be the best way to write a comment 😞 |
For the
For
|
Sadly we've had a number of PRs that touched serialization macros so this needs rebase now :( |
b5bdfa9
to
32b419c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Generally looks good, just a number of doc nits.
lightning/src/ln/msgs.rs
Outdated
@@ -822,7 +822,7 @@ pub struct CommitmentUpdate { | |||
|
|||
/// Messages could have optional fields to use with extended features | |||
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but | |
/// As we wish to serialize these differently from `Option<T>`s (`Option`s get a tag byte, but |
lightning/src/ln/msgs.rs
Outdated
@@ -822,7 +822,7 @@ pub struct CommitmentUpdate { | |||
|
|||
/// Messages could have optional fields to use with extended features | |||
/// As we wish to serialize these differently from Option<T>s (Options get a tag byte, but | |||
/// OptionalFeild simply gets Present if there are enough bytes to read into it), we have a | |||
/// OptionalField simply gets Present if there are enough bytes to read into it), we have a |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// OptionalField simply gets Present if there are enough bytes to read into it), we have a | |
/// [`OptionalField`] simply gets `Present` if there are enough bytes to read into it), we have a |
lightning/src/util/ser.rs
Outdated
read: R, | ||
bytes_read: u64, | ||
total_bytes: u64, | ||
} | ||
impl<R: Read> FixedLengthReader<R> { | ||
/// Returns a new FixedLengthReader. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Returns a new FixedLengthReader. | |
/// Returns a new [`FixedLengthReader`]. |
lightning/src/util/ser.rs
Outdated
@@ -94,21 +94,24 @@ impl Writer for LengthCalculatingWriter { | |||
|
|||
/// Essentially std::io::Take but a bit simpler and with a method to walk the underlying stream |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Essentially std::io::Take but a bit simpler and with a method to walk the underlying stream | |
/// Essentially [`std::io::Take`] but a bit simpler and with a method to walk the underlying stream |
lightning/src/util/ser.rs
Outdated
@@ -146,11 +149,13 @@ impl<R: Read> LengthRead for FixedLengthReader<R> { | |||
|
|||
/// A Read which tracks whether any bytes have been read at all. This allows us to distinguish |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// A Read which tracks whether any bytes have been read at all. This allows us to distinguish | |
/// A [`Read`] implementation which tracks whether any bytes have been read at all. This allows us to distinguish |
lightning/src/util/ser.rs
Outdated
pub have_read: bool, | ||
} | ||
impl<R: Read> ReadTrackingReader<R> { | ||
/// Returns a new ReadTrackingReader. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Returns a new ReadTrackingReader. | |
/// Returns a new [`ReadTrackingReader`]. |
lightning/src/util/ser_macros.rs
Outdated
@@ -7,17 +7,24 @@ | |||
// You may not use this file except in accordance with one or both of these | |||
// licenses. | |||
|
|||
macro_rules! encode_tlv { | |||
//! Some macros that implement Readable/Writeable traits for lightning messages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
//! Some macros that implement Readable/Writeable traits for lightning messages. | |
//! Some macros that implement [`Readable`]/[`Writeable`] traits for lightning messages. |
lightning/src/util/ser_macros.rs
Outdated
@@ -254,9 +376,9 @@ macro_rules! decode_tlv_stream_range { | |||
}, | |||
_ => {}, | |||
} | |||
// As we read types, make sure we hit every required type: | |||
// As we read types, make sure we hit every required type between last_seen_type and typ: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// As we read types, make sure we hit every required type between last_seen_type and typ: | |
// As we read types, make sure we hit every required type `between last_seen_type` and `typ`: |
lightning/src/util/ser_macros.rs
Outdated
@@ -350,12 +472,14 @@ macro_rules! impl_writeable { | |||
/// object. | |||
/// $min_version_that_can_read_this is the minimum reader version which can understand this | |||
/// serialized object. Previous versions will simply err with a | |||
/// DecodeError::UnknownVersion. | |||
/// [`DecodeError::UnknownVersion`]. | |||
/// | |||
/// Updates to either $this_version or $min_version_that_can_read_this should be included in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Updates to either $this_version or $min_version_that_can_read_this should be included in | |
/// Updates to either `$this_version` or `$min_version_that_can_read_this` should be included in |
lightning/src/util/ser_macros.rs
Outdated
/// serialization logic for this object. This is compared against the | ||
/// $min_version_that_can_read_this added by write_ver_prefix!(). | ||
/// $min_version_that_can_read_this added by [`write_ver_prefix`]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// $min_version_that_can_read_this added by [`write_ver_prefix`]. | |
/// `$min_version_that_can_read_this` added by [`write_ver_prefix`]. |
Looks like this needs a trivial rebase, any desire to pick it back up this year? |
1f1e432
to
6e3ddac
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks basically good to go from my side, can you squash the fixup commits so that the PR is only a few freestanding commits where later commits don't fix things done in previous commits. https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md#squashing-commits is a good guide for it and we generally follow Bitcoin Core contributing guidelines on git.
lightning/src/util/ser.rs
Outdated
read: R, | ||
bytes_read: u64, | ||
total_bytes: u64, | ||
} | ||
impl<R: Read> FixedLengthReader<R> { | ||
/// Returns a new [`FixedLengthReader`]. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: here and the two changes below - tabs not spaces :)
macro_rules! check_encoded_tlv_order { | ||
/// Panics if the last seen TLV type is not numerically less than the TLV type currently being checked. | ||
/// This is exported for use by other exported macros, do not use directly. | ||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's a number of the dont-use macros that are missing #[doc(hidden)]
.
/// | ||
/// This is the preferred method of adding new fields that old nodes can ignore and still function | ||
/// correctly. | ||
/// | ||
/// [`DecodeError::UnknownRequiredFeature`]: crate::ln::msgs::DecodeError::UnknownRequiredFeature | ||
#[macro_export] | ||
macro_rules! write_tlv_fields { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should mention that this "writes out a length-prefixed TLV stream"
@@ -396,11 +431,12 @@ macro_rules! init_tlv_field_var { | |||
/// If $fieldty is `option`, then $field is optional field. | |||
/// if $fieldty is `vec_type`, then $field is a Vec, which needs to have its individual elements | |||
/// serialized. | |||
#[macro_export] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough. It'd be nice to add an example for the docs here.
I don't really know why GitHub auto removes one review request when I add another :(. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, feel free to squash fix-up commits.
Every exported macro needed to have all the macros used inside it: 1- to be exported as well. 2- be called from the `$crate` namespace so it works in other crates. Some structs in `lightning::util::ser` needed to be made public as they were used inside the exported macros. Use the macros like this: ```Rust lightning::impl_writeable_tlv_based!(...) ```
Types must be unique and monotonically increasing (using < instead of <=)
266a95d
to
0acd5d3
Compare
0.0.114 - Mar 3, 2023 - "Faster Async BOLT12 Retries" API Updates =========== * `InvoicePayer` has been removed and its features moved directly into `ChannelManager`. As such it now requires a simplified `Router` and supports `send_payment_with_retry` (and friends). `ChannelManager::retry_payment` was removed in favor of the automated retries. Invoice payment utilities in `lightning-invoice` now call the new code (lightningdevkit#1812, lightningdevkit#1916, lightningdevkit#1929, lightningdevkit#2007, etc). * `Sign`/`BaseSign` has been renamed `ChannelSigner`, with `EcdsaChannelSigner` split out in anticipation of future schnorr/taproot support (lightningdevkit#1967). * The catch-all `KeysInterface` was split into `EntropySource`, `NodeSigner`, and `SignerProvider`. `KeysManager` implements all three (lightningdevkit#1910, lightningdevkit#1930). * `KeysInterface::get_node_secret` is now `KeysManager::get_node_secret_key` and is no longer required for external signers (lightningdevkit#1951, lightningdevkit#2070). * A `lightning-transaction-sync` crate has been added which implements keeping LDK in sync with the chain via an esplora server (lightningdevkit#1870). Note that it can only be used on nodes that *never* ran a previous version of LDK. * `Score` is updated in `BackgroundProcessor` instead of via `Router` (lightningdevkit#1996). * `ChainAccess::get_utxo` (now `UtxoAccess`) can now be resolved async (lightningdevkit#1980). * BOLT12 `Offer`, `InvoiceRequest`, `Invoice` and `Refund` structs as well as associated builders have been added. Such invoices cannot yet be paid due to missing support for blinded path payments (lightningdevkit#1927, lightningdevkit#1908, lightningdevkit#1926). * A `lightning-custom-message` crate has been added to make combining multiple custom messages into one enum/handler easier (lightningdevkit#1832). * `Event::PaymentPathFailure` is now generated for failure to send an HTLC over the first hop on our local channel (lightningdevkit#2014, lightningdevkit#2043). * `lightning-net-tokio` no longer requires an `Arc` on `PeerManager` (lightningdevkit#1968). * `ChannelManager::list_recent_payments` was added (lightningdevkit#1873). * `lightning-background-processor` `std` is now optional in async mode (lightningdevkit#1962). * `create_phantom_invoice` can now be used in `no-std` (lightningdevkit#1985). * The required final CLTV delta on inbound payments is now configurable (lightningdevkit#1878) * bitcoind RPC error code and message are now surfaced in `block-sync` (lightningdevkit#2057). * Get `historical_estimated_channel_liquidity_probabilities` was added (lightningdevkit#1961). * `ChannelManager::fail_htlc_backwards_with_reason` was added (lightningdevkit#1948). * Macros which implement serialization using TLVs or straight writing of struct fields are now public (lightningdevkit#1823, lightningdevkit#1976, lightningdevkit#1977). Backwards Compatibility ======================= * Any inbound payments with a custom final CLTV delta will be rejected by LDK if you downgrade prior to receipt (lightningdevkit#1878). * `Event::PaymentPathFailed::network_update` will always be `None` if an 0.0.114-generated event is read by a prior version of LDK (lightningdevkit#2043). * `Event::PaymentPathFailed::all_paths_removed` will always be false if an 0.0.114-generated event is read by a prior version of LDK. Users who rely on it to determine payment retries should migrate to `Event::PaymentFailed`, in a separate release prior to upgrading to LDK 0.0.114 if downgrading is supported (lightningdevkit#2043). Performance Improvements ======================== * Channel data is now stored per-peer and channel updates across multiple peers can be operated on simultaneously (lightningdevkit#1507). * Routefinding is roughly 1.5x faster (lightningdevkit#1799). * Deserializing a `NetworkGraph` is roughly 6x faster (lightningdevkit#2016). * Memory usage for a `NetworkGraph` has been reduced substantially (lightningdevkit#2040). * `KeysInterface::get_secure_random_bytes` is roughly 200x faster (lightningdevkit#1974). Bug Fixes ========= * Fixed a bug where a delay in processing a `PaymentSent` event longer than the time taken to persist a `ChannelMonitor` update, when occurring immediately prior to a crash, may result in the `PaymentSent` event being lost (lightningdevkit#2048). * Fixed spurious rejections of rapid gossip sync data when the graph has been updated by other means between gossip syncs (lightningdevkit#2046). * Fixed a panic in `KeysManager` when the high bit of `starting_time_nanos` is set (lightningdevkit#1935). * Resolved an issue where the `ChannelManager::get_persistable_update_future` future would fail to wake until a second notification occurs (lightningdevkit#2064). * Resolved a memory leak when using `ChannelManager::send_probe` (lightningdevkit#2037). * Fixed a deadlock on some platforms at least when using async `ChannelMonitor` updating (lightningdevkit#2006). * Removed debug-only assertions which were reachable in threaded code (lightningdevkit#1964). * In some cases when payment sending fails on our local channel retries no longer take the same path and thus never succeed (lightningdevkit#2014). * Retries for spontaneous payments have been fixed (lightningdevkit#2002). * Return an `Err` if `lightning-persister` fails to read the directory listing rather than panicing (lightningdevkit#1943). * `peer_disconnected` will now never be called without `peer_connected` (lightningdevkit#2035) Security ======== 0.0.114 fixes several denial-of-service vulnerabilities which are reachable from untrusted input from channel counterparties or in deployments accepting inbound connections or channels. It also fixes a denial-of-service vulnerability in rare cases in the route finding logic. * The number of pending un-funded channels as well as peers without funded channels is now limited to avoid denial of service (lightningdevkit#1988). * A second `channel_ready` message received immediately after the first could lead to a spurious panic (lightningdevkit#2071). This issue was introduced with 0conf support in LDK 0.0.107. * A division-by-zero issue was fixed in the `ProbabilisticScorer` if the amount being sent (including previous-hop fees) is equal to a channel's capacity while walking the graph (lightningdevkit#2072). The division-by-zero was introduced with historical data tracking in LDK 0.0.112. In total, this release features 130 files changed, 21457 insertions, 10113 deletions in 343 commits from 18 authors, in alphabetical order: * Alec Chen * Allan Douglas R. de Oliveira * Andrei * Arik Sosman * Daniel Granhão * Duncan Dean * Elias Rohrer * Jeffrey Czyz * John Cantrell * Kurtsley * Matt Corallo * Max Fang * Omer Yacine * Valentine Wallace * Viktor Tigerström * Wilmer Paulino * benthecarman * jurvis
Every exported macro needed to have all the macros used inside it:
1- be exported as well.
2- be called from the
$crate
namespace so it works in other crates.Some structs in
lightning::util::ser
needed to be made public as they were used inside the exported macros.Usage:
Couldn't cleanly rebase the old PR so here is this one instead.
cc/ @tnull
Closes #1539