lite-rpc/README.md

123 lines
7.0 KiB
Markdown

# Lite RPC For Solana Blockchain
Submitting a [transaction](https://docs.solana.com/terminology#transaction) to
be executed on the solana blockchain, requires the client to identify the next
few leaders based on the
[leader schedule](https://docs.solana.com/terminology#leader-schedule), look up
their peering information in gossip and connect to them via the
[quic protocol](https://en.wikipedia.org/wiki/QUIC). In order to simplify the
process so it can be triggered from a web browser, most applications run full
[validators](https://docs.solana.com/terminology#validator) that forward the
transactions according to the protocol on behalf of the web browser. Running
full solana [validators](https://docs.solana.com/terminology#validator) 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](https://en.wikipedia.org/wiki/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](quic-forward-proxy/README.md)).
### 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*
```bash
$ cargo run --release
```
*to know about command line options*
```bash
$ cargo run --release -- --help
```
## Test and Bench
*Make sure both `solana-validator` and `lite-rpc` is running*
*test*
```bash
$ cargo test
```
*bench*
```bash
$ 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`<br/>`GRPC_ADDR2`<br/>`GRPC_ADDR3`<br/>`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`<br/>`GRPC_X_TOKEN2`<br/>`GRPC_X_TOKEN3`<br/>`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](https://github.com/blockworks-foundation/lite-rpc/issues/199) - you might
need to explicitly disable GSO (Generic Segmenatin Offload) see
```DISABLE_GSO=true```
#### Example
```bash
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
```
## License & Copyright
Copyright (c) 2022 Blockworks Foundation
Licensed under the **[AGPL-3.0 license](LICENSE)**