Rand Protocol
Dokumentasi
Panduan

Menjalankan node

Membangun binari, membuat kunci, menginisialisasi direktori data dari genesis chain 20, menghubungi bootstrap, mengikat RPC, memangkas riwayat, dan memverifikasi chain - sebagai observer maupun validator.

Gunakan halaman ini untuk menjalankan rand-node Anda sendiri pada testnet. Cara ini juga yang direkomendasikan untuk memakai dompet secara privat: node yang Anda jalankan sendiri tidak memberi tahu siapa pun, selain Anda, leaf mana yang akan Anda belanjakan. Sebuah observer melakukan sinkronisasi, memverifikasi ulang setiap bukti, dan melayani JSON-RPC. Sebuah validator melakukan hal yang sama dan ikut serta dalam konsensus setelah kuncinya masuk ke dalam set sebuah epoch.

Membangun

Prasyarat: Rust 1.98.1 (dipatok di rust-toolchain.toml; rustup memasangnya), kompiler C++ dan cmake untuk RocksDB. Crate zkVM memiliki dependensi path ke checkout circuits/ bersaudara dari repositori sistem bukti (randprotocol/zkp-circuits). Checkout tersebut harus berada di samping fullnode/, pada commit tempat rilis ini di-vendor: baris circuits: pada crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md (aeacf31 untuk v0.6.8, sama seperti v0.6.7). Build pertama memakan waktu 10 hingga 20 menit.

git clone https://github.com/randprotocol/fullnode
cargo build --release          # target/release/rand-node, target/release/rand, target/release/rand-prover

Jalankan v0.6.8 (git checkout v0.6.8, commit c9c9bd3c, adalah rilis yang dijalankan armada; rand_getVersion melaporkan sha sebuah node). Rilis GitHub-nya memuat rand-node, rand, rand-prover dan SHA256SUMS, dibangun pada satu host armada dan tidak ditandatangani. Chain 20 memerlukannya: genesis-nya memuat field yang tidak dibaca oleh build mana pun sebelumnya (testnet, binding_domain, proof_window_blocks, program_state, grup rotation dan fees pada bridge, batas atas gas, dan penerimaan staking melalui pemungutan suara), dan v0.6.8 membawa perubahan konsensus yang tidak dijalankan oleh node yang lebih lama. Bukti masih dibuat di bawah constraint set 8, seperti pada chain 18 dan 19, dan setiap bundle masih membawa bukti otorisasi di samping bukti bundle-nya (otorisasi terpisah, sejak chain 17), sehingga genesis mematok dua guest yang sama: bundle guest v3 (hc_bundle 60af094a…) dan auth guest (hc_auth 1e4e347f…). Genesis juga memuat bagian gas, hardening_v6 dan envelope_bytes. Build v0.6.8 menolak genesis chain 14, 15, 16 dan 17 pada run maupun verify, berdasarkan hash; build ini tetap dapat menjalankan genesis chain 19. Setiap node menjalankan build armada.

Chain 20: hard fork dengan penghentian total

Chain 20 mulai berjalan pada 2026-10-01 pukul 06:17 UTC. Chain ini dipotong dari snapshot chain 19 dan digulirkan dengan pola semua berhenti, semua mulai: setiap node chain 19 berhenti pada ketinggian 7.700, dan setiap node dimulai pada chain 20 dengan v0.6.8. Ini bukan pembaruan bergulir, karena dua alasan. Chain 20 adalah genesis baru, sehingga tidak ada blok yang dibagikan dengan chain 19. Selain itu, v0.6.8 membawa perubahan konsensus dari audit v6 yang tidak boleh digulirkan node demi node: CON-4 menghapus pelepasan otomatis kunci (lock) sebuah validator, dan CH-1 menambahkan pacemaker sertifikat timeout. Seluruh 26 validator, kunci, peer id dan bootstrap mereka dibawa serta; kuorum tetap 18 dari 26. Chain 19 dan 18 dipensiunkan.

Memindahkan sebuah node dari chain 19 ke chain 20 karena itu memerlukan biner baru, berkas genesis baru, dan direktori data baru, seperti di bawah. Dompet memerlukan v0.6.8 untuk mengirim di chain 20: genesis-nya mengikat setiap bukti dan setiap pesan yang ditandatangani pada hash-nya (binding_domain: 1), yang tidak dilakukan oleh dompet yang lebih lama.

Kunci

rand-node keygen --out node.key.json      # prints the address
rand-node address --key node.key.json     # address, public key, libp2p peer id

Berkasnya berbentuk { "seed", "address", "public_key" }, mode 0600; hanya seed yang rahasia. Sebuah observer juga memerlukan kunci — itulah identitas p2p. Kunci node bukan kunci dompet: gunakan rand keygen untuk dompet.

Buat kunci Anda sendiri dan simpan di luar checkout. Repositori fullnode tidak lagi melacak kunci apa pun (audit v3, OPS-1): berkas deploy/node-*.key.json dan deploy/payout/*.key.json yang pernah di-commit untuk chain 8 hingga 13 adalah seed yang dipublikasikan dan tidak boleh dipakai. Kunci validator chain 20 dibuat di luar repositori dan tidak pernah berada di dalam repositori: 26 validator genesisnya adalah delapan belas kunci yang dibuat untuk chain 14 dan delapan yang di-bond pada chain 15, dibawa melalui setiap pemotongan sejak itu.

Sejak v0.6.8 rand-node keygen menolak berkas --out yang sudah ada; v0.6.7 menimpanya tanpa bertanya. Berkas itu adalah satu-satunya salinan seed. Cadangkan sebelum sebuah bond bergantung padanya.

Inisialisasi dari genesis

Setiap node pada sebuah chain memerlukan berkas genesis yang identik byte demi byte; rand-node init menyalinnya ke direktori data dan mencetak hash-nya, yang harus bernilai 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 untuk chain 20. Berkasnya adalah deploy/genesis-chain20.json (sha256 0020247a…3a21). Berkas ini di-commit ke main fullnode bersama catatan peluncuran (commit 74cfaca0), setelah tag, sehingga checkout v0.6.8 tidak memilikinya: ambil dari main.

git -C fullnode show origin/main:deploy/genesis-chain20.json > genesis-chain20.json
rand-node init --datadir ./data-6210cf07 --genesis genesis-chain20.json

Perintah ini membuat <datadir>/db (RocksDB) berisi blok 0, sembilan note genesis sebagai leaf pertama pohon (tujuh note RAND yang membawa 5.184,243719258 RAND milik dompet operator dari chain 19, dan dua note zUSD sebesar 10 dan 89 zUSD, yaitu 99 zUSD yang dikunci dalam kustodi bridge), serta register validator. Menjalankan ulang dengan genesis yang sama tidak berdampak apa pun; genesis yang berbeda ditolak (already initialized with a different genesis berarti datadir milik chain lain). Namai direktori data berdasarkan delapan karakter pertama hash genesis, seperti yang dilakukan armada (data-<name>-6210cf07), agar tidak pernah bertabrakan dengan milik chain 19 (-a3defc93).

Bentuk berkas genesis:

{
  "chain_id": 20,
  "timestamp_ms": 1790835251661,
  "validators": [ { "public_key": "<hex>", "stake": 1000000000000, "payout": "rand1…" } ],
  "alloc": [ { "cm": "<64 hex>", "envelope": { "kem_ct": "…", "to_receiver": "…", "to_sender": "…", "body": "…" }, "amount": 1000000000000,
               "opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>" } },
             { "cm": "…", "envelope": { … }, "amount": 1000000000,
               "opening": { "pk": "<64 hex>", "time": 0, "r": "<64 hex>", "asset": 1 } } ],
  "faucet": true,
  "confidential": true,
  "fri_profile": "production",
  "hc_bundle": "60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce",
  "bridge": { "emitter": "<64 hex>", "guardians": [ "<40 hex>" ], "emitters": { "2": "<64 hex>", "3": "…", "4": "…", "5": "…" },
              "pq_guardians": [ "<hex>" ], "pause_key": "<hex>",
              "rules_v2": { "global_mint_cap_per_window": 400000000000, "cap_window_secs": 86400 },
              "guardian_set_index": 1, "burn_sequence": 13,
              "min_inbound_sequence": { "2": 3, "3": 3, "4": 3, "5": 7 },
              "rotation": { "delay_secs": 86400, "needs_possession": true },
              "fees": { "mint_bps": 10, "burn_bps": 10, "recipient": "rand1…" } },
  "tokens": { "registration_fee": 1000000000, "mint_cap_per_day": 10000000000000,
              "tokens": [ { "name": "Shielded USD", "symbol": "zUSD", "salt": "<64 hex>",
                            "backings": [ { "chain": 2, "token": "<64 hex>", "decimals": 6 }, … ] } ],
              "max_tokens": 4096, "burn_registration_fee": true, "bound_note_value": true },
  "consensus_domain": 1,
  "staking": { "faucet_budget_per_epoch": "10000000000000", "bond_activation_epochs": 2,
               "max_weight_bps": 3333, "registration_v2": true,
               "faucet_recipients": [ "rand1…" ], "faucet_minters": [ "<validator address>" ],
               "max_stake_entry_bps_per_epoch": 2500, "admission_by_vote": true },
  "epoch_blocks": 1000,
  "max_program_words": 65535,
  "max_proof_bytes": 4194304,
  "max_block_bytes": 20971520,
  "max_call_envelope_bytes": 65536,
  "max_program_public_words": 32768,
  "envelope_bytes": 1860,
  "hardening_v6": true,
  "hc_auth": "1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1",
  "gas": { "gas_price": "100", "byte_price": "800", "bundle_gas_limit": 20479, "metering": "circuit",
           "dynamic": { "target_block_bytes": 10485760, "target_block_gas": 262144,
                        "adjust_bps": 1250, "min_gas_price": "100", "min_byte_price": "800",
                        "max_gas_price": "10000", "max_byte_price": "80000", "byte_load": "paying" } },
  "testnet": true,
  "binding_domain": 1,
  "proof_window_blocks": 1024,
  "program_state": { "cell_fee": 10000000 }
}

Setiap field masuk ke dalam hash genesis. hc_bundle mematok bundle guest yang menjadi acuan pemeriksaan setiap bukti bundle, dan hc_auth mematok auth guest yang menjadi acuan pemeriksaan setiap bukti otorisasi; node yang build-nya merakit guest berbeda menolak untuk dimulai dan menyebutkan kedua digest. Kelima field max_* bersifat opsional dan hanya diikat ke dalam hash bila ada; chain 20 menetapkan kelimanya. max_proof_bytes adalah 4 MiB, sedangkan chain 13 hingga 16 memiliki 8 MiB: sejak chain 17 sebuah transaksi dapat membawa tiga bukti (bundle, otorisasi, call), dan genesis dengan hc_auth harus memiliki max_block_bytes sedikitnya tiga kali max_proof_bytes ditambah 1 MiB. Setiap note alloc membawa opening-nya (pk, time, r, dan asset untuk note token), sehingga pemilik dan jumlah sebuah note genesis memang bersifat publik. Chain 20 memiliki:

  • bagian bridge: guardian set 1 pada indeks 1 dengan delapan guardian, emitter untuk chain sumber 2, 3, 4 dan 5 (milik chain 19), delapan pq_guardians Dilithium2, sebuah pause_key, burn_sequence 13, min_inbound_sequence sebesar 3 untuk chain sumber 2, 3 dan 4 dan 7 untuk chain sumber 5, serta rules_v2 (batas mint global 4.000 zUSD per jendela 24 jam). Baru pada chain 20: rotation, yang mewajibkan rotasi PQ-guardian atau pause-key disertai bukti kepemilikan oleh kunci baru dan berlaku 86.400 detik setelah di-commit; serta fees, yang membuat chain menahan 10 bps dari setiap deposit dan 10 bps dari setiap burn sebagai note zUSD ke alamat treasury, sehingga sebuah deposit mengkredit jumlah kotor dikurangi biaya dan sebuah burn melepaskan jumlahnya dikurangi biaya;
  • bagian tokens: biaya pendaftaran sebesar 1 RAND, yang dibakar alih-alih dibayarkan kepada proposer; mint_cap_per_day sebesar 100.000 token per backing dengan delapan desimal; batas registri sebesar 4.096 token; batas nilai note 2^63; dan zUSD terdaftar pada genesis dengan tujuh backing-nya, 99 zUSD terkunci (Ethereum USDT 22, BSC USDT 22, Tron USDT 30, Solana USDT 25) terhadap dua note zUSD genesis;
  • consensus_domain: 1: setiap tanda tangan konsensus terikat pada genesis ini (Konsensus);
  • bagian staking: faucet yang masuk daftar izin untuk 16 dompet dan 18 kunci validator pencetak, dengan anggaran 10.000 RAND per epoch, penundaan bond dua epoch, batas bobot 3.333 bps dan pendaftaran v2, seperti pada chain 19; baru pada chain 20, admission_by_vote (kunci validator baru baru terdaftar setelah set validator memilihnya masuk) dan anggaran masuk sebesar 2.500 bps dari bobot aktif per batas epoch, sedangkan chain 19 memiliki 10.000 RAND tetap (Staking). Tidak ada slashing;
  • bagian gas: sebuah call membayar gas limit yang dideklarasikan buktinya dan membayar byte-nya, dengan harga yang dimulai pada 100 unit per gas dan 800 unit per KiB lalu bergerak setelah setiap blok sesuai keterisiannya terhadap target 10.485.760 byte dan 262.144 gas, paling banyak 1.250 bps per blok, tidak pernah di bawah harga awal dan, baru pada chain 20, tidak pernah di atas 10.000 dan 80.000. Hanya byte yang dikenai harga byte, yaitu bukti dan envelope input sebuah call, yang dihitung dalam beban harga byte (byte_load: "paying"). Setiap bukti bundle mendeklarasikan limit yang sama, 20.479 (Biaya);
  • envelope_bytes: 1860: setiap envelope note berukuran tepat 1.860 byte dan membawa field memo terenkripsi;
  • hardening_v6: true, sakelar hardening v0.6, yang ditetapkan oleh setiap chain sejak chain 16;
  • testnet: true, penanda yang memungkinkan faucet berdampingan dengan bagian bridge;
  • binding_domain: 1: bukti setiap transaksi dan setiap pesan aksi yang ditandatangani menyertakan hash genesis, sehingga tidak ada yang dibuktikan atau ditandatangani untuk satu chain yang terverifikasi di chain lain;
  • proof_window_blocks: 1024: anchor sebuah bundle boleh berupa salah satu dari 1.024 root akhir-blok terakhir dan time-nya boleh tertinggal hingga 1.024 blok dari ketinggian (256 pada chain 19), yang memberi prover yang lambat atau terdelegasi sekitar dua puluh menit;
  • program_state, RPL-2: sel program, vault program, dan aksi Invoke, dengan biaya sel sebesar 0,1 RAND per sel yang dibuat sebuah invoke (JSON-RPC memuat batasnya).

Chain ini tidak memiliki bagian aggregation, dan build menolak untuk dimulai pada genesis yang memuatnya.

timestamp_ms adalah titik nol jam rantai. Saat Anda membuat genesis sendiri, tetapkan nilainya sedekat mungkin dengan waktu peluncuran sebenarnya dan jangan pernah mendahuluinya. Jika terlalu jauh di masa lalu, waktu blok tertinggal dari jam dinding sampai batas 60 detik per langkah blok memungkinkannya mengejar. Jika lebih dari 15 detik di masa depan, blok 1 tidak ter-commit sama sekali: setiap suara, termasuk suara leader, ditahan sampai waktu dinding mencapai timestamp genesis. Periksa nilainya terhadap jam mesin yang meluncurkan fleet, bukan mesin yang membuat berkas tersebut.

Menjalankan

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
argumenbawaanarti
--datadirwajibdirektori data yang telah diinisialisasi
--keywajibberkas kunci: identitas validator, identitas p2p, penerima biaya
--listen/ip4/0.0.0.0/tcp/30303multiaddr listen libp2p, dapat diulang
--bootstraptidak adapeer yang dihubungi saat mulai dan setiap 30 detik selama terputus, dapat diulang
--rpc127.0.0.1:8545listener JSON-RPC dan WebSocket milik operator: semua metode, dan listener ini memercayai loopback. Biarkan tetap di loopback, dan jangan pernah meneruskan endpoint publik ke listener ini
--public-rpc <ADDR>mativ0.6.8: listener publik kedua yang menjadi tujuan reverse proxy atau SSH forward: kumpulan metode tetap tanpa metode viewing-key, rand_mint atau rand_getPeers, tanpa batch, tanpa WebSocket, satu meter untuk semua pemanggil (JSON-RPC)
--rpc-viewing-token-file <PATH>mativ0.6.8: mewajibkan bearer token (baris pertama berkas, minimal 32 karakter) pada metode viewing-key milik --rpc
--reserved-peer <PEER_ID>tidak adav0.6.8, dapat diulang: peer yang diizinkan melewati batas koneksi masuk; lihat Peer terpesan
--strict-gossipmativ0.6.8: hanya menerima gossip dengan tanda tangan penulis, nomor urut, dan sumber yang valid; diterapkan node demi node
--validatormatinode ini memegang kunci validator dan ikut serta dalam konsensus ketika kuncinya ada dalam set saat ini
--no-mdnsmatimenonaktifkan penemuan LAN; disarankan pada server
--block-interval-ms1000jarak minimum antarproposal
--view-timeout-ms3000batas waktu view dasar, berlipat dua untuk setiap timeout berturut-turut hingga 8×
--verify-chainquickpemeriksaan integritas saat startup: off, quick (struktur dan replay ledger), full (juga setiap tanda tangan dan QC)
--keep-raw-proofsmatimode arsip untuk agregasi blok; tidak berpengaruh pada chain 20
--prune-historymati (simpan semuanya)simpan ledger dan hanya riwayat blok sebanyak ini: <n>m, <n>h atau <n>d, minimal 1h. Validator testnet menjalankan 24h, kecuali dua arsip; lihat Pemangkasan riwayat
--min-free-disk-mb1024menolak mulai jika ruang kosong pada sistem berkas direktori data kurang dari nilai ini; rand_getHealth menjawab disk_low di bawah empat kali nilainya. 0 menonaktifkan pengaman ini
--prover <ADDR>matimenjalankan prover terdelegasi pada alamat ini, listener tersendiri dan bukan RPC; lihat di bawah
--gas-price, --byte-price100, 800batas bawah harga pool untuk sebuah panggilan pada chain tanpa bagian gas. Genesis chain 20 menetapkan harganya sendiri, sehingga node mengabaikan kedua flag ini di sana dan mencatat peringatan

--prover-accept-spend-key telah dihentikan: node v0.6.8 yang diberi flag ini menolak untuk mulai, jadi hapus dari berkas unit mana pun yang dibawa dari v0.6.7.

Ketiga bootstrap di atas adalah validator C, D, dan E, tidak berubah dari chain 19. Chain 20 berjalan dengan kunci validator yang dibuat untuk chain 14, sehingga peer id-nya sama dengan yang digunakan chain 14; identitas p2p diturunkan dari kunci validator. Sebagian besar validator hanya menyimpan blok satu hari, sehingga node yang melakukan sinkronisasi dari genesis, atau yang tertinggal lebih dari satu hari, juga memerlukan peer dengan riwayat lengkap. Tambahkan salah satu dari kedua arsip:

    --bootstrap /ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf    # obs1
    --bootstrap /ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh    # rand-archive-2

Hilangkan --validator untuk menjalankan observer. Startup: membuka penyimpanan, memeriksa guest build ini terhadap hc_bundle dan hc_auth genesis, menjalankan pemeriksaan integritas (memotong ekor yang rusak dan mempertahankan status keamanan suara), melanjutkan konsensus dari head yang tersimpan, memulai jaringan dan RPC, lalu melakukan sinkronisasi dari peer mana pun yang lebih maju. RUST_LOG bernilai bawaan info,libp2p=warn,libp2p_mdns=off; Ctrl-C atau SIGTERM, sinyal henti systemd, mematikan node dengan bersih. Memulai ulang dari --datadir yang sama akan melanjutkan dari head yang tersimpan.

Aturan topologi dari fullnode: node di belakang NAT menghubungi node yang beralamat publik; buka TCP 30303 masuk pada node publik; ikat RPC ke 127.0.0.1 kecuali dilindungi firewall: RPC menerima transaksi dari siapa pun yang dapat menjangkaunya, dan setelah viewing key diimpor ke dalamnya, perlakukan port tersebut sebagai pembawa kunci. Pertahankan --block-interval-ms pada 1000 atau lebih lambat: bukti bundle memerlukan sekitar dua menit dan anchor-nya berlaku selama 1.024 blok pada chain 20 (256 pada chain 19).

Validator memerlukan jam yang tersinkronisasi. Sejak chain 14, waktu jam dinding menjadi bagian dari konsensus (bridge hardening B2). Blok dengan timestamp lebih dari 60 detik setelah induknya tidak valid, dan validator menahan suaranya terhadap blok yang timestamp-nya lebih dari 15 detik mendahului jamnya sendiri. Validator yang jamnya berjalan lambat karena itu berhenti memberikan suara tanpa mencatat kesalahan, dan dua puluh enam validator pada chain 20 memerlukan delapan belas suara untuk melakukan commit. Jalankan NTP pada setiap validator dan periksa sebelum memulai node:

timedatectl                     # want "System clock synchronized: yes" and "NTP service: active"
chronyc tracking
apt-get install -y chrony && systemctl enable --now chrony    # if it is not synchronised

Peer terpesan

Sejak v0.6.8 sebuah node menerima paling banyak 256 koneksi masuk yang terbentuk dan 64 yang setengah terbuka, dan identitas libp2p tidak memerlukan biaya apa pun untuk dibuat, sehingga pihak asing dapat menempati setiap slot. Tiga jenis peer dicadangkan, diizinkan melewati batas dan dilayani dari bagian anggaran sinkronisasi milik validator: setiap peer --bootstrap, setiap --reserved-peer, dan setiap identitas validator yang diketahui dari peer binding yang ditandatangani. Setiap node --validator menandatangani identitas libp2p-nya dengan kunci validatornya dan menyebarkannya melalui gossip; node yang mengetahui kunci tersebut dari sebuah set validator mencadangkan peer itu dan menyimpan catatannya setelah restart. Penyimpanan rantai yang baru dibuat tidak memiliki binding, sehingga sampai pengumuman pertama tiba hanya dua jenis pertama yang dicadangkan: pada pembuatan baru, berikan peer id validator fleet dengan --reserved-peer atau simpan dalam daftar bootstrap (rand-node address --key <file> mencetak peer id sebuah kunci). rand_status.reserved_peers menghitungnya; pada node fleet, nilainya seharusnya mencapai jumlah validator dalam satu menit sejak dimulai.

Memeriksanya

rand-node status                # rand_status verbatim
rand --rpc http://127.0.0.1:8545 status
rand peers

rand_status melaporkan height, view, syncing, sync_target, peer_count, connected_peers, reserved_peers, mempool_size, is_validator, active_validator, faucet, confidential, testnet, fri_profile, programs, notes, nullifiers, tree_root, hc_bundle, hc_auth, binding_domain, gas_prices, address dan peer_id milik node, serta diagnostik sinkronisasi (sync_inflight_age_ms, sync_failures, sync_late_batches), disk (disk_free_bytes, disk_low), dan batas retensi (prune_floor, 0 pada node yang menyimpan semuanya; prune_history_secs, null bila tidak diatur). Pada chain 20, harapkan hc_bundle 60af094a…, hc_auth 1e4e347f…, faucet true, confidential true, testnet true, binding_domain 1, fri_profile "production", dan gas_prices antara 100 dan 10.000 per gas serta 800 dan 80.000 per KiB. rand_getGenesisHash harus menjawab 6210cf07…5135 dan rand_getVersion 0.6.8.

rand_getHealth menjawab disk_low (beserta free_bytes) sebelum ok, syncing, atau behind ketika ruang kosong kurang dari empat kali --min-free-disk-mb.

Pemangkasan riwayat

Node yang dimulai dengan --prune-history 24h menyimpan ledger (note, nullifier, anchor, register validator, program) secara utuh dan menghapus blok yang lebih lama, beserta sertifikat, transaksi, dan tanda terimanya. Satu putaran berjalan pada setiap blok ke-16 yang di-commit dan menghapus hingga 512 blok yang lebih lama daripada timestamp head dikurangi jendela; genesis, head, dan induknya tidak pernah dihapus, dan batas bawahnya hanya naik. Ruang disk kembali setelah RocksDB melakukan kompaksi. Pada chain 20, seperti pada chain 19, 24 dari 26 validator menjalankan 24h dan menyimpan blok sekitar satu hari. Ketika pemangkasan diaktifkan untuk chain 14 (2026-09-25), tabel blok setiap validator turun dari 19 GB menjadi 3,3–4,4 GB setelah antrean selesai diproses; dua lainnya, obs1 dan rand-archive-2, yang juga menjadi validator sejak 2026-09-27, berjalan tanpa flag tersebut dan menyimpan semuanya. Node mainnet tidak pernah memakai flag ini.

Pada node yang dipangkas, pencarian berdasarkan tinggi di bawah batas bawah (rand_getBlockByHeight, rand_getFinality berdasarkan tinggi, rentang rand_getBlocks atau rand_getCompactBlocks yang mencapainya) menjawab galat -32010 dengan data.floor: tanyakan ke arsip. Pencarian berdasarkan hash menjawab null untuk blok yang tidak lagi disimpan node, sama seperti untuk blok yang tidak pernah ada. Pemindaian wallet tidak terpengaruh, karena note dan nullifier tidak pernah dipangkas.

Pemeriksaan startup node yang dipangkas bersifat struktural (blok 0 dan blok yang dipertahankan, QC, tautan induk, dan leader-nya), bukan replay dari genesis, dan tidak memperbaiki dirinya sendiri: jika gagal, sinkronkan ulang dari arsip. Jangan membuka direktori data yang dipangkas dengan build yang lebih lama dari v0.5.7 kecuali dijalankan dengan --verify-chain off: pemeriksaan bawaannya melakukan replay dari genesis, menemukan blok 1 hilang, dan memotong ledger hingga genesis.

Menjalankan prover

Pada chain 20, wallet membuat dua bukti untuk setiap bundle, dan yang lebih besar memerlukan sekitar 6 GB memori. Wallet yang tidak sanggup menampungnya dapat menyerahkan bukti tersebut kepada prover terdelegasi yang dipasangkan dengannya: biner rand-prover yang terpisah, atau layanan yang sama yang dijalankan oleh sebuah node.

rand-prover --home /root/prover keygen
rand-prover --home /root/prover pair --name laptop --url https://prover.example.net
rand-node run --datadir ./data --key node.key.json --prover 127.0.0.1:8600 --prover-home /root/prover

pair mencetak tautan randprover:. Dompet menerimanya dengan rand prover pair <link> lalu membuktikan melaluinya dengan opsi global --prover. Pendengar (listener) prover adalah miliknya sendiri, tidak pernah menjadi metode RPC: alamat yang sama dengan --rpc ditolak. Dengan --prover, node menolak untuk dimulai kecuali <prover-home>/prover.key.json ada (bawaan <datadir>/prover) dan tersedia memori 5,74 GB per slot pembuktian ditambah 1 GiB; --prover-max-parallel menetapkan jumlah slot, satu secara bawaan.

Pada chain 20, prover dikirimi viewing key dompet dan salt baru, bukan spend key. Dompet membuat bukti otorisasi atas spend key itu sendiri, sehingga prover yang telah dipasangkan dapat membaca seluruh riwayat dompet tersebut dan tidak dapat membelanjakan. Biarkan pendengar pada loopback kecuali ada proksi pengakhir TLS di depannya, dan jangan menjalankannya pada mesin yang melayani RPC publik. Penghentian menunggu bukti yang sedang berjalan, jadi berikan TimeoutStopSec=180 pada unit systemd.

Verifikasi dan perbaikan

rand-node verify --datadir ./data                  # full: hashes, QCs, signatures, proofs, ledger replay, the supply counters
rand-node verify --datadir ./data --mode quick     # structure and ledger replay
rand-node verify --datadir ./data --repair         # truncate a damaged tail; peers resync the rest

Hentikan node terlebih dahulu. Kode keluar 0 jika konsisten, 2 jika ditemukan masalah dan --repair tidak diberikan. Pemutaran ulang (replay) memverifikasi ulang setiap bukti bundle, sehingga build dengan himpunan constraint yang berbeda dari yang membuat chain akan berhenti pada bundle pertama.

Menjadi validator

Sebuah validator bergabung dengan chain yang sedang berjalan melalui bonding, bukan melalui genesis baru: jalankan node dengan --validator, cetak registrasi dengan rand-node register --key node.key.json --payout <rand1…> --v2 (chain 20 menolak registrasi v1), minta sebuah dompet mem-bond sekurang-kurangnya 1.000 RAND dengan rand bond <address> 1000 --registration <hex>, dan node mengusulkan blok setelah bond aktif: pada chain 20, paling cepat tiga batas epoch 1.000 blok setelah bond. Pada chain 20, bond datang belakangan. Genesis-nya menetapkan staking.admission_by_vote, sehingga bond yang mendaftarkan kunci baru ditolak sampai validator yang memegang lebih dari dua pertiga bobot suara memilih kunci tersebut masuk: masing-masing menandatangani dengan rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135, dan salah satunya mengirimkan suara-suara itu dengan rand-node admit submit (Command line). rand_getAdmitted mencantumkan kunci yang telah dipilih masuk dan belum terdaftar. Tidak lebih dari 2.500 bps dari bobot aktif menjadi bobot baru pada satu batas epoch. Staking menjelaskannya langkah demi langkah. Untuk chain uji privat, rand-node genesis membuatnya:

rand-node genesis --chain-id 88 \
    --validator a.key.json,1000,rand1<a's payout address> \
    --validator <hex public key of b>,1000,rand1<b's payout address> \
    --alloc rand1<address>=1000 \
    --epoch-blocks 1000 --faucet --fri-profile production \
    --out genesis.json

dan scripts/local-testnet.sh menjalankan dua validator pada satu mesin dengan RPC pada 8545 dan 8546. Tanpa flag tambahan, genesis tidak memiliki hc_auth, tidak memiliki bagian gas, dan tidak memiliki memo. Chain 20 dibuat dengan --hardening-v6 --bundle-guest v3 --auth-guest --gas-price 100 --byte-price 800 --bundle-gas-limit 20479 --gas-dynamic 10485760,262144,1250 --max-gas-price 10000 --max-byte-price 80000 --gas-byte-load paying --envelope-bytes 1860 --testnet --binding-domain 1 --proof-window-blocks 1024 --program-state-cell-fee 10000000 di atasnya (chain 18 dan 19 memiliki flag hingga --envelope-bytes), dan bagian bridge dan staking serta consensus_domain-nya disisipkan oleh skrip pemotongan. Chain baru milik Anda sendiri sebaiknya memakai --binding-domain 1: dompet v0.6.8 membuktikan bentuk yang terikat genesis pada setiap chain id di luar 14 hingga 19.

Men-deploy pada server

Direktori deploy/ di repositori berisi skrip yang dipakai armada (fleet): deploy/push-to-vps.sh <ip> <letter> "<bootstraps>" [validator|observer] menyiapkan server Linux (rsync kode sumber, build, memasang /usr/local/bin/{rand-node,rand}, menginisialisasi datadir yang dikunci pada hash genesis, memasang layanan systemd rand-node), dan deploy/rebuild-vps.sh <ip> membangun ulang pada commit baru dan memulai ulang dengan data tetap tersimpan. Dua peringatan. Skrip penyiapan menginisialisasi dari deploy/genesis.json, yang bukan berkas chain 20, sehingga node untuk testnet disiapkan secara manual dari deploy/genesis-chain20.json (pada main, lihat di atas). Dan kedua skrip melakukan rsync /root/fullnode dengan --delete, sehingga kunci yang disimpan di dalam pohon itu akan terhapus oleh pembangunan ulang berikutnya: simpanlah di /root/keys, seperti yang dilakukan armada dan seperti yang kini dilakukan skrip penyiapan v0.6.8 secara bawaan (skrip v0.6.7 menulis kunci di bawah /root/fullnode/deploy/). Pengelolaan layanan adalah systemctl status rand-node, journalctl -u rand-node -f. Server memerlukan build-essential clang cmake pkg-config libssl-dev dan toolchain Rust. Server 1-vCPU, 2 GB tidak dapat membangun biner; bangun di tempat lain lalu salin ke dalamnya. Running a validator and an aggregator memuat ukuran dan penyiapan langkah demi langkah.

Explorer

randscan.org berjalan di samping validator E dan mengindeks chain 20; REST API dan umpan WebSocket-nya adalah cara termudah untuk membaca chain tanpa node (Explorer API). Explorer ini bersumber terbuka (randprotocol/randscan) dan pengindeksnya hanya memerlukan JSON-RPC rand_* milik sebuah node serta basis data PostgreSQL, sehingga dapat dijalankan terhadap node Anda sendiri.

Terakhir diverifikasi terhadap commit fullnode c0878c3f (chain 21) pada 2026-10-12. Jika kode dan halaman ini tidak sesuai, kodelah yang benar; beri tahu kami.