> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# 아키텍처

> 지갑, RPC, Solana 프로그램이 Solana 프라이버시 링과 상호 작용하는 방식을 알아보세요.

<a id="architecture" />

<Tabs sync={false}>
  <Tab title="Permissionless Confidential Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            Indexer["Photon Indexer"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch encrypted UTXOs| Indexer
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Confidential transfer| SPP
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>

  <Tab title="Custom Confidential Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            Indexer["Photon Indexer"]
            RingRPC["Ring RPC with auditor · optional"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            Ring1["Custom Ring Program 1"]
            RingN["Custom Ring Program N"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| Ring1
            Ring1 -->|CPI| SPP
            RingN -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch encrypted UTXOs| Indexer
        Users <-.->|Fetch decrypted UTXOs| RingRPC
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Confidential transfer| Ring1
        TransactionRPC --> RingN
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>

  <Tab title="Custom Anonymous Ring">
    ```mermaid theme={"system"}
    %%{init: {
      'theme': 'base',
      'themeVariables': {
        'primaryColor': '#FFFFFF',
        'primaryTextColor': '#737373',
        'primaryBorderColor': '#9CA3AF',
        'lineColor': '#FF6B35',
        'secondaryColor': '#F5F5F5',
        'tertiaryColor': '#FFFFFF',
        'clusterBkg': '#FF6B350A',
        'clusterBorder': '#9CA3AF',
        'edgeLabelBackground': '#FFFFFF'
      }
    }}%%
    flowchart LR
        Users["Users"]

        subgraph RPC["RPC"]
            direction TB
            RingRPC["Ring RPC with auditor"]
            Prover["Prover"]
            TransactionRPC["Transaction RPC<br/>Relayer for anonymous transactions"]
        end

        subgraph Solana["Solana"]
            direction LR
            Swap["ZK Swap Program"]
            Ring1["Custom Ring Program 1"]
            RingN["Custom Ring Program N"]
            subgraph State[" "]
                direction TB
                SPP["SPP<br/>Solana Privacy Program"]
                Pools["SPL interface"]
                Trees["State Merkle tree account"]
            end
            Swap -->|CPI| Ring1
            Ring1 -->|CPI| SPP
            RingN -->|CPI| SPP
        end

        Forester["Forester"]

        Users <-.->|Fetch decrypted UTXOs| RingRPC
        Users <-.->|Fetch proofs| Prover
        Users -->|Send transaction| TransactionRPC
        TransactionRPC -->|Relayed anonymous transaction| Ring1
        TransactionRPC --> RingN
        TransactionRPC --> Swap
        Forester --> Trees

        style State fill:none,stroke:none
    ```
  </Tab>
</Tabs>

## 프라이빗 지갑과 사용자

사용자는 프라이빗 지갑에 암호화된 잔액을 보관하고 기존 Solana Ed25519 키로 비공개 트랜잭션에 서명합니다. 프라이빗 지갑을 통합하면 키 관리에 차폐 키 쌍이 추가됩니다. [직접 통합](/docs/ko/privacy/integration/wallet)하거나 [임베디드 프라이빗 지갑](/docs/ko/privacy/integration/embedded-wallet)을 사용할 수 있습니다.

## 비공개 트랜잭션

비공개 전송은 일반적인 Solana 트랜잭션입니다. Solana 런타임은 서명을 검증하고 Solana 프라이버시 프로그램을 호출합니다. 이 프로그램은 암호화된 상태를 공개하지 않고 ZK 증명을 검증합니다.

일반적인 기밀 전송은 약 927바이트를 사용하므로 v1의 4,096바이트 제한에 충분히 들어갑니다.

<Accordion title="Example Confidential Transfer">
  | 구성 요소 | 바이트 |
  | - | -: |
  | Groth16 증명 | 192 |
  | 기타 프라이버시 명령 데이터: 암호문, 커밋먼트, 무효화 값, 키 및 메타데이터 | 418 |
  | 계정 주소 6개 × 32바이트 | 192 |
  | Ed25519 서명 1개 | 64 |
  | 최근 블록 해시 | 32 |
  | 버전, 메시지 헤더, 구성 마스크 및 개수 | 10 |
  | 컴퓨팅 유닛 및 로드된 계정 데이터 제한 | 8 |
  | 명령 헤더 | 4 |
  | 명령 계정 인덱스 7개 | 7 |
  | **합계** | **927** |

  <Info>
    사양의 입력 2개, 출력 3개 기밀 전송 예시를 기준으로 합니다.
    소스 코드 보기: [사양](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/docs/spec.md#transact) · [xtask/src/main.rs](https://github.com/helius-labs/zolana/blob/680667f27cf9ba4203a0b69284f4c304b874092f/xtask/src/main.rs#L412)

    [Solana v1 트랜잭션 레이아웃](https://solana.com/docs/core/transactions/versioned-transactions#v1-wire-layout)을 참조하세요.
  </Info>
</Accordion>

## RPC

<Tooltip tip="https://devnet.helius-rpc.com/?api-key=<API_KEY> or https://mainnet.helius-rpc.com/?api-key=<API_KEY>">하나의 Helius RPC URL</Tooltip>로 Solana RPC, 인덱서 및 원격 증명기를 사용할 수 있습니다.

* **Solana RPC** – 공개 잔액을 반환하고 Solana 네트워크에 트랜잭션을 제출합니다.

* **인덱서** – 인덱서는 지갑이 잔액을 읽고 비공개 트랜잭션을 생성하는 데 필요한 암호화된 상태를 제공합니다. 누구든지 대체 수단으로 자체 인덱서를 무허가 방식으로 실행할 수도 있습니다.

* **증명기** – 트랜잭션과 하드웨어에 따라 영지식 증명을 로컬 또는 증명기 서버에서 수 밀리초 만에 생성할 수 있습니다. Helius는 GPU 증명을 사용합니다.

커스텀 링의 선택적 기능에는 공유 조회 키 또는 구성된 링 감사자 키를 사용하여 복호화된 잔액과 내역을 제공하는 선택적 링 RPC가 포함됩니다. 또한 익명 트랜잭션은 사용자가 트랜잭션 수수료 납부자로 표시되지 않도록 릴레이어를 사용합니다.

## 프라이버시와 Solana 프로그램

Solana 프라이버시 프로그램(SPP)은 모든 비공개 상태 전환을 검증하고 실행하는 핵심 프로그램입니다. 커스텀 링 프로그램과 ZK Solana 프로그램은 규정 준수 또는 애플리케이션 로직을 추가한 후 SPP를 호출하여 비공개 상태를 업데이트합니다.

다른 Solana 프로그램은 CPI 깊이 제한 5와 같은 Solana 트랜잭션 제한 내에서 동일한 트랜잭션의 CPI를 통해 이러한 프로그램과 상호 작용할 수 있습니다.

<Accordion title="ZK Program Transaction Flow">
  <Tabs sync={false}>
    <Tab title="Permissionless Ring">
      <Tabs sync={false}>
        <Tab title="ZK Program alone">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant SPP as Solana Privacy Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              Note over ZK: Update Solana accounts (optional)

          ```
        </Tab>

        <Tab title="ZK Program and additional Solana Program">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant SPP as Solana Privacy Program
              participant Program as Solana Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              ZK->>Program: CPI
              Note over Program: Update Solana accounts

          ```
        </Tab>
      </Tabs>
    </Tab>

    <Tab title="Custom Rings">
      <Tabs sync={false}>
        <Tab title="ZK Program alone">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant Ring as Custom Ring Program
              participant SPP as Solana Privacy Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>Ring: CPI
              Note over Ring: Verify proof for custom compliance logic
              Ring->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              Note over ZK: Update Solana accounts (optional)

          ```
        </Tab>

        <Tab title="ZK Program and additional Solana Program">
          ```mermaid theme={"system"}
          %%{init: {
            'theme': 'base',
            'themeVariables': {
              'lineColor':           '#FF6B35',
              'primaryTextColor':    '#737373',
              'primaryBorderColor':  '#9CA3AF',
              'actorBkg':            '#FFFFFF',
              'actorBorder':         '#9CA3AF',
              'actorTextColor':      '#737373',
              'signalColor':         '#FF6B35',
              'signalTextColor':     '#737373',
              'labelBoxBkgColor':    '#FF6B351F',
              'labelBoxBorderColor': '#FF6B35',
              'noteBkgColor':        '#F5F5F5',
              'noteTextColor':       '#737373',
              'noteBorderColor':     '#9CA3AF'
            }
          }}%%
          sequenceDiagram
              box Offchain
              participant Client
              end
              box Onchain
              participant Runtime as Solana Runtime
              participant ZK as ZK Solana Program
              participant Ring as Custom Ring Program
              participant SPP as Solana Privacy Program
              participant Program as Solana Program
              end

              Client->>Runtime: Sign and send transaction
              Note over Runtime: Check signatures
              Runtime->>ZK: invoke
              Note over ZK: Verify proof for ZK program logic
              ZK->>Ring: CPI
              Note over Ring: Verify proof for custom compliance logic
              Ring->>SPP: CPI
              Note over SPP: Verify proof for private state transition
              Note over SPP: Update private state<br/>(nullify input UTXOs, create output UTXOs)
              ZK->>Program: CPI
              Note over Program: Update Solana accounts

          ```
        </Tab>
      </Tabs>
    </Tab>
  </Tabs>
</Accordion>

### Solana 프라이버시 프로그램(SPP)

Solana 프라이버시 프로그램은 영지식 증명을 검증하고 비공개 상태를 업데이트합니다. 토큰을 예치하고, 비공개 잔액을 전송하고, 공개 계정으로 토큰을 출금할 때 사용하세요.

다른 프로그램은 CPI를 통해 SPP를 호출하여 비공개 상태 전환을 실행합니다.

### 커스텀 링 프로그램

커스텀 링 프로그램은 Token-2022와 유사하게 전송 권한과 추가 권한 주체를 정의합니다. 이 프로그램을 사용하여 감사자를 구성하거나, 공동 서명자를 요구하거나, 권한 주체가 잔액을 동결할 수 있도록 설정하세요.

이 프로그램은 커스텀 규정 준수 로직을 적용하기 위해 ZK 증명을 검증한 후 SPP를 호출하여 비공개 상태를 업데이트합니다.

### ZK Solana 프로그램

영지식(ZK) Solana 프로그램을 사용하면 Solana 프로그램 내의 비공개 에스크로가 비공개 잔액에 애플리케이션 로직을 적용할 수 있습니다. ZK Solana 프로그램으로 비공개 스왑, 스테이킹, 대출 등을 구축할 수 있습니다. 예를 들어 기밀 스왑은 합의된 수량과 가격을 공개하지 않고도 이를 적용할 수 있습니다.

프로그램은 애플리케이션 로직의 ZK 증명을 검증한 후 직접 또는 커스텀 링 프로그램을 통해 SPP를 호출하여 비공개 상태를 업데이트합니다.

## 상태 머클 트리와 Forester

기본 링과 모든 커스텀 링은 Forester 노드가 유지 관리하는 상태 머클 트리 계정에 비공개 상태를 저장합니다.
트리 계정은 비공개 상태를 별도의 Solana 계정에 저장하지 않고 해당 상태를 커밋합니다.

따라서 `getAccountInfo` 같은 Solana 계정 메서드 대신 `getShieldedTransactionsByTags` 같은 전용 인덱서 RPC 메서드로 잔액과 트랜잭션 내역을 읽습니다. [비공개 잔액 읽기](/docs/ko/privacy/guides/read-balance) 및 [비공개 트랜잭션 내역 읽기](/docs/ko/privacy/guides/read-history)를 참조하세요.

### 처리량

트리는 쓰기 가능한 Solana 계정 하나에 저장됩니다.
이 계정에 쓰는 비공개 전송은 블록당 Solana의 계정별 1,200만 CU 쓰기 잠금 제한을 공유합니다.
서로 다른 UTXO는 독립적으로 사용할 수 있지만, 동일한 트리에 쓰는 트랜잭션은 여전히 Solana 계정 잠금과 컴퓨팅 제한을 공유합니다.

기밀 전송은 [명령 벤치마크](https://github.com/helius-labs/zolana/blob/a3ddedda42b40d4951ae8fcdde2500374c4f2125/program-tests/shielded-pool/CU_BENCHMARK.md#12-transfer-eddsa-2x3)에서 약 140,000 CU를 사용합니다.
따라서 트리 하나는 블록당 약 86건의 비공개 전송을 지원하며, 현재 약 400밀리초인 Solana 블록 시간을 기준으로 초당 약 215건의 트랜잭션을 지원합니다.

프로토콜은 처리량을 늘리기 위해 더 많은 트리를 추가할 수 있습니다.
각 트리는 자체 계정별 컴퓨팅 예산이 있는 별도의 쓰기 가능 계정이므로 서로 다른 트리의 트랜잭션은 동일한 쓰기 잠금 예산을 두고 경쟁하지 않습니다.

<a id="interface-pda-account" />

## SPL 인터페이스

SPL 인터페이스는 공개적으로 보유된 토큰과 비공개로 보유된 토큰 간의 상호 운용성을 지원합니다. 민트별 에스크로이며 무허가 방식으로 생성할 수 있지만
각 민트마다 한 번만 생성해야 합니다.

* SOL 및 SPL 자산을 비공개 잔액에 예치하면 Solana 프라이버시 프로그램이 소유한 인터페이스 PDA가 토큰을 에스크로하고 사용자를 소유자로 하는 UTXO를 생성합니다.
* 공개 잔액으로 출금하면 기존 UTXO가 사용된 것으로 표시되고 토큰이 Solana 토큰 계정으로 지급됩니다.

아직 인터페이스 PDA가 없는 민트의 경우 첫 예치 트랜잭션에 인터페이스 PDA를 생성하는 명령을 포함할 수 있습니다.

```mermaid theme={"system"}
%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#FFFFFF',
    'primaryTextColor': '#737373',
    'primaryBorderColor': '#9CA3AF',
    'lineColor': '#FF6B35',
    'edgeLabelBackground': '#FFFFFF'
  }
}}%%
flowchart LR
    GetAccount["Get account"] --> Exists{"Interface PDA exists?"}
    Exists -->|Yes| Deposit["Deposit to private balance"]
    Exists -->|No| Create["Create interface PDA<br/>and token account"]
    Create --> Deposit
```

<span id="creation-of-a-private-wallet" />

<span id="decryption-modes-and-wallet-sync" />

<span id="delegated-decryption" />

<span id="encryption-and-shielded-keypair" />

<span id="integrating-a-shielded-keypair" />

<span id="latency-and-concurrency" />

<span id="local-decryption" />

<span id="on-concurrency" />

<span id="private-solana-token-accounts" />

<span id="private-solana-token-accounts-are-utxos" />

<span id="private-wallet" />

<span id="private-wallet-balance" />

<span id="shielded-keypair" />

<span id="spending-a-utxo" />

## 자세히 알아보기

<CardGroup cols={2}>
  <Card title="Overview" icon="book" href="/docs/ko/privacy/concepts/overview">
    링, 프라이버시 보장 및 트랜잭션 흐름입니다.
  </Card>

  <Card title="Private State and UTXOs" icon="database" href="/docs/ko/privacy/concepts/utxo">
    비공개 잔액이 저장되고 사용되는 방식입니다.
  </Card>

  <Card title="Encryption and Privacy Guarantees" icon="key" href="/docs/ko/privacy/concepts/encryption">
    자산이 암호화되는 방식과 차폐 키 쌍의 역할입니다.
  </Card>

  <Card title="Custom Enterprise Rings" icon="building" href="/docs/ko/privacy/integration/enterprise">
    커스텀 링을 구성하는 방법을 알아보세요.
  </Card>
</CardGroup>

## 원하는 정보를 찾지 못하셨나요?

<Callout type="info">
  문의하세요! [Telegram](https://t.me/tilo_light) | [이메일](mailto:sales@helius.xyz) | [Typeform](https://form.typeform.com/to/LPFASU8a)
</Callout>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.