# Cairo

## 1. Cairo란?

Cairo는 Circom, Noir와 같이 ZK 언어라는 점에서는 비슷하지만, 출발점과 목적이 꽤 다르다.&#x20;

다른 것들이 "회로/증명 도구"에 가깝다면, Cairo는 애초에 "STARK 기반 롤업을 위한 전용 VM+언어 스택"으로 나왔다는 점이 가장 큰 차이다.

Cairo는 StarkWare가 StarkNet 같은 L2에서 대규모 계산을 STARK로 증명하기 위한 실행 환경으로 설계한 언어이다. 즉, 프로그램 전체를 STARK로 증명하는 VM에 초점이 있다.

Cairo VM 위에서 프로그램을 실행하고 이 VM이 규칙에 따라 이 상태에서 저 상태로 이동했다는 것을 STARK로 증명한다. \
사용자는 회로를 직접 의식하기보다는 일반 프로그램을 쓰듯이 Cairo 코드를 작성하고, 그 실행 trace가 자동으로 증명된다.

또한 Cairo는 STARK를 전제로 한 언어/VM이다. 투명한 셋업, 해시 기반 보안 가정, 상대적으로 큰 증명 크기를 가지고 있다.

따라서 Cairo는 L2 dApp을 작성하는 "언어"에 더 가깝고, 그 결과물이 자동으로 STARK 증명과 연결되는 구조이다.

***

## 2. 사용법

### 설치

```zsh
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.dev | sh

source ~/.zshrc

starkup
scarb --version
snforge --version

```

scarb를 통해서 cairo 패키지를 사용할 수 있다.

```zsh
scarb new hello_world
```

scarb new로 새로운 프로젝트를 만들 수 있다.

프로젝트 템플릿으로 많은 파일이 생기는데 Scarb.toml 파일을 통해 빌드 설정을 할 수 있다.

만약 오프체인에서 실행한 함수 결과를 zk proof를 만든다면 실행 파일로 만들어 (target.executable) 실행 트레이스에 대한 STARK 증명을 만든다.

```toml
## Scarb.toml
[package]
name = "equation_prover"
version = "0.1.0"
edition = "2024_07"

[cairo]
enable-gas = false          # 실행용 바이너리이므로 gas 비활성화

[dependencies]
cairo_execute = "2.13.1"    # 실행 + 증명용 플러그인

[[target.executable]]
name = "main"
function = "equation_prover::main"   # src/lib.cairo 안의 main을 엔트리로 사용

```

```rust
// src/lib.cairo

/// x^3 + x + 5 == 35 를 만족하는지 확인하는 함수이다.
fn check_equation(x: felt252) -> bool {
    // Cairo의 기본 타입 felt252 위에서 계산한다.
    let lhs = x * x * x + x + 5;
    lhs == 35
}

// 실행 가능한 엔트리 포인트이다.
#[executable]
fn main(x: felt252) -> bool {
    check_equation(x)
}
```

### 실행

비밀 값인 x를 대입하여 실행한 과정과 결과를 가지고 STARK를 사용해서 증명을 만든다

```zsh
scarb execute -p equation_prover \
  --print-program-output \
  --arguments 3
```

`#[executable] fn main` 를 찾아서 빌드하고 실행한다. 실행 과정에서 생성된&#x20;

* air\_public\_input.json, air\_private\_input.json: AIR에 들어갈 공개/비공개 입력
* trace.bin, memory.bin: 실행 트레이스와 메모리 스냅샷 이 존재한다.

### 증명

```zsh
scarb prove --execution-id 1
```

위에서 만든 입력들과 실행 트레이스를 바탕으로 proof를 만든다. \
proof.json 안에는 "어떤 입력 x에 대해 main(x)가 Cairo VM 규칙에 맞게 실행되어 true를 반환했다"는 STARK 증명이 들어 있다

### 검증

```zsh
scarb verify --execution-id 1
```

proof를 사용해서 검증을 진행한다.&#x20;

즉 어떤 $$x$$에 대해 $$x^3 + x + 5 = 35$$ 이고, 그 $$x$$를 입력으로 하는 Cairo 프로그램 main이 규칙대로 실행되어 true를 반환했다는 사실이 STARK 증명으로 확인된다.

하지만 이러한 증명과 검증을 온체인에서 동일하게 진행할 수 없다.

***

## 3. References

* <https://www.starknet.io/cairo-book/ch01-03-proving-a-prime-number.html>
* <https://eprint.iacr.org/2021/1063.pdf>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://upsidezkp.gitbook.io/upside-zkp-docs/step-4/zkp-dsl-proving-system/cairo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
