Quickstart
The Succinct Prover Network enables seamless proof generation with zero setup, providing instant access to GPU clusters for the lowest latency and cost.
Step 1: Requester Key Setup
The Succinct Network uses Secp256k1 key pairs for authentication, similar to Ethereum wallets. You can either generate a new key pair or use an existing one. Foundry and Metamask are two easy ways to generate a new key pair.
For simplicity, we will refer to this key pair as your requester account.
- Foundry
- Metamask
Prerequisites
Install the Foundry CLI if you haven't already:
curl -L https://foundry.paradigm.xyz | bash
foundryup
Create a New Key Pair
You can generate a new Secp256k1 key pair by running:
cast wallet new
This command will give you an output similar to this:
Successfully created new keypair.
Address: 0x7594cF2161dC345B300A5Ac87e2473c7bF25D9fe
Private key: <PRIVATE_KEY>
Create a New Key Pair
If you don't have Metamask, download it and follow the setup process. This will create a new key pair for you.
If you already have Metamask installed, you can create a new key pair by following Metamask's account creation instructions.
Export the Private Key
To export your private key from Metamask:
- Make sure you have selected the account you want to use with the prover network.
- Follow Metamask's private key export instructions.
- Copy the displayed private key.
In Step 4, you will set the NETWORK_PRIVATE_KEY
environment variable to this private key value.
Step 2: Acquire PROVE
When requesting proofs on the Succinct Prover Network, you must pay for them with the PROVE token using your requester account.
You can get PROVE on Ethereum Mainnet through any of the options listed in the Token Overview.
Step 3: Deposit PROVE
Next, you need to make sure your requester account has a sufficient PROVE balance in the Succinct Prover Network to pay for proofs.
Option 1: Deposit with Requester Account
If you used your requester account to get PROVE on Ethereum Mainnet, you can connect it to the Succinct Explorer and deposit PROVE into the Succinct Prover Network.
To deposit:
- Go to the Account page on the explorer.
- Click on the "Deposit" button and confirm the amount of PROVE to deposit.
- Complete the deposit by confirming the permit and transaction signatures in your wallet:
After the deposit is indexed (which can take up to 5 minutes), you will see your network PROVE balance update in the Account page, and are now ready to request proofs on the network.
Option 2: Deposit and Transfer to Requester Account
If you have PROVE on an account that is not your requester account, you can leverage the network's "Transfer" functionality:
- First, deposit PROVE with your account that has PROVE on Ethereum Mainnet (similar to Option 1).
- Wait for the deposit to be indexed (which can take up to 5 minutes).
- Click the "Transfer" button. Then, enter the address of your requester account and the amount of PROVE to transfer.
Once the transfer completes, you're ready to request proofs on the network.
Step 4: Request Proofs
To request proofs on the Succinct Prover Network:
- Make sure to use sp1-sdk >=
v5.2.1
- Set the following two environment variables:
SP1_PROVER=network
NETWORK_PRIVATE_KEY=<PRIVATE_KEY>
(from Step 1)
- Disable default features and enable the
network
feature onsp1-sdk
inscript/Cargo.toml
:
[dependencies]
sp1-sdk = { version = "...", default-features = false, features = ["network"] }
You're now ready to request proofs:
use sp1_sdk::{include_elf, utils, ProverClient, SP1ProofWithPublicValues, SP1Stdin};
/// The ELF we want to execute inside the zkVM.
const ELF: &[u8] = include_elf!("fibonacci-program");
fn main() {
// Create an input stream and write '500' to it.
let n = 1000u32;
// The input stream that the program will read from using `sp1_zkvm::io::read`. Note that the
// types of the elements in the input stream must match the types being read in the program.
let mut stdin = SP1Stdin::new();
stdin.write(&n);
// Create a `ProverClient` method.
let client = ProverClient::from_env();
// Generate the proof for the given program and input.
let (pk, _vk) = client.setup(ELF);
let _proof = client.prove(&pk, &stdin).compressed().run().unwrap();
}
The output should look something like this if you run the code above:
2025-08-03T04:33:46.055353Z INFO Registered program 0x1d6d196c1323d9411fa45a8f37268807343573f52a324c845f4aa26873310d63
2025-08-03T04:33:46.056304Z INFO execute: clk = 0 pc = 0x201d98
2025-08-03T04:33:46.058941Z INFO execute: gas: 1003634
2025-08-03T04:33:46.058953Z INFO execute: close time.busy=3.54ms time.idle=1.21µs
2025-08-03T04:33:46.544214Z INFO Requesting proof:
2025-08-03T04:33:46.544225Z INFO ├─ Strategy: Auction
2025-08-03T04:33:46.544227Z INFO ├─ Proof mode: Compressed
2025-08-03T04:33:46.544228Z INFO ├─ Circuit version: v5.0.0
2025-08-03T04:33:46.544229Z INFO ├─ Timeout: 300 seconds
2025-08-03T04:33:46.544231Z INFO ├─ Public values hash: 0xeb61af091de14d64211b5f413bbb0da5a66e3de8cec2cb754b1fc56f8b0b2189
2025-08-03T04:33:46.544233Z INFO ├─ Base fee: 200000000000000000 (0.2000 $PROVE)
2025-08-03T04:33:46.544234Z INFO ├─ Max price per bPGU: 2000000000000000000 (2.0000 $PROVE)
2025-08-03T04:33:46.544235Z INFO ├─ Minimum auction period: 0 seconds
2025-08-03T04:33:46.544236Z INFO ├─ Prover Whitelist: None
2025-08-03T04:33:46.544237Z INFO ├─ Cycle limit: 13528 cycles
2025-08-03T04:33:46.544238Z INFO └─ Gas limit: 1003634 PGUs
2025-08-03T04:33:48.471022Z INFO Created request 0x59f7cf1359d86f073cb6324bc6acb47a77bb33c459aeb21d5bce14fd2a3ee8e6 in transaction 0x91e392b0d615a1b90f760295125f5923c8f8cf65e7fa2ddf02c6245a7bb7d8c9
2025-08-03T04:33:48.471036Z INFO View request status at: https://explorer.sepolia.succinct.xyz/request/0x59f7cf1359d86f073cb6324bc6acb47a77bb33c459aeb21d5bce14fd2a3ee8e6
2025-08-03T04:34:00.941642Z INFO Proof request assigned, proving...
2025-08-03T04:35:24.197709Z Successfully generated proof!
View Proof Status
Monitor your proofs on the explorer. Each proof page shows:
- Current stage and status
- Cycle count used
- Verification key details
- Prover assignment information
Proof Request Configuration
In the above example, we used the compressed
proof mode, but you can specify any of the supported proof types based on your use case.
There are other configuration options, like auction parameters and timeouts, that use default values when not specified. Please see the Advanced Usage section for details on how to configure these parameters.
Support
Need help getting started? Join the Telegram for assistance with onboarding.