You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Cairo程序生成并验证STARK证明?本地实现疑问

Cairo与STARK的本地证明生成/验证指南(以15-puzzle为例)

一、15-puzzle场景下的完整工作流

以验证15-puzzle解的合法性为例,可通过Cairo官方工具链完成本地的证明生成与验证,流程如下:

1. 编写Cairo验证程序

需要编写核心功能为验证15-puzzle移动序列合法且最终达到目标状态的Cairo程序,需实现:

  • 检查每一步移动的合法性(空白块仅能与上下左右方块交换)
  • 确认初始状态经所有移动后与目标状态完全匹配

简化示例代码:

from starkware.cairo.common.math import assert_eq
from starkware.cairo.common.alloc import alloc

# 定义15-puzzle状态为16个元素的数组(4x4)
def is_valid_move(prev_state: felt*, curr_state: felt*) -> felt:
    # 定位空白块在前后状态中的位置
    let mut blank_prev = 0
    let mut blank_curr = 0
    for i in 0..16:
        if prev_state[i] == 0:
            blank_prev = i
        if curr_state[i] == 0:
            blank_curr = i
    # 验证空白块仅移动一格(上下左右)
    let diff = abs(blank_curr - blank_prev)
    if diff == 1 or diff == 4:
        # 检查非空白块位置元素一致
        let mut valid = 1
        for i in 0..16:
            if i != blank_prev and i != blank_curr:
                if prev_state[i] != curr_state[i]:
                    valid = 0
        return valid
    return 0

def apply_move(state: felt*, move: felt) -> felt*:
    # 根据移动方向生成新状态
    let new_state = alloc()
    for i in 0..16:
        new_state[i] = state[i]
    let blank_pos = 0
    for i in 0..16:
        if state[i] == 0:
            blank_pos = i
    # move=0上,1下,2左,3右
    match move {
        0: if blank_pos >=4 {
            new_state[blank_pos] = state[blank_pos-4]
            new_state[blank_pos-4] = 0
        },
        1: if blank_pos <12 {
            new_state[blank_pos] = state[blank_pos+4]
            new_state[blank_pos+4] = 0
        },
        2: if blank_pos %4 !=0 {
            new_state[blank_pos] = state[blank_pos-1]
            new_state[blank_pos-1] = 0
        },
        3: if blank_pos %4 !=3 {
            new_state[blank_pos] = state[blank_pos+1]
            new_state[blank_pos+1] = 0
        },
        _: assert_eq(0, 1, 'Invalid move')
    }
    return new_state

def verify_15_puzzle(initial_state: felt*, moves: felt*, move_count: felt, target_state: felt*) -> felt:
    let mut curr_state = alloc()
    for i in 0..16:
        curr_state[i] = initial_state[i]
    for i in 0..move_count:
        let new_state = apply_move(curr_state, moves[i])
        assert_eq(is_valid_move(curr_state, new_state), 1, 'Invalid move step')
        curr_state = new_state
    # 验证最终状态匹配目标
    for i in 0..16:
        assert_eq(curr_state[i], target_state[i], 'Final state mismatch')
    return 1

2. 编译Cairo程序

使用cairo-compile将源代码编译为可执行JSON格式:

cairo-compile 15_puzzle.cairo --output 15_puzzle.json

3. 生成执行轨迹与内存快照

通过cairo-run执行程序,同时保存证明所需的执行轨迹和内存快照:

cairo-run --program=15_puzzle.json --layout=small --trace_file=trace.bin --memory_file=memory.bin --program_input=input.json
  • --layout=small:选择适合小规模计算的STARK参数,平衡速度与证明大小
  • --program_input=input.json:传入初始状态、移动序列、目标状态的输入数据(需按Cairo输入格式提前编写)

4. 本地生成STARK证明

使用cairo-prove基于轨迹和内存文件生成STARK证明:

cairo-prove --program=15_puzzle.json --trace_file=trace.bin --memory_file=memory.bin --output=proof.json

5. 本地验证证明

用cairo-verify验证生成的证明有效性:

cairo-verify --program=15_puzzle.json --proof_file=proof.json

二、关于cairo-run的功能说明

cairo-run核心作用是执行Cairo程序并输出结果,同时可生成执行轨迹(trace)和内存快照(memory)文件,但它本身不直接生成STARK证明。生成的trace和memory是后续STARK prover生成证明的核心输入——STARK证明本质是对程序执行轨迹的合法性做密码学证明,这两个文件包含了完整的执行过程信息。

若不指定--trace_file和--memory_file参数,cairo-run仅输出程序执行结果,不会保存轨迹相关文件。

三、不依赖SHARP的本地证明方案

完全可以不依赖SHARP服务,通过Cairo官方工具链完成本地证明生成与验证:

  • 依赖条件:安装完整的cairo-lang工具包(包含cairo-compile、cairo-run、cairo-prove、cairo-verify等工具)
  • 核心逻辑:利用Cairo程序的执行轨迹和内存快照,通过STARK prover直接在本地生成证明,无需上传至第三方服务
  • 注意事项:根据计算复杂度选择合适的layout参数(small/medium/large),15-puzzle这类简单场景用small即可,大规模计算可选择更大的layout保证安全性。

内容的提问来源于stack exchange,提问作者sinoTrinity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:36:23