Skip to main content
비공개 잔액은 UTXO(미사용 트랜잭션 출력)에 저장됩니다. UTXO는 다음 두 가지 핵심 차이점이 있는 비공개 SPL 토큰 계정으로 생각할 수 있습니다.
  1. UTXO는 Solana 계정이 아니므로 임대료 면제가 필요하지 않습니다.
  2. 잔액은 온체인에서 암호화됩니다.
UTXO 데이터 레이아웃은 SPL 토큰 계정과 유사합니다.
  • 소유자 – Solana 키 쌍, PDA 또는 P-256 키입니다.
  • 자산 – 민트(SOL, SPL 또는 Token-2022)입니다.
  • 금액 – 최소 단위로 표시한 asset의 단위 수입니다.
  • 데이터 – UTXO는 에스크로된 토큰의 소유자와 같은 임의의 데이터를 저장할 수 있습니다.
  • 프로그램 및 정책 데이터 – 선택적으로 구성하는 Ring 규정 준수 데이터입니다.
비공개 Solana 토큰 계정입니다. Solana Privacy Program이 비공개 토큰 계정을 소유하며, 이 계정은 소유자, 자산, 금액, 데이터, 정책 데이터, 정책 프로그램 ID로 구성된 UTXO 필드로 확장됩니다.
Solana 토큰 계정입니다.

비공개 잔액

비공개 잔액은 비공개 지갑이 소유한 한 자산의 모든 UTXO를 합한 값입니다. 비공개 잔액이 하나 또는 여러 UTXO로 구성되어 있는지와 관계없이 지갑에는 하나의 잔액이 표시됩니다. 비공개 전송에서는 여러 UTXO를 한 번에 사용할 수 있습니다. 점선으로 여러 UTXO에 연결된 비공개 지갑입니다. 각 UTXO에는 한 자산의 특정 금액이 보관됩니다. 지갑 잔액은 UTXO의 합계입니다.

비공개 전송

UTXO를 사용하는 비공개 전송은 SPL 토큰 계정을 사용하는 공개 전송과 다르게 작동합니다.
  • SPL 토큰 계정에서 전송하면 amount이 업데이트됩니다.
  • UTXO를 사용하는 비공개 전송은 UTXO의 amount을 업데이트하지 않습니다. 대신 비공개 전송은 기존 UTXO를 사용하고 수신자와 발신자의 남은 잔액을 위한 새 UTXO를 생성합니다.
하지만 사용자가 체감하는 Solana 토큰 계정의 공개 전송과 UTXO의 비공개 전송 방식은 비슷합니다. 예를 들어 Alice가 50 USDC를 보유하고 있으며 Bob에게 35 USDC를 보냅니다.
  • SPL 토큰 계정을 사용하면 Alice의 amount은 50에서 15로 감소하고 Bob의 잔액은 35만큼 증가합니다.
  • UTXO를 사용하면 Alice는 50 USDC가 든 UTXO 하나를 보유합니다. 트랜잭션은 기존 UTXO를 사용하고 새로운 UTXO 두 개를 생성합니다. 하나에는 Bob의 35 USDC가, 다른 하나에는 Alice의 15 USDC가 들어갑니다.
UTXO 하나 사용

UTXO 선택

비공개 전송 시 SDK는 전송하려는 금액을 충당하는 미사용 UTXO를 선택합니다. UTXO 선택 알고리즘은 전송당 가능한 한 적은 수의 UTXO를 사용합니다.
  1. SDK가 전송할 자산을 기준으로 UTXO를 필터링하고 금액순으로 정렬합니다.
  2. SDK가 전송 금액을 충당하는 데 필요한 만큼 UTXO를 선택합니다. 전송 금액이 충당될 때까지 가장 큰 UTXO부터 선택합니다.
예를 들어 Alice가 Bob에게 80 USDC를 보냅니다. Alice가 보유한 가장 큰 UTXO 세 개로 전송 금액을 충당할 수 있습니다. Alice가 80 USDC를 보냅니다. Alice의 UTXO는 40, 25, 20, 10, 5 USDC 순으로 큰 금액부터 정렬됩니다. SDK는 80 USDC를 충당하는 40, 25, 20 USDC를 선택하고 10, 5 USDC는 선택하지 않습니다. UTXO 수가 적을수록 트랜잭션 크기가 작아집니다. 사용된 각 UTXO는 해당 UTXO가 사용되었음을 표시하는 무효화 계정에 66바이트를 추가합니다. 이 계정은 UTXO가 방지합니다. 추가 데이터나 다른 명령이 없는 비공개 전송의 예는 다음과 같습니다.

트랜잭션 변형

모든 비공개 전송은 트랜잭션 변형을 사용합니다. 트랜잭션 변형에는 사용할 UTXO와 생성할 새 UTXO를 위한 고정된 수의 슬롯이 있습니다. 변형은 사용되는 UTXO가 1개에서 36개인 범위이며, 각 변형에는 자체 ZK 회로가 있습니다. 이 회로는 사용된 UTXO가 유효하고 새 UTXO가 동일한 총액을 보유한다는 것을 증명합니다. 전송에 36개가 넘는 UTXO가 필요하면 먼저 병합하세요. SDK는 전송에 맞는 변형을 선택하고 사용하지 않는 슬롯을 더미 UTXO로 채웁니다. 더미 UTXO에는 가치가 없으며 온체인에서는 실제 UTXO처럼 보입니다.
Alice가 Bob에게 30 USDC를 보냅니다. Alice의 가장 큰 UTXO로 전송 금액을 충당할 수 있습니다.Alice의 40 USDC UTXO가 사용되고 25, 20, 10, 5 USDC UTXO는 미사용 상태로 유지됩니다. 트랜잭션은 Bob에게 30 USDC, Alice에게 10 USDC가 든 UTXO를 생성합니다.
소스 코드 보기: 사양 · 지원되는 변형

UTXO 병합

잔액을 사용하지 않고 여러 전송을 받으면 비공개 잔액이 여러 UTXO로 분할될 수 있습니다. 전송에 36개가 넘는 UTXO가 필요하면 먼저 병합하여 사용자가 전체 잔액을 한 번에 전송할 수 있게 하세요. 한 번의 전송에서 최대 36개의 UTXO를 사용할 수 있으므로 대부분의 사용자는 잔액 분할을 거의 경험하지 않습니다.
  • 병합은 소유자와 자산이 같은 UTXO를 총액이 동일한 UTXO 하나로 결합합니다.
  • 병합으로 자금을 사용하거나 소유자를 변경할 수 없습니다.
  • 최종 사용자 UX에 영향을 주지 않고 내부적으로 병합할 수 있습니다.
병합은 Alice가 보유한 각각 1 USDC가 든 UTXO 다섯 개를 사용하고 Alice를 위해 5 USDC가 든 새 UTXO 하나를 생성합니다. 한 번의 전송으로 전체 잔액을 사용하기 위해 필요한 병합 횟수는 잔액을 보유한 UTXO 수에 따라 달라집니다. 각 병합은 ZK 증명이 포함된 하나의 Solana 트랜잭션이며 최대 36개의 UTXO를 하나로 합칩니다. 병합 결과는 결정적이므로 병합 증명과 전송 증명이 병렬로 생성됩니다.

병합 명령 사용 예시

애플리케이션은 다음 두 시점에 병합할 수 있습니다.
  • 비공개 잔액을 동기화할 때: 지갑 잠금 해제, 비공개 지갑 열기, 앱 재개, 네트워크 재연결, 스트림 누락 또는 지갑 복원 시입니다.
  • 전송 전: 전송에 36개가 넘는 UTXO가 필요할 때입니다.
병합은 사용자 서명 없이 실행됩니다. 사용자 지정 Ring은 자체 병합 권한을 설정합니다. 내장 비공개 지갑을 사용하면 내부적으로 병합이 자동으로 수행됩니다.
예를 들어 비공개 지갑이 각각 1 USDC인 비공개 전송을 1,296번 받은 후 1,296개의 UTXO에 1,296 USDC를 보유하고 있다고 가정해 보겠습니다. 한 번의 전송으로 최대 36개의 UTXO를 사용할 수 있으므로 지갑은 다음 두 단계로 잔액을 사용합니다.
  1. 36개의 병합 트랜잭션을 병렬로 실행하여 각각 36 USDC가 든 UTXO 36개를 생성합니다.
  2. 입력이 36개인 한 번의 전송으로 1,296 USDC 전체 잔액을 사용합니다.

UTXO 동시성

사용자는 트랜잭션이 최종 확정되는 즉시 비공개 잔액을 사용할 수 있습니다. 비공개 잔액이 여러 UTXO로 분할되어 있으면 동시에 사용할 수 있습니다. 각 UTXO는 별도의 트랜잭션에서 동시에 사용할 수 있습니다. 예를 들어 각각 100 USDC인 UTXO 세 개로 구성된 잔액은 한 번에 최대 100 USDC인 전송 세 건에 자금을 제공할 수 있습니다. 지갑은 사용할 UTXO를 선택합니다. 각각 100 USDC인 Alice의 UTXO 세 개가 동시에 세 건의 전송에 자금을 제공하며, 전송마다 UTXO 하나를 사용합니다. 단일 UTXO는 한 번만 사용할 수 있습니다. 프로토콜의 처리량 한도는 상태 Merkle 트리 및 Forester를 참조하세요.

자세히 알아보기

Overview

Ring, 개인정보 보호 보장 및 트랜잭션 흐름을 알아보세요.

Architecture

지갑, RPC 서비스 및 Solana 프로그램이 상호 작용하는 방식을 알아보세요.

Encryption and Privacy Guarantees

자산이 암호화되는 방식과 보호된 키 쌍의 역할을 알아보세요.

Custom Enterprise Rings

사용자 지정 Ring을 구성하는 방법을 알아보세요.

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

문의하세요! Telegram | 이메일 | Typeform