Photon: the Indexer for ZK Compression on Solana
January 22, 2025 ยท View on GitHub
Photon is the core indexer for ZK Compression on the Solana blockchain. It offers rapid indexing capabilities, snapshot support, and flexible database options to cater to local and production deployments.
๐ Quick Start
Installation
- Install dependencies:
sudo apt install -y build-essential pkg-config libssl-dev
- Install
photon-indexer:
cargo install photon-indexer
๐ง Usage
Basic Usage
- Run Photon with default settings against localnet:
photon
Configuration
- Connect to Devnet:
photon --rpc-url=https://api.devnet.solana.com
- Use gRPC for block streaming (requires GRPC_X_TOKEN env variable):
photon --rpc-url=https://api.devnet.solana.com --grpc-url=<grpc_url>
- Use a local Postgres database:
photon --db-url=postgres://postgres@localhost/postgres
- Specify a start slot:
photon --start-slot=123
- For more advanced options:
photon --help
๐ธ Snapshots
Photon supports snapshots for quick bootstrapping.
Loading a Snapshot
- Download a snapshot:
photon-snapshot-loader --snapshot-dir=~/snapshot --snapshot-server-url=https://photon-devnet-snapshot.helius-rpc.com
- Run Photon with the snapshot:
photon --snapshot-dir=~/snapshot --rpc-url=https://api.devnet.solana.com --db-url=postgres://postgres@localhost/postgres
Creating Snapshots
Create a local snapshot:
photon-snapshotter --snapshot-dir=~/snapshot
Store snapshots in an R2 bucket:
photon-snapshotter --r2-bucket=some-bucket --r2-prefix=prefix
Note: Set R2_ACCESS_KEY, R2_ACCOUNT_ID, and R2_SECRET_KEY environment variables when using R2.
๐๏ธ Database Management
Photon supports both Postgres and SQLite. By default, it uses an in-memory SQLite database.
To use a custom database:
export DATABASE_URL="postgres://postgres@localhost/postgres"
# Set ENABLE_CUSTOM_INDEXES=true to enable program-specific indexes.
photon-migration up
photon --db-url=$DATABASE_URL
๐๏ธ Custom Indexes
Developers can easily add program-specific indexes through a custom migration to speed up queries. See src/migration/migrations/custom/custom20252201_000001_init.rs for an example. In the future, we will add tooling to make it easier to add custom indexes. For now, contact the Helius team to add custom indexes.
๐ ๏ธ Local Development
Running Tests
- Set up the environment:
export MAINNET_RPC_URL=https://api.mainnet-beta.solana.com
export DEVNET_RPC_URL=https://api.devnet.solana.com
export TEST_DATABASE_URL="postgres://postgres@localhost/postgres"
- Install additional tools:
npm install -g @apidevtools/swagger-cli
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
docker run -p 3001:3001 docker.io/pmantica1/light-prover:1
- Run tests:
cargo test
Note: All migrations run automatically during tests for both Postgres and SQLite.
Database Model Generation
cargo install sea-orm-cli --version 0.10.6
sea-orm-cli generate entity -o src/dao/generated
API Documentation
Generate OpenAPI schemas:
cargo run --bin=photon-openapi
๐ฌ Support
For support or queries, please open an issue on Github or contact the Helius discord.