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