AI × Blockchain Convergence
Verifiable AI Inference (ZKML)
The fundamental problem: if an AI model judges Agent Sparta submissions, how do you PROVE:
- The correct model was used (not a biased one)
- The correct inputs were given (no cherry-picking)
- The output wasn't manipulated
ZKML solves this: generate a ZK proof that a specific neural network with specific weights produced a specific output for a specific input — cryptographically verifiable, model weights optionally private.
EZKL — Practical ZKML
# Convert any PyTorch/ONNX model to a ZK-provable circuit
import ezkl
import torch
# 1. Export model to ONNX
model = torch.load("scoring_model.pt")
dummy_input = torch.randn(1, 512) # 512-dim text embedding
torch.onnx.export(model, dummy_input, "model.onnx")
# 2. Setup EZKL circuit
ezkl.gen_settings("model.onnx", "settings.json")
ezkl.compile_circuit("model.onnx", "model.compiled", "settings.json")
# 3. Generate proving key + verification key
ezkl.setup("model.compiled", "vk.key", "pk.key")
# 4. For each judging: generate proof
def judge_and_prove(submission_embedding):
# Write input
import json
with open("input.json", "w") as f:
json.dump({"input_data": [submission_embedding.tolist()]}, f)
# Generate witness (intermediate values)
ezkl.gen_witness("input.json", "model.compiled", "witness.json")
# Generate ZK proof (this is the slow step: 10s-10min depending on model size)
ezkl.prove("witness.json", "model.compiled", "pk.key", "proof.json")
# Read the proof + output score
with open("proof.json") as f:
proof_data = json.load(f)
score = proof_data["instances"][0][0] # Model's output score
proof_bytes = proof_data["proof"]
return score, proof_bytes
# 5. Verify on-chain (anyone can verify)
# Deploy Solidity verifier contract (auto-generated by EZKL):
ezkl.create_evm_verifier("vk.key", "settings.json", "Verifier.sol")
// Auto-generated Solidity verifier
// Gas cost: ~300K-500K gas to verify a Groth16 proof
interface IMLVerifier {
function verify(
uint256[] calldata publicInputs, // [submissionHash, score]
bytes calldata proof
) external view returns (bool);
}
contract SpartaVerifiedJudging {
IMLVerifier public immutable verifier;
bytes32 public immutable modelCommitment; // keccak256(modelWeightsHash)
mapping(bytes32 => uint256) public verifiedScores; // submissionHash → score
function submitVerifiedScore(
bytes32 submissionHash,
uint256 score,
bytes calldata proof
) external {
uint256[] memory publicInputs = new uint256[](2);
publicInputs[0] = uint256(submissionHash);
publicInputs[1] = score;
require(verifier.verify(publicInputs, proof), "Invalid ZK proof");
verifiedScores[submissionHash] = score;
}
}
Current Practical Limits (2026)
| Model Size | Proof Generation Time | Verification Gas | Practical? |
|---|---|---|---|
| Logistic regression (1K params) | ~1s | ~300K gas | ✅ Yes |
| Small NN (100K params) | ~30s | ~500K gas | ✅ With batching |
| BERT-base (110M params) | ~2 hours | ~500K gas | ❌ Not yet |
| GPT-4 class | Months | ~500K gas | ❌ Far future |
Agent Sparta solution: Use a small verifiable scoring model (proxy model) that distills the large model's judgments. The ZK proof covers the proxy model; the proxy was trained on large model outputs and is public.
On-Chain AI Agents (Autonomous Wallets)
// Agent that autonomously manages a portfolio
// Using Olas/Autonolas framework
class AutoAgent {
wallet: ethers.Wallet;
strategy: TradingStrategy;
async run() {
// Fetch market data
const prices = await this.fetchPrices();
// AI decides action (can be on-chain verified if small model)
const action = await this.strategy.decide(prices);
// Execute autonomously
if (action.type === "SWAP") {
await this.executeSwap(action.token, action.amount);
}
// Agents can own Safe multisigs, vote in DAOs, manage protocols
// Economic incentive: agent earns fees → token accrues value
}
}
Ritual Network — On-Chain AI Inference
// Call an AI model FROM a smart contract
interface IRitual {
function requestCompute(
uint32 subscriptionId,
uint32 interval, // How often to rerun
uint16 redundancy, // How many nodes compute this
address paymentToken,
uint256 maxGasPrice,
address wallet,
address verifier,
bytes calldata input
) external;
}
contract OnChainAIScorer {
IRitual public immutable ritual;
uint32 public subscriptionId;
// Request AI scoring of a submission
function requestScore(bytes32 submissionHash, bytes calldata submissionText) external {
ritual.requestCompute(
subscriptionId,
0, // One-shot
3, // 3 nodes compute (consensus)
address(usdc),
5 gwei,
address(this),
address(zkVerifier), // Optional ZK verification
abi.encode(submissionHash, submissionText)
);
}
// Ritual nodes call this with the result
function receiveCompute(bytes32 taskId, bytes calldata output) external {
(uint256 score) = abi.decode(output, (uint256));
scores[taskId] = score;
}
}
Bittensor — Decentralized AI Network
Architecture (understand for competitive analysis with Agent Sparta):
- Validators: evaluate miner outputs, weight based on quality
- Miners: serve AI model inference, compete on quality
- TAO token: distributed to miners proportional to validator scores
- Subnets: specialized networks for different tasks (text generation, image generation, etc.)
Agent Sparta parallel:
- Bittensor Subnet 1 = text generation competition
- Agent Sparta = AI judging competition with on-chain prizes
- Key difference: Agent Sparta has clear tasks (predict, answer, write) with human-meaningful outcomes
- Bittensor miners optimize for validator score (which may diverge from real quality)
- Agent Sparta judges on objective criteria (prediction accuracy) or verifiable quality metrics
Competitive moat: Agent Sparta can use Bittensor miners AS competitors — the best AI systems on
Bittensor could enter Sparta challenges and earn USDC prizes, creating a talent marketplace for AI.