Skip to content

Commit c139ac8

Browse files
committed
Allow to verify channel updates without applying them
We introduce a new `NetworkGraph::verify_channel_update` method that allows to check whether an update would be applied by `update_channel`.
1 parent 5485d1b commit c139ac8

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

lightning/src/routing/gossip.rs

+24-7
Original file line numberDiff line numberDiff line change
@@ -1845,14 +1845,14 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
18451845
/// For an already known (from announcement) channel, update info about one of the directions
18461846
/// of the channel.
18471847
///
1848-
/// You probably don't want to call this directly, instead relying on a P2PGossipSync's
1849-
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
1848+
/// You probably don't want to call this directly, instead relying on a [`P2PGossipSync`]'s
1849+
/// [`RoutingMessageHandler`] implementation to call it indirectly. This may be useful to accept
18501850
/// routing messages from a source using a protocol other than the lightning P2P protocol.
18511851
///
18521852
/// If built with `no-std`, any updates with a timestamp more than two weeks in the past or
18531853
/// materially in the future will be rejected.
18541854
pub fn update_channel(&self, msg: &msgs::ChannelUpdate) -> Result<(), LightningError> {
1855-
self.update_channel_intern(&msg.contents, Some(&msg), Some(&msg.signature))
1855+
self.update_channel_internal(&msg.contents, Some(&msg), Some(&msg.signature), false)
18561856
}
18571857

18581858
/// For an already known (from announcement) channel, update info about one of the directions
@@ -1862,10 +1862,23 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
18621862
/// If built with `no-std`, any updates with a timestamp more than two weeks in the past or
18631863
/// materially in the future will be rejected.
18641864
pub fn update_channel_unsigned(&self, msg: &msgs::UnsignedChannelUpdate) -> Result<(), LightningError> {
1865-
self.update_channel_intern(msg, None, None)
1865+
self.update_channel_internal(msg, None, None, false)
18661866
}
18671867

1868-
fn update_channel_intern(&self, msg: &msgs::UnsignedChannelUpdate, full_msg: Option<&msgs::ChannelUpdate>, sig: Option<&secp256k1::ecdsa::Signature>) -> Result<(), LightningError> {
1868+
/// For an already known (from announcement) channel, verify the given [`ChannelUpdate`].
1869+
///
1870+
/// This checks whether the update currently is applicable by [`Self::update_channel`].
1871+
///
1872+
/// If built with `no-std`, any updates with a timestamp more than two weeks in the past or
1873+
/// materially in the future will be rejected.
1874+
pub fn verify_channel_update(&self, msg: &msgs::ChannelUpdate) -> Result<(), LightningError> {
1875+
self.update_channel_internal(&msg.contents, Some(&msg), Some(&msg.signature), true)
1876+
}
1877+
1878+
fn update_channel_internal(&self, msg: &msgs::UnsignedChannelUpdate,
1879+
full_msg: Option<&msgs::ChannelUpdate>, sig: Option<&secp256k1::ecdsa::Signature>,
1880+
only_verify: bool) -> Result<(), LightningError>
1881+
{
18691882
let chan_enabled = msg.flags & (1 << 1) != (1 << 1);
18701883

18711884
if msg.chain_hash != self.genesis_hash {
@@ -1961,7 +1974,9 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
19611974
action: ErrorAction::IgnoreAndLog(Level::Debug)
19621975
})?, "channel_update");
19631976
}
1964-
channel.two_to_one = get_new_channel_info!();
1977+
if !only_verify {
1978+
channel.two_to_one = get_new_channel_info!();
1979+
}
19651980
} else {
19661981
check_update_latest!(channel.one_to_two);
19671982
if let Some(sig) = sig {
@@ -1970,7 +1985,9 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
19701985
action: ErrorAction::IgnoreAndLog(Level::Debug)
19711986
})?, "channel_update");
19721987
}
1973-
channel.one_to_two = get_new_channel_info!();
1988+
if !only_verify {
1989+
channel.one_to_two = get_new_channel_info!();
1990+
}
19741991
}
19751992
}
19761993
}

0 commit comments

Comments
 (0)