Go to file
Godmode Galactus 65f80db089
updating some more env variables to compile in linux
2025-01-23 05:34:15 +01:00
.github/workflows remove nightly clippy+fmt config (#419) 2024-12-11 13:04:21 +01:00
accounts replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
accounts-on-demand replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
address-lookup-tables replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
bench use nightly without explicit version for clippy (#418) 2024-12-10 22:14:25 +01:00
benches Fix some typos (#260) 2024-01-02 20:52:46 +05:30
benchrunner-service LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
blockstore LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
cd Fixing rpc account fly config 2024-03-26 15:37:20 +01:00
ci
cluster-endpoints replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
core replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
docs first impl for RPC get_vote_accounts 2024-01-03 10:20:18 +01:00
examples/custom-tpu-send-transactions fixing openssl compilation issues for linux 2025-01-10 14:11:46 +01:00
lite-rpc fixing openssl compilation issues for linux 2025-01-10 14:11:46 +01:00
migrations fix table name 2024-06-27 11:55:08 +02:00
prioritization_fees use nightly without explicit version for clippy (#418) 2024-12-10 22:14:25 +01:00
quic-forward-proxy replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
quic-forward-proxy-integration-test replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
services Adding more logs to test quiche 2025-01-13 14:43:36 +01:00
stake_vote LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
tests Adding tests for versioned transactions (#406) 2024-07-01 16:12:06 +02:00
util replacing quinn with quiche for sending tranasctions to the solana cluster 2025-01-10 11:47:52 +01:00
.dockerignore
.env.example validate LITE_RPC_HTTP_ADDR in config (#331) 2024-02-21 14:17:14 +01:00
.gitignore LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
CHANGELOG.md Updating the change logs 2024-01-29 13:20:32 +01:00
Cargo.lock fixing openssl compilation issues for linux 2025-01-10 14:11:46 +01:00
Cargo.toml fixing openssl compilation issues for linux 2025-01-10 14:11:46 +01:00
Dockerfile LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
Dockerfile-benchrunner LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
LICENSE
README.md updating some more env variables to compile in linux 2025-01-23 05:34:15 +01:00
config.example.json reducing yellowstone dependencies (#389) 2024-04-17 15:11:51 +02:00
jest.config.js
openssl-legacy.cnf benchrunner service (#363) 2024-03-26 13:41:46 +01:00
package-lock.json
package.json
run_clippy_fmt.sh remove nightly clippy+fmt config (#419) 2024-12-11 13:04:21 +01:00
rust-toolchain.toml LiteRPC 0.3.0: Update solana 2.0.16, Yellowstone 2.0.0 (#417) 2024-12-10 17:50:26 +01:00
test.bash
tsconfig.json
yarn.lock Gixing websocket subscriptions for signatures and slot (#403) 2024-06-28 17:00:45 +02:00

README.md

Lite RPC For Solana Blockchain

Submitting a transaction to be executed on the solana blockchain, requires the client to identify the next few leaders based on the leader schedule, look up their peering information in gossip and connect to them via the quic protocol. In order to simplify the process so it can be triggered from a web browser, most applications run full validators that forward the transactions according to the protocol on behalf of the web browser. Running full solana validators is incredibly resource intensive (>256GB RAM), the goal of this project would be to create a specialized micro-service that allows to deploy this logic quickly and allows horizontal scalability with commodity vms. Optionally the Lite RCP micro-services can be configured to send the transactions to a complementary QUIC forward proxy instead of the solana tpu (details).

Confirmation strategies

  1. Subscribe to new blocks using websockets (deprecated)
  2. Polling blocks over RPC.(Current)
  3. Subscribe blocks over gRPC. (Current)
  4. Listening to gossip protocol. (Future roadmap)

Executing

run using

$ cargo run --release

to know about command line options

$ cargo run --release -- --help

Test and Bench

Make sure both solana-validator and lite-rpc is running

test

$ cargo test

bench

$ cd bench
$ RUST_LOG=info cargo run -- --help

Find a new file named metrics.csv in the project root.

Deployment

Environment Variables

Thank you for providing the default values. Here's the updated table with the default values for the environment variables based on the additional information:

Environment Variable Purpose Required? Default Value
RPC_ADDR Address for the RPC node Replaces default if set http://0.0.0.0:8899 (from DEFAULT_RPC_ADDR)
WS_ADDR WebSocket address for the RPC node Replaces default if set ws://0.0.0.0:8900 (from DEFAULT_WS_ADDR)
LITE_RPC_HTTP_ADDR HTTP address for the lite RPC node Replaces default if set http://0.0.0.0:8890 (from DEFAULT_LITE_RPC_ADDR)
LITE_RPC_WS_ADDR WebSocket address for the lite RPC node Replaces default if set [::]:8891 (from Config::default_lite_rpc_ws_addr)
FANOUT_SIZE Configuration for the fanout size Replaces default if set 18 (from DEFAULT_FANOUT_SIZE)
IDENTITY Identity keypair Optional, replaces default if set None
PROMETHEUS_ADDR Address for Prometheus monitoring Replaces default if set None specified in provided defaults
MAX_RETRIES Maximum number of retries per transaction Replaces default if set 40 (from MAX_RETRIES)
RETRY_TIMEOUT Timeout for transaction retries in seconds Replaces default if set 3 (from DEFAULT_RETRY_TIMEOUT)
QUIC_PROXY_ADDR Address for QUIC proxy Optional None
USE_GRPC Flag to enable or disable gRPC Enables gRPC if set false
GRPC_ADDR
GRPC_ADDR2
GRPC_ADDR3
GRPC_ADDR4
gRPC address(es); will be multiplexed Replaces default if set http://127.0.0.0:10000 (from DEFAULT_GRPC_ADDR)
GRPC_X_TOKEN
GRPC_X_TOKEN2
GRPC_X_TOKEN3
GRPC_X_TOKEN4
Token for gRPC authentication Optional None
PG_* Various environment variables for Postgres configuration Depends on Postgres usage Based on PostgresSessionConfig::new_from_env()

Postgres

lite-rpc implements an optional postgres service that can write to postgres database tables as defined in ./migrations. This can be enabled by either setting the environment variable PG_ENABLED to true or by passing the -p option when launching the executable. If postgres is enabled then the optional environment variables shown above must be set.

Metrics

Various Prometheus metrics are exposed on localhost:9091/metrics which can be used to monitor the health of the application in production.

Deployment on fly.io

While lite-rpc can be deployed on any cloud infrastructure, it has been tested extensively on https://fly.io. An example configuration has been provided in fly.toml. We recommend a dedicated-cpu-2x VM with at least 4GB RAM.

The app listens by default on ports 8890 and 8891 for HTTP and Websockets respectively. Since only a subset of RPC methods are implemented, we recommend serving unimplemented methods from a full RPC node using a reverse proxy such as HAProxy or Kong. Alternatively, you can connect directly to lite-rpc using a web3.js Connection object that is only used for sending and confirming transactions.

Troubleshooting: if you encounter issues with QUIC sendmsg check this - you might need to explicitly disable GSO (Generic Segmenatin Offload) see DISABLE_GSO=true

Configuring openssl for quiche

# Get OpenSSL sources from Ubuntu 21.10 Impish
wget https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/openssl/1.1.1l-1ubuntu1.6/openssl_1.1.1l.orig.tar.gz

# Extract files
tar -xvf openssl_1.1.1l.orig.tar.gz

# build openssl 1.1.1l
cd /tmp/openssl-1.1.1l/
./config shared enable-ec_nistp_64_gcc_128 -Wl,-rpath=/usr/local/ssl/lib --prefix=/usr/local/ssl
make -j 4
make test && sudo make install

# refresh cache
hash -r

# check version
/usr/local/ssl/bin/openssl <<< version

Compiling with openssl1.1

export OPENSSL_LIB_DIR=/usr/local/ssl/lib
export OPENSSL_INCLUDE_DIR=/usr/local/ssl/include
export OPENSSL_DIR=/usr/local/ssl
export LIBSSL_DIR=/usr/local/ssl/lib
export INCLUDE_DIR=/usr/local/ssl/include
export OPENSSL_NO_PKG_CONFIG=1

Example

fly apps create my-lite-rpc
fly secrets set -a my-lite-rpc RPC_URL=... WS_URL=...   # See above table for env options
fly scale vm dedicated-cpu-2x --memory 4096 -a my-lite-rpc
fly deploy -c cd/lite-rpc.toml -a my-lite-rpc --remote-only # To just launch lite-rpc
fly deploy -c cd/lite-rpc.toml -a my-lite-rpc --remote-only # To launch lite-rpc with proxy mode

Copyright (c) 2022 Blockworks Foundation

Licensed under the AGPL-3.0 license