Gunakan halaman ini untuk menjalankan rand-node anda sendiri pada testnet, yang juga merupakan cara yang disyorkan untuk menggunakan dompet secara persendirian: nod yang anda jalankan tidak mengetahui daun mana yang bakal anda belanjakan daripada sesiapa selain anda. Seorang pemerhati menyegerakkan, mengesahkan semula setiap bukti dan menyediakan JSON-RPC; seorang validator melakukan perkara yang sama dan mengambil bahagian dalam konsensus setelah kuncinya berada dalam set sesuatu epoch.
Bina
Keperluan: Rust 1.98.1 (dipin dalam rust-toolchain.toml; rustup memasangnya), pengompil C++ dan cmake untuk RocksDB. Crate zkVM mempunyai kebergantungan laluan ke dalam checkout circuits/ yang bersebelahan daripada repositori sistem bukti (randprotocol/zkp-circuits), yang mesti diletakkan di sebelah fullnode/, pada commit tempat keluaran itu di-vendor: baris circuits: dalam crates/randprotocol-zkvm/guests-compiled/PROVENANCE.md (aeacf31 untuk v0.6.8, seperti untuk v0.6.7). Binaan pertama mengambil masa 10 hingga 20 minit.
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, ialah keluaran yang dijalankan oleh armada; rand_getVersion melaporkan sha sesebuah nod). Keluaran GitHub-nya mengandungi rand-node, rand, rand-prover dan SHA256SUMS, dibina pada satu hos armada dan tidak ditandatangani. Chain 20 memerlukannya: genesisnya membawa medan yang tidak dibaca oleh binaan terdahulu (testnet, binding_domain, proof_window_blocks, program_state, kumpulan rotation dan fees bagi bridge, siling gas dan kemasukan staking melalui undian), dan v0.6.8 membawa perubahan konsensus yang tidak dijalankan oleh nod yang lebih lama. Bukti masih dihasilkan di bawah constraint set 8, seperti pada chain 18 dan 19, dan setiap bundle masih membawa bukti kebenaran di sebelah bukti bundle-nya (kebenaran terpisah, sejak chain 17), maka genesis memin dua guest yang sama: bundle guest v3 (hc_bundle 60af094a…) dan auth guest (hc_auth 1e4e347f…). Genesis turut membawa bahagian gas, hardening_v6 dan envelope_bytes. Binaan v0.6.8 menolak genesis chain 14, 15, 16 dan 17 pada run dan pada verify, mengikut hash; ia masih boleh menjalankan genesis chain 19. Setiap nod menggunakan binaan armada.
Chain 20: hard fork henti-semua
Chain 20 beroperasi pada 2026-10-01 pukul 06:17 UTC. Ia dipotong daripada snapshot chain 19 dan dilancarkan secara henti-semua, mula-semua: setiap nod chain 19 berhenti pada ketinggian 7,700, dan setiap nod bermula pada chain 20 dengan v0.6.8. Ia bukan kemas kini bergulir, atas dua sebab. Chain 20 ialah genesis baharu, jadi tiada blok yang dikongsi dengan chain 19. Dan v0.6.8 membawa perubahan konsensus daripada audit v6 yang tidak boleh sekali-kali bergulir nod demi nod: CON-4 menghapuskan pelepasan automatik kunci seorang validator, dan CH-1 menambah pacemaker sijil tamat masa. Kesemua 26 validator, kunci, id peer dan bootstrap mereka dibawa ke hadapan; kuorum masih 18 daripada 26. Chain 19 dan 18 telah dipersarakan.
Oleh itu, memindahkan sesebuah nod daripada chain 19 ke chain 20 memerlukan binari baharu, fail genesis baharu dan direktori data yang baharu, seperti di bawah. Dompet memerlukan v0.6.8 untuk menghantar pada chain 20: genesisnya mengikat setiap bukti dan setiap mesej bertandatangan kepada 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
Failnya ialah { "seed", "address", "public_key" }, mod 0600; hanya seed yang rahsia. Pemerhati juga memerlukan kunci — ia ialah identiti p2p. Kunci nod bukan kunci dompet: gunakan rand keygen untuk dompet.
Jana kunci anda sendiri dan simpan di luar checkout. Repositori fullnode tidak lagi menjejaki sebarang kunci (audit v3, OPS-1): fail deploy/node-*.key.json dan deploy/payout/*.key.json yang pernah di-commit untuk chain 8 hingga 13 ialah seed yang telah diterbitkan dan tidak boleh digunakan. Kunci validator chain 20 dijana di luar repositori dan tidak pernah berada dalam repositori: 26 validator genesisnya ialah lapan belas kunci yang dijana untuk chain 14 dan lapan yang diikat pada chain 15, dibawa melalui setiap pemotongan sejak itu.
Sejak v0.6.8 rand-node keygen menolak fail --out yang sudah wujud; v0.6.7 menimpanya tanpa bertanya. Fail itu ialah satu-satunya salinan seed. Sandarkannya sebelum sebarang ikatan bergantung padanya.
Mulakan daripada genesis
Setiap nod pada sesebuah chain memerlukan fail genesis yang serupa bait demi bait; rand-node init menyalinnya ke dalam direktori data dan mencetak hash-nya, yang mesti berbunyi 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 untuk chain 20. Failnya ialah deploy/genesis-chain20.json (sha256 0020247a…3a21). Ia di-commit ke main fullnode bersama rekod pelancaran (commit 74cfaca0), selepas tag, maka checkout v0.6.8 tidak memilikinya: dapatkannya daripada main.
git -C fullnode show origin/main:deploy/genesis-chain20.json > genesis-chain20.json
rand-node init --datadir ./data-6210cf07 --genesis genesis-chain20.json
Ini mencipta <datadir>/db (RocksDB) dengan blok 0, sembilan nota genesis sebagai daun pertama pokok (tujuh nota RAND yang membawa 5,184.243719258 RAND daripada dompet operator dari chain 19, dan dua nota zUSD sebanyak 10 dan 89 zUSD, iaitu 99 zUSD yang dikunci dalam jagaan bridge), dan daftar validator. Menjalankan semula dengan genesis yang sama tidak berbuat apa-apa; genesis yang berbeza ditolak (already initialized with a different genesis bermakna datadir itu milik chain lain). Namakan direktori data mengikut lapan aksara pertama hash genesis, seperti yang dilakukan armada (data-<name>-6210cf07), supaya ia tidak sekali-kali bertembung dengan direktori chain 19 (-a3defc93).
Bentuk fail 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 medan terkandung dalam hash genesis. hc_bundle memin bundle guest yang terhadapnya setiap bukti bundle disemak, dan hc_auth auth guest yang terhadapnya setiap bukti kebenaran disemak; nod yang binaannya menghimpun guest yang berbeza enggan bermula dan menamakan kedua-dua digest. Lima medan max_* adalah pilihan dan diikat ke dalam hash hanya apabila hadir; chain 20 menetapkan kesemua lima. max_proof_bytes ialah 4 MiB, manakala chain 13 hingga 16 mempunyai 8 MiB: sejak chain 17 sesebuah transaksi boleh membawa tiga bukti (bundle, kebenaran, panggilan), dan genesis dengan hc_auth mesti mempunyai max_block_bytes sekurang-kurangnya tiga kali max_proof_bytes campur 1 MiB. Setiap nota alloc membawa opening-nya (pk, time, r, dan asset untuk nota token), maka pemilik dan jumlah nota genesis adalah awam secara reka bentuk. Chain 20 mempunyai:
- bahagian
bridge: guardian set 1 pada indeks 1 dengan lapan guardian, emitter untuk chain sumber 2, 3, 4 dan 5 (milik chain 19), lapanpq_guardiansDilithium2, satupause_key,burn_sequence13,min_inbound_sequencesebanyak 3 untuk chain sumber 2, 3 dan 4 dan 7 untuk chain sumber 5, sertarules_v2(had cetak global sebanyak 4,000 zUSD bagi setiap tetingkap 24 j). Baharu pada chain 20:rotation, yang mana putaran PQ-guardian atau pause-key memerlukan bukti pemilikan oleh kunci baharu dan berkuat kuasa 86,400 s selepas ia di-commit; danfees, yang mana chain menyimpan 10 bps daripada setiap deposit dan 10 bps daripada setiap bakar sebagai nota zUSD kepada alamat perbendaharaan, supaya deposit mengkreditkan jumlah kasar tolak yuran dan pembakaran melepaskan jumlahnya tolak yuran; - bahagian
tokens: yuran pendaftaran 1 RAND, yang dibakar dan bukan dibayar kepada proposer;mint_cap_per_daysebanyak 100,000 token bagi setiap sokongan pada lapan perpuluhan; had daftar 4,096 token; had nilai nota 2^63; dan zUSD disenaraikan pada genesis dengan tujuh sokongannya, 99 zUSD dikunci (Ethereum USDT 22, BSC USDT 22, Tron USDT 30, Solana USDT 25) berbanding dua nota zUSD genesis; consensus_domain: 1: setiap tandatangan konsensus diikat kepada genesis ini (Konsensus);- bahagian
staking: faucet disenaraiputihkan kepada 16 dompet dan kepada 18 kunci validator pencetak, dengan bajet 10,000 RAND setiap epoch, kelewatan ikatan dua epoch, had berat 3,333 bps dan pendaftaran v2, seperti pada chain 19; baharu pada chain 20,admission_by_vote(kunci validator baharu hanya mendaftar selepas set validator mengundinya masuk) dan bajet kemasukan 2,500 bps daripada berat aktif bagi setiap sempadan epoch, manakala chain 19 mempunyai 10,000 RAND tetap (Staking). Tiadaslashing; - bahagian
gas: sesebuah panggilan membayar untuk had gas yang diisytiharkan oleh buktinya dan untuk bait-baitnya, pada harga yang bermula dengan 100 unit setiap gas dan 800 unit setiap KiB serta berubah selepas setiap blok mengikut kepenuhannya berbanding sasaran 10,485,760 bait dan 262,144 gas, sebanyak-banyaknya 1,250 bps sebuah blok, tidak sekali-kali di bawah harga permulaan dan, baharu pada chain 20, tidak sekali-kali di atas 10,000 dan 80,000. Hanya bait yang membayar harga bait, iaitu bukti sesebuah panggilan dan sampul inputnya, dikira dalam beban harga bait (byte_load: "paying"). Setiap bukti bundle mengisytiharkan had yang sama, 20,479 (Yuran); envelope_bytes: 1860: setiap sampul nota tepat 1,860 bait dan membawa medan memo yang disulitkan;hardening_v6: true, suis pengukuhan v0.6, ditetapkan oleh setiap chain sejak chain 16;testnet: true, penanda yang membenarkan faucet berada bersebelahan bahagian bridge;binding_domain: 1: setiap bukti transaksi dan setiap mesej tindakan bertandatangan merangkumi hash genesis, supaya tiada apa yang dibuktikan atau ditandatangani untuk satu chain disahkan pada chain lain;proof_window_blocks: 1024: anchor sesebuah bundle boleh menjadi salah satu daripada 1,024 root hujung blok yang terakhir dantime-nya sehingga 1,024 blok di belakang ketinggian (256 pada chain 19), yang memberikan pembukti yang perlahan atau yang diwakilkan kira-kira dua puluh minit;program_state, RPL-2: sel program, peti program dan tindakanInvoke, dengan yuran sel 0.1 RAND bagi setiap sel yang dicipta oleh sesuatu invoke (JSON-RPC mempunyai had-hadnya).
Ia tidak mempunyai bahagian aggregation, dan binaan enggan bermula pada genesis yang membawanya.
timestamp_ms ialah sifar jam rantaian. Apabila anda memotong genesis sendiri, tetapkan nilainya hampir dengan masa pelancaran sebenar dan jangan sekali-kali mendahuluinya. Jika terlalu jauh di masa lalu, masa blok ketinggalan daripada jam dinding sehingga had langkah 60 s setiap blok membolehkannya mengejar. Jika lebih daripada 15 saat di masa hadapan, blok 1 langsung tidak dikomit: setiap undi, termasuk undi pemimpin, ditahan sehingga masa dinding mencapai cap masa genesis. Semaklah terhadap jam mesin yang melancarkan armada nod, bukan mesin yang memotong fail tersebut.
Jalankan
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
| argumen | lalai | maksud |
|---|---|---|
--datadir | wajib | direktori data yang telah dimulakan |
--key | wajib | fail kunci: identiti validator, identiti p2p, penerima yuran |
--listen | /ip4/0.0.0.0/tcp/30303 | multiaddr dengar libp2p, boleh diulang |
--bootstrap | tiada | rakan sebaya yang dihubungi semasa permulaan dan setiap 30 s selagi terputus sambungan, boleh diulang |
--rpc | 127.0.0.1:8545 | pendengar JSON-RPC dan WebSocket operator: setiap kaedah, dan ia mempercayai loopback. Kekalkan pada loopback, dan jangan sekali-kali memajukan titik akhir awam kepadanya |
--public-rpc <ADDR> | mati | v0.6.8: pendengar kedua yang awam untuk dituju oleh proksi songsang atau pemajuan SSH: set kaedah tetap tanpa kaedah kunci pelihat, rand_mint atau rand_getPeers, tiada kelompok, tiada WebSocket, satu meter untuk semua pemanggil (JSON-RPC) |
--rpc-viewing-token-file <PATH> | mati | v0.6.8: mewajibkan token pembawa (baris pertama fail, 32 aksara atau lebih) pada kaedah kunci pelihat bagi --rpc |
--reserved-peer <PEER_ID> | tiada | v0.6.8, boleh diulang: rakan sebaya yang dibenarkan melepasi had sambungan masuk; lihat Rakan sebaya terpelihara |
--strict-gossip | mati | v0.6.8: hanya menerima gosip dengan tandatangan pengarang, nombor jujukan dan sumber yang sah; ia dilancarkan nod demi nod |
--validator | mati | nod ini memegang kunci validator dan mengambil bahagian dalam konsensus apabila kuncinya berada dalam set semasa |
--no-mdns | mati | lumpuhkan penemuan LAN; disyorkan pada pelayan |
--block-interval-ms | 1000 | jarak minimum antara cadangan |
--view-timeout-ms | 3000 | tamat masa paparan asas, berganda bagi setiap tamat masa berturut-turut sehingga 8× |
--verify-chain | quick | semakan integriti semasa permulaan: off, quick (struktur dan main semula lejar), full (termasuk setiap tandatangan dan QC) |
--keep-raw-proofs | mati | mod arkib untuk pengagregatan blok; tiada kesan pada chain 20 |
--prune-history | mati (simpan semua) | simpan lejar dan hanya sejarah blok sebanyak ini: <n>m, <n>h atau <n>d, sekurang-kurangnya 1h. Validator testnet menjalankan 24h, kecuali dua arkib; lihat Pemangkasan sejarah |
--min-free-disk-mb | 1024 | enggan bermula jika ruang kosong pada sistem fail direktori data kurang daripada nilai ini; rand_getHealth menjawab disk_low di bawah empat kali ganda nilainya. 0 melumpuhkan pengawal ini |
--prover <ADDR> | mati | menjadi hos prover yang diwakilkan pada alamat ini, pendengar tersendiri dan bukan RPC; lihat di bawah |
--gas-price, --byte-price | 100, 800 | lantai harga kolam bagi panggilan pada rantaian tanpa seksyen gas. Genesis chain 20 menetapkan harganya sendiri, maka nod mengabaikan kedua-dua bendera itu di sana dan mencatat amaran |
--prover-accept-spend-key telah dihentikan: nod v0.6.8 yang diberikannya enggan bermula, jadi buangkannya daripada mana-mana fail unit yang dibawa dari v0.6.7.
Ketiga-tiga bootstrap di atas ialah validator C, D dan E, tidak berubah daripada chain 19. Chain 20 berjalan pada kunci validator yang dijana untuk chain 14, jadi id rakan sebaya mereka sama dengan yang digunakan chain 14; identiti p2p diperoleh daripada kunci validator. Kebanyakan validator hanya menyimpan blok sehari, jadi nod yang menyegerak dari genesis, atau yang ketinggalan lebih daripada sehari, memerlukan rakan sebaya sejarah penuh juga. Tambahkan salah satu daripada dua arkib:
--bootstrap /ip4/168.144.46.203/tcp/30303/p2p/12D3KooWS5usdMPvsbaWSaT2xtKndHvDYurwmueoNvaRRarb2wRf # obs1
--bootstrap /ip4/206.81.29.236/tcp/30303/p2p/12D3KooWPocyZGcNB9Vp68VSfgVvNXhSzBBoJa4h9R1yMkp71XHh # rand-archive-2
Abaikan --validator untuk menjalankan pemerhati. Permulaan: buka storan, semak guest binaan ini terhadap hc_bundle dan hc_auth genesis, jalankan semakan integriti (memangkas ekor yang rosak dan mengekalkan keadaan keselamatan undi), sambung semula konsensus daripada kepala yang disimpan, mulakan rangkaian dan RPC, kemudian segerak daripada mana-mana rakan sebaya yang lebih maju. RUST_LOG lalai kepada info,libp2p=warn,libp2p_mdns=off; Ctrl-C atau SIGTERM, isyarat henti systemd, menutup nod dengan bersih. Memulakan semula daripada --datadir yang sama menyambung semula daripada kepala yang disimpan.
Peraturan topologi daripada fullnode: nod di sebalik NAT menghubungi nod yang mempunyai alamat awam; buka TCP 30303 masuk pada nod awam; ikat RPC kepada 127.0.0.1 melainkan ia dilindungi tembok api — ia menerima transaksi daripada sesiapa yang boleh mencapainya, dan setelah kunci pelihat diimport ke dalamnya, perlakukan port itu sebagai pembawa kunci. Kekalkan --block-interval-ms pada 1000 atau lebih perlahan: bukti bundle mengambil masa kira-kira dua minit dan anchornya sah selama 1,024 blok pada chain 20 (256 pada chain 19).
Validator memerlukan jam yang diselaraskan. Sejak chain 14, masa jam dinding merupakan sebahagian daripada konsensus (pengukuhan jambatan B2). Blok yang cap masanya lebih daripada 60 s selepas induknya adalah tidak sah, dan validator menahan undinya daripada blok yang cap masanya lebih daripada 15 s mendahului jamnya sendiri. Validator yang jamnya perlahan oleh itu berhenti mengundi tanpa mencatat sebarang kesalahan, dan dua puluh enam daripada dua puluh enam…
Sebenarnya, saya perlu membetulkan perenggan terakhir: berikut ialah versi yang tepat.
Validator memerlukan jam yang diselaraskan. Sejak chain 14, masa jam dinding merupakan sebahagian daripada konsensus (pengukuhan jambatan B2). Blok yang cap masanya lebih daripada 60 s selepas induknya adalah tidak sah, dan validator menahan undinya daripada blok yang cap masanya lebih daripada 15 s mendahului jamnya sendiri. Validator yang jamnya perlahan oleh itu berhenti mengundi tanpa mencatat sebarang kesalahan, dan lapan belas daripada dua puluh enam mesti mengundi untuk mengkomit pada chain 20. Jalankan NTP pada setiap validator dan semaknya sebelum anda memulakan nod:
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
Rakan sebaya terpelihara
Sejak v0.6.8, nod menerima paling banyak 256 sambungan masuk yang telah terjalin dan 64 yang separuh terbuka, dan identiti libp2p tidak memerlukan kos untuk dicipta, jadi orang asing boleh menduduki setiap slot. Tiga jenis rakan sebaya dipelihara, dibenarkan melepasi had dan dilayan daripada bahagian bajet penyegerakan validator: setiap rakan sebaya --bootstrap, setiap --reserved-peer, dan setiap identiti validator yang dipelajari daripada pengikatan rakan sebaya bertandatangan. Setiap nod --validator menandatangani identiti libp2p-nya dengan kunci validatornya dan menggosipkannya; nod yang mengetahui kunci itu daripada set validator memelihara rakan sebaya tersebut dan mengekalkan rekod merentasi permulaan semula. Stor rantaian yang baru dipotong tidak mempunyai pengikatan, jadi sehingga pengumuman pertama tiba, hanya dua jenis pertama dipelihara: pada rantaian yang baru dipotong, berikan id rakan sebaya validator armada dengan --reserved-peer atau simpan dalam senarai bootstrap (rand-node address --key <file> mencetak id rakan sebaya bagi sesuatu kunci). rand_status.reserved_peers mengiranya; pada nod armada, ia harus mencapai bilangan validator dalam masa seminit selepas permulaan.
Semaknya
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 nod, serta diagnostik penyegerakan (sync_inflight_age_ms, sync_failures, sync_late_batches), cakera (disk_free_bytes, disk_low), dan lantai pengekalan (prune_floor, 0 pada nod yang menyimpan semua; prune_history_secs, null apabila tidak ditetapkan). Pada chain 20, jangkakan hc_bundle 60af094a…, hc_auth 1e4e347f…, faucet true, confidential true, testnet true, binding_domain 1, fri_profile "production", dan gas_prices antara 100 dengan 10,000 setiap gas dan 800 dengan 80,000 setiap KiB. rand_getGenesisHash mesti menjawab 6210cf07…5135 dan rand_getVersion 0.6.8.
rand_getHealth menjawab disk_low (dengan free_bytes) mendahului ok, syncing atau behind apabila ruang kosong kurang daripada empat kali ganda --min-free-disk-mb.
Pemangkasan sejarah
Nod yang dimulakan dengan --prune-history 24h menyimpan lejar (nota, nullifier, anchor, daftar validator, program) secara utuh dan memadam blok yang lebih lama, perakuannya, transaksi dan resitnya. Satu pas berjalan pada setiap blok ke-16 yang dikomit dan memadam sehingga 512 blok yang lebih lama daripada cap masa kepala tolak tetingkap; genesis, kepala dan induknya tidak pernah dipadam, dan lantai hanya naik. Cakera pulih selepas RocksDB memadatkan. Pada chain 20, seperti pada chain 19, 24 daripada 26 validator menjalankan 24h dan menyimpan kira-kira sehari blok. Apabila pemangkasan diaktifkan untuk chain 14 (2026-09-25), jadual blok setiap validator susut daripada 19 GB kepada 3.3–4.4 GB setelah tunggakan habis diproses; dua yang lain, obs1 dan rand-archive-2, juga validator sejak 2026-09-27, berjalan tanpa bendera itu dan menyimpan semuanya. Nod mainnet tidak pernah menggunakan bendera itu.
Pada nod yang dipangkas, carian beralamat ketinggalan di bawah lantai (rand_getBlockByHeight, rand_getFinality mengikut ketinggalan, julat rand_getBlocks atau rand_getCompactBlocks yang mencapainya) menjawab ralat -32010 dengan data.floor: tanyalah arkib. Carian beralamat cincangan menjawab null bagi blok yang tidak lagi dipegang nod, seperti bagi blok yang tidak pernah wujud. Pengimbasan dompet tidak terjejas, kerana nota dan nullifier tidak pernah dipangkas.
Semakan permulaan nod yang dipangkas bersifat struktur (blok 0 dan blok yang dikekalkan, QC, pautan induk dan pemimpinnya), bukan main semula dari genesis, dan ia tidak membaiki dirinya sendiri: jika gagal, segerak semula daripada arkib. Jangan buka direktori data yang dipangkas dengan binaan yang lebih lama daripada v0.5.7 melainkan ia dijalankan dengan --verify-chain off: semakan lalainya bermain semula dari genesis, mendapati blok 1 hilang, dan memangkas lejar kepada genesis.
Hosting a prover
Pada chain 20, dompet membuat dua bukti bagi setiap bundle, dan yang lebih besar memerlukan kira-kira 6 GB memori. Dompet yang tidak mampu menampungnya boleh menyerahkan bukti itu kepada prover yang diwakilkan yang dipasangkan dengannya: binaan berasingan rand-prover, atau perkhidmatan yang sama yang dihoskan oleh nod.
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 pautan randprover:. Dompet menerimanya dengan rand prover pair <link> dan kemudian membuat bukti melaluinya dengan pilihan global --prover. Pendengar (listener) prover adalah miliknya sendiri, dan tidak sekali-kali menjadi kaedah RPC: alamat yang sama dengan --rpc akan ditolak. Dengan --prover, nod enggan dimulakan melainkan <prover-home>/prover.key.json wujud (lalai <datadir>/prover) dan memori sebanyak 5.74 GB bagi setiap slot pembuktian serta 1 GiB tersedia; --prover-max-parallel menetapkan bilangan slot, satu secara lalai.
Pada chain 20, prover dihantar kunci pemandangan (viewing key) dompet dan salt yang baharu, bukan kunci perbelanjaan. Dompet membuat bukti kebenaran (authorisation proof) ke atas kunci perbelanjaan itu sendiri, jadi prover yang telah dipasangkan boleh membaca seluruh sejarah dompet tersebut tetapi tidak boleh membelanjakannya. Pastikan pendengar kekal pada loopback melainkan sebuah proksi yang menamatkan TLS berada di hadapannya, dan jangan menghosnya pada mesin yang menyediakan RPC awam. Penghentian menunggu bukti yang sedang diproses, maka berikan unit systemd TimeoutStopSec=180.
Semak dan baiki
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 nod terlebih dahulu. Kod keluar 0 jika konsisten, 2 jika masalah ditemui dan --repair tidak diberikan. Main semula (replay) mengesahkan semula setiap bukti bundle, maka binaan yang set kekangannya berbeza daripada set yang menghasilkan chain itu akan berhenti pada bundle yang pertama.
Menjadi validator
Sebuah validator menyertai chain yang sedang berjalan melalui pengikatan (bonding), bukan melalui genesis baharu: mulakan nod dengan --validator, cetak pendaftaran dengan rand-node register --key node.key.json --payout <rand1…> --v2 (chain 20 menolak pendaftaran v1), minta sebuah dompet mengikat sekurang-kurangnya 1,000 RAND dengan rand bond <address> 1000 --registration <hex>, dan nod mula mencadangkan blok setelah ikatan itu aktif: pada chain 20, selewat-lewatnya tiga sempadan epok 1,000 blok selepas ikatan. Pada chain 20, ikatan datang kedua. Genesisnya menetapkan staking.admission_by_vote, maka ikatan yang mendaftarkan kunci baharu ditolak sehingga validator yang memegang lebih daripada dua pertiga daripada berat undian telah mengundi masuk kunci itu: setiap seorang menandatangani dengan rand-node admit sign --candidate <key or registration> --key <validator key> --genesis-hash 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135, dan salah seorang daripada mereka menyerahkan undian dengan rand-node admit submit (Command line). rand_getAdmitted menyenaraikan kunci yang telah diundi masuk tetapi belum didaftarkan. Tidak lebih daripada 2,500 bps berat aktif boleh menjadi berat baharu pada satu sempadan epok. Staking menerangkannya langkah demi langkah. Untuk chain ujian persendirian, rand-node genesis menghasilkannya:
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 bendera tambahan, genesis tidak mempunyai hc_auth, tiada bahagian gas dan tiada memo. Chain 20 dihasilkan 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 mempunyai bendera sehingga --envelope-bytes), dan bahagian bridge dan staking serta consensus_domain disambungkan oleh skrip pemotongan. Chain baharu anda sendiri harus menggunakan --binding-domain 1: dompet v0.6.8 membuat bukti berikat genesis (genesis-bound) pada setiap id chain di luar 14 hingga 19.
Pemasangan pada pelayan
Direktori deploy/ dalam repositori mengandungi skrip yang digunakan oleh armada (fleet): deploy/push-to-vps.sh <ip> <letter> "<bootstraps>" [validator|observer] menyediakan pelayan Linux (rsync kod sumber, bina, pasang /usr/local/bin/{rand-node,rand}, mulakan datadir yang dikunci pada hash genesis, pasang perkhidmatan systemd rand-node), dan deploy/rebuild-vps.sh <ip> membina semula pada commit baharu dan memulakan semula dengan data dikekalkan. Dua perkara perlu diberi perhatian. Skrip penyediaan memulakan daripada deploy/genesis.json, yang bukan fail chain 20, maka nod untuk testnet disediakan secara manual daripada deploy/genesis-chain20.json (pada main, lihat di atas). Dan kedua-dua skrip melakukan rsync /root/fullnode dengan --delete, maka kunci yang disimpan di dalam pokok itu dipadam oleh pembinaan semula berikutnya: simpan di /root/keys, seperti yang dilakukan armada dan seperti yang kini dilakukan skrip penyediaan v0.6.8 secara lalai (skrip v0.6.7 menulis kunci di bawah /root/fullnode/deploy/). Pengurusan perkhidmatan ialah systemctl status rand-node, journalctl -u rand-node -f. Pelayan memerlukan build-essential clang cmake pkg-config libssl-dev dan rantaian alat Rust. Pelayan 1-vCPU, 2 GB tidak dapat membina binari; bina di tempat lain dan salin ke dalamnya. Running a validator and an aggregator mengandungi saiz dan persediaan langkah demi langkah.
Peneroka
randscan.org berjalan di sebelah validator E dan mengindeks chain 20; API REST dan suapan WebSocket-nya ialah cara paling mudah untuk membaca chain tanpa nod (Explorer API). Peneroka ini bersumber terbuka (randprotocol/randscan) dan pengindeksnya hanya memerlukan JSON-RPC rand_* sesebuah nod serta pangkalan data PostgreSQL, maka ia boleh dijalankan terhadap nod anda sendiri.