Skip to content
Back to skills

Requesting

DSecurity

Submit proof requests on the Boundless ZK proof marketplace. Covers wallet setup, CLI configuration, building or discovering guest programs, self-hosting via Cloudflare Quick Tunnels (no Pinata/S3 needed), submitting, and retrieving results. Use when a developer wants to request a ZK proof, submit a proof request, get started with Boundless, try Boundless, or learn the requestor workflow.

  • 195 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 12, 2026
blockchainpythonrustgobashawsgitapi

Works with

  • cli
  • api

Security analysis

D42/100
  • criticalPipes output to a shell interpreter
  • mediumUses curl or wget to download content
  • criticalDownloads and executes remote scripts — classic supply chain attack

Pro scans all 9 files and shows the line behind each finding

Scanned September 12, 2026

npx -y skills add boundless-xyz/boundless --skill requesting --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Requesting?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Requesting
[![Security: D — Skills Directory](https://www.skillsdirectory.com/api/skills/boundless-xyz-requesting/badge)](https://www.skillsdirectory.com/skills/boundless-xyz-requesting)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: requesting
description: >-
  Submit proof requests on the Boundless ZK proof marketplace. Covers wallet
  setup, CLI configuration, building or discovering guest programs, self-hosting
  via Cloudflare Quick Tunnels (no Pinata/S3 needed), submitting, and retrieving
  results. Use when a developer wants to request a ZK proof, submit a proof
  request, get started with Boundless, try Boundless, or learn the requestor
  workflow.
---

# Requesting Proofs on Boundless

Guide a developer through submitting a ZK proof request on the Boundless market — from wallet setup through fulfilled proof.

## Important: This Costs Real Money

Boundless runs on **Base Mainnet**. Every transaction uses real ETH on Base.

- **Gas fees**: ~$0.01–0.05 per transaction
- **Proof cost**: ~$0.10–0.50 depending on prover auction dynamics
- **Recommended starting deposit**: $1–5 worth of ETH on Base
- Use a **fresh wallet** — do not use a wallet holding significant funds

If they want to experiment without cost, point them to the [Boundless SDK examples](https://github.com/boundless-xyz/boundless/tree/main/examples) which can run against a local test environment.

## Two Paths

Ask the developer which applies:

| Path                           | When to use                                       | What happens                                                        |
| ------------------------------ | ------------------------------------------------- | ------------------------------------------------------------------- |
| **A — Bring your own program** | Developer has (or wants to build) a guest program | Build the guest, self-host the binary via Cloudflare tunnel, submit |
| **B — Just trying it out**     | Developer wants to see Boundless work end-to-end  | Discover a recently fulfilled request and replay it                 |

Both paths share the same setup (Phases 1–4) and submission flow (Phase 6+). They differ only in where the program comes from (Phase 5).

## Quick Command Reference

| Step                            | Command                                                                                                                      |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Check prerequisites             | `bash scripts/check-prerequisites.sh` (from this skill's directory)                                                          |
| Create wallet                   | `cast wallet new`                                                                                                            |
| Check balance                   | `cast balance <ADDRESS> --rpc-url https://mainnet.base.org`                                                                  |
| Install CLI                     | `cargo install --locked --git https://github.com/boundless-xyz/boundless boundless-cli --branch release-1.2 --bin boundless` |
| Configure                       | `boundless requestor setup`                                                                                                  |
| Deposit                         | `boundless requestor deposit 0.005`                                                                                          |
| Check deposit                   | `boundless requestor balance`                                                                                                |
| **Path A** — Self-host + submit | `bash scripts/self-host.sh ./program.bin ./input.bin --image-id <ID> --submit --wait`                                        |
| **Path B** — Discover programs  | `bash scripts/discover-programs.sh`                                                                                          |
| **Path B** — Build YAML         | `bash scripts/build-request-yaml.sh <URL> <IMAGE_ID> <HEX>`                                                                  |
| Submit (manual)                 | `boundless requestor submit-file request.yaml --no-preflight`                                                                |
| Check status                    | `boundless requestor status <REQUEST_ID>`                                                                                    |
| Get proof                       | `boundless requestor get-proof <REQUEST_ID>`                                                                                 |

For full CLI docs, see `references/cli-reference.md`.

## CRITICAL: Use `submit-file`, NOT `submit`

| Command                           | Preflight Behavior                                                                                     | Use           |
| --------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------- |
| `boundless requestor submit`      | **Always runs preflight** — spawns `r0vm` locally. Can hang 10+ minutes. **No `--no-preflight` flag.** | ❌ Do NOT use |
| `boundless requestor submit-file` | Has `--no-preflight` flag to skip local execution. Completes in seconds.                               | ✅ Use this   |

**Always use `submit-file` with `--no-preflight`.**

### Environment Variable: AWS_EC2_METADATA_DISABLED

Set `AWS_EC2_METADATA_DISABLED=true` on all `boundless` commands. Without this, the AWS SDK embedded in the CLI tries to contact the EC2 IMDS on startup, causing 2–4 second timeouts with warning spam on non-EC2 machines.

## Phase 1: Check Prerequisites

```bash
bash /path/to/requesting/scripts/check-prerequisites.sh
```

**Required tools:**

| Tool                    | Purpose                                     | Install                                                           |
| ----------------------- | ------------------------------------------- | ----------------------------------------------------------------- |
| Rust (`rustc`, `cargo`) | Building the Boundless CLI                  | `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \| sh` |
| Foundry (`cast`)        | Wallet management, chain interaction        | `curl -L https://foundry.paradigm.xyz \| bash && foundryup`       |
| `cloudflared`           | Cloudflare tunnel for self-hosting (Path A) | `brew install cloudflared`                                        |
| Python 3                | HTTP server, JSON parsing in scripts        | Usually pre-installed                                             |
| `curl`                  | Health checks                               | Usually pre-installed                                             |

**Optional (installed during walkthrough):**

| Tool          | Purpose                                           | Install                                                                                                                      |
| ------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| Boundless CLI | Submitting requests                               | `cargo install --locked --git https://github.com/boundless-xyz/boundless boundless-cli --branch release-1.2 --bin boundless` |
| `rzup`        | RISC Zero toolchain (Path A, if building a guest) | `curl -L https://risczero.com/install \| bash && rzup install`                                                               |

## Phase 2: Wallet Setup

The developer needs a funded wallet on Base.

**Ask the developer:** Do you already have a wallet with ETH on Base, or do you need to create one?

### Create a New Wallet

```bash
cast wallet new
```

Save the **address** and **private key** securely.

### Fund the Wallet

Options:

1. **Bridge from Ethereum mainnet**: [bridge.base.org](https://bridge.base.org)
2. **CEX withdrawal**: Withdraw ETH directly to Base from Coinbase, Binance, etc. (select Base network)
3. **Transfer from another wallet**

Confirm the balance:

```bash
cast balance <ADDRESS> --rpc-url https://mainnet.base.org
```

Minimum ~0.005 ETH recommended to start.

## Phase 3: Install & Configure CLI

### Install

```bash
cargo install --locked --git https://github.com/boundless-xyz/boundless \
  boundless-cli --branch release-1.2 --bin boundless
```

Verify: `boundless --version`

If install fails, see `references/troubleshooting.md`.

### Configure

Run the interactive setup wizard:

```bash
boundless requestor setup
```

The wizard prompts for:

1. **Network** — select Base Mainnet
2. **RPC URL** — `https://mainnet.base.org` (or Alchemy/Infura for better reliability)
3. **Private key** — from Phase 2
4. **Storage provider** — **skip this** (we self-host instead)

Verify: `boundless requestor config`

For non-interactive setup:

```bash
boundless requestor setup --change-network base-mainnet
boundless requestor setup --set-rpc-url "https://mainnet.base.org"
boundless requestor setup --set-private-key "0x<PRIVATE_KEY>"
```

## Phase 4: Deposit Funds

Deposit ETH into the Boundless Market contract (provers are paid from this balance):

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor deposit 0.005
```

Check the deposited balance:

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor balance
```

---

## Phase 5A: Bring Your Own Program (Self-Hosted)

Use this path when the developer has their own guest program (or wants to build one). Files are served via a Cloudflare Quick Tunnel — no Pinata, no S3, no third-party storage accounts.

### How It Works

```
[program.bin + input.bin] → [local HTTP server] → [cloudflared tunnel] → https://xyz.trycloudflare.com
                                                                                ↑
                                                                provers download from here
```

1. A local HTTP server serves the guest program and input
2. `cloudflared` creates a zero-auth quick tunnel exposing them at a public HTTPS URL
3. A proof request is built with `imageUrl` pointing to the tunnel
4. Provers download the files, generate the proof
5. The tunnel stays alive until fulfillment

No signup, no API keys, no JWT tokens.

### CRITICAL: File Format

The guest program must be the **`.bin` file** (R0BF wrapped format), NOT the raw `.elf`.

When you build a guest with `cargo build -p guests`, the build produces both:

- `is-even` — raw ELF (starts with `\x7fELF`) ❌ **Do NOT use**
- `is-even.bin` — R0BF wrapped format (starts with `R0BF`) ✅ **Use this**

The `.bin` file lives at:

```
target/riscv-guest/guests/<name>/riscv32im-risc0-zkvm-elf/release/<name>.bin
```

### Build Your Guest Program

If the developer already has a compiled `.bin` and image ID, skip to "Serve & Submit".

```bash
cd /path/to/your/project
cargo build -p guests
```

Get the image ID from the generated Solidity file:

```bash
cat contracts/src/ImageID.sol
```

Look for `bytes32 public constant <NAME>_ID = bytes32(0x...);` — the hex value (without `0x`) is the image ID.

### Prepare Input

The input file should be the raw bytes your guest program expects on stdin:

```bash
# ABI-encode the number 42 as U256
cast abi-encode "f(uint256)" 42 | xxd -r -p > input.bin
```

### Serve & Submit

**Full auto (serve + submit + wait):**

```bash
bash /path/to/requesting/scripts/self-host.sh \
    ./target/riscv-guest/guests/<name>/riscv32im-risc0-zkvm-elf/release/<name>.bin \
    ./input.bin \
    --image-id <64_CHAR_HEX_IMAGE_ID> \
    --submit --wait
```

The script will:

1. Start a local HTTP server
2. Start a Cloudflare Tunnel
3. Verify the tunnel is reachable
4. Build a proof request YAML
5. Submit via `boundless requestor submit-file --no-preflight`
6. Poll for fulfillment every 15 seconds
7. Print results when fulfilled

**The script must stay running until the proof is fulfilled.** Ctrl-C is guarded (3× to force quit) so you don't accidentally kill the tunnel.

**Serve only (no submit):**

```bash
bash /path/to/requesting/scripts/self-host.sh \
    ./program.bin ./input.bin --image-id <IMAGE_ID>
```

Prints the public URLs for use in your own YAML or SDK code.

**Pricing options:**

| Flag              | Default                        | Description                   |
| ----------------- | ------------------------------ | ----------------------------- |
| `--min-price`     | `100000000000000` (0.0001 ETH) | Starting auction price        |
| `--max-price`     | `2000000000000000` (0.002 ETH) | Maximum auction price         |
| `--timeout`       | `3600` (1 hour)                | Request expiry                |
| `--poll-interval` | `15`                           | Seconds between status checks |

Skip to **Phase 6** once the script is running (or if you chose serve-only and want to submit manually).

---

## Phase 5B: Just Trying It Out (Replay a Recent Request)

Use this path when the developer doesn't have their own program and just wants to see Boundless work. We discover a recently fulfilled request and replay it — guaranteed to work since provers handled it recently.

### Discover a Program

```bash
bash /path/to/requesting/scripts/discover-programs.sh
```

This queries the Boundless indexer for recently fulfilled requests, filters for ones with accessible IPFS URLs, and outputs the 5 smallest (cheapest/fastest) verified options.

**Present the results** with:

- Program cycles (proxy for complexity/cost)
- Proof cost (lock price from last fulfillment)
- Image ID (first 16 chars)
- When it was last fulfilled

Let the developer pick one.

### Build the YAML Request File

Extract from the discovery script's JSON output:

- `image_url` — the IPFS URL for the program
- `image_id` — the 64-char hex image ID
- `input_data` — the hex-encoded input (with `0x` prefix)

```bash
bash /path/to/requesting/scripts/build-request-yaml.sh \
  "<IMAGE_URL>" "<IMAGE_ID>" "<INPUT_DATA_HEX>" \
  > /tmp/boundless-request.yaml
```

Or write YAML manually — see `examples/request.yaml` for the template.

**YAML field gotchas:**

| Field                         | Requirement                                                                   | Error if Wrong                             |
| ----------------------------- | ----------------------------------------------------------------------------- | ------------------------------------------ |
| `offer.rampUpStart`           | Must be a **future Unix timestamp** (e.g. `$(date +%s) + 30`). Cannot be `0`. | `offer rampUpStart must be greater than 0` |
| `requirements.predicate.data` | Must be `0x` + image ID hex (64 chars). Cannot be empty.                      | `malformed predicate data`                 |
| `requirements.imageId`        | 64-char hex **without** `0x` prefix                                           | Image ID mismatch                          |
| `input.data`                  | Hex-encoded input **with** `0x` prefix                                        | Invalid input / empty journal              |

Generate `rampUpStart`:

```bash
echo $(( $(date +%s) + 30 ))
```

### Submit

```bash
AWS_EC2_METADATA_DISABLED=true RUST_LOG=info boundless requestor submit-file /tmp/boundless-request.yaml --no-preflight
```

**Do NOT use `--wait` initially.** Submit without it and poll status manually so you can see what's happening.

---

## Phase 6: Monitor & Retrieve Results

### Poll for Fulfillment

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor status <REQUEST_ID>
```

Run every 30–60 seconds. Typical fulfillment takes 1–5 minutes after lock.

| Status        | Meaning                                  |
| ------------- | ---------------------------------------- |
| **Submitted** | Request broadcast, auction running       |
| **Locked**    | A prover has committed to fulfilling     |
| **Fulfilled** | Proof delivered and verified on-chain ✅ |
| **Expired**   | Request timed out before fulfillment     |

### View on Explorer

```
https://explorer.boundless.network/orders/<REQUEST_ID>
```

### Show Timeline

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor status <REQUEST_ID> --timeline
```

Present a summary:

```
🎉 Your proof is complete!

  🔗 Explorer:   https://explorer.boundless.network/orders/<REQUEST_ID>

  ⏱️  Time to lock:     8s
  ⏱️  Proving time:     34s
  ⏱️  Total time:       42s

  💰 Price paid:        ~0.0001 ETH
```

### Retrieve the Proof

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor get-proof <REQUEST_ID>
```

- **Journal** — the public output committed by the guest program
- **Seal** — the cryptographic proof (used by smart contracts for on-chain verification)

### Verify the Proof

```bash
AWS_EC2_METADATA_DISABLED=true boundless requestor verify-proof <REQUEST_ID>
```

## Troubleshooting

See `references/troubleshooting.md` for a full list. Common issues:

| Problem                              | Fix                                                          |
| ------------------------------------ | ------------------------------------------------------------ |
| `submit` hangs with no output        | Use `submit-file --no-preflight` instead                     |
| `Malformed ProgramBinary`            | Use the `.bin` file (R0BF format), not the raw `.elf`        |
| AWS IMDS timeout warnings            | Set `AWS_EC2_METADATA_DISABLED=true`                         |
| Cloudflare `429 Too Many Requests`   | Wait 10–15 min. Don't create/destroy tunnels rapidly.        |
| Tunnel URL not reachable             | Check firewall. Wait a few seconds for DNS. Retry.           |
| Request expired                      | Increase `--max-price`. Ensure tunnel stayed alive (Path A). |
| `rampUpStart must be greater than 0` | Use a future Unix timestamp: `echo $(( $(date +%s) + 30 ))`  |

## SDK Equivalent (Reference)

```rust
use boundless_market::Client;

let client = Client::builder()
    .with_rpc_url(rpc_url)
    .with_private_key(private_key)
    .with_skip_preflight(true)
    .build()
    .await?;

// Path A: self-hosted via tunnel
let request = client.new_request()
    .with_program_url("https://xyz.trycloudflare.com/program.bin")?
    .with_input_url("https://xyz.trycloudflare.com/input.bin")?;

// Path B: replay from IPFS
let request = client.new_request()
    .with_program_url(ipfs_url)?
    .with_stdin(&input_bytes);

let (request_id, expires_at) = client.submit(request).await?;

let fulfillment = client
    .wait_for_request_fulfillment(request_id, Duration::from_secs(5), expires_at)
    .await?;
```

## Additional Resources

- `references/guest-program-explainer.md` — deep dive on guest programs, ZK concepts, building an ELF
- `references/cli-reference.md` — full requestor command reference
- `references/troubleshooting.md` — common errors and fixes
- `examples/request.yaml` — YAML request template
- [Boundless Docs](https://docs.boundless.network)
- [Boundless GitHub](https://github.com/boundless-xyz/boundless)
- [RISC Zero Developer Docs](https://dev.risczero.com)

Files in this skill

  • SKILL.md18.6 KB
  • examples/request.yaml1.9 KB
  • references/cli-reference.md7.1 KB
  • references/guest-program-explainer.md4.7 KB
  • references/troubleshooting.md7 KB
  • scripts/build-request-yaml.sh2 KB
  • scripts/check-prerequisites.sh2.7 KB
  • scripts/discover-programs.sh5.3 KB
  • scripts/self-host.sh19.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…