Rand Protocol
문서
시작하기

소개

Rand Protocol이 무엇인지, 현재 공개 testnet에서 어떤 기능이 운영되고 있는지, 그리고 이를 기반으로 개발하기 위해 RAND를 받는 방법을 설명합니다.

Rand Protocol 위에 무엇을 구축할지, 어디서 시작할지 판단하는 데 필요한 내용을 이 페이지에서 다룹니다. 체인의 모델을 몇 개 단락으로 설명하고, 라이브 testnet의 매개변수와 테스트용 RAND를 받는 방법, 나머지 문서의 안내도를 담았습니다.

Rand Protocol이란

Rand는 양자 내성 차폐 체인입니다. 네이티브 코인은 RAND이며, RAND는 완전 차폐 풀(shielded pool)에 존재합니다. 체인에는 계정도 잔액도 없고 노트 커밋먼트와 널리파이어만 있습니다. 전송은 노트 네 개가 다른 노트 네 개로 바뀌었음을 증명하는 영지식 증명이며(사용하지 않는 슬롯은 더미가 채웁니다), 어떤 자산이 이동했는지는 드러나지 않습니다. RAND와 체인 자체 표준인 RPL의 모든 토큰은 이 하나의 풀을 공유합니다. 같은 코인으로 기밀 프로그램의 비용도 지불합니다. 기밀 프로그램은 영지식 가상 머신 안에서 오프체인으로 실행되는 RISC-V 프로그램이며, 입력 대신 증명으로 온체인에서 정산됩니다.

모든 프리미티브는 양자 공격자에 맞서도록 선택되었습니다.

계층사용 기술
서명Dilithium2(격자 기반)입니다. 밸리데이터는 이것으로 블록과 투표에 서명하며, faucet, 스테이킹 동작, 브리지 등록에도 이 서명을 사용합니다. 지갑은 트랜잭션에 서명하지 않습니다. 번들은 자신의 증명으로 스스로를 승인합니다.
노트 암호화ML-KEM-768 키 캡슐화와 ChaCha20-Poly1305입니다. 체인의 모든 노트에는 소유자(와 발신자)만 열 수 있는 봉투가 함께 붙습니다.
해싱주소, 트랜잭션 id, 상태 루트 및 증명 시스템 밖의 모든 것에는 도메인 분리를 적용한 BLAKE3를 사용합니다. 노트, 널리파이어, 커밋먼트 트리 및 증명 안의 모든 것에는 Goldilocks 필드 위의 Poseidon2를 사용합니다.
증명은닉(hiding) FRI(쿼리 80개, 블로우업 8, 작업 증명 20비트)를 적용한 Plonky3 배치 STARK입니다. 투명합니다. 신뢰 설정도 페어링 곡선도 없으며, 가정은 충돌 저항 해시입니다.
기밀 연산STARK 아래에서 증명되는 RV32IM 머신인 Rand zkVM입니다. 프로그램은 회로 내부 다이제스트로 식별되며, 검증자는 명령어 워드를 단 하나도 보지 못합니다.
합의체인형 HotStuff BFT입니다. 3분의 2를 초과하는 지분 가중 쿼럼, 라운드 로빈 리더, 연속 세 뷰 커밋 규칙을 사용합니다.
저장소 및 네트워킹노드당 RocksDB 하나(fsync 커밋과 시작 시 무결성 검사 포함), libp2p(TCP, Noise, Yamux, gossipsub, Kademlia, LAN에서는 mDNS)를 사용합니다.

참조 구현은 Rust로 작성된 randprotocol/fullnode입니다. rand-node 바이너리가 노드이고 rand 바이너리가 지갑이며, JSON-RPC 메서드에는 rand_ 접두사가 붙습니다. 탐색기는 randscan.org입니다.

testnet: 체인 20

공개 플릿은 체인 20을 운영하며, fullnode v0.6.8에서 2026-10-01 06:17 UTC부터 가동 중입니다. 체인 15~19는 폐기되었습니다. 나흘 동안 체인 네 개가 새로 생성되었으며, 각각 모든 증명 또는 트랜잭션 형식을 바꾸는 변경 때문이었습니다.

  • 체인 16(2026-09-28, fullnode v0.6.1)은 zkVM을 제약 집합 7로 옮겨, 증명이 작은 비공개 입력에 관해 드러내던 정보를 블라인딩하고 hardening_v6 규칙을 활성화했습니다.
  • 체인 17(2026-09-29, v0.6.3)은 전송의 승인과 증명을 분리했습니다. 모든 번들이 지출 키로 만든 작고 별도인 두 번째 증명을 담으므로, 큰 증명은 조회 키만 가진 머신이 만들 수 있습니다.
  • 체인 18(2026-09-29, v0.6.7)은 기밀 호출에 가스를 부과하고(제약 집합 8) 모든 노트 봉투에 암호화된 메모를 활성화했습니다.
  • 체인 20(2026-10-01, v0.6.8)은 모든 증명과 서명된 모든 메시지를 제네시스 해시에 바인딩하고, 프로그램 상태(RPL-2)를 추가하며, zUSD 브리지 민팅과 소각에 수수료를 부과하고, 아래 표에 나열된 audit-v6 규칙을 활성화합니다.

체인 19(2026-10-01 03:43 UTC, v0.6.7)는 같은 빌드에서 체인 18을 다시 제네시스한 것으로, 규칙은 바꾸지 않았습니다. 체인 18은 높이 143,776에서 중단되었고, 체인 19는 높이 141,935의 스냅샷에서 생성되었습니다. 체인 19의 제네시스가 체인 18과 다른 점은 체인 id, 타임스탬프, 이월된 노트, 브리지 섹션뿐이었습니다. 브리지 섹션에는 Ethereum, Binance Smart Chain, Tron 엔드포인트용 새 emitter가 들어 있으며 시퀀스 카운터는 그대로 이월되었습니다.

체인 20은 체인 19의 하드 포크입니다. 제네시스는 높이 7,258의 체인 19 스냅샷에서 생성되었고, 체인 19는 높이 7,700에서 중단되었으며, 26개 밸리데이터 전부가 동일한 키, 피어 id, 부트스트랩 노드로 함께 체인 20에서 재시작되었습니다. 체인 19와 체인 18은 폐기되었습니다. 체인 20에서 전송하려면 지갑이 v0.6.8이어야 합니다. 이전 지갑의 증명과 서명에는 제네시스 바인딩이 없으므로 체인이 이를 거부합니다.

각 체인은 새로운 체인입니다. 운영자 지갑의 RAND 잔액과 유통 중인 zUSD는 다음 제네시스로 이월되었고, 그 밖의 것은 이월되지 않았습니다. 한 체인에 배포된 프로그램은 다음 체인에 존재하지 않습니다. 이 소프트웨어는 실험적이며 감사를 받지 않았고, 여기서의 RAND에는 가치가 없습니다.

체인 20의 프로그램은 상태를 유지할 수 있습니다. RPL-2의 프로그램 셀, 프로그램 볼트, Invoke 동작이 가동 중입니다.

체인 ID20 (rand_chainId)
제네시스 해시6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135
제네시스 파일fullnode 저장소의 deploy/genesis-chain20.json
빌드fullnode v0.6.8(태그 c9c9bd3c). 노드는 rand_getVersion으로 자신의 빌드를 보고합니다. 이 빌드는 체인 14~17을 거부하며, v0.6.8 이전의 지갑은 체인 20에서 전송할 수 없습니다
제네시스 바인딩binding_domain 1: 모든 번들의 증명 바인딩과 서명된 모든 액션 메시지에 제네시스 해시가 포함되므로, 한 체인을 위해 증명하거나 서명한 것은 다른 체인에서 검증되지 않습니다
testnet 표시testnet true: 제네시스가 스스로 테스트 네트워크임을 선언하며, 이로 인해 브리지와 함께 faucet을 운영할 수 있습니다
검증자26명, 각각 스테이킹 최소 수량인 1,000 RAND를 스테이킹
정족수26명 중 18명: 스테이크의 3분의 2를 엄격히 초과하는 비율
블록 간격기본값 --block-interval-ms 1000. 초당 약 1개의 블록
블록 시간부모 블록보다 60초를 초과하여 뒤선 타임스탬프는 유효하지 않으며, 검증자는 자신의 시계보다 15초를 초과하여 앞선 블록에 투표하지 않으므로 검증자는 NTP를 운영합니다
증명 윈도우proof_window_blocks 1,024: 번들의 앵커는 최근 1,024개 블록 종료 루트 중 하나여야 하며, time도 그보다 오래되어서는 안 됩니다(체인 18과 19에서는 256개 블록)
에포크1,000개 블록. 새 본드는 반영되기까지 두 에포크를 추가로 기다리며(bond_activation_epochs 2, 에포크 e + 3에 활성화), 언본딩된 스테이크는 두 에포크 뒤에 해제됩니다
스테이킹등록은 v2이며(rand-node register --v2), 새 키는 가중치의 3분의 2를 초과하여 보유한 검증자들이 투표로 승인한 뒤에만 등록됩니다(admission_by_vote). 한 검증자의 가중치는 33.33 %로 제한되고, 에포크 경계에서 들어오는 신규 스테이크는 활성 가중치의 25 %로 제한되며(max_stake_entry_bps_per_epoch 2,500), 슬래싱은 없습니다
zkVM제약 집합 8, 프로덕션 FRI 프로필(쿼리 80개)
번들 게스트hc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: 4-in-4-out 히든 자산 번들, 버전 3, 티어 14
인증 게스트hc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: 모든 번들이 포함하는 지출 인가, 티어 10
가스호출은 회로가 강제하는 가스 한도를 선언하고 그에 대해 gas_price를 지불합니다. 하한에서 가스당 100 유닛, KiB당 800 유닛이며, 둘 다 블록마다 목표치인 262,144 가스와 10,485,760 바이트를 향해 움직이고, 가스당 10,000, KiB당 80,000의 상한을 넘지 않습니다. 바이트 가격이 부과되는 바이트(호출의 증명과 입력 봉투)만 바이트 부하에 산입되므로(byte_load: "paying"), 전송으로만 이루어진 블록은 이를 높이지 않습니다. 모든 번들은 고정 한도 20,479를 선언하고 정액 0.001 RAND를 지불합니다
프로그램 상태RPL-2 켜짐: 프로그램 셀, 프로그램 금고, Invoke(Action 33). 생성된 셀의 비용은 0.01 RAND(cell_fee 10,000,000 유닛)입니다. 한 번의 invoke는 최대 8개의 셀을 읽고, 최대 8개를 쓰며, 최대 4건의 지급을 수행합니다(rand_getLimits.program_state)
노트 봉투envelope_bytes 1860: 모든 노트의 봉투는 1,860바이트이며 암호화된 메모를 담습니다
프로그램 상한max_program_words 65,535이지만, hardening_v6에서는 티어 14 호출이 담을 수 없는 배포는 거부됩니다(ProgramUncallable): 공개 세그먼트가 없는 프로그램은 8,180 워드
증명 상한max_proof_bytes 4,194,304(4 MiB). 체인 13~16에서는 8 MiB였습니다
블록 상한max_block_bytes 20,971,520(20 MiB)
호출 봉투 상한max_call_envelope_bytes 65,536
프로그램별 공개 입력max_program_public_words 32,768, 배포 시 고정
faucet켜짐. 단, 제네시스 허용 목록(staking.faucet_recipients)에 있는 16개 지갑에 한하며, 제네시스가 민터로 지정한 18명의 검증자(staking.faucet_minters)만 사용할 수 있습니다. 호출당 최대 100 RAND, 에포크당 총 10,000 RAND
기밀 연산켜짐. 호출 증명은 티어 14로 제한됩니다. 프로그램은 컷오버를 거치며 이월되지 않습니다. 예제 프로그램은 각 프로그램이 어느 체인에 배포되어 있는지 알려 줍니다
토큰RPL 레지스트리 켜짐: 등록 수수료 1 RAND(소각), 토큰은 최대 4,096개, 모든 노트 값은 2⁶³ 미만. zUSD는 제네시스의 인덱스 1에 등재되어 있습니다
브리지켜짐: 가디언 세트 1(가디언 8명), Dilithium2 PQ 가디언 8명, 일시 중지 키, 4개 소스 체인의 에미터, 백킹당 일일 민트 한도 100,000 zUSD, 모든 백킹을 합쳐 24시간 롤링 기준 전체 한도 4,000 zUSD. zUSD의 백킹은 7개이며, 공급량은 잠긴 수량 그대로이고 rand_getTokenSupply에서 실시간으로 읽습니다. 체인 20부터 모든 민트와 소각에 10 bps의 수수료가 zUSD로 부과되어 treasury 주소로 가는 노트가 됩니다(bridge.fees). 입금은 총액에서 수수료를 뺀 금액이 적립되고, 소각은 소스 체인에서 amount − fee를 해제합니다. PQ 가디언 또는 일시 중지 키의 교체에는 각 새 키 자체의 서명이 따르며, 승인된 후 86,400초가 지나 효력이 발생합니다(bridge.rotation)
이력24개의 검증자가 24시간 분량의 블록을 보관하며(--prune-history 24h) 그 이전 요청에는 -32010으로 응답합니다. 아카이브 노드 2개는 모든 블록을 보관하며, 공개 RPC https://rpc.randprotocol.org는 아카이브로 전달합니다
블록 집계꺼짐(제네시스에 aggregation 섹션이 없으며, 이 섹션이 있는 제네시스에서는 빌드가 시작을 거부합니다)
제네시스 값검증자 레지스터에 스테이킹된 26,000 RAND와, 체인 19의 운영자 지갑에서 이월된 총 5,184.243719258 RAND의 입금 노트 7개: faucet 민트 전 31,184.243719258 RAND(rand_getSupply는 genesis_staked와 genesis_deposited를 보고합니다). 여기에 총 99 zUSD의 제네시스 노트 2개가 더해지며, 이는 백킹에 잠긴 99 zUSD와 일치합니다

부트스트랩 노드(deploy/nodes.env):

/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ

체인 20은 체인 14~19가 사용한 검증자 키로 실행되므로, 이 피어 ID는 체인 14의 키 교체 이후 변하지 않았습니다.

탐색기 randscan.org는 체인 20을 인덱싱하며 https://randscan.org/api/v1에서 REST API를 제공합니다(Explorer API). 풀 노드의 JSON-RPC는 기본적으로 127.0.0.1:8545에 바인딩됩니다. 노드를 직접 운영하거나(Running a node), 신뢰하는 노드를 사용하거나, 공개 엔드포인트 https://rpc.randprotocol.org를 사용하십시오(rand --rpc https://rpc.randprotocol.org …). 공개 엔드포인트는 첫 동기화와 트랜잭션 전송을 포함하여 지갑에 필요한 모든 것을 제공하며, 주소당 분당 읽기 1,200회와 전송 6회의 한도가 적용됩니다. faucet은 제공하지 않습니다.

faucet에서 RAND 받기

faucet은 하나의 트랜잭션 유형입니다. 검증자가 공개된 수량의 노트 하나를 shielded 주소로 민트하며, 이 노트는 주소 보유자만 열 수 있습니다. 체인 20에서는 제네시스 허용 목록에 있는 16개 주소에만 지급합니다. 그 외의 주소로 민트하면 the faucet may not mint to this recipient (not in staking.faucet_recipients) 오류로 거부되므로, 목록에 없는 지갑은 다른 곳에서 테스트 RAND를 전송받아야 합니다. 아래 세 경로 모두 검증자 노드에 민트를 요청하며, 옵저버는 faucet mints are signed by validators; ask a validator node로 응답하고, 공개 RPC 엔드포인트는 rand_mint를 전혀 전달하지 않습니다.

검증자의 RPC를 가리키도록 설정한 rand 지갑으로:

rand keygen                    # writes wallet.key.json; refuses to overwrite
rand address                   # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet                    # an allowlisted wallet: 100 RAND into a note only it can open
rand balance                   # scans the tree with this key; prints 100 RAND

rand faucet [ADDRESS] --amount <RAND>는 다른 주소로 또는 더 적은 수량을 민트합니다. 100 RAND가 기본값이자 호출당 상한입니다. JSON-RPC에서는 같은 요청이 rand_mint입니다:

curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'

결과는 민트 트랜잭션의 해시입니다. rand_getTransaction이 블록을 반환할 때까지 폴링하십시오. 수량은 유닛 단위의 문자열이며, 1 RAND는 10⁹ 유닛입니다. 지갑 앱에는 한 번의 탭으로 같은 faucet이 있으며, 체인 20을 위한 첫 릴리스인 Rand Wallet v0.6.8 이상으로 전송하십시오. 이 사이트의 faucet 페이지는 devnet 지급을 위한 대기자 명단 요청을 받습니다.

민트의 수량은 체인상에 공개됩니다. 투명 주소에서 shielded 주소로의 입금에 있는 것과 같은, 한 홉의 가시성입니다. 이후 그 노트가 누구에게 얼마의 가치가 있는지는 다른 모든 노트와 마찬가지로 숨겨집니다.

다음으로 이동

fullnode 저장소의 docs/ 디렉터리는 이 페이지들을 대조 확인하는 기준 자료이며, 논문에는 암호학적 배경이 담겨 있습니다.

fullnode 커밋 c0878c3f(chain 21) 기준으로 2026-10-12에 마지막으로 검증되었습니다.