Skip to content

Commit 3a3a19b

Browse files
authored
Merge pull request #539 from rustaceanrob/26-2-25-feature-best-block
Add `chain_tip` method to `Requester`
2 parents 4c89b3d + c6555fd commit 3a3a19b

4 files changed

Lines changed: 30 additions & 1 deletion

File tree

src/client.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use tokio::sync::oneshot;
66

77
use crate::chain::block_subsidy;
88
use crate::messages::ClientRequest;
9-
use crate::{Event, Info, TrustedPeer, Warning};
9+
use crate::{Event, HeaderCheckpoint, Info, TrustedPeer, Warning};
1010

1111
use super::{error::ClientError, messages::ClientMessage};
1212
use super::{error::FetchBlockError, IndexedBlock};
@@ -188,6 +188,20 @@ impl Requester {
188188
.map_err(|_| ClientError::SendError)
189189
}
190190

191+
/// The height and hash of the block in the chain of most work.
192+
///
193+
/// # Errors
194+
///
195+
/// If the node has stopped running.
196+
pub async fn chain_tip(&self) -> Result<HeaderCheckpoint, ClientError> {
197+
let (tx, rx) = tokio::sync::oneshot::channel::<HeaderCheckpoint>();
198+
let request = ClientRequest::new((), tx);
199+
self.ntx
200+
.send(ClientMessage::BestBlock(request))
201+
.map_err(|_| ClientError::SendError)?;
202+
rx.await.map_err(|_| ClientError::RecvError)
203+
}
204+
191205
/// Check if the node is running.
192206
pub fn is_running(&self) -> bool {
193207
self.ntx.send(ClientMessage::NoOp).is_ok()

src/messages.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ pub(crate) enum ClientMessage {
145145
Rescan,
146146
/// Explicitly request a block from the node.
147147
GetBlock(ClientRequest<BlockHash, Result<IndexedBlock, FetchBlockError>>),
148+
/// Get the chain tip.
149+
BestBlock(ClientRequest<(), HeaderCheckpoint>),
148150
/// Add another known peer to connect to.
149151
AddPeer(TrustedPeer),
150152
/// Request the broadcast minimum fee rate.

src/node.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,17 @@ impl Node {
236236
self.block_queue.add(request);
237237
}
238238
},
239+
ClientMessage::BestBlock(request) => {
240+
let (_, oneshot) = request.into_values();
241+
let block_tree = &self.chain.header_chain;
242+
let hash = block_tree.tip_hash();
243+
let height = block_tree.height();
244+
let checkpoint = HeaderCheckpoint::new(height, hash);
245+
let send_result = oneshot.send(checkpoint);
246+
if send_result.is_err() {
247+
self.dialog.send_warning(Warning::ChannelDropped);
248+
};
249+
},
239250
ClientMessage::AddPeer(peer) => {
240251
self.peer_map.add_trusted_peer(peer);
241252
},

tests/core.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ async fn various_client_methods() {
248248
tokio::task::spawn(async move { print_logs(info_rx, warn_rx).await });
249249
sync_assert(&best, &mut channel).await;
250250
let _ = requester.broadcast_min_feerate().await.unwrap();
251+
let cp = requester.chain_tip().await.unwrap();
252+
assert_eq!(cp.hash, best);
251253
assert!(requester.is_running());
252254
requester.shutdown().unwrap();
253255
rpc.stop().unwrap();

0 commit comments

Comments
 (0)