Rand Protocol
참여하기

Rand 노드 실행

레퍼런스 풀 노드와 지갑은 Rust로 작성되어 있으며 소스에서 빌드합니다. 빌드하면 두 개의 바이너리가 생성됩니다. 하나는 노드와 운영자 도구인 rand-node이고, 다른 하나는 shielded 지출 키를 보관하고 JSON-RPC를 통해 모든 노드와 통신하며 모든 전송과 모든 기밀 호출에 대해 zkVM 프로버를 로컬에서 실행하는 지갑 rand입니다. 실험적 testnet인 체인 21가 DigitalOcean 드롭릿 위의 검증자 26개로 운영되고 있습니다. 이 네트워크는 감사를 받지 않았으며 실제 가치를 지니지 않습니다. 두 바이너리의 Linux x86_64 빌드는 v0.8.0 릴리스에 첨부되어 있으며, 이는 플릿에 롤아웃된 빌드입니다.

로컬에서 빌드하고 실행하기
bash
# 1. Rust(rustup이 고정된 1.98.1 툴체인을 설치합니다)와 RocksDB 빌드 의존성
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install build-essential clang cmake pkg-config libssl-dev   # Linux

# 2. 클론 및 빌드(처음에는 10–20분)
git clone https://github.com/randprotocol/fullnode.git
cd fullnode
cargo build --release        # target/release/rand-node, target/release/rand

# 3. 이 머신에서 검증자 두 개로 구성된 체인(RPC는 8545와 8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status

# 4. 테스트. STARK 증명은 디버그 빌드에서 느리므로 릴리스 빌드로 실행합니다(테스트 678개, 2026-09-14에 측정한 결과 약 43분)
cargo test --workspace --release
옵저버로 공개 testnet에 참여하기
체인 21
# 릴리스 v0.8.0 (c0878c3f)는 chain 21을 실행하며, 이전 릴리스는 어느 것도 chain 21을 실행하지 못합니다. chain 21은 constraint set 9를 실행하는데, 이전 버전에는 이 세트의 verifier 키와 증명 인코딩이 없습니다. 태그에서 빌드하거나 Linux x86_64에서 빌드하십시오
# 릴리스 바이너리를 받아 함께 게시된 SHA256SUMS와 대조하십시오.
git checkout v0.8.0 && cargo build --release
curl -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand-node -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand \
     -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/msauth-vk-production.bin# 고정된 multisig verifier 키: rand-node는 바이너리 옆에서 이 키를 불러오며, 키가 없으면 시작을 거부합니다
sha256sum rand-node rand msauth-vk-production.bin   # 릴리스의 값이 출력되어야 합니다 (SHA256SUMS, SHA256SUMS.sig로 서명됨):
# 324a4ab1029d39e67fc2de36b036341b0f88f13089997d7fe24c596363a58278  rand-node
# e3a38e74ee28743a960fc1c3eb1ac6c538e18dc259411e10afff7f54e268bbf4  rand
# 68facb06c7f321aaf1d4d541acf6b5c0e9d7f17788ed1c9add6c5a8a8f7acd30  msauth-vk-production.bin

# 노드 신원: Dilithium2 validator 키와 p2p peer id가 하나의 파일에 들어 있습니다. 직접 생성하십시오
# 그리고 체크아웃 바깥에 보관하십시오. 저장소는 더 이상 어떤 키도 추적하지 않습니다
rand-node keygen --out node.key.json

# genesis는 저장소에 포함되어 있으며, 모든 노드는 동일한 파일을 보유해야 합니다.
# init은 해당 파일의 해시를 출력하며, 이는 아래의 해시와 일치해야 합니다
rand-node init --datadir ./data --genesis deploy/genesis-chain21.json

# 공개 validator에 연결합니다 (chain 21는 chain 14의 키를 그대로 유지했으므로 peer id와 IP도 같습니다).
# --validator는 생략합니다. 사용자의 키는 validator 집합에 속해 있지 않습니다. validator에는 NTP도 필요합니다
rand-node run --datadir ./data --key node.key.json \
    --listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns \
    --bootstrap /ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe \
    --bootstrap /ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw \
    --bootstrap /ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ

# 지갑은 별도의 shielded 키입니다. 지갑의 rand1… 주소는 약 1.6 KB 분량의 텍스트입니다
rand keygen && rand address

# faucet 민팅은 validator가 서명하므로 validator의 RPC가 필요합니다. 로컬 두 validator 체인에서는
# 그대로 작동하며, 옵저버 노드는 "ask a validator node"라고 응답합니다. chain 21에서는
# faucet이 genesis의 허용 목록에 있는 16개 지갑에만, 그리고 지정된 validator로부터만 민팅합니다
rand faucet                                  # 사용자만 열 수 있는 note로 100 RAND를 받습니다
rand balance                                 # 사용자의 키로 트리를 스캔하며, 다른 사람은 할 수 없습니다
rand send <rand1 address> 1.5              # 확인을 요청하고, 증명(prove)하며(~2 min), 커밋을 기다립니다
검증자
26
쿼럼
18 of 26
제네시스
ca76c2766ed6090ac6ba5dad86b724dd5d2b80c0edfaed287cd8b129e663ca9a
기밀 호출 수행하기
rand
# 내장 게스트를 어셈블합니다. 비공개 잔액 네 개가 충당하는 경우 1000을 초과하는 잉여분을 지급합니다.
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json                  # 프로그램 ID(콘텐츠 해시)를 출력합니다

# 로컬에서 증명합니다. 증명, 출력 워드 8개, 봉인된 입력 트랜스크립트만 온체인에 기록됩니다.
rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx>                            # 출력 [1, 0, 25, 0, ...]: 잉여분이 데이터로 공개됩니다

# 나중에 트랜스크립트를 열어 증명이 공개한 H_IN과 대조합니다
rand open-call <tx>                          # inputs: [400, 250, 300, 75] — verdict: faithful
체인이 보는 것은 프로그램 ID, 가스 티어, 출력 워드 8개입니다. 잔액은 전혀 보지 못하며, 수수료가 shielded 번들로 지불되므로 호출자가 누구인지도 알 수 없습니다. 출력은 데이터이고, 모든 지급은 호출자가 만드는 번들입니다. Apple Silicon에서 측정한 결과, 티어 10에서 증명에 약 7초, 80-쿼리 FRI 프로파일에서 증명 크기는 약 1.2 MB이며, 웜 검증자 키를 사용한 검증에는 약 16 ms가 걸립니다. 검증자 키는 노드가 티어마다 한 번 계산하여 여러 프로그램에서 재사용합니다.

요구 사항

OS
Linux x86_64 또는 macOS arm64
Rust
1.98.1, rust-toolchain.toml로 고정되며 rustup이 설치합니다
빌드 의존성
C++ 컴파일러, cmake, pkg-config, OpenSSL 헤더(RocksDB)
첫 빌드
10~20분: RocksDB와 Plonky3를 소스에서 빌드
포트
공개 노드는 TCP 30303 인바운드, RPC는 127.0.0.1:8545
서버
vCPU 1~2개의 클라우드 인스턴스로 testnet 검증자를 운영할 수 있습니다
시계
검증자에는 NTP(chrony)가 필요합니다. 검증자는 자신의 시계보다 15초를 넘게 앞선 블록에는 투표하지 않으므로, 시계가 느리면 아무 알림 없이 투표가 중단됩니다.
증명
현재는 CPU만 사용합니다. shielded 전송은 노트북에서 약 2분(7초의 인가 증명과 약 110초의 번들 증명)과 약 6 GB의 메모리가 필요하며, 작은 호출은 약 30초가 추가됩니다.

역할 선택

  • 옵저버 누구나 가능

    --validator 없이 같은 바이너리를 실행합니다. 체인을 동기화하고, 모든 인증서와 모든 번들 및 호출 증명을 검증하며, 모든 블록을 재실행하여 영수증을 비교하고, JSON-RPC를 제공합니다. 공개 testnet에서 새 키가 실행하는 역할이 바로 이것입니다.

  • 검증자 본드 필요

    chained HotStuff에 따라 투표하고 블록을 제안합니다. chain 21에서도 chain 20과 마찬가지로 새 validator는 먼저 투표를 통해 승인됩니다. 스테이크의 3분의 2를 초과하여 보유한 validator들이 해당 키에 대한 AdmitValidator 액션에 서명합니다. 그다음 노드 키를 등록하고(rand-node register --v2), 지갑에서 최소 1,000 RAND를 본딩하며, 본딩 이후 세 번째 1,000블록 에폭 경계에서 집합에 진입합니다(chain 18의 두 에폭 본딩 지연). chain 18은 각각 1,000 RAND를 보유한 26개 validator로 시작했으며, 커밋하려면 스테이크의 3분의 2를 초과하는 18/26이 온라인 상태로 투표해야 합니다. 직접 키를 생성하십시오. 저장소에는 더 이상 validator 키가 보관되어 있지 않으며, 이전 체인용으로 커밋된 키 파일은 공개된 시드입니다.

  • 지갑과 프로버 로컬

    rand 클라이언트는 256비트 지출 키를 보관하며 아무것도 서명하지 않습니다. 인가는 두 개의 증명, 즉 지출 키로 만드는 작은 증명과 4-in-4-out 번들 증명으로 이루어집니다. 클라이언트는 트리를 스캔하여 자신의 노트를 찾고, 두 증명을 모두 사용자의 머신에서 생성하며, RAND와 모든 RPL 토큰에 대해 같은 형태로 처리하고, 기밀 호출에서는 프로그램까지 증명합니다. 체인에 도달하는 것은 증명, 커밋먼트, 널리파이어, 봉인된 봉투뿐입니다.

노드를 실행하지 않으시나요? 같은 지갑이 iOS, Android, Chrome, Firefox용 앱으로도 제공됩니다: 지갑.

소스
randprotocol/fullnode
GPL-3.0-only · testnet은 최신 릴리스인 v0.8.0를 실행합니다
검증

모든 노드가 모든 것을 검사합니다

동기화하는 노드는 수락하기 전에 모든 인증서를 다시 검증하고, 증명을 포함한 모든 블록을 재실행하며, 영수증을 비교합니다. 시작할 때 자체 데이터베이스를 점검하여, 일관되지 않은 부분은 투표 안전성 상태를 유지한 채 잘라내고 빠진 구간을 피어에서 다시 가져옵니다.

# 노드 중지 상태: 해시, QC, 서명, 증명, 리플레이
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair

라이브 testnet에서 실행하는 장애 테스트

  • ›검증자 네 개 중 하나를 중지합니다. 체인은 계속 커밋하며, 노드는 복귀하면 몇 초 안에 따라잡습니다.
  • ›네 개 중 둘을 중지합니다. 쿼럼이 없어 체인이 멈추고, 복귀하면 포크 없이 재개됩니다.
  • ›노드의 데이터베이스를 손상시킵니다. 시작할 때 감지하여 잘라내고 피어에서 다시 동기화하며, 이후에는 바이트 단위로 동일합니다.
  • ›서로 다른 노드를 통한 전송: 모두 커밋되고, 잔액은 모든 곳에서 동일하며, 총 공급량은 변하지 않습니다.
  • ›끊어진 피어 연결은 재접속 로직이 약 30초 안에 다시 수립합니다.

아직 구현되지 않음

논문과 노드 사이의 간극을 추측이 아니라 명확히 읽을 수 있도록 나열합니다.

  • ›프로그램별 영속 상태와 프로그램 간 호출
  • ›지갑 자체에 내장된 컴파일러: 프로그램은 기본 제공되는 어셈블된 게스트이거나, 별도의 rand-guest 툴체인으로 빌드한 이미지입니다
  • ›슬래싱과 제일링, 블록 보상, 수수료 시장, 해시 소트리션 리더 비콘
  • ›널리파이어 어큐뮬레이터, 파이널리티 이후의 증명 프루닝, 증명 배칭
  • ›SPL Token 전송의 tier-20 증명, 그리고 백서에 기술된 GPU 증명자 마켓