Rand Protocol
문서
개발자

개발자

다섯 개의 저장소, 기술 스택, Rand zkVM과 그 마일스톤, shielded pool의 단계, v0.5 작업과 그 이후의 릴리스(chain 20의 v0.6.8까지), fullnode의 소스 구성, 명세는 되어 있으나 출시되지 않은 항목, 그리고 빌드·테스트·기여 방법을 다룹니다.

Rand는 오픈 소스입니다. 풀 노드, 익스플로러, 브리지, 증명 연구, 지갑 클라이언트는 각각 GitHub의 별도 저장소에 있습니다. 코드를 읽고, 테스트를 실행하고, 패치를 보내 주십시오. 이 페이지는 안내도입니다. 각 구성 요소가 어디에 있는지, 무엇으로 만들어졌는지, 증명 시스템이 어디까지 발전했는지, 그리고 현재 어디에서 한계에 이르는지를 설명합니다.

저장소

저장소담고 있는 것언어
randprotocol/fullnode참조 풀 노드와 지갑: 체인형 HotStuff BFT, libp2p 네트워킹, shielded RAND 노트 풀, zkVM 증명 검증기, JSON-RPC, rand 지갑 CLI, 위임형 증명기 rand-prover.Rust
randprotocol/randscan.orgrandscan.org를 구동하는 블록 익스플로러: PostgreSQL 기반의 REST 및 WebSocket API를 갖춘 axum 인덱서와 Next.js 프런트엔드.Rust · TypeScript
randprotocol/bridgeEthereum, Binance Smart Chain, Tron, Solana에서 USDT와 USDC를 옮기는 가디언 브리지: 수탁 컨트랙트, 공통 증명서(attestation) 형식과 그 테스트 벡터.Solidity · Rust
randprotocol/zkp-circuits증명 시스템 해설(Groth16 대 STARK, shielded 풀, 링 서명, 믹서), research/, Rand 참조 zkVM, recursion/, 재귀 VM, 게스트 툴체인과 두 개의 변환기, 그리고 CUDA 커널. fullnode 빌드에는 이 저장소가 circuits/라는 이름으로 나란히 체크아웃되어 있어야 합니다.Rust
randprotocol/clients지갑 클라이언트: 데스크톱, 웹, iOS, Android.Rust · Swift · Java · JavaScript

스택

처음부터 끝까지 Rust입니다. Rand는 독자적인 체인입니다. libp2p 가십 계층을 갖춘 HotStuff BFT 노드, 원장 역할을 하는 완전 shielded 노트 풀, 양자 내성 서명과 노트 암호화, 기밀 연산을 위한 Rand zkVM이 모두 fullnode 저장소에 있습니다. 증명 시스템 자체는 아래에서 설명하는 것처럼 활발히 연구 중인 부분입니다.

계층구성
합의체인형 HotStuff BFT, 지분 가중 쿼럼, 3-체인 커밋
네트워킹libp2p: TCP, Noise, Yamux, gossipsub, Kademlia, LAN에서는 mDNS
원장Shielded 노트 풀: 깊이 32의 Poseidon2 트리, 널리파이어 집합, 트랜잭션당 하나의 4-in-4-out 숨김 자산 번들(체인 13까지는 2-in-2-out). 체인 17부터는 번들 증명과 함께 두 번째 증명인 tier-10 인증 증명(분할 승인), 체인 18부터는 암호화된 메모가 포함된 1,860바이트 노트 봉투
토큰RPL: 토큰은 컨트랙트가 아니라 rpl1… id를 가진 원장 레지스트리 항목이며, 같은 풀에서 노트로 이동합니다
스테이킹공개 검증자 등록부: 번들에서 본딩, 2 에포크의 언본딩, 1,000블록 에포크. 체인 20부터는 새 검증자를 기존 검증자 집합의 투표로 승인합니다
기밀 연산Rand zkVM: Plonky3 배치 STARK 아래의 RV32IM, ZK 은닉 FRI, 제약 집합 8. 체인 18부터 호출은 회로가 강제하는 가스 한도를 선언하고 가스당, KiB당 요금을 지불합니다. 체인 20부터 프로그램은 셀에 상태를 보관하고 볼트(RPL-2)에 가치를 보유합니다
암호Dilithium2 · ML-KEM-768 · Poseidon2 · BLAKE3 · ChaCha20-Poly1305
스토리지노드당 하나의 RocksDB, fsync된 커밋, 시작 시 무결성 검사. 선택적 이력 정리(--prune-history 24h)를 지원하며 아카이브 노드는 모든 것을 보존합니다
브리지네 체인에서 가디언이 증명한 락, 모든 민트에 대한 Dilithium2 공동 서명 쿼럼. 브리지된 자산은 같은 풀의 노트입니다
언어전반적으로 Rust. 브리지는 Solidity, 익스플로러는 TypeScript

모든 프로그램을 위한 하나의 관계

백서의 범용 실행 관계 R_exec는 코드로 존재합니다. rand_zkvm은 Goldilocks 필드 위의 Plonky3에서 단일 배치 STARK로 증명되는 RV32IM 머신입니다. 이는 솔트가 적용된 H_IN으로 커밋된 입력에 대해 어떤 트레이스가 프로그램 hc를 실행하여 이 공개 출력에 이르렀음을 증명하며, 프로그램에 관한 어떤 것도 검증기의 매개변수가 되지 않습니다. 기밀 프로그램을 게시한다는 것은 해시를 등록하는 것이지, 맞춤형 회로를 생성하는 것이 아닙니다.

이 증명 시스템은 투명하며 신뢰 설정도 페어링 곡선도 필요 없고, 그 가정은 충돌 저항성 해시입니다. 증명을 다루는 다른 모든 구성 요소는 각자 별도의 방식을 만들기보다 이 크레이트로 수렴할 것으로 기대됩니다. 이 크레이트는 zkp-circuits/research에 있으며, 제약 집합 8로 fullnode에 벤더링되어 있습니다(circuits aeacf31, fullnode v0.6.7 및 v0.6.8). 아래의 표와 측정값은 특정 줄에서 이후 집합을 명시하지 않는 한 제약 집합 5(마일스톤 M4.2)를 기준으로 하며, 2026-09-13 시점의 fullnode docs/zkvm.md, docs/zkvm-milestones.md, docs/confidential.md에서 가져온 것입니다. 측정값은 목표치가 아니라 Apple Silicon 노트북에서 측정된 값 그대로 인용합니다.

이름 붙은 버스 위의 여덟 개 테이블과, 필요할 때의 아홉 번째 테이블

하나의 커밋먼트, 하나의 FRI 오프닝입니다. 테이블은 서로를 호출하지 않으며, 이름 붙은 LogUp 버스(PROGRAM, PROGRAM_WORD, MEMORY, ALU, POSEIDON2, INPUT_DIGEST, INPUT_READ, KECCAK, 그리고 범위 및 니블 룩업)를 통해 사실을 주고받고, 검증기는 모든 버스가 전역적으로 균형을 이루는지 확인합니다. 모든 테이블의 최대 제약 차수는 FRI 블로업이 허용하는 상한 8 아래로 테스트에 의해 고정되어 있습니다.

테이블종류역할
program증인(witness)M3.4부터 회로 내에서 디코딩되는 원시 명령어 워드이며, cpu가 hc로 다이제스트합니다
cpu증인(witness)사이클당 한 행, 그리고 프로그램을 hc로, 솔트가 적용된 입력을 H_IN으로 흡수하는 다이제스트 행
memory증인(witness)레지스터와 RAM을 하나의 테이블에 담고 (space, addr, ts) 순으로 정렬. M2.5부터 서브워드 접근 지원
alu증인(witness)바이트 리임 산술, 시프트, 비교. M2.6부터 RV32M 곱셈과 나눗셈 지원
range사전 처리됨 · 256행범위 검사와 2의 거듭제곱 룩업
nibble사전 처리됨 · 256행4비트 AND, OR, XOR. 적중 자체가 두 피연산자에 대한 범위 검사입니다
poseidon2증인(witness)32행 블록 단위로 순열 라운드당 한 행. POSEIDON2 버스와 두 다이제스트에 사용됩니다
input증인(witness) · M4.1부터비공개 입력 워드당 한 행. INPUT_DIGEST와 INPUT_READ에 사용되므로 읽기가 커밋먼트를 벗어날 수 없습니다
keccak증인(witness) · 선택32행 블록의 Keccak-f[1600]. 게스트가 KECCAK을 호출한 증명에만 존재합니다(M4.2)

이후 세 개의 제약 집합이 추가되었습니다. 집합 6은 배포 시점의 프로그램 공개 입력을 위한 필수 public 테이블(솔트 없는 다이제스트 H_PUB에 결합)과, keccak 옆의 선택적 sha256 테이블을 추가했습니다. 집합 7(체인 16)은 모든 LogUp 종단을 새로운 BLIND 버스로 블라인딩하고 선언된 모든 테이블에 2⁷행의 하한을 두며, 길이 결합형 POSEIDON2_LEN 시스콜을 추가합니다. 집합 8(체인 18)은 cpu 테이블에 GAS 열을, 그리고 선언된 GAS_LIMIT라는 하나의 공개 값을 추가합니다.

증명이 드러내는 것

공개: 코드 해시 hc(회로 내 다이제스트 워드 8개), 솔트가 적용된 입력 커밋먼트 H_IN(워드 8개), 가스 티어, 그리고 출력 워드 8개. 제약 집합 6부터는 공개 입력의 다이제스트인 H_PUB도, 제약 집합 8부터는 선언된 가스 한도도 공개됩니다. 증명 헤더는 Keccak 및 SHA-256 테이블의 높이를 선언하므로, 호출이 해시를 수행했는지 여부와, 2⁷ 하한을 넘는 경우 대략 얼마나 수행했는지가 드러납니다.

숨김: 비공개 입력(H_IN은 솔트가 적용되어 있으므로 결합할 뿐 아니라 은닉도 합니다). 검증기는 hc만 확인하고 프로그램은 확인하지 않으므로 모든 명령어 워드. 모든 레지스터와 메모리 값. 실행된 모든 분기. 정확한 사이클 수와 정확한 가스 사용량. 그리고 두 해시 테이블의 높이로 드러나는 부분을 제외한 실행된 시스콜.

STARK의 크기가 이미 트레이스 높이를 드러내므로 티어는 증명마다 공개됩니다. 인덱스를 숨겨도 얻는 것이 없습니다. hc는 결합적일 뿐 은닉적이지 않습니다. 현재 어디에서 한계에 이르는지를 참조하십시오.

제약 집합 5 기준 측정값

FRI쿼리 80개 · PoW 20비트 · 블로업 8 · 아리티 8 · ZK 켜짐. 추측 기준 260비트, 증명 기준 약 86비트. M2의 27쿼리 재조정은 2026-09-12 감사에서 되돌려졌습니다
호출티어 10의 private_payment: 증명에 약 7초, 80쿼리에서 증명 크기 약 1.2 MB(27쿼리에서는 435 KB). M1의 21.6초, 892 KB에서 줄어든 값입니다
전송체인 13까지의 2-in-2-out 번들 게스트: 3,811 워드, 약 9,160 사이클, 티어 14. 증명에 약 100초, 증명 크기 약 1.3 MB. 체인 14의 4-in-4-out 숨김 자산 게스트도 같은 티어로 고정되어 있습니다. 약 100초, 약 1.42 MB
검증키가 준비된 상태에서 약 16 ms. 새로운 (티어, 높이) 키에서의 첫 검증은 약 230 ms
블록4 MiB 예산과 2 MiB 증명 상한: 80쿼리에서 블록당 shielded 전송 약 세 건

Apple Silicon 노트북, 릴리스 빌드입니다. M2.3의 바이트 테이블 분할이 증명 시간을 바꾸었고, 80쿼리 프로파일이 증명 크기를 다시 늘렸습니다. 검증기 키는 프로그램 내용과 무관하며 티어와 증명이 선언한 프로그램, 입력, keccak 높이로 식별되므로, 노드는 하나의 키를 준비해 두고 재사용합니다.

이후의 제약 집합(constraint set)에서 크기가 다시 바뀌었습니다. 제약 집합 7에서 tier-10 증명은 프로덕션 프로필 기준 1,367,688바이트이고, Keccak을 포함한 tier-10 증명은 3,283,898바이트입니다(2026-09-28 측정). chain 17부터 전송에는 증명이 두 개 포함됩니다. 약 1.49 MB의 tier-14 번들 증명과, 약 1.37 MB이며 증명에 약 7초가 걸리는 tier-10 인증 증명입니다. chain 20의 제네시스는 블록 20 MiB와 증명 상한 4 MiB를 설정하며, 호출은 tier 14를 초과할 수 없습니다.

세 가지 대상, 하나의 회로

RISC-V만 네이티브로 실행됩니다. Solidity와 Solana 프로그램은 바이트코드를 입력으로 받아 동일한 관계 안의 인터프리터 게스트에서 실행되거나, 오프체인에서 RISC-V 프로그램으로 변환되며, 변환된 프로그램의 출력은 인터프리터의 출력과 워드 단위로 일치합니다. 비용이 큰 오피코드는 비트 단위 시뮬레이션 대신 전용 코프로세서 테이블을 필요로 합니다.

대상경로코프로세서
RISC-V네이티브. RV32IM이며, asm.rs로 직접 어셈블하거나 riscv32im-unknown-none-elf용 no_std Rust로 컴파일하여 M4.1부터 플랫 바이너리로 로드하거나, rand-guest가 Rust 또는 C로부터 이미지 컨테이너로 빌드합니다(Rust 프로그램 배포)Poseidon2(세트 7부터 POSEIDON2_LEN 포함); M4.2부터 Keccak-f[1600]; 세트 6부터 SHA-256
Soliditysolc --bin-runtime으로 EVM 바이트코드를 만든 뒤, evm.bin 인터프리터 게스트(바이트코드를 입력으로 사용)로 실행하거나, 바이트코드를 C로 변환하는 evm2rv를 사용합니다. 이 C를 rand-guest가 동일한 출력의 RV32IM 이미지로 빌드합니다(Ethereum 트랜스파일러)Keccak-256(테이블 제공), 256비트 모듈러 산술, ECRECOVER, 스토리지용 Merkle 증인 시스템 콜
Solana / SVMsBPF ELF이며, sbpf.bin 인터프리터 게스트로 실행하거나 sbpf2rv로 동일한 출력의 RV32IM 이미지로 변환합니다(Solana 트랜스파일러)SHA-256, Ed25519 검증, 64비트 곱셈

마일스톤

마일스톤 1에서는 범용 머신을 증명했습니다. 마일스톤 3에서는 이를 차폐 풀(shielded pool)로 발전시켰습니다. 회로 내 멤버십을 갖춘 전송이 R_exec 아래에서 증명되며, 검증자는 프로그램 워드를 전혀 보지 않고 hc를 확인합니다. 마일스톤 4는 호환성입니다. 로더, 입력 커밋먼트, Keccak 테이블은 제약 집합 4와 5로, SHA-256 테이블은 세트 6으로 출시되었습니다. EVM 및 sBPF 인터프리터 게스트, rand-guest 툴체인, 두 변환기가 구축되어 있습니다. ERC-20 전송은 128 GB 머신에서 증명되었으나, tier 20의 SPL Token 증명은 아직 이루어지지 않았습니다. 마일스톤 5는 블록 집계의 기반이 되는 재귀 VM이며, 구축되어 있고 모든 체인에서 꺼져 있습니다. 제약 집합 7과 8은 9월의 리뷰와 가스 모델 이후에 이어졌습니다.

id범위종료 기준상태
M1다섯 개의 테이블, RV32I 기본 ISA, HALT/WRITE_OUTPUT/READ_INPUT, ZK 활성화, tier 패딩, 어셈블러, 에뮬레이터fib, memcpy, bubble_sort, alu_mix, balance_check가 증명 및 검증되며, 모든 부정 행위 테스트가 거부됨완료. 테스트 44개; 이후 리뷰에서 건전성 결함 다섯 개를 한 차례에 해소
M1.5뷰잉 키: 1입력 1출력 차폐 전송 게스트, ML-KEM-768과 ChaCha20-Poly1305 기반 노트 봉투, 당사자 및 트랜잭션 범위 공개, 시뮬레이션 원장전송이 tier 12에서 증명되고 원장이 이를 수락함; 각 공개 범위는 자신의 행만 열람시킴; 뷰잉 키로는 지출할 수 없음완료. 노드에는 벤더링되지 않음
M2검증 키 캐시, 100비트 추측 목표로 재조정한 FRI, 범위 테이블과 니블 테이블로 분리한 바이트 테이블, 서브워드 로드와 스토어, RV32M 확장계획보다 좁게 전달됨: 플랫 바이너리 로더와 더 견고한 READ_INPUT 바인딩은 M4.1로 이월됨완료. tier 10의 fib: 증명 892 KB에서 268 KB로, 증명 시간 21.6초에서 3.1초로, 최초 검증 2.17초에서 16 ms로. 제약 집합 3, 하드 포크
M3Poseidon2 칩과 시스템 콜; 그 위의 게스트 루틴으로서 NOTE_COMMIT, NULLIFY, MERKLE_VERIFY; 공개 출력에서 제외된 소비 커밋먼트; 증인으로서의 프로그램 테이블과 회로 내에서 다이제스트되는 hc전송 관계가 회로 내 멤버십과 함께 R_exec 아래에서 증명되며, verify(hc, proof)는 프로그램 워드를 전혀 보지 않음완료. 전송 게스트: 명령어 4,554개, 4,903 사이클, tier 14. Merkle 순회는 이제 횟수가 정해진 루프이므로 프로그램 크기가 트리 깊이에 따라 늘어나지 않음
CUDAGPU 증명자 백엔드: Plonky3의 Dft 및 Mmcs 트레이트 뒤에 CUDA 커널로 구현한 NTT와 Poseidon2 Merkle 커밋먼트; rand send, call, deploy가 --cuda를 받음모든 게스트가 순수 Rust 참조 트윈과 모의 드라이버를 통해 증명 및 검증됨; CPU 검증자는 백엔드를 구별할 수 없음완료; 2026-09-28 하드웨어에서 첫 실행. NVIDIA H100에서 커널이 sm_80과 sm_90용 PTX로 빌드되며 CPU 및 Plonky3 참조와 일치함. 플릿 GPU 노드에서의 프로덕션 재측정은 아직 남아 있음. CUDA 호출은 입력 봉투를 봉인할 수 없음. 솔트가 증명자 밖으로 나가지 않기 때문임
M4.1플랫 바이너리 로더와 riscv32im-unknown-none-elf용 최초의 컴파일된 no_std Rust 게스트; 자체 입력 테이블을 갖춘 솔트 입력 커밋먼트 H_IN, 따라서 READ_INPUT은 커밋된 벡터에 대한 룩업임표준 툴체인으로 빌드한 게스트가 로드, 증명, 검증됨; 동일한 입력 인덱스를 두 번 읽으면 일치하며 입력이 H_IN에 바인딩됨완료. 2026-09-11 제약 집합 4로 반영: 공개 값 26개, 테이블 여덟 개, 하드 포크
M4.2직접 작성한 Keccak-f[1600] 코프로세서 테이블과 KECCAK 시스템 콜로, 게스트가 사용한 경우에만 증명에 포함됨; 증명이 선언하는 메모리 높이; 네 가지 구성 요소를 키로 하는 검증 키; 2026-09-12 감사 이후 80 쿼리로 되돌린 FRIkeccak256이 컴파일된 게스트로서 증명되며, 테이블이 없는 증명은 M4.1의 증명과 형태가 바이트 단위로 동일함완료. 2026-09-12 제약 집합 5로 반영, 하드 포크. Keccak을 포함한 증명은 약 1.9 MB 더 크며 기본 상한 2 MiB를 초과함. 제네시스에서 상한을 높인 체인은 이를 수용함: chain 13(8 MiB)은 2026-09-19에 3.41 MB의 Keccak 포함 호출을 받아들였고, chain 20의 상한은 4 MiB임
M4.3 · M4.4RV32IM으로 컴파일되어 외부 바이트코드를 입력으로 받는 EVM 및 sBPF 게스트 인터프리터; Keccak과 나란히 놓인 SHA-256 코프로세서 테이블; 이어서 rand-guest 툴체인과 evm2rv, sbpf2rv 변환기(2026-09-18)ERC-20 전송과 SPL Transfer가 각각 R_exec 아래에서 증명됨구축됨; 종료 증명은 하나 완료. evm.bin(18,009 워드)과 sbpf.bin(8,317)이 ERC-20 및 SPL Token 벡터를 실행하며, 변환된 이미지는 이들과 워드 단위로 일치함. ERC-20 transfer는 2026-09-19에 128 GB 드롭릿에서 tier 18로 증명되었음(최대 85.0 GB, 53.8분). tier 20의 SPL Token 증명은 약 330 GB로 외삽되며 아직 이루어지지 않았음(증명 메모리). 둘 다 체인에서 호출할 수 없음: 호출은 tier 14로 제한됨
M5재귀 VM(rVM): Rand zkVM 증명을 검증하는 프로그램을 실행하는 24개 명령어의 Goldilocks 네이티브 머신, 내부 증명 형태마다 하나의 N-제네릭 집계 프로그램, CPU와 CUDA 백엔드 분리, 자체 검증자(M5.1M5.4, 2026-09-132026-09-16)실제 프로덕션 번들 증명 50개가 수락되고 변조된 50개가 명시된 단계에서 거부됨; 실제 번들 증명 하나에 대한 검증자 프로그램의 rVM 증명이 네이티브에서 검증됨(테스트 프로필)구축됨; 프로덕션 증명에는 대형 머신이 필요함. crates/randprotocol-rvm으로 벤더링됨. 체인 측 집계는 병합되었으며 모든 체인에서 꺼져 있음(아래)
set 7모든 LogUp 종단 블라인딩; 선언된 모든 테이블에 2⁷행 하한; 입력, 공개, 솔트 워드에 대한 32비트 범위 검사; POSEIDON2_LEN 시스템 콜; JALR 수정; key_derivation_v2로 솔트를 적용한 검증 키검증 키를 바꾸는 2026-09-27 및 28 zkVM 리뷰의 수정 사항을 한 번의 컷으로 반영완료. Fullnode v0.6.1, chain 16(2026-09-28), 하드 포크
set 8가스 미터: cpu 테이블의 GAS 열과 공개 GAS_LIMIT, 회로 내에서 증명되는 GAS ≤ GAS_LIMIT; 실행의 정확한 가스는 비공개로 유지됨호출은 자신이 선언한 한도만큼 비용을 지불하며, 모든 번들 증명은 동일하게 고정된 한도를 선언함완료. Fullnode v0.6.7-rc1, chain 18(2026-09-29), 하드 포크. bundle_gas_limit은 20,479

차폐 풀 단계

fullnode의 원장은 세 단계로 반영되었으며, 각 단계는 하드 포크입니다(docs/shielded.md §7). S1은 계정 원장을 노트 풀로 대체했고, S3는 브리지를 노트로 되살려 먼저 반영되었으며, S2는 그 위에 스테이킹을 올렸습니다. 세 단계 모두 main에 있으며 현재 체인에 반영되어 있습니다.

Rand의 v0.5 작업은 S2 아래의 행들입니다. 모든 행이 하드 포크이며, 하나의 새 체인인 chain 14로 묶어 빌드 b3c594c에서 2026-09-20에 컷했고, 배포된 소스 엔드포인트를 통한 zUSD 왕복 거래를 라이브로 확인한 뒤 같은 날 v0.5로 태그했습니다. 2026-09-26부터 v0.5.8 이후 버전으로 운영된 chain 15는 이 모두를 담았고, 감사 v4와 v5의 제네시스 게이트 수정 사항을 활성화했습니다. 에포크별 예산이 있는 허용 목록 기반 파우셋, 지연된 본드 활성화, 스테이크 가중치 상한, 제네시스에 결속된 등록, consensus_domain 1, 브리지 규칙 v2와 토큰 레지스트리의 상한, 소각되는 등록 수수료, 2⁶³ 노트 한도가 그것입니다. 2026-10-01 06:17 UTC부터 v0.6.8(c9c9bd3c)로 운영 중인 chain 20은 chain 19의 하드 포크로서 이 모두를 유지하고, v0.6 릴리스의 작업을 더했습니다. 이는 아래에 정리되어 있습니다.

id범위완료 기준상태
S1풀 자체: 노트, 2-in-2-out 증명 번들, 깊이 32의 Poseidon2 커밋먼트 트리와 널리파이어 집합, 로컬 프루버를 갖춘 rand 지갑, 편집된 RPC지갑 간 차폐 전송, 두 밸리데이터 사이의 이중 지불 경쟁, 번들로 비용을 지불하는 배포 및 호출이 클러스터 테스트 스위트에서 모두 통과완료. chain 6(2026-09-12)부터 공개 플릿에서 운영 중
S3노트로서의 브리지: 브리지된 보유분은 레지스트리의 자산 인덱스를 지니고, 어테스테이션은 체인이 스스로 계산하는 노트 하나를 예치하며, BridgeBurn은 두 번들로 이루어진 유일한 트랜잭션입니다. 호출 입력을 위한 봉인된 엔벨로프는 호출자, 호출별 키 또는 지정된 감사자가 열 수 있습니다브리지된 자산이 노트로 발행, 지출, 소각됨. 호출자는 프로그램이 무엇을 입력으로 실행했는지를 공개하지 않고도 공개할 수 있으며, rand open-call은 그 열람 내용을 H_IN과 대조해 확인완료. 가장 먼저 반영됨. chain 9부터 13까지는 제네시스에서 브리지 섹션을 뺐고, chain 14 이후의 모든 체인에는 있음. chain 14부터 소각은 두 번들이 아니라 한 번들
S2차폐 체인의 스테이킹: 공개 밸리데이터 레지스터, 번들의 소각분으로 하는 Bond, 두 에포크에 걸친 Unbond, 페이아웃 주소의 노트로 받는 Withdraw, 집합을 다시 도출하는 1,000블록 단위의 에포크, 레지스터와 풀에 대한 공급량 감사다섯 번째 밸리데이터가 등록하고, 본드하고, 다음 에포크부터 제안함. 한 밸리데이터가 집합에서 언본드하고 페이아웃 지갑이 지출하는 노트로 인출함. 둘 다 클러스터 테스트 스위트에서 통과완료. 지갑의 로컬 커밋먼트 트리가 2026-09-21에 뒤따름: 지갑이 자체 증인을 계산하며 더 이상 어느 리프를 지출하는지 노드에 알리지 않음
RPL토큰 표준(docs/tokens.md): 토큰은 원장 안의 레지스트리 항목이며 62자의 rpl1… bech32m id를 가집니다. 생성은 RAND로 내는 등록 수수료만 있으면 누구나 할 수 있고, 발행 권한은 등록 시 없음, 키 또는 브리지로 고정됩니다. 심볼은 고유하지 않습니다. rand token create, mint, set-authority, burn, info, list, 그리고 rand_getTokens, rand_getToken, rand_getTokenSupply토큰이 같은 풀 안에서 노트로 등록, 발행, rand send --asset으로 전송, 소각됨chain 14(v0.5)부터 운영 중. chain 20에서 등록 수수료는 1 RAND이며 소각되고, 레지스트리는 최대 4,096개의 토큰을 담으며, 제네시스는 zUSD를 인덱스 1에 등재함
RPL-2프로그램 상태(docs/program-state.md): 프로그램별 셀(8워드 키에서 8워드 값으로, 상태 루트에 포함), 자산별 공개 볼트, 해당 프로그램만 발행할 수 있는 토큰, 그리고 Invoke 액션(Action 33). 이는 읽고 쓰는 셀과 지급하는 노트를 선언하는 호출입니다. rand program invoke, state, vault, 그리고 rand_getProgramCell, rand_getProgramCells, rand_getProgramVault원장은 선언된 모든 읽기가 여전히 유효하고 볼트가 모든 지급액을 충당할 때에만 전이를 적용함. 오래된 읽기는 거부되고 다시 증명됨chain 20(v0.6.8)부터 운영 중. cell_fee는 셀 하나를 생성할 때마다 0.01 RAND이며, invoke 한 번에 읽기 최대 8개, 쓰기 최대 8개, 지급 최대 4개. 프로그램 참조
숨겨진 자산 번들모든 트랜잭션은 2-in-2-out 번들 대신 정확히 하나의 4-in-4-out 번들을 담습니다. 슬롯 0–1은 비공개 자산을 담고(RAND만 전송할 때는 더미), 슬롯 2–3은 항상 RAND이며 수수료를 지불합니다. 두 번들 토큰 전송과 두 번들 브리지 소각은 사라졌습니다RAND 전송과 모든 RPL 토큰 전송이 동일한 형태로 공개되므로, 이동한 자산이 숨겨짐chain 14(v0.5)부터 운영 중. 티어 14, 증명에 약 100초, chain 14와 15에서 증명 크기 약 1.42 MB. 그곳의 hc_bundle은 83d3a370…. chain 18부터 20까지는 번들 게스트 v3, hc_bundle 60af094a…, 약 1.49 MB로 고정
트랜잭션 바인딩모든 번들 증명은 공개 입력 세그먼트에 담긴 H("rand-tx-bind-1", chain_id ‖ tx with proofs blanked)를 대상으로 만들어지고 이에 대해 검증됩니다변경된 목적지, 밸리데이터 또는 메모로 다시 제출된, 복사된 미수정 증명은 거부됨chain 14(v0.5)부터 운영 중. chain 20(binding_domain 1)부터 프리이미지는 H("rand-tx-bind-2", genesis hash ‖ chain_id ‖ …)이며, 서명된 모든 액션 메시지도 제네시스 해시를 담으므로, 한 체인을 위해 증명되거나 서명된 것은 다른 체인에서 검증되지 않음
B1–B4브리지 강화(docs/bridge.md §§14–20). B1: 백킹별 일일 발행 상한, 그리고 정지만 할 수 있는 정지 키(정지 해제에는 PQ 쿼럼이 필요). B2: 부모보다 60초를 넘어 앞선 블록 타임스탬프는 무효이며, 밸리데이터는 자신의 시계보다 15초를 넘어 앞선 블록에는 투표하지 않으므로 밸리데이터에게 NTP가 필요함. B3: 모든 발행에 대한 Dilithium2 공동 서명 쿼럼. B4: PQ 가디언 쿼럼 아래에서 제네시스 이후에 브리지된 토큰이나 백킹을 등재하며, 체인 컷은 없음하나의 토큰에 일곱 개의 백킹(Ethereum, Binance Smart Chain, Tron, Solana의 USDT와 USDC)을 가진 zUSD가 트랜잭션으로 등록되며, total_supply == Σ backings.locked가 구조상 성립함. 로컬 9단계 게이트(zusd_e2e.rs: 밸리데이터 4개, 실제 증명, 파우셋에서 등록, 예치, 전송, 소각, 감사까지)는 9개 중 9개를 통과chain 14(v0.5)부터 운영 중. chain 20에서: 백킹별 하루 100,000 zUSD의 발행 상한에 더해 롤링 24시간당 전체 4,000 zUSD(브리지 규칙 v2), 여덟 명의 PQ 가디언으로 이루어진 가디언 집합 1, 발행과 소각마다 zUSD로 부과되는 10 bps 수수료(bridge.fees), 그리고 보유를 요구하며 86,400초를 기다리는 가디언 교체(bridge.rotation). zUSD는 chain 20의 제네시스에 일곱 개의 백킹과 컷 시점에 잠긴 99 zUSD와 함께 등재됨
감사 v3공동 창업자가 이끈 세 번째 내부 감사 라운드의 수정 사항(2026-09-19, 독립 감사는 수행되지 않았음). POOL-1: 파우셋 Mint는 노트 오프닝(pk, time, r)을 담고, 어드미션이 커밋먼트를 다시 계산하며, 민터는 rand-mint-2에 서명합니다. 제네시스 할당 노트도 오프닝을 담습니다. RPC-1: rand_getWitness(es)는 한 번에 트리 재구성을 최대 두 번만 실행하며 10초 뒤에는 -32000 busy로 응답합니다. OPS-1: 열여덟 개의 밸리데이터 키 전체를 교체했고, 저장소 밖에서 생성했으며, 저장소에는 어떤 키도 추적되지 않음커밋먼트가 금액보다 큰 값으로 열리는 발행은 거부됨. chain 14의 키는 저장소에 들어간 적이 없음chain 14(v0.5)부터 운영 중. 리프를 지목하는 증인 요청인 PRIV-1은 2026-09-21에 지갑 자체의 트리로 해소됨

v0.5 이후 릴리스

모든 릴리스는 fullnode의 CHANGELOG.md에 항목이 있는 git 태그입니다. 합의, 와이어 포맷 또는 검증자 키를 바꾸는 릴리스는 새 체인과 함께 배포되고, 그 밖의 릴리스는 노드를 하나씩 차례로 라이브 체인에 적용합니다.

릴리스주요 내용체인
v0.5 to v0.5.8RPL 토큰, zUSD, 강화된 브리지(위 참조), 감사 수정 사항, 이력 가지치기, 합의 및 동기화 강화14, 15
v0.5.9재스캔 수정: 파우셋은 제네시스 밸리데이터로부터만 발행하며, 동기화 백오프와 가십 사전 검사를 추가15
v0.5.10주소 공유: 지문, randpay: 링크, QR 코드. 암호화된 메모는 체인 18에서 처음 활성화15
v0.5.11팀, 투자자, 파트너 배정분에 대한 시간 잠금 제네시스 베스팅. 제네시스로 활성화를 제어하며 어느 체인에서도 활성화되지 않음없음
v0.69월 검토에서 나온 zkVM, rVM, 집계 수정 사항15
v0.6.1제약 집합 7: LogUp 블라인딩, 2⁷ 테이블 하한, 32비트 범위 검사, POSEIDON2_LEN, JALR 수정. 체인 16은 hardening_v6 및 번들 게스트 v2와 함께 생성됨16
v0.6.2위임 증명 1단계: rand-prover 바이너리와 지갑의 --prover. 1단계 증명자는 지출 키를 받음16
v0.6.3, v0.6.4위임 증명 2단계: 분리된 승인. 번들 증명은 더 이상 지출 키를 받지 않고 티어 10 승인 증명이 받으며, 트랜잭션 ID 도메인은 rand-txid-3이 됨17
v0.6.6, v0.6.7-rc1가스: 제약 집합 8, 증명별 선언 가스 한도, 동적 가스 및 바이트 가격. 메모 활성화. v0.6.6은 태그가 붙은 채로 릴리스된 적이 없음18
v0.6.7합의 규칙을 바꾸지 않는 체인 18 수정 사항: 봉인된 증명 가지치기(휴면), 봉투 형식 고정, 조회 키 위생, rVM 할당자, GPU 커널 에일리어싱, ALU 테스트 범위. 전체 워크스페이스 테스트 스위트가 끝나기 전에 태그됨18, 19
v0.6.8RPL-2: 프로그램 셀, 프로그램 금고, Invoke 액션. 양방향 zUSD 브리지 수수료. 마지막 audit-v6 수정 사항: 자동 잠금 해제 폐지(CON-4)와 타임아웃 인증서 페이스메이커(CH-1), --public-rpc 리스너, 읽기 한도, 예약된 밸리데이터 피어, 동기화 및 가십 예산, 풀의 바이트 상한, 증명 헤더가 선언하는 차수의 상한(ZKV-4), 그리고 체인 20이 켜는 제네시스 제어 규칙: 제네시스 해시 바인딩, testnet, 1,024블록 증명 윈도, 가스 가격 상한과 유료 바이트 부하, 투표에 의한 승인, 비율로 표시한 스테이크 진입 상한, 브리지 교체에 대한 소유 증명과 지연. 체인 20에서 전송하려면 지갑이 이 빌드여야 함20

현재의 한계

백서와 다른 점을 매끄럽게 덮지 않고 그대로 밝힙니다. 각 항목은 해당 크레이트의 자체 문서에서 이를 해소할 마일스톤과 함께 추적됩니다.

  • hc는 바인딩이지만 숨김은 아닙니다. 솔트가 없으므로 추측한 프로그램을 확인할 수 있고, 같은 프로그램의 두 배포를 서로 연결할 수 있습니다. M3.4가 없앤 것은 검증자가 프로그램 전체를 평문으로 보유하는 상태입니다.
  • 2026-09-21 이전에 빌드된 지갑은 노드에 증인을 요청하며, 증인 요청에는 곧 사용할 리프가 드러납니다. 현재의 rand는 트리의 사본을 직접 보유하며 요청하지 않습니다. 노드는 이전 지갑을 위해 여전히 rand_getWitness를 제공합니다.
  • 입금은 경계에서 공개됩니다. 파우셋 발행, 제네시스 노트, 브리지 입금은 모두 금액을 평문으로 담습니다(체인 14부터 발행과 제네시스 노트는 오프닝도 담으므로 소유자 키 역시 공개됩니다). 이는 투명 주소에서 차폐 주소로의 입금이 어디서나 갖는 한 단계 가시성과 같습니다.
  • 영지식은 완전하지 않고 통계적입니다. 이것이 Plonky3 0.7의 hiding FRI가 실제로 제공하는 성질이며, 크레이트도 그렇게 밝히고 있습니다.
  • 트랜스크립트 해시는 논문의 SHA3-384 / BLAKE3-384가 아니라 개발용 라운드 상수를 쓰는 Poseidon2입니다. 재작성이 아니라 설정 교체로 해결됩니다.
  • FRI 쿼리 80회에서 번들 증명은 체인 14와 15에서 약 1.42 MB였습니다(체인 13까지는 약 1.3 MB). 체인 17부터 전송 한 건은 약 2.85 MB의 증명을 담습니다. 번들 증명 약 1.49 MB와 승인 증명 약 1.37 MB입니다. 블록 4 MiB, 증명 상한 2 MiB인 기본 체인에서는 Keccak을 포함한 증명이 증명 상한을 곧바로 넘습니다. 체인 20의 제네시스는 블록 20 MiB, 증명 상한 4 MiB로 설정합니다(체인 13부터 16은 8 MiB).
  • 호출 증명의 헤더는 숨겨지지 않습니다. 티어와 Keccak 및 SHA-256 테이블의 높이를 선언하므로, 호출이 해시를 사용했는지 드러납니다. v0.6 증명자 하한 이전에 체인 15에 커밋된 호출은 더 많은 정보를 노출했습니다. 2⁷행 미만의 비공개 테이블을 증명에서 읽어낼 수 있었습니다. v0.6 증명자 하한이 새 호출에 대해 이를 막았고, 제약 집합 7과 hardening_v6가 체인 16부터 이를 체인의 규칙으로 만들었습니다.
  • 호출은 티어 14로 제한되며, Keccak 행은 최대 2¹²개(순열 128회), SHA-256 행은 최대 2¹³개(압축 128회)입니다. 또한 hardening_v6에서는 8,180워드를 넘는 프로그램을 배포할 수 없습니다. EVM 및 sBPF 인터프리터 게스트와 번역된 ERC-20 및 SPL Token 이미지는 모두 이를 넘습니다.
  • 증인을 가진 쪽은 모든 것을 봅니다. ZK는 검증자의 시야를 보호할 뿐 증명자의 시야는 보호하지 않습니다. 체인 17부터 지갑은 지출 키를 넘기지 않고 번들 증명을 짝지어진 rand-prover에 맡길 수 있지만, 그 증명자는 여전히 조회 키를 갖고 있어 노트를 봅니다. CUDA 백엔드는 2026-09-28에 하드웨어에서 처음 실행되었으며 아직 프로덕션 측정값이 없습니다.

저장소 구조

README와 crates/ 디렉터리에 나와 있는 fullnode의 Cargo 워크스페이스 구조입니다.

경로담고 있는 것
crates/randprotocol-core/I/O 없는 순수 로직: 암호, 노트와 커밋먼트 트리, 원장 규칙, 가스, 제네시스, HotStuff 상태 머신
crates/randprotocol-zkvm/제약 집합 8 기준으로 zkp-circuits/research에서 가져온 Rand zkVM(회로 aeacf31, deploy/sync-zkvm.sh로 재동기화), 그리고 체인 측 증명 검증자와 그 검증 키 캐시
crates/randprotocol-rvm/zkp-circuits/recursion에서 가져온 재귀 VM: 프로그램이 Rand zkVM 증명을 검증하는 필드 네이티브 머신
crates/bridge-codec/가디언 브리지의 와이어 형식과 쿼럼 규칙. Solidity 컨트랙트 및 Solana 프로그램과 바이트 단위로 동일하게 공유
crates/randprotocol-node/RocksDB 저장소, libp2p 네트워킹, 멤풀, 블록 동기화, JSON-RPC 서버, rand-node 바이너리
crates/randprotocol-client/rand 지갑 바이너리와 RpcClient 라이브러리. RocksDB와 libp2p에 의존하지 않음
crates/randprotocol-prover/rand-prover 바이너리: 짝지어진 지갑을 위해 번들을 증명하는 위임 증명자
deploy/테스트넷 제네시스 파일, nodes.env, 실행 스크립트, 클라우드 프로비저닝, 전환 및 재빌드 스크립트. 체인 14 준비 이후 추적되는 키는 없음
docs/참조 문서와 설계 명세
scripts/로컬 밸리데이터 2대 테스트넷

명세는 있으나 아직 출시되지 않은 것

이 구성 요소들은 논문이나 fullnode 문서에 기술되어 있으나 실행되고 있지 않습니다. 저장소에 없거나, 구현되어 있지만 어느 체인에서도 활성화되지 않은 것들입니다. 명세와 코드 사이의 간극을 추측이 아니라 분명히 알 수 있도록 나열합니다.

구성 요소상태
bridge · guardian증명 형식을 처음부터 끝까지 실행하는 가디언 및 릴레이어 데몬. 컨트랙트, 코덱, fullnode의 수신 측은 출시되어 있으나 데몬은 출시되지 않음
fullnode · aggregation재귀 VM을 이용한 블록 집계: 봉인, 가지치기, 봉인 형식 동기화. 구현되어 있으며 모든 체인에서 꺼져 있음. rand-node는 aggregation 섹션이 있는 제네시스를 거부함. 위조된 집계에 대한 종단 간 검증이 아직 필요하며, 제거하는 것은 번들 증명뿐이고 승인 증명은 아님. 프로덕션 rVM 증명에는 대형 머신이 필요함. 제약 집합 7에서 2개 집계에 133 GB, 3개 집계에 221 GB, 종료 증명에 256 GB 이상이 들었음(2026-09-28과 29에 측정, 제약 집합 8에서는 재측정하지 않음)
fullnode · vesting팀, 투자자, 파트너를 위한 시간 잠금 제네시스 배정(v0.5.11, docs/vesting.md). 제네시스로 활성화를 제어함: vesting 섹션이 없으면 네 가지 베스팅 액션은 거부되며, 이를 가진 체인은 없음. 체인 20의 공급량 감사는 모든 베스팅 카운터를 0으로 보고함. v0.6.8부터 취소 가능 항목은 취소권자의 임계값에 의해서만, 그리고 그 제네시스 항목이 지정한 재무 계정으로만 취소됨
fullnode · slashing리더 이중 서명에 대한 슬래싱과 감금은 v0.6.8에서 staking.slashing 뒤에 구현되어 있으며 체인 20에서는 꺼져 있음(제네시스에 해당 설정이 없으며, 26개 밸리데이터 키는 모두 한 운영자의 것임). 블록 보상, 해시 추첨 리더 비콘, 널리파이어 누산기, 프로그램 간 호출은 구현되지 않음. 프로그램별 영속 상태는 RPL-2로 출시됨(위)
prover/GPU 증명 데몬: 큐에서 배치를 가져오고 제출을 경쟁함. CUDA 커널은 zkp-circuits에 있으며 2026-09-28에 NVIDIA H100에서 처음 실행되었고, 마켓 데몬은 존재하지 않음. 출시되어 있는 rand-prover는 자신과 짝지어진 지갑을 위해 증명할 뿐 마켓이 아님
zkp-circuits · M4.4 exit proofSPL Token 전송 증명(티어 20). 약 330 GB로 추정. ERC-20 전송(티어 18)은 2026-09-19에 128 GB 드롭릿에서 증명되었음. 둘 다 호출을 티어 14로 제한하는 체인 20에서는 호출할 수 없음

빌드 및 테스트

Rust 표준 워크플로가 각 저장소에 적용됩니다. fullnode는 하나의 Cargo 워크스페이스이며, 고정된 toolchain과 실제 노드를 TCP로 구동하는 클러스터 테스트 스위트를 갖추고 있습니다. 빌드하려면 circuits 저장소가 fullnode 옆에 circuits라는 이름의 디렉터리로, vendored crate가 동기화된 시점의 커밋(v0.6.7과 v0.6.8의 경우 aeacf31)으로 체크아웃되어 있어야 합니다. zkVM은 zkp-circuits 안의 독립 crate로, 자체 toolchain 고정 설정이 있으며, 기밀 호출이 무엇을 드러내고 무엇을 드러내지 않는지 설명하는 데모를 포함합니다.

fullnode:

git clone https://github.com/randprotocol/fullnode.git
git clone https://github.com/randprotocol/zkp-circuits.git circuits   # the sibling directory must be named circuits
git -C circuits checkout "$(sed -n 's/^circuits: //p' fullnode/crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md)"
cd fullnode

# Rust 1.98.1 is pinned by rust-toolchain.toml; first build pulls RocksDB and Plonky3, 10 to 20 minutes
cargo build --release        # target/release/rand-node, target/release/rand, target/release/rand-prover

# All crates; release because STARK proving is slow in debug. One to two hours, mostly proving
cargo test --release

# One machine, two validators
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status

zkp-circuits/research의 연구용 zkVM:

# Toolchain is pinned by rust-toolchain.toml; the first build pulls Plonky3
cargo build --release

# Narrated demo: thirteen proofs, one at production FRI parameters (~6-7 min)
cargo run --release

# Emulator, per-table constraints, cheating provers, ZK, end-to-end, viewing keys, compiled guests (395 tests, ~17 min)
cargo test

16-vCPU 머신에서 v0.6.1 기준으로 측정한 fullnode 스위트는 다음과 같습니다. core 521개 테스트, node 373개, client 117개, 부정 prover 스위트 116개, 은닉 번들 부정 테스트 21개(75분), 지갑 흐름 6개(53분), 클러스터 26개(44분), zUSD 엔드투엔드 게이트 2개(51분)입니다. 재귀 VM의 프로덕션 증명은 이 스위트에 포함되지 않으며, 위에 기재된 메모리가 필요합니다.

Running a node는 이 빌드로 공개 testnet에 참여하는 방법을 다룹니다. testnet 제네시스, 부트스트랩 피어, 실행 스크립트는 fullnode의 deploy/ 디렉터리에 포함되어 있으며, download page에 간략한 안내가 있습니다.

기여하기

fullnode는 GNU General Public License v3.0(GPL-3.0-only)에 따라 라이선스가 부여되며, 이전에는 Apache-2.0이었습니다. 버그와 설계 제안은 변경 대상이 되는 저장소에 이슈로 등록해 주십시오. 풀 리퀘스트는 환영합니다. 제출하기 전에 cargo fmt && cargo clippy를 실행하고 변경 범위를 한정해 주십시오. 시작점은 fullnode issues입니다.

아키텍처, 프라이버시 회로, 수수료 토큰 증명, 포스트 퀀텀 트레이드오프는 모두 papers page의 백서에 문서화되어 있습니다. fullnode 저장소의 docs/ 디렉터리는 이 문서의 모든 페이지를 대조해 검증하는 기준 원본입니다.

fullnode 커밋 c0878c3f(chain 21) 기준으로 2026-10-12에 마지막으로 검증되었습니다. 코드와 이 페이지의 내용이 다를 경우 코드가 옳습니다. 알려 주시기 바랍니다.