RISC Zero provides deployed verifier contracts on Ethereum mainnet and testnets. Your smart contracts can call these verifiers to validate zkVM proofs on-chain.
All examples and contracts are available in the risc0-ethereum repository.
All verifiers implement the IRiscZeroVerifier interface:
interface IRiscZeroVerifier { /// @notice Verify a RISC Zero proof /// @param seal The encoded cryptographic proof /// @param imageId The identifier for the guest program /// @param journalDigest The SHA-256 digest of the journal function verify( bytes calldata seal, bytes32 imageId, bytes32 journalDigest ) external view;}
// SPDX-License-Identifier: MITpragma solidity ^0.8.20;import {IRiscZeroVerifier} from "risc0-ethereum/contracts/src/IRiscZeroVerifier.sol";contract EvenNumber { IRiscZeroVerifier public immutable verifier; bytes32 public constant EVEN_CHECK_ID = /* your image ID */; uint256 public number; constructor(IRiscZeroVerifier _verifier) { verifier = _verifier; } /// @notice Set an even number with proof verification function set(uint256 x, bytes calldata seal) public { // Construct expected journal bytes memory journal = abi.encode(x); // Verify the proof verifier.verify( seal, EVEN_CHECK_ID, sha256(journal) ); // Update state only if proof is valid number = x; } function get() public view returns (uint256) { return number; }}
The verify() function will revert if the proof is invalid. Always handle this in your contract logic.
// test/EvenNumber.t.solimport {Test} from "forge-std/Test.sol";import {EvenNumber} from "../src/EvenNumber.sol";contract EvenNumberTest is Test { EvenNumber public evenNumber; function setUp() public { // Deploy with verifier router evenNumber = new EvenNumber(VERIFIER_ROUTER_ADDRESS); } function testSetEvenNumber() public { // Generate proof in Rust, then: bytes memory seal = /* proof from Rust */; evenNumber.set(42, seal); assertEq(evenNumber.get(), 42); } function testRejectOddNumber() public { bytes memory seal = /* proof for odd number */; vm.expectRevert(); evenNumber.set(43, seal); }}