reth_enclave/
lib.rs

1//! This crate provides functionalities related to the Enclave service.
2//! It includes modules and API for interacting with wallet operations and HTTP clients.
3
4use std::net::{IpAddr, TcpListener};
5
6use derive_more::Display;
7pub use seismic_enclave::{
8    client::{
9        rpc::{BuildableServer, SyncEnclaveApiClient},
10        EnclaveClient, MockEnclaveServer, ENCLAVE_DEFAULT_ENDPOINT_IP,
11        ENCLAVE_DEFAULT_ENDPOINT_PORT,
12    },
13    SchnorrkelKeypair,
14};
15use tracing::error;
16
17/// Custom error type for reth error handling.
18#[derive(Clone, Debug, Eq, PartialEq, Display)]
19pub enum EnclaveError {
20    /// enclave encryption fails
21    EncryptionError,
22    /// enclave decryption fails
23    DecryptionError,
24    /// Ephemeral keypair generation fails
25    EphRngKeypairGenerationError(String),
26    /// Custom error.
27    Custom(&'static str),
28}
29
30/// Get the test enclave endpoint
31fn get_random_port() -> u16 {
32    TcpListener::bind("127.0.0.1:0") // 0 means OS assigns a free port
33        .expect("Failed to bind to a port")
34        .local_addr()
35        .unwrap()
36        .port()
37}
38
39/// Start the mock enclave server
40pub async fn start_mock_enclave_server_random_port() -> EnclaveClient {
41    let port = get_random_port();
42    tokio::spawn(async move {
43        start_blocking_mock_enclave_server(ENCLAVE_DEFAULT_ENDPOINT_IP, port).await;
44    });
45    EnclaveClient::builder()
46        .ip(ENCLAVE_DEFAULT_ENDPOINT_IP.to_string())
47        .port(port)
48        .build()
49        .expect("Failed to build enclave client")
50}
51
52/// Start the mock enclave server
53pub async fn start_default_mock_enclave_server() -> EnclaveClient {
54    let client = EnclaveClient::builder()
55        .ip(ENCLAVE_DEFAULT_ENDPOINT_IP.to_string())
56        .port(ENCLAVE_DEFAULT_ENDPOINT_PORT)
57        .build()
58        .expect("Failed to build enclave client");
59    tokio::spawn(async move {
60        start_blocking_mock_enclave_server(
61            ENCLAVE_DEFAULT_ENDPOINT_IP,
62            ENCLAVE_DEFAULT_ENDPOINT_PORT,
63        )
64        .await;
65    });
66    client
67}
68
69/// Start the mock enclave server
70pub async fn start_blocking_mock_enclave_server(addr: IpAddr, port: u16) {
71    let enclave_server = MockEnclaveServer::new((addr, port));
72
73    let addr = enclave_server.addr();
74
75    match enclave_server.start().await {
76        Ok(handle) => {
77            handle.stopped().await;
78        }
79        Err(err) => {
80            let err = eyre::eyre!("Failed to start mock enclave server at {}: {}", addr, err);
81            error!("{:?}", err);
82        }
83    }
84}