On-chain Modules
Contracts
Solidity sources. OpenZeppelin. Ready to compile.
Architecture
System Overview
Four modules. Strict interfaces. No central operator.
User
│ submitCircuit(bytes)
▼
┌─────────────────┐
│ QuantumCircuit │ ──► jobId
└────────┬────────┘
│
▼
┌─────────────────┐ ┌─────────────────┐
│ QVMVerifier │ ◄───│ QuantumState │
│ - parse gates │ │ - amplitudes[] │
│ - run sim │ │ - applyGate() │
└────────┬────────┘ └─────────────────┘
│ verified == true
▼
┌─────────────────┐
│ RewardPool │ ──► ETH payout
│ - 15 ETH cap │
└─────────────────┘Flow
Pipeline
Deterministic simulation. No oracles.
01
Parse
Decode gate sequence.
02
Simulate
Fixed-point state evolution.
03
Check
Output vs target within ε.
04
Payout
Atomic reward release.
Modules
Contracts
QuantumCircuit.sol
Circuit Registry
Stores bytecode, metadata, timestamps. Assigns job IDs.
QuantumState.sol
State Manager
State vectors and gate operations.
QVMVerifier.sol
Verification Engine
Checks unitarity, fidelity, distributions.
RewardPool.sol
Treasury
Holds 15 ETH. Auto-releases on verification.
Source
Contracts
QuantumCircuit.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/access/Ownable.sol";
contract QuantumCircuit is Ownable {
struct Job {
address submitter;
bytes circuit;
uint256 submittedAt;
bool exists;
}
mapping(uint256 => Job) public jobs;
uint256 public nextJobId;
event CircuitSubmitted(
uint256 indexed jobId,
address indexed submitter,
uint256 submittedAt
);
constructor(address initialOwner) Ownable(initialOwner) {}
function submit(bytes calldata circuit) external returns (uint256 jobId) {
require(circuit.length > 0, "Empty circuit");
require(circuit.length <= 256, "Circuit too large");
jobId = nextJobId++;
jobs[jobId] = Job(msg.sender, circuit, block.timestamp, true);
emit CircuitSubmitted(jobId, msg.sender, block.timestamp);
}
function get(uint256 jobId) external view returns (Job memory) {
require(jobs[jobId].exists, "Job not found");
return jobs[jobId];
}
function totalJobs() external view returns (uint256) {
return nextJobId;
}
}