RithmGraph
Privacy‑by‑Design Intelligence on Base (OP Stack)
Powered by Zero‑Knowledge cryptography and client‑side encryption — without moving raw data
Executive Overview
RithmGraph is a Universal Zero‑Knowledge Graph for enterprises building on Base. Applications generate client‑side ZK proofs (snarkJS/Halo2 WASM) and client‑side encrypted payloads, then commit verifiable signals to on‑chain verifier contracts. Queries are proven, not exposed; policies are enforced cryptographically, not operationally. By leveraging EIP‑4844 data availability and Base’s OP Stack economics, the platform delivers predictable costs, fast UX, and privacy by design suitable for regulated environments.
Base + Client‑Side ZK: Production Architecture
A pragmatic layering: proofs in the browser, verification on Base, and encrypted data off‑chain with verifiable lineage.
Cryptographic guarantees • predictable fees • enterprise ergonomics
Developer Blueprints
Drop‑in patterns for Base integration, client‑side ZK, and encryption. Fonts & styling echo a legible Matrix aesthetic.
// CDN: https://cdn.skypack.dev/ethers@6
import { ethers } from "https://cdn.skypack.dev/ethers@6";
const provider = new ethers.BrowserProvider(window.ethereum);
await provider.send("eth_requestAccounts", []);
let net = await provider.getNetwork();
if (net.chainId !== 8453n) {
await window.ethereum.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: "0x2105" }], // Base mainnet
});
net = await provider.getNetwork();
}
const signer = await provider.getSigner();
console.log(`Base: ${net.name} (${net.chainId}) as ${await signer.getAddress()}`);
// CDN: https://cdn.jsdelivr.net/npm/snarkjs@0.7.2/dist/snarkjs.min.js
import * as snarkjs from "https://cdn.jsdelivr.net/npm/snarkjs@0.7.2/dist/snarkjs.min.js";
const input = { value: 42, bound: 100 };
const { proof, publicSignals } = await snarkjs.groth16.fullProve(
input,
"/circuits/range.wasm",
"/circuits/range_final.zkey"
);
const calldata = await snarkjs.groth16.exportSolidityCallData(proof, publicSignals);
// ... split calldata into (a,b,c,input) per your verifier and submit via signer
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IGroth16Verifier {
function verifyProof(
uint[2] memory a,
uint[2][2] memory b,
uint[2] memory c,
uint[] memory input
) external view returns (bool);
}
contract ZKAttest {
IGroth16Verifier public immutable V;
event Proven(address indexed account, bytes32 signalHash);
constructor(address verifier) { V = IGroth16Verifier(verifier); }
function submit(
uint[2] calldata a,
uint[2][2] calldata b,
uint[2] calldata c,
uint[] calldata input
) external {
require(V.verifyProof(a, b, c, input), "INVALID_PROOF");
emit Proven(msg.sender, keccak256(abi.encode(input)));
}
}
const enc = new TextEncoder();
const msg = "RithmGraph session key v1";
const signature = await signer.signMessage(msg);
const salt = crypto.getRandomValues(new Uint8Array(16));
// Derive key from signature material
const keyMaterial = await crypto.subtle.importKey(
"raw", enc.encode(signature), "PBKDF2", false, ["deriveKey"]
);
const key = await crypto.subtle.deriveKey(
{ name: "PBKDF2", salt, iterations: 150_000, hash: "SHA-256" },
keyMaterial,
{ name: "AES-GCM", length: 256 },
false,
["encrypt","decrypt"]
);
// Encrypt JSON payload
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv }, key, enc.encode(JSON.stringify({ hello: "base" }))
);
Why Enterprises Pick RithmGraph on Base
Data never leaves the perimeter: proofs replace disclosure; encryption lives client‑side. Regulators can be satisfied with evidence instead of copies.
Predictable unit economics: Base + EIP‑4844 yields cost stability; proofs are succinct and verifiable on‑chain. You control DA budget and can batch workloads.
Composable by default: verifiers, attestations, and graph indices are on Base—portable across apps, auditable by design.
Initiate Enterprise Consultation
Discuss rollout on Base, proof architectures, and policy models for your domain.