Skip to main content

linera_rpc/
lib.rs

1// Copyright (c) Zefchain Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4//! This module provides network abstractions and the data schemas for remote procedure
5//! calls (RPCs) in the Linera protocol.
6
7// `tracing::instrument` is not compatible with this nightly Clippy lint
8#![allow(unknown_lints)]
9
10pub mod config;
11pub mod node_provider;
12
13pub mod client;
14
15mod cross_chain_message_queue;
16mod message;
17#[cfg(feature = "opentelemetry")]
18pub mod propagation;
19#[cfg(with_simple_network)]
20pub mod simple;
21
22pub mod grpc;
23
24pub use client::Client;
25pub use message::RpcMessage;
26pub use node_provider::{NodeOptions, NodeProvider, DEFAULT_MAX_BACKOFF};
27
28#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
29#[cfg_attr(with_testing, derive(Eq, PartialEq))]
30pub struct HandleLiteCertRequest<'a> {
31    pub certificate: linera_chain::types::LiteCertificate<'a>,
32    pub wait_for_outgoing_messages: bool,
33}
34
35#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
36#[cfg_attr(with_testing, derive(Eq, PartialEq))]
37pub struct HandleConfirmedCertificateRequest {
38    pub certificate: linera_chain::types::ConfirmedBlockCertificate,
39    pub wait_for_outgoing_messages: bool,
40}
41
42#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
43#[cfg_attr(with_testing, derive(Eq, PartialEq))]
44pub struct HandleValidatedCertificateRequest {
45    pub certificate: linera_chain::types::ValidatedBlockCertificate,
46}
47
48#[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
49#[cfg_attr(with_testing, derive(Eq, PartialEq))]
50pub struct HandleTimeoutCertificateRequest {
51    pub certificate: linera_chain::types::TimeoutCertificate,
52}
53
54pub const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("file_descriptor_set");
55
56#[cfg(not(target_arch = "wasm32"))]
57pub const CERT_PEM: &str = include_str!(concat!(env!("OUT_DIR"), "/self_signed_cert.pem"));
58#[cfg(not(target_arch = "wasm32"))]
59pub const KEY_PEM: &str = include_str!(concat!(env!("OUT_DIR"), "/private_key.pem"));
60
61/// Computes a Full Jitter delay for exponential backoff.
62///
63/// Uses the AWS-recommended formula: `sleep = random(0, min(cap, base * 2^attempt))`.
64/// Reference: <https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/>
65pub(crate) fn full_jitter_delay(
66    base_delay: std::time::Duration,
67    attempt: u32,
68    max_backoff: std::time::Duration,
69) -> std::time::Duration {
70    use rand::Rng as _;
71    let exponential_delay =
72        base_delay.saturating_mul(1u32.checked_shl(attempt).unwrap_or(u32::MAX));
73    let capped_delay = exponential_delay.min(max_backoff);
74    std::time::Duration::from_millis(
75        rand::thread_rng().gen_range(0..=capped_delay.as_millis() as u64),
76    )
77}