Skip to content

Commit 88c4acc

Browse files
committed
fix import
1 parent 865bcad commit 88c4acc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1732
-852
lines changed

.github/workflows/build.yml

+9
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,15 @@ jobs:
180180
cargo check --no-default-features --features=futures --release
181181
cargo doc --release
182182
RUSTDOCFLAGS="--cfg=anchors" cargo doc --release
183+
- name: Run cargo check for Taproot build.
184+
run: |
185+
cargo check --release
186+
cargo check --no-default-features --features=no-std --release
187+
cargo check --no-default-features --features=futures --release
188+
cargo doc --release
189+
env:
190+
RUSTFLAGS: '--cfg=anchors --cfg=taproot'
191+
RUSTDOCFLAGS: '--cfg=anchors --cfg=taproot'
183192

184193
fuzz:
185194
runs-on: ubuntu-latest

ci/ci-tests.sh

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ set -eox pipefail
44
RUSTC_MINOR_VERSION=$(rustc --version | awk '{ split($2,a,"."); print a[2] }')
55
HOST_PLATFORM="$(rustc --version --verbose | grep "host:" | awk '{ print $2 }')"
66

7-
# Tokio MSRV on versions newer than 1.14 is rustc 1.49
7+
# Tokio MSRV on versions 1.17 through 1.26 is rustc 1.49. Above 1.26 MSRV is 1.56.
88
[ "$RUSTC_MINOR_VERSION" -lt 49 ] && cargo update -p tokio --precise "1.14.0" --verbose
9+
[[ "$RUSTC_MINOR_VERSION" -gt 48 && "$RUSTC_MINOR_VERSION" -lt 56 ]] && cargo update -p tokio --precise "1.26.0" --verbose
910
[ "$LDK_COVERAGE_BUILD" != "" ] && export RUSTFLAGS="-C link-dead-code"
1011

1112
export RUST_BACKTRACE=1
@@ -93,4 +94,6 @@ fi
9394
echo -e "\n\nTest anchors builds"
9495
pushd lightning
9596
RUSTFLAGS="$RUSTFLAGS --cfg=anchors" cargo test --verbose --color always -p lightning
97+
echo -e "\n\nTest Taproot builds"
98+
RUSTFLAGS="$RUSTFLAGS --cfg=anchors --cfg=taproot" cargo test --verbose --color always -p lightning
9699
popd

fuzz/src/chanmon_consistency.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ use lightning::chain::channelmonitor::{ChannelMonitor, MonitorEvent};
3838
use lightning::chain::transaction::OutPoint;
3939
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
4040
use lightning::chain::keysinterface::{KeyMaterial, InMemorySigner, Recipient, EntropySource, NodeSigner, SignerProvider};
41+
use lightning::events;
42+
use lightning::events::MessageSendEventsProvider;
4143
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
4244
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs, PaymentId};
4345
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4446
use lightning::ln::msgs::{self, CommitmentUpdate, ChannelMessageHandler, DecodeError, UpdateAddHTLC, Init};
4547
use lightning::ln::script::ShutdownScript;
4648
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
4749
use lightning::util::errors::APIError;
48-
use lightning::util::events;
4950
use lightning::util::logger::Logger;
5051
use lightning::util::config::UserConfig;
51-
use lightning::util::events::MessageSendEventsProvider;
5252
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
5353
use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router};
5454

@@ -526,7 +526,18 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
526526
msg.clone()
527527
} else { panic!("Wrong event type"); }
528528
};
529+
let events = $dest.get_and_clear_pending_events();
530+
assert_eq!(events.len(), 1);
531+
if let events::Event::ChannelPending{ ref counterparty_node_id, .. } = events[0] {
532+
assert_eq!(counterparty_node_id, &$source.get_our_node_id());
533+
} else { panic!("Wrong event type"); }
534+
529535
$source.handle_funding_signed(&$dest.get_our_node_id(), &funding_signed);
536+
let events = $source.get_and_clear_pending_events();
537+
assert_eq!(events.len(), 1);
538+
if let events::Event::ChannelPending{ ref counterparty_node_id, .. } = events[0] {
539+
assert_eq!(counterparty_node_id, &$dest.get_our_node_id());
540+
} else { panic!("Wrong event type"); }
530541

531542
funding_output
532543
} }

fuzz/src/full_stack.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget,
3535
use lightning::chain::chainmonitor;
3636
use lightning::chain::transaction::OutPoint;
3737
use lightning::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, EntropySource, NodeSigner, SignerProvider};
38+
use lightning::events::Event;
3839
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
3940
use lightning::ln::channelmanager::{ChainParameters, ChannelDetails, ChannelManager, PaymentId};
4041
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
@@ -46,7 +47,6 @@ use lightning::routing::router::{find_route, InFlightHtlcs, PaymentParameters, R
4647
use lightning::routing::scoring::FixedPenaltyScorer;
4748
use lightning::util::config::UserConfig;
4849
use lightning::util::errors::APIError;
49-
use lightning::util::events::Event;
5050
use lightning::util::enforcing_trait_impls::{EnforcingSigner, EnforcementState};
5151
use lightning::util::logger::Logger;
5252
use lightning::util::ser::{Readable, Writeable};

lightning-background-processor/Cargo.toml

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ all-features = true
1414
rustdoc-args = ["--cfg", "docsrs"]
1515

1616
[features]
17-
futures = [ "futures-util" ]
17+
futures = [ ]
1818
std = ["lightning/std", "lightning-rapid-gossip-sync/std"]
1919

2020
default = ["std"]
@@ -23,7 +23,6 @@ default = ["std"]
2323
bitcoin = { version = "0.29.0", default-features = false }
2424
lightning = { version = "0.0.114", path = "../lightning", default-features = false }
2525
lightning-rapid-gossip-sync = { version = "0.0.114", path = "../lightning-rapid-gossip-sync", default-features = false }
26-
futures-util = { version = "0.3", default-features = false, features = ["async-await-macro"], optional = true }
2726

2827
[dev-dependencies]
2928
lightning = { version = "0.0.114", path = "../lightning", features = ["_test_utils"] }

lightning-background-processor/src/lib.rs

+99-20
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#![deny(private_intra_doc_links)]
88

99
#![deny(missing_docs)]
10-
#![deny(unsafe_code)]
10+
#![cfg_attr(not(feature = "futures"), deny(unsafe_code))]
1111

1212
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
1313

@@ -26,18 +26,20 @@ use lightning::chain;
2626
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
2727
use lightning::chain::chainmonitor::{ChainMonitor, Persist};
2828
use lightning::chain::keysinterface::{EntropySource, NodeSigner, SignerProvider};
29+
use lightning::events::{Event, PathFailure};
30+
#[cfg(feature = "std")]
31+
use lightning::events::{EventHandler, EventsProvider};
2932
use lightning::ln::channelmanager::ChannelManager;
3033
use lightning::ln::msgs::{ChannelMessageHandler, OnionMessageHandler, RoutingMessageHandler};
3134
use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor};
3235
use lightning::routing::gossip::{NetworkGraph, P2PGossipSync};
3336
use lightning::routing::utxo::UtxoLookup;
3437
use lightning::routing::router::Router;
3538
use lightning::routing::scoring::{Score, WriteableScore};
36-
use lightning::util::events::{Event, PathFailure};
37-
#[cfg(feature = "std")]
38-
use lightning::util::events::{EventHandler, EventsProvider};
3939
use lightning::util::logger::Logger;
4040
use lightning::util::persist::Persister;
41+
#[cfg(feature = "std")]
42+
use lightning::util::wakers::Sleeper;
4143
use lightning_rapid_gossip_sync::RapidGossipSync;
4244

4345
use core::ops::Deref;
@@ -52,8 +54,6 @@ use std::thread::{self, JoinHandle};
5254
#[cfg(feature = "std")]
5355
use std::time::Instant;
5456

55-
#[cfg(feature = "futures")]
56-
use futures_util::{select_biased, future::FutureExt, task};
5757
#[cfg(not(feature = "std"))]
5858
use alloc::vec::Vec;
5959

@@ -80,7 +80,7 @@ use alloc::vec::Vec;
8080
/// unilateral chain closure fees are at risk.
8181
///
8282
/// [`ChannelMonitor`]: lightning::chain::channelmonitor::ChannelMonitor
83-
/// [`Event`]: lightning::util::events::Event
83+
/// [`Event`]: lightning::events::Event
8484
#[cfg(feature = "std")]
8585
#[must_use = "BackgroundProcessor will immediately stop on drop. It should be stored until shutdown."]
8686
pub struct BackgroundProcessor {
@@ -116,6 +116,13 @@ const FIRST_NETWORK_PRUNE_TIMER: u64 = 60;
116116
#[cfg(test)]
117117
const FIRST_NETWORK_PRUNE_TIMER: u64 = 1;
118118

119+
#[cfg(feature = "futures")]
120+
/// core::cmp::min is not currently const, so we define a trivial (and equivalent) replacement
121+
const fn min_u64(a: u64, b: u64) -> u64 { if a < b { a } else { b } }
122+
#[cfg(feature = "futures")]
123+
const FASTEST_TIMER: u64 = min_u64(min_u64(FRESHNESS_TIMER, PING_TIMER),
124+
min_u64(SCORER_PERSIST_TIMER, FIRST_NETWORK_PRUNE_TIMER));
125+
119126
/// Either [`P2PGossipSync`] or [`RapidGossipSync`].
120127
pub enum GossipSync<
121128
P: Deref<Target = P2PGossipSync<G, U, L>>,
@@ -258,7 +265,8 @@ macro_rules! define_run_body {
258265
($persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
259266
$channel_manager: ident, $process_channel_manager_events: expr,
260267
$gossip_sync: ident, $peer_manager: ident, $logger: ident, $scorer: ident,
261-
$loop_exit_check: expr, $await: expr, $get_timer: expr, $timer_elapsed: expr)
268+
$loop_exit_check: expr, $await: expr, $get_timer: expr, $timer_elapsed: expr,
269+
$check_slow_await: expr)
262270
=> { {
263271
log_trace!($logger, "Calling ChannelManager's timer_tick_occurred on startup");
264272
$channel_manager.timer_tick_occurred();
@@ -288,9 +296,10 @@ macro_rules! define_run_body {
288296

289297
// We wait up to 100ms, but track how long it takes to detect being put to sleep,
290298
// see `await_start`'s use below.
291-
let mut await_start = $get_timer(1);
299+
let mut await_start = None;
300+
if $check_slow_await { await_start = Some($get_timer(1)); }
292301
let updates_available = $await;
293-
let await_slow = $timer_elapsed(&mut await_start, 1);
302+
let await_slow = if $check_slow_await { $timer_elapsed(&mut await_start.unwrap(), 1) } else { false };
294303

295304
if updates_available {
296305
log_trace!($logger, "Persisting ChannelManager...");
@@ -384,6 +393,59 @@ macro_rules! define_run_body {
384393
} }
385394
}
386395

396+
#[cfg(feature = "futures")]
397+
pub(crate) mod futures_util {
398+
use core::future::Future;
399+
use core::task::{Poll, Waker, RawWaker, RawWakerVTable};
400+
use core::pin::Pin;
401+
use core::marker::Unpin;
402+
pub(crate) struct Selector<
403+
A: Future<Output=()> + Unpin, B: Future<Output=()> + Unpin, C: Future<Output=bool> + Unpin
404+
> {
405+
pub a: A,
406+
pub b: B,
407+
pub c: C,
408+
}
409+
pub(crate) enum SelectorOutput {
410+
A, B, C(bool),
411+
}
412+
413+
impl<
414+
A: Future<Output=()> + Unpin, B: Future<Output=()> + Unpin, C: Future<Output=bool> + Unpin
415+
> Future for Selector<A, B, C> {
416+
type Output = SelectorOutput;
417+
fn poll(mut self: Pin<&mut Self>, ctx: &mut core::task::Context<'_>) -> Poll<SelectorOutput> {
418+
match Pin::new(&mut self.a).poll(ctx) {
419+
Poll::Ready(()) => { return Poll::Ready(SelectorOutput::A); },
420+
Poll::Pending => {},
421+
}
422+
match Pin::new(&mut self.b).poll(ctx) {
423+
Poll::Ready(()) => { return Poll::Ready(SelectorOutput::B); },
424+
Poll::Pending => {},
425+
}
426+
match Pin::new(&mut self.c).poll(ctx) {
427+
Poll::Ready(res) => { return Poll::Ready(SelectorOutput::C(res)); },
428+
Poll::Pending => {},
429+
}
430+
Poll::Pending
431+
}
432+
}
433+
434+
// If we want to poll a future without an async context to figure out if it has completed or
435+
// not without awaiting, we need a Waker, which needs a vtable...we fill it with dummy values
436+
// but sadly there's a good bit of boilerplate here.
437+
fn dummy_waker_clone(_: *const ()) -> RawWaker { RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE) }
438+
fn dummy_waker_action(_: *const ()) { }
439+
440+
const DUMMY_WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
441+
dummy_waker_clone, dummy_waker_action, dummy_waker_action, dummy_waker_action);
442+
pub(crate) fn dummy_waker() -> Waker { unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &DUMMY_WAKER_VTABLE)) } }
443+
}
444+
#[cfg(feature = "futures")]
445+
use futures_util::{Selector, SelectorOutput, dummy_waker};
446+
#[cfg(feature = "futures")]
447+
use core::task;
448+
387449
/// Processes background events in a future.
388450
///
389451
/// `sleeper` should return a future which completes in the given amount of time and returns a
@@ -396,6 +458,11 @@ macro_rules! define_run_body {
396458
/// feature, doing so will skip calling [`NetworkGraph::remove_stale_channels_and_tracking`],
397459
/// you should call [`NetworkGraph::remove_stale_channels_and_tracking_with_time`] regularly
398460
/// manually instead.
461+
///
462+
/// The `mobile_interruptable_platform` flag should be set if we're currently running on a
463+
/// mobile device, where we may need to check for interruption of the application regularly. If you
464+
/// are unsure, you should set the flag, as the performance impact of it is minimal unless there
465+
/// are hundreds or thousands of simultaneous process calls running.
399466
#[cfg(feature = "futures")]
400467
pub async fn process_events_async<
401468
'a,
@@ -431,7 +498,7 @@ pub async fn process_events_async<
431498
>(
432499
persister: PS, event_handler: EventHandler, chain_monitor: M, channel_manager: CM,
433500
gossip_sync: GossipSync<PGS, RGS, G, UL, L>, peer_manager: PM, logger: L, scorer: Option<S>,
434-
sleeper: Sleeper,
501+
sleeper: Sleeper, mobile_interruptable_platform: bool,
435502
) -> Result<(), lightning::io::Error>
436503
where
437504
UL::Target: 'static + UtxoLookup,
@@ -470,19 +537,25 @@ where
470537
chain_monitor, chain_monitor.process_pending_events_async(async_event_handler).await,
471538
channel_manager, channel_manager.process_pending_events_async(async_event_handler).await,
472539
gossip_sync, peer_manager, logger, scorer, should_break, {
473-
select_biased! {
474-
_ = channel_manager.get_persistable_update_future().fuse() => true,
475-
exit = sleeper(Duration::from_millis(100)).fuse() => {
540+
let fut = Selector {
541+
a: channel_manager.get_persistable_update_future(),
542+
b: chain_monitor.get_update_future(),
543+
c: sleeper(if mobile_interruptable_platform { Duration::from_millis(100) } else { Duration::from_secs(FASTEST_TIMER) }),
544+
};
545+
match fut.await {
546+
SelectorOutput::A => true,
547+
SelectorOutput::B => false,
548+
SelectorOutput::C(exit) => {
476549
should_break = exit;
477550
false
478551
}
479552
}
480553
}, |t| sleeper(Duration::from_secs(t)),
481554
|fut: &mut SleepFuture, _| {
482-
let mut waker = task::noop_waker();
555+
let mut waker = dummy_waker();
483556
let mut ctx = task::Context::from_waker(&mut waker);
484557
core::pin::Pin::new(fut).poll(&mut ctx).is_ready()
485-
})
558+
}, mobile_interruptable_platform)
486559
}
487560

488561
#[cfg(feature = "std")]
@@ -597,8 +670,11 @@ impl BackgroundProcessor {
597670
define_run_body!(persister, chain_monitor, chain_monitor.process_pending_events(&event_handler),
598671
channel_manager, channel_manager.process_pending_events(&event_handler),
599672
gossip_sync, peer_manager, logger, scorer, stop_thread.load(Ordering::Acquire),
600-
channel_manager.await_persistable_update_timeout(Duration::from_millis(100)),
601-
|_| Instant::now(), |time: &Instant, dur| time.elapsed().as_secs() > dur)
673+
Sleeper::from_two_futures(
674+
channel_manager.get_persistable_update_future(),
675+
chain_monitor.get_update_future()
676+
).wait_timeout(Duration::from_millis(100)),
677+
|_| Instant::now(), |time: &Instant, dur| time.elapsed().as_secs() > dur, false)
602678
});
603679
Self { stop_thread: stop_thread_clone, thread_handle: Some(handle) }
604680
}
@@ -663,7 +739,8 @@ mod tests {
663739
use lightning::chain::channelmonitor::ANTI_REORG_DELAY;
664740
use lightning::chain::keysinterface::{InMemorySigner, KeysManager};
665741
use lightning::chain::transaction::OutPoint;
666-
use lightning::get_event_msg;
742+
use lightning::events::{Event, PathFailure, MessageSendEventsProvider, MessageSendEvent};
743+
use lightning::{get_event_msg, get_event};
667744
use lightning::ln::PaymentHash;
668745
use lightning::ln::channelmanager;
669746
use lightning::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChainParameters, MIN_CLTV_EXPIRY_DELTA, PaymentId};
@@ -674,7 +751,6 @@ mod tests {
674751
use lightning::routing::router::{DefaultRouter, RouteHop};
675752
use lightning::routing::scoring::{ChannelUsage, Score};
676753
use lightning::util::config::UserConfig;
677-
use lightning::util::events::{Event, PathFailure, MessageSendEventsProvider, MessageSendEvent};
678754
use lightning::util::ser::Writeable;
679755
use lightning::util::test_utils;
680756
use lightning::util::persist::KVStorePersister;
@@ -1012,7 +1088,10 @@ mod tests {
10121088
($node_a: expr, $node_b: expr, $temporary_channel_id: expr, $tx: expr) => {{
10131089
$node_a.node.funding_transaction_generated(&$temporary_channel_id, &$node_b.node.get_our_node_id(), $tx.clone()).unwrap();
10141090
$node_b.node.handle_funding_created(&$node_a.node.get_our_node_id(), &get_event_msg!($node_a, MessageSendEvent::SendFundingCreated, $node_b.node.get_our_node_id()));
1091+
get_event!($node_b, Event::ChannelPending);
1092+
10151093
$node_a.node.handle_funding_signed(&$node_b.node.get_our_node_id(), &get_event_msg!($node_b, MessageSendEvent::SendFundingSigned, $node_a.node.get_our_node_id()));
1094+
get_event!($node_a, Event::ChannelPending);
10161095
}}
10171096
}
10181097

lightning-block-sync/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ rpc-client = [ "serde_json", "chunked_transfer" ]
2020
[dependencies]
2121
bitcoin = "0.29.0"
2222
lightning = { version = "0.0.114", path = "../lightning" }
23-
futures-util = { version = "0.3" }
2423
tokio = { version = "1.0", features = [ "io-util", "net", "time" ], optional = true }
2524
serde_json = { version = "1.0", optional = true }
2625
chunked_transfer = { version = "1.4", optional = true }

lightning-block-sync/src/rest.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,34 @@ use crate::http::{BinaryResponse, HttpEndpoint, HttpClient, JsonResponse};
77
use bitcoin::hash_types::BlockHash;
88
use bitcoin::hashes::hex::ToHex;
99

10-
use futures_util::lock::Mutex;
11-
1210
use std::convert::TryFrom;
1311
use std::convert::TryInto;
12+
use std::sync::Mutex;
1413

1514
/// A simple REST client for requesting resources using HTTP `GET`.
1615
pub struct RestClient {
1716
endpoint: HttpEndpoint,
18-
client: Mutex<HttpClient>,
17+
client: Mutex<Option<HttpClient>>,
1918
}
2019

2120
impl RestClient {
2221
/// Creates a new REST client connected to the given endpoint.
2322
///
2423
/// The endpoint should contain the REST path component (e.g., http://127.0.0.1:8332/rest).
2524
pub fn new(endpoint: HttpEndpoint) -> std::io::Result<Self> {
26-
let client = Mutex::new(HttpClient::connect(&endpoint)?);
27-
Ok(Self { endpoint, client })
25+
Ok(Self { endpoint, client: Mutex::new(None) })
2826
}
2927

3028
/// Requests a resource encoded in `F` format and interpreted as type `T`.
3129
pub async fn request_resource<F, T>(&self, resource_path: &str) -> std::io::Result<T>
3230
where F: TryFrom<Vec<u8>, Error = std::io::Error> + TryInto<T, Error = std::io::Error> {
3331
let host = format!("{}:{}", self.endpoint.host(), self.endpoint.port());
3432
let uri = format!("{}/{}", self.endpoint.path().trim_end_matches("/"), resource_path);
35-
self.client.lock().await.get::<F>(&uri, &host).await?.try_into()
33+
let mut client = if let Some(client) = self.client.lock().unwrap().take() { client }
34+
else { HttpClient::connect(&self.endpoint)? };
35+
let res = client.get::<F>(&uri, &host).await?.try_into();
36+
*self.client.lock().unwrap() = Some(client);
37+
res
3638
}
3739
}
3840

0 commit comments

Comments
 (0)