Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions CHANGELOG.md
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,69 @@
# 0.0.103 - 2021-11-02

## API Updates
* This release is almost entirely focused on a new API in the
`lightning-invoice` crate - the `InvoicePayer`. `InvoicePayer` is a
struct which takes a reference to a `ChannelManager` and a `NetworkGraph`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should replace NetworkGraph with Router. I almost wonder if we should move the Router trait to the lightning crate.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably, IMO.

and retries payments as paths fail. It limits retries to a configurable
number, but is not serialized to disk and may retry additional times across
a serialization/load. In order to learn about failed payments, it must
receive `Event`s directly from the `ChannelManager`, wrapping a
user-provided `EventHandler` which it provides all unhandled events to
(#1059).
* `get_route` has been renamed `find_route` (#1059) and now takes a `Payee`
Comment thread
TheBlueMatt marked this conversation as resolved.
struct in replacement of a number of its long list of arguments (#1134).
`Payee` is further stored in the `Route` object returned and provided in the
`RouteParameters` contained in `Event::PaymentPathFailed` (#1059).
* `ChannelMonitor`s must now be persisted after calls which provide new block
Comment thread
TheBlueMatt marked this conversation as resolved.
data, prior to `MonitorEvent`s being passed back to `ChannelManager` for
processing. If you are using a `ChainMonitor` this is handled for you.
The `Persist` API has been updated to `Option`ally take the
`ChannelMonitorUpdate` as persistence events that result from chain data no
longer have a corresponding update (#1108).
* `routing::Score` now has a `payment_path_failed` method which it can use to
learn which channels often fail payments. It is automatically called by
`InvoicePayer` for failed payment paths (#1144).
* The default `Scorer` implementation is now a type alias to a type generic
across different clocks and supports serialization to persist scoring data
across restarts (#1146).
* `Event::PaymentSent` now includes the full fee which was spent across all
Comment thread
TheBlueMatt marked this conversation as resolved.
payment paths which were fulfilled or pending when the payment was fulfilled
(#1142).
* `NetGraphMsgHandler` now takes a `Deref` to the `NetworkGraph`, allowing for
shared references to the graph data to make serialization and references to
the graph data in the `InvoicePayer`'s `Router` simpler (#1149).
* `routing::Score::channel_penalty_msat` has been updated to provide the
`NodeId` of both the source and destination nodes of a channel (#1133).
Comment thread
TheBlueMatt marked this conversation as resolved.

## Bug Fixes
* Delay disconnecting peers if we receive messages from them even if it takes
a while to receive a pong from them. Further, avoid sending too many gossip
messages between pings to ensure we should always receive pongs in a timely
manner. Together, these should significantly reduce instances of us failing
to remain connected to a peer during initial gossip sync (#1137).
* If a payment is sent, creating an outbound HTLC and sending it to our
counterparty (implying the `ChannelMonitor` was persisted on disk), but the
`ChannelManager` was not persisted prior to shutdown/crash, no
`Event::PaymentPathFailed` event will be generated if the HTLC is eventually
failed on chain (#1104).
Comment on lines +44 to +48

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems to be worded in terms of what the bug was whereas the previous bullet is worded in terms of how the bug was fixed.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, we've generally worded in terms of the bug, but I wasn't really sure how to word the previous in terms of the bug and still have it be clear. I'll try, though.


## Serialization Compatibility
* All above new Events/fields are ignored by prior clients. All above new
Events/fields are not present when reading objects serialized by prior
versions of the library.
* Payments for which a `Route` was generated using a previous version or for
which the payment was originally sent by a previous version of the library
will not be retried by an `InvoicePayer`.

This release was singularly focused and some contributions by third parties
were delayed.
In total, this release features 38 files changed, 4414 insertions, and 969
deletions in 71 commits from 2 authors, in alphabetical order:

* Jeffrey Czyz
* Matt Corallo


# 0.0.102 - 2021-10-18

## API Updates
Expand Down
10 changes: 5 additions & 5 deletions lightning-background-processor/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-background-processor"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace <vwallace@protonmail.com>"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -11,9 +11,9 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.102", path = "../lightning-persister" }
lightning = { version = "0.0.103", path = "../lightning", features = ["allow_wallclock_use"] }
lightning-persister = { version = "0.0.103", path = "../lightning-persister" }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.10.0", path = "../lightning-invoice" }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
lightning-invoice = { version = "0.11.0", path = "../lightning-invoice" }
4 changes: 2 additions & 2 deletions lightning-block-sync/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-block-sync"
version = "0.0.102"
version = "0.0.103"
authors = ["Jeffrey Czyz", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "http://github.com/rust-bitcoin/rust-lightning"
Expand All@@ -15,7 +15,7 @@ rpc-client = [ "serde", "serde_json", "chunked_transfer" ]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
Expand Down
6 changes: 3 additions & 3 deletions lightning-invoice/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
[package]
name = "lightning-invoice"
description = "Data structures to parse and serialize BOLT11 lightning invoices"
version = "0.10.0"
version = "0.11.0"
authors = ["Sebastian Geisler <sgeisler@wh2.tu-dresden.de>"]
documentation = "https://docs.rs/lightning-invoice/"
license = "MIT OR Apache-2.0"
Expand All@@ -10,11 +10,11 @@ readme = "README.md"

[dependencies]
bech32 = "0.8"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
secp256k1 = { version = "0.20", features = ["recovery"] }
num-traits = "0.2.8"
bitcoin_hashes = "0.10"

[dev-dependencies]
hex = "0.3"
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
4 changes: 2 additions & 2 deletions lightning-net-tokio/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-net-tokio"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -12,7 +12,7 @@ edition = "2018"

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
tokio = { version = "1.0", features = [ "io-util", "macros", "rt", "sync", "net", "time" ] }

[dev-dependencies]
Expand Down
6 changes: 3 additions & 3 deletions lightning-persister/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning-persister"
version = "0.0.102"
version = "0.0.103"
authors = ["Valentine Wallace", "Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand All@@ -13,11 +13,11 @@ unstable = ["lightning/unstable"]

[dependencies]
bitcoin = "0.27"
lightning = { version = "0.0.102", path = "../lightning" }
lightning = { version = "0.0.103", path = "../lightning" }
libc = "0.2"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3", features = ["winbase"] }

[dev-dependencies]
lightning = { version = "0.0.102", path = "../lightning", features = ["_test_utils"] }
lightning = { version = "0.0.103", path = "../lightning", features = ["_test_utils"] }
2 changes: 1 addition & 1 deletion lightning/Cargo.toml
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
[package]
name = "lightning"
version = "0.0.102"
version = "0.0.103"
authors = ["Matt Corallo"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/rust-bitcoin/rust-lightning/"
Expand Down
28 changes: 21 additions & 7 deletions lightning/src/routing/scorer.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -275,34 +275,48 @@ impl<T: Time> Writeable for ScorerUsingTime<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.params.write(w)?;
self.channel_failures.write(w)
self.channel_failures.write(w)?;
write_tlv_fields!(w, {});
Ok(())
}
}

impl<T: Time> Readable for ScorerUsingTime<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
Ok(Self {
let res = Ok(Self {
params: Readable::read(r)?,
channel_failures: Readable::read(r)?,
})
});
read_tlv_fields!(r, {});
res
}
}

impl<T: Time> Writeable for ChannelFailure<T> {
#[inline]
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
self.undecayed_penalty_msat.write(w)?;
(T::duration_since_epoch() - self.last_failed.elapsed()).write(w)
let duration_since_epoch = T::duration_since_epoch() - self.last_failed.elapsed();
write_tlv_fields!(w, {
(0, self.undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(())
}
}

impl<T: Time> Readable for ChannelFailure<T> {
#[inline]
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
let mut undecayed_penalty_msat = 0;
let mut duration_since_epoch = Duration::from_secs(0);
read_tlv_fields!(r, {
(0, undecayed_penalty_msat, required),
(2, duration_since_epoch, required),
});
Ok(Self {
undecayed_penalty_msat: Readable::read(r)?,
last_failed: T::now() - (T::duration_since_epoch() - Readable::read(r)?),
undecayed_penalty_msat,
last_failed: T::now() - (T::duration_since_epoch() - duration_since_epoch),
})
}
}