프라이버시 프리컴파일
0x1000…000b에 위치한 정책 인지 프리컴파일을 통해 OKRW를 프라이버시 풀에서 관리합니다. 예치는 payable로 이뤄지며, 인출은 공개 수신자에게 정산되고, 전송은 풀 내부에서 유지됩니다.
0x100000000000000000000000000000000000000b에 위치한 프라이버시 프리컴파일은 프라이버시 풀 대상 OKRW 연산(deposit, transfer, withdraw, 각 인가 변형, 두 종류의 배치 변형)을 EVM에서 호출할 수 있는 표면으로 제공합니다. 이 표면은 정책 인지 프리컴파일 프레임워크로 감싸져 있습니다. 예치는 payable이며 금액은 네이티브 msg.value(aokrw 단위)에서 취합니다. 요청 struct 자체에는 노트 커밋먼트, 암호화된 노트, ZK 증명만 담깁니다. 상태를 바꾸는 모든 호출은 정확히 하나의 컨트랙트 범위 PolicyOperation을 노출하고, PCL이 실행 전후로 이를 평가하므로 컨트랙트 정책(denylist, 주기 상한 등)이 프라이버시 흐름에도 동일하게 적용됩니다.
아키텍처
flowchart LR
User[User dApp]:::evm
Relayer[Relayer / Executor]:::evm
Privacy[Privacy Precompile<br/>0x1000…000b]:::precompile
Recipient[Transparent Recipient]:::evm
User -- deposit / transfer / withdraw --> Privacy
User -- EIP-712 signed intent --> Relayer
Relayer -- ...WithAuthorization --> Privacy
Privacy -- withdraw payout --> Recipient
classDef evm fill:#0096AA,stroke:#0096AA,color:#fff;
classDef precompile fill:#FF8C50,stroke:#FF8C50,color:#fff; 직접 호출자는 자신의 지갑에서 Privacy 프리컴파일을 호출합니다. 위임 호출자는 오프체인에서 EIP-712 인증에 서명하고, 릴레이어가 `…WithAuthorization` 변형을 대신 제출합니다. 인출은 투명한 EVM 수신자에게 정산됩니다.
메서드 표면
인터페이스는 상태를 바꾸는 아래 메서드들을 제공하며 view 메서드는 없습니다.
| 메서드 | payable | 용도 |
|---|---|---|
deposit | 예 | 네이티브 OKRW를 프라이버시 풀에 예치합니다. 금액은 msg.value에서 취합니다. |
transfer | 아니오 | 풀 내부에서 프라이버시 노트를 이동합니다. |
withdraw | 아니오 | 공개 수신자에게 정산 인출을 수행합니다. |
transferWithAuthorization | 아니오 | transfer와 동일하며, 서명된 인가에 따라 대행자가 실행합니다. |
withdrawWithAuthorization | 아니오 | withdraw의 대행 실행입니다. |
batchTransfer | 아니오 | 하나의 배치 id 아래 여러 개의 독립 전송을 처리합니다. |
batchTransferWithAuthorization | 아니오 | 대행 배치 전송입니다. |
singleProofBatchTransfer | 아니오 | 여러 입출력을 하나의 집계 ZK 증명으로 처리합니다. |
singleProofBatchTransferWithAuthorization | 아니오 | 대행 단일 증명 배치 전송입니다. |
depositWithAuthorization은 존재하지 않습니다. 예치는 operator(msg.sender)가 실질 발신자와 동일해야 하므로, 예치자 본인의 서명이 곧 해당 연산을 보증합니다.예치 금액은 msg.value로 전달
deposit에 전달하는 request struct는 { bytes noteCommitment; bytes encryptedNote; bytes proof; }이며 amount 필드가 없습니다. 예치 금액은 런타임 네이티브 denom(aokrw) 기준으로 msg.value에서 도출합니다. PrivacyDeposit 이벤트는 여전히 Cosmos 코인 문자열 형식으로 금액을 기록하므로(예: 1,000만 OKRW의 경우 "10000000000000000000000000aokrw"), 다운스트림 인덱서가 표준 값을 볼 수 있습니다.// 1,000만 OKRW 예치.
PRIVACY.deposit{value: 10_000_000 ether}(PrivacyDepositRequest({
noteCommitment: commitment,
encryptedNote: encNote,
proof: zkProof
})); 정책 인지 래핑
이 프리컴파일은
vm.PrecompiledContract를 직접 구현하지 않습니다. privacy-policy-aware-precompile에서 다루는 정책 인지 래퍼와 원시 executor의 조합으로 구성됩니다. 래퍼는 executor가 각 호출에 대해 준비한 단일 PolicyOperation을 받아 PCL의 평가 전 → 실행 → 평가 후 → 기록 흐름을 진행합니다. 프라이버시 전송의 숨겨진 금액은 해당 operation에서 value = 0으로 모델링되므로, 신원 정책과 denylist 정책은 여전히 실행되면서도 검증 불가능한 주기 거래량은 기록되지 않습니다. 반면 공개 예치는 실제 msg.value를 담고 있어 거래량 상한 산정에도 포함됩니다.