Overview
OYSTER is an independent project. It is not affiliated with Pearl Research Labs or Robinhood. It has three parts:
- Pearl Network is where compute becomes value. Pearl is an L1 blockchain based on Proof-of-Useful-Work, where mining is a by-product of matrix multiplication.
- Robinhood Chain is where OYSTER participation will be accounted, in smart contracts. It is an EVM-compatible Arbitrum L2 with gas paid in ETH.
- This site and its API make up the Reef dashboard and an integration layer that reads from a real pearld node and receives miner events.
Pearl mining stack
The Pearl monorepo ships these components:
pearld | Full node, the reference implementation of the Pearl protocol (forked from btcd). JSON-RPC on :44107 on mainnet. |
pearl-gateway | Bridge between a pearld node and local miner processes. It handles work distribution, block template management and block submission. |
vllm-miner | A vLLM plugin that replaces quantized linear ops with NoisyGEMM CUDA kernels (pearl-gemm), so model inference also performs the mining work. |
zk-pow | ZK proof-of-work circuit and verifier (Rust, Plonky2/STARKy). The gateway attaches a ZK certificate to each block it builds. |
oyster / oystercli | Pearl's HD wallet daemon and terminal client. Note the name overlap: this is Pearl's wallet, not this project. |
The mining model comes from Proofs of Useful Work from Arbitrary Matrix Multiplication by Komargodski and Weinstein (arXiv:2504.09971). The target block time in pearld is 3 minutes 14 seconds.
Miner ↔ node communication
The GPU process talks only to pearl-gateway, using line-delimited JSON-RPC over a Unix socket (/tmp/pearlgw.sock, the default) or TCP on 127.0.0.1:8337 with MINER_RPC_TRANSPORT=tcp. The gateway exposes two methods:
→ {"jsonrpc":"2.0","id":1,"method":"getMiningInfo","params":{}}
← {"jsonrpc":"2.0","id":1,"result":{ ...mining job... }}
→ {"jsonrpc":"2.0","id":2,"method":"submitPlainProof",
"params":{"plain_proof":"<base64>","mining_job":{...}}}
← {"jsonrpc":"2.0","id":2,"result":"submitted"}The gateway talks to pearld over HTTP JSON-RPC with Basic auth. It refreshes getblocktemplate about once a second, and when a miner submits a proof it generates the ZK certificate, assembles the block and calls submitblock.
vllm-miner ──getMiningInfo──▶ pearl-gateway ──getblocktemplate──▶ pearld
vllm-miner ──submitPlainProof─▶ pearl-gateway ──submitblock──────▶ pearldBecause the gateway only listens on loopback or a Unix socket and has no public stats endpoint, OYSTER does not connect to it remotely. Per-miner events are forwarded instead (see Connecting a real miner).
Rewards & mining address
- Pearl requires a Taproot mining address (mainnet HRP
prl, e.g.prl1p…). Generate one with the Oyster wallet:prlctl … getnewaddress. - Set it with
--miningaddron pearld orPEARLD_MINING_ADDRESSon the gateway. Block rewards go to this address on the Pearl L1. - Coinbase outputs mature after 100 blocks, and the wallet lists them as
immatureuntil then andgenerateafter. - The base unit is the grain: 1 PRL = 108 grains. Block subsidy follows a decaying emission curve defined in
CalcBlockSubsidy.
Robinhood Chain
| Mainnet | Testnet | |
|---|---|---|
| Chain ID | 4663 (0x1237) | 46630 (0xB626) |
| Public RPC | https://rpc.mainnet.chain.robinhood.com | https://rpc.testnet.chain.robinhood.com |
| Explorer | robinhoodchain.blockscout.com | explorer.testnet.chain.robinhood.com |
| Gas token | ETH | ETH |
The site uses the network set by NEXT_PUBLIC_ROBINHOOD_NETWORK and reads it through NEXT_PUBLIC_ROBINHOOD_RPC_URL (an Alchemy endpoint in production), falling back to the public, rate-limited RPC. Browser wallets are found through EIP-6963, so MetaMask, Rabby and the Coinbase Wallet extension appear on the Reef when installed. If a wallet is on another network, the Reef offers a one-click switch, and the wallet adds Robinhood Chain if it doesn't know it yet. The Reef reads a connected wallet's address and ETH balance only: it sends no transactions and asks for no signatures. OYSTER never asks for private keys or seed phrases.
OYSTER miner API
All endpoints are GET, return JSON with cache-control: no-store, and include a source field (pearld, or none when no node is configured).
/api/miner/status | Node reachability, chain, height, peers, gateway reporting state, mining address. |
/api/miner/stats | Reef metrics. Each is a Metric carrying its value, unit, provenance and origin. |
/api/miner/rewards?account=0x… | Coinbase reward totals and recent rewards from the Oyster wallet, plus an optional view of an EVM account on Robinhood Chain. |
/api/miner/activity?limit=50 | Recent miner events (max 200). |
/api/miner/stream | Server-Sent Events: hello, then miner events, with a heartbeat every 15s. |
POST /api/miner/events | Ingest for real miner events. Requires Authorization: Bearer $MINER_INGEST_TOKEN. |
/api/health | Health check and active configuration flags (no secrets). |
// Metric shape
{ "value": 1234 | "0x…" | null,
"unit": "H/s",
"provenance": "live" | "unavailable",
"origin": "pearld:getnetworkhashps",
"note": "Estimated from difficulty over the last 120 blocks" }
// MinerEvent shape
{ "id": "gw_…", "ts": "2026-09-28T10:00:00Z",
"type": "connected" | "job_received" | "job_accepted" | "workload"
| "proof_generated" | "proof_submitted" | "block_accepted"
| "block_rejected" | "new_block" | "info" | "error" | "disconnected",
"worker": "OYSTER-042", "message": "…",
"origin": "gateway" | "pearld" }Data provenance
Every metric on the Reef is backed by one of these sources, or it is marked N/A:
| Metric | pearld mode source |
|---|---|
| Oysters Online | Distinct workers seen by the gateway forwarder in the last 5 minutes |
| Network Compute | getnetworkhashps, an estimate from difficulty over 120 blocks |
| Total Compute | getblockchaininfo.chainwork |
| Pearls Mined | getblockchaininfo.blocks (chain height) |
| Grains Received | Forwarded job_received events: one per block template the gateway received from pearld (log line Template refreshed successfully) |
| Proofs Submitted | Forwarded proof_submitted events: one per block the gateway submitted to pearld |
| Network Uptime | uptime of the connected pearld node (not the whole network) |
| Rewards | Oyster wallet listtransactions, categories immature / generate |
| ETH balance | Robinhood Chain RPC eth_getBalance for the connected wallet, read in the browser |
OYSTER never simulates figures. Without a pearld node (source: none), node and wallet figures are N/A and show a dash; only real events from a gateway forwarder appear.
Connecting a real miner
- Run a Pearl node and miner following the Pearl README (wallet → pearld → pearl-gateway → vllm-miner).
- Expose pearld's RPC to the OYSTER server only over TLS, for example through Pearl's Caddy proxy sidecar, with a dedicated RPC user.
- Configure the OYSTER deployment:
MINER_DATA_SOURCE=pearld
PEARLD_RPC_URL=https://node.example.com:44107
PEARLD_RPC_USER=…
PEARLD_RPC_PASSWORD=…
PEARLD_MINING_ADDRESS=prl1p…
# optional, for rewards:
PEARL_WALLET_RPC_URL=https://node.example.com:44207
PEARL_WALLET_RPC_USER=…
PEARL_WALLET_RPC_PASSWORD=…
# for per-miner events:
MINER_INGEST_TOKEN=$(openssl rand -hex 32)- On each GPU host, pipe the gateway / miner logs into the forwarder:
pearl-gateway start 2>&1 | python3 integrations/gateway-forwarder/forward.py \
--endpoint https://your-oyster-site/api/miner/events \
--token "$MINER_INGEST_TOKEN" --worker OYSTER-042next start, Docker, a VPS). On serverless platforms, back it with Redis or a queue before relying on the counters.The OYSTER token
OYSTER is an ERC-20 token on Robinhood Chain. It is the key to the Reef: holding and staking it is how a person takes part in the pearls the Reef's GPUs produce, whether or not they run a GPU themselves.
| Standard | ERC-20 |
| Network | Robinhood Chain (chain 4663) |
| Utility | Staked in the Reef Vault to earn a share of the Reef's Pearl mining rewards |
| Contracts | The token, Reef Vault and Link Registry contract addresses are published on this page at deployment. Only trust addresses listed here. |
Holder mining
Pearl mining is done by GPUs. Holder mining lets OYSTER holders share in that work without owning one: the Reef's oysters mine Pearl blocks to a common Reef address, and the rewards are divided between the oysters who did the compute and the holders who staked OYSTER.
How it works
- Stake. A holder deposits OYSTER into the Reef Vault contract on Robinhood Chain. Stake is measured over time, so a token staked for a whole epoch counts fully and one staked for half counts half.
- Link a Pearl address. The holder sends a link transaction from their wallet on Robinhood Chain naming a Pearl Taproot address (
prl1p…). The Link Registry records it against the sending address. This is where their PRL will be paid. No private key ever leaves the wallet. - The Reef mines. Oysters run the standard Pearl stack (pearld, pearl-gateway, vLLM miner) with
PEARLD_MINING_ADDRESSset to the Reef address. Their gateway forwarder reports which worker found each accepted block. - Rewards mature. Every block the Reef wins pays its coinbase to the Reef address. After 100 confirmations the PRL is spendable and counts toward the current epoch.
- Split and settle. At the end of each epoch the matured PRL is split into an operator share (to oysters, by accepted blocks) and a holder share (to stakers, by time-weighted stake). A Merkle root of every allocation is posted to the Reef Vault, and the PRL is paid on the Pearl chain in one batched transaction to the linked Taproot addresses.
Parameters
| Parameter | Meaning |
|---|---|
epochLength | Pearl blocks per epoch. 445 blocks is about 24 hours at the 3 m 14 s block target. |
operatorShare | Part of each epoch's matured PRL paid to oysters for compute. |
holderShare | Part paid to stakers. operatorShare + holderShare = 100%. |
minStake | Smallest stake that earns a share, to keep the payout batch a sensible size. |
unstakeDelay | Wait between requesting and completing an unstake, so stake cannot be timed around an epoch close. |
A holder's share
holderPRL(h) = epochPRL × holderShare × (stake(h) × timeStaked(h)) / Σ(stake × timeStaked)
oysterPRL(o) = epochPRL × operatorShare × blocksFound(o) / Σ blocksFoundPearl blocks are found by chance, so a single oyster's reward varies a lot from day to day. Pooling through the Reef smooths that out for oysters and holders alike.
Contract interface (planned, not deployed)
// Planned, not deployed. No OYSTER contract exists on Robinhood Chain yet.
interface IReefVault {
function stake(uint256 amount) external;
function requestUnstake(uint256 amount) external;
function completeUnstake() external;
/// epoch => Merkle root of (holder, prlAmount) allocations
function epochRoot(uint256 epoch) external view returns (bytes32);
function stakeWeight(address holder, uint256 epoch) external view returns (uint256);
event Staked(address indexed holder, uint256 amount);
event UnstakeRequested(address indexed holder, uint256 amount, uint256 availableAt);
event EpochSettled(uint256 indexed epoch, bytes32 root, uint256 holderPRL, uint256 operatorPRL);
}
interface ILinkRegistry {
/// Records taprootAddress (prl1p…) for msg.sender; the transaction itself proves the holder.
function link(string calldata taprootAddress) external;
function pearlAddressOf(address holder) external view returns (string memory);
}On the Reef
Account Services on the Reef shows a connected wallet's stake, its linked Pearl address, compute contributed, shares and estimated PRL for the current epoch. Every figure carries its source, like the rest of the office.
Risks
- Rewards depend on how many blocks the Reef wins, which depends on its GPUs and on the rest of the network.
- PRL rewards are paid on the Pearl chain, not on Robinhood Chain. A holder needs a Pearl wallet to receive them.
- The value of OYSTER and of PRL can fall, including to zero.
- Smart contracts can contain bugs. Only interact with the addresses published on this page.
Glossary
- Oyster
- A GPU miner in the OYSTER network (brand term). Not to be confused with Pearl's
oysterwallet daemon. - Grain
- Compute, the workload a GPU takes in (brand term). In the Pearl protocol, grain is also the base unit of PRL (1 PRL = 108 grains).
- Pearl
- A mining reward: an accepted block paying PRL.
- Reef
- The network and the dashboard that watches it.
- PoUW
- Proof-of-Useful-Work: consensus work that is also useful computation, here matrix multiplication inside AI inference.