Rand Protocol
Dokumentasi
Panduan

Pertaruhan (Staking)

Mendaftarkan validator, kemasukan melalui undian set, mengikat pertaruhan daripada dompet, menyahikat dan mengeluarkan, alamat bayaran, epoch, bajet kemasukan pertaruhan, dan sebab tiada slashing pada rantaian langsung.

Gunakan halaman ini untuk menyertai set validator pada rantaian yang sedang berjalan, untuk keluar daripadanya, dan untuk membaca semula daftar. Berat konsensus mestilah awam, jadi daftar validator ialah satu-satunya jadual pada rantaian ini yang menyimpan jumlah secara terbuka; namun stake tetap keluar daripada nota terlindung dan kembali ke dalam satu nota terlindung.

Daftar

Satu baris bagi setiap validator yang pernah membuat bond, dikunci dengan alamat base58 miliknya:

ValidatorEntry {
    public_key,                  // Dilithium2: signs blocks, and this validator's staking actions
    stake:    u64,               // bonded: the weight an epoch's set gives it
    pending:  Vec<(u64, u64)>,   // unbonding, as (release_epoch, amount), oldest first
    rewards:  u64,               // fees earned as a block proposer, unpaid
    payout:   ShieldedAddress,   // rand1… — where a withdraw pays
    nonce:    u64,               // replay protection for its signed actions
    activation_epoch: u64,       // under a `staking` section: the first epoch this row may be in a set
}

Setiap medan adalah awam dan daftar di-hash ke dalam akar keadaan setiap blok. Baris tidak pernah dipadam: validator yang melakukan unbond ke atas keseluruhan stake kekal mempunyai satu baris dengan stake = 0.

pemalarnilaimaksud
MIN_STAKE1,000 RANDstake yang diperlukan oleh sesuatu baris untuk berada dalam set mana-mana epoch
MAX_VALIDATORS100set terbesar yang boleh dimiliki oleh sesuatu epoch
UNBONDING_EPOCHS2bilangan epoch yang perlu ditunggu oleh jumlah yang di-unbond sebelum boleh dikeluarkan
epoch_blocks1,000 pada chain 20bilangan blok bagi setiap epoch; parameter genesis

Epoch

epoch(h) = h / epoch_blocks. Set bagi epoch e ≥ 1 diterbitkan daripada daftar seperti pada blok terakhir epoch e − 1: setiap baris dengan stake ≥ MIN_STAKE, sebanyak MAX_VALIDATORS teratas mengikut (stake menurun, alamat menaik), disusun mengikut alamat. Pemimpin bagi sesuatu view, pengundi bagi sesuatu blok dan pengesahan sesuatu sijil semuanya menggunakan set bagi epoch tempat blok itu berada. Dua akibatnya:

  • Bond bukan berat sehingga sempadan yang kemudian. Ia berada dalam daftar serta-merta, tetapi set berubah hanya pada sempadan — sempadan seterusnya pada rantaian tanpa bahagian staking, lebih lewat pada chain 20 (di bawah).
  • Unbond menjejaskan berat pada sempadan seterusnya, manakala jumlahnya menunggu dua epoch sebelum boleh dikeluarkan. Validator berhenti mencadangkan blok lama sebelum ia boleh mengeluarkan stake.

Jika sesuatu penerbitan kosong, set sebelumnya dibawa ke hadapan. Nod yang dimulakan dengan --validator dan kuncinya tidak terdapat dalam mana-mana set semasa hanya memerhati sehingga sesuatu epoch menerimanya, maka validator yang membuat bond selepas genesis tidak perlu dimulakan semula; rand_status melaporkan is_validator (kunci ada di sini) dan active_validator (kunci berada dalam set semasa) secara berasingan.

Bahagian staking

Sesebuah genesis boleh membawa bahagian staking (fullnode v0.5.4, audit v4 STAKE-2). Tanpanya, peraturan di atas ialah keseluruhan ceritanya, seperti pada chain 14. Setiap rantaian sejak chain 15 membawanya. Pada chain 20, ia diaktifkan dengan:

"staking": {
  "faucet_budget_per_epoch": "10000000000000", "bond_activation_epochs": 2,
  "max_weight_bps": 3333, "max_stake_entry_bps_per_epoch": 2500,
  "admission_by_vote": true, "registration_v2": true,
  "faucet_recipients": ["rand1…", "…16 wallets…"],
  "faucet_minters": ["<validator address>", "…18 validators…"]
}
medanchain 20peraturan
bond_activation_epochs2bond yang dikenakan dalam epoch e diletakkan dalam giliran untuk epoch e + 1 + 2; pendaftaran dan tambahan (top-up) sama sahaja. Jumlahnya berada dalam stake serta-merta tetapi bukan berat sehingga ketika itu, dan stake yang berada dalam giliran tidak boleh di-unbond
max_stake_entry_bps_per_epoch2,500 (25 %)stake paling banyak, pendaftaran dan top-up digabungkan, yang menjadi berat pada satu sempadan, sebagai pecahan daripada berat yang sudah aktif di situ: ⌊active · bps / 10,000⌋. Baris yang sudah sampai tempohnya tetapi melebihi had menunggu sempadan seterusnya, mengikut susunan bond. Pada 26,000 RAND stake aktif chain 20, itu bersamaan 6,500 RAND pada setiap sempadan. Bahagian pemasuk baharu selepas k sempadan tidak melebihi 1 − 1.25^−k pada sebarang skala, kira-kira satu pertiga selepas dua
admission_by_votetruebond yang mendaftarkan kunci baharu ditolak (NotAdmitted) sehingga validator yang memegang lebih daripada dua pertiga berat mengundi telah mengundi kunci itu masuk (di bawah); top-up tidak memerlukan undi
max_weight_bps3,333berat mana-mana validator tidak melebihi 33.33 % daripada jumlah set miliknya; lebihannya dihadkan dalam set, stake dalam daftar tidak berubah
registration_v2truependaftaran menandatangani rand-register-2 ke atas hash genesis, id rantaian, alamat validator dan payout; pendaftaran v1 ditolak
faucet_budget_per_epoch10,000 RANDfaucet mencetak paling banyak jumlah ini bagi setiap epoch (FaucetBudgetExhausted jika melebihinya; pembilang dimulakan semula pada epoch seterusnya)
faucet_recipients16 dompetMint faucet hanya membayar dompet-dompet ini (FaucetRecipientNotAllowed); senarai inilah yang membolehkan faucet diletakkan di sebelah bridge
faucet_minters18 validatorMint faucet hanya boleh ditandatangani oleh kunci validator ini (MinterNotAllowed), disemak semasa kemasukan dan apabila blok dikenakan, tanpa mengira berapa lama kunci lain telah di-bond. Pada chain 20, mereka ialah 18 daripada 26 validator genesis. Senarai ini terdapat dalam setiap genesis sejak chain 16
slashingtiadatiada bahagian slashing, maka tiada validator yang di-slash atau dipenjarakan (Apa yang awam)

Di bawah bahagian ini, pembilang faucet dan giliran bond ditambah pada akar keadaan, di bawah domain rand-state-5, dan daun validator ialah rand-validator-leaf-4. Chain 20 juga mempunyai harga gas dinamik dan keadaan program RPL-2, yang ditambah selepasnya, lalu memindahkan domainnya kepada rand-state-8, dan kemasukan melalui undi membungkus akar itu sekali lagi sebagai H("rand-state-admitted-1", root ‖ admitted_root). Chain 15 tidak mempunyai senarai faucet_minters: di sana, setiap nod mengumpul dan memajukan Mint faucet hanya apabila validator genesis menandatanganinya (MinterNotAllowed, sebagai dasar nod), supaya validator yang di-bond selepas genesis tidak dapat menghabiskan bajet melalui pool. Dengan senarai itu, penolakan yang sama menjadi peraturan kesahihan.

Sejarah: chain 15 hingga 19 tidak mempunyai admission_by_vote, maka mana-mana kunci yang memegang 1,000 RAND boleh mendaftar, dan mereka menetapkan bajet kemasukan sebagai max_stake_entry_per_epoch tetap sebanyak 10,000 RAND pada setiap sempadan. Angka tetap disesuaikan dengan satu genesis; pecahan pula mengekalkan pemasuk pada bahagian yang sama tanpa mengira jumlah stake. Kedua-dua medan tidak boleh ditetapkan serentak.

Kemasukan melalui undi

Baharu dalam fullnode v0.6.8 (audit v6, STAKE-2) dan aktif untuk chain 20. Dengan 26 kunci masing-masing 1,000 RAND, satu pertiga penghalang bagi set ialah kira-kira 13,000 RAND stake yang dibeli, dan tiada apa-apa yang di-slash. Di bawah peraturan ini, set itulah yang menentukan kunci baharu mana yang boleh mendaftar.

  • Undi ialah satu tindakan, AdmitValidator { candidate, signatures }, tanpa bundle dan tanpa fi. Setiap tandatangan ialah tandatangan Dilithium2 seorang validator ke atas blake3("rand-admit-validator-1" ‖ genesis hash ‖ candidate address), mengikut susunan menaik alamat pengundi. Pengundi mestilah memegang lebih daripada dua pertiga secara ketat berat set pengundi, aritmetik sijil kuorum: pada chain 20, 18 daripada 26 validator. Undi terikat kepada satu genesis dan tidak memerlukan nonce: kemasukan digunakan oleh pendaftaran yang dibenarkannya.
  • Set pengundi ialah terbitan daftar sendiri bagi epoch semasa. Bond yang berada dalam giliran bukan berat di dalamnya, dan unbond meninggalkannya serta-merta. Calon tidak boleh mengundi dirinya masuk.
  • Set yang diterima ialah keadaan konsensus, paling banyak 256 kunci yang menunggu untuk mendaftar (AdmissionSetFull jika melebihinya). rand_getAdmitted menyediakannya; rand_getLimits.admission_by_vote menyatakan sama ada sesebuah rantaian memerlukan undi.
# each voting validator, offline
rand-node admit sign --candidate <registration hex or public key> --key node.key.json --genesis-hash <hash>
# whoever collects the lines
rand-node admit submit --candidate <…> --signature <line> --signature <line> … --rpc http://127.0.0.1:8545

Kemudian bond diteruskan seperti di bawah. rand_getGenesisHash mengembalikan hash yang diperlukan oleh admit sign.

Empat arahan

Binari mana yang memiliki tindakan mana bergantung pada kunci mana yang menandatanganinya: bond membelanjakan nota, maka ia ialah arahan dompet; unbond dan withdraw ditandatangani oleh kunci Dilithium2 validator, yang hanya dipegang oleh nod.

tindakanarahanmenumpang padamembayar
registerrand-node registertiada — mencetak blobtiada
Bondrand bondbundle yang burn_r-nya ialah stake0.001 RAND daripada nota dompet
Unbondrand-node unbondtiada (bundle: null)tiada
Withdrawrand-node withdrawtiada (bundle: null)0.001 RAND daripada jumlah yang dikeluarkan

Register

rand-node register --key node.key.json --payout "$(rand --key payout.key.json address)" --v2 [--rpc http://127.0.0.1:8545]

Mencetak alamat validator dan Registration heks: kunci awamnya, alamat payout dan tandatangan. Dengan --v2, yang diwajibkan oleh chain 20, tandatangan itu berada di bawah rand-register-2 ke atas hash genesis rantaian, id rantaian, alamat validator dan payout; tanpanya, bentuk v1, blake3("rand-register" ‖ bincode(chain_id, payout)), yang ditolak oleh chain 20 (pada rantaian binding_domain: 1 seperti chain 20, mesej pendaftaran ialah mesej v2 dalam apa jua keadaan). RPC dibaca untuk id rantaian dan, dengan --v2, hash genesis, supaya pendaftaran yang ditandatangani untuk satu rantaian ditolak pada rantaian lain. Alamat payout ialah alamat dompet, bukan kunci nod, dan ia ialah satu-satunya medan yang tidak boleh diubah oleh top-up kemudian. Serahkan heks itu kepada pemegang stake.

Bond

rand bond <validator base58> <amount in RAND> [--registration <hex>] [--fee <RAND>] [--no-wait] [--cuda]

Transaksi terlindung biasa: dompet membuktikan bundle aset tersembunyi 4-masuk-4-keluar yang dibawa oleh setiap transaksi sejak chain 14, dengan jumlah yang dipertaruhkan berada dalam pembakaran RAND, burn_r, dan lejar hanya menerima sesuatu ikatan apabila burn_r == amount. Pada chain 20, bundle membawa dua bukti, seperti setiap bundle sejak chain 17: bukti bundle tier-14 dan bukti kebenaran tier-10 ke atas kunci perbelanjaan. Kedua-duanya dibuktikan secara setempat secara lalai, dalam masa kira-kira dua minit pada komputer riba Apple Silicon (Memori pembuktian). Dengan pilihan --prover pada dompet, bukti bundle dihasilkan oleh pembukti yang dipasangkan, manakala bukti kebenaran kekal pada mesin dompet. --registration diwajibkan tepat apabila validator belum berada dalam daftar, dan ditolak apabila sudah ada; dompet menyemak daftar terlebih dahulu. Pada chain 20, ikatan pendaftaran ditolak dengan NotAdmitted melainkan set telah mengundi untuk menerima kunci itu terlebih dahulu (Kemasukan melalui undian); penambahan tidak memerlukan undian. Ikatan pendaftaran sekurang-kurangnya 1,000 RAND; penambahan boleh berapa-berapa jumlah di atas sifar. Yang diketahui oleh chain ialah stake validator ini bertambah sebanyak ini; nota mana yang membayar, dan milik siapa, kekal tersembunyi seperti dalam pemindahan — sesiapa sahaja boleh membuat staking kepada sesebuah validator tanpa mendedahkan apa-apa selain jumlahnya.

submitted bond 8c3f…e1
  0 RAND out, 1000 RAND burned, 0.999 RAND change, fee 0.001 RAND, anchored at height 412
2nRdFC…: stake 1000 RAND, counting as consensus weight from epoch 69

Epok yang dicetak oleh dompet ialah sempadan yang berikutnya. Ia tidak mengira kelewatan pengaktifan: pada chain 20, ikatan yang dikomit dalam epok 68 menjadi pemberat daripada epok 71 paling awal, lebih lewat jika bajet kemasukan, suku daripada pemberat aktif bagi setiap sempadan, telah habis digunakan.

Nyahikatan

rand-node unbond <amount in RAND> --key node.key.json [--rpc …] [--no-wait]

Memindahkan amount daripada stake ke dalam pending dengan release_epoch = epoch + 2 dan menaikkan nonce. Percuma, tanpa bundle, ditandatangani ke atas blake3("rand-unbond" ‖ bincode(chain_id, validator, amount, nonce)) pada chain 14 hingga 19 dan ke atas blake3("rand-unbond-2" ‖ bincode(genesis_hash, chain_id, validator, amount, nonce)) pada chain 20 (genesis binding_domain: 1); ia dikomit dalam masa sesebuah blok. rand-node v0.6.8 memilih bentuk yang sesuai bagi chain yang dihubunginya. Menyahikat melebihi stake, atau sifar, ditolak; beberapa nyahikatan dalam satu epok digabungkan menjadi satu baris pending.

Pengeluaran

rand-node withdraw <amount in RAND> --key node.key.json [--rpc …] [--no-wait]

Membayar nilai yang telah dilepaskan — rewards serta baris pending yang release_epoch-nya telah tiba, yang paling lama dahulu — ke dalam nota deposit pada alamat payout daftar. Ia ditandatangani oleh validator (pada chain 20 di bawah rand-withdraw-2, ke atas hash genesis dahulu, seperti nyahikatan) dan tanpa bundle tetapi tidak percuma: asas 0.001 RAND diberikan kepada proposer blok yang menggunakannya, daripada jumlah itu, maka pengeluaran 1,000 RAND mencipta nota bernilai 999.999 dan jumlah yang tidak dapat menampung asas itu ditolak. Chain mengira nota itu sendiri:

cm = H_CM(payout.pk, from = 0, amount − 0.001 RAND, asset 0, time, r)

time ialah ketinggian kepala semasa arahan dijalankan (dicetak, dan terikat pada tandatangan), diterima di mana-mana dalam tetingkap bundle (1,024 blok pada chain 20, yang genesisnya menetapkan proof_window_blocks; 256 pada chain terdahulu); r diterbitkan supaya chain tidak pernah menerima komitmen daripada wayar. Selepas itu dompet pembayaran menemui nota itu dengan mengimbas, tanpa diberitahu apa-apa:

rand --key payout.key.json balance      # balance: 999.999 RAND

Menyertai dan meninggalkan

# on the joining validator's machine
rand-node register --key node.key.json --payout "$(rand --key payout.key.json address)" --v2
rand-node run --datadir ./data --key node.key.json --validator --bootstrap /ip4/…/p2p/…
#   it syncs and observes; rand_status says is_validator true, active_validator false

# on chain 20: validators holding more than two thirds of the weight vote the key in
rand-node admit sign --candidate <hex from above> --key <their node.key.json> --genesis-hash <hash>
rand-node admit submit --candidate <hex from above> --signature <line> … --rpc http://127.0.0.1:8545

# on the machine holding the stake
rand bond <validator base58> 1000 --registration <hex>
rand validators                       # the new row, active false until it activates

# from its activation epoch on (on chain 20, three boundaries after the bond at the earliest)
rand-node status                      # active_validator: true
rand-node unbond 1000 --key node.key.json     # out of the set at the next boundary
#   wait two epochs
rand-node withdraw 1000 --key node.key.json    # a note worth 999.999 RAND at the payout address

Semak aritmetik kuorum sebelum menyahikat: satu set n memerlukan lebih daripada 2/3 stake-nya dalam talian. Pada chain 20, kesemua 26 validator berada tepat pada MIN_STAKE, jadi sebarang nyahikatan menyebabkan nod itu keluar daripada set epok berikutnya, dan 18 daripada 26 mesti kekal aktif. Validator yang aktif tetapi tidak mengundi turut dikira terhadap kuorum: sejak chain 14, validator menahan undinya daripada blok yang lebih daripada 15 s di hadapan jamnya sendiri, maka validator yang jamnya perlahan berhenti mengundi tanpa sebarang ralat. Jalankan NTP padanya (Menjalankan validator).

Genesis mengisi daftar secara terus — satu entri bagi setiap --validator <key or hex pubkey>,<stake>,<payout> — dan menolak stake di bawah minimum. Genesis chain 20 mengisi 26 baris masing-masing 1,000 RAND, dengan kunci yang sama seperti chain 19.

Sejak v0.5.11, binaan turut membawa vesting genesis: daftar awam peruntukan berkunci masa, yang daripadanya entri tidak boleh batal boleh mengikat RAND berkunci sebagai stake validator (rand-node vesting bond) dan mengambilnya semula (rand-node vesting unbond). Ia memerlukan seksyen vesting dalam genesis. Tiada chain yang memilikinya, termasuk chain 20, dan tanpanya tindakan tersebut ditolak semasa kemasukan. (v0.6.8 juga membenarkan entri vesting yang boleh dibatalkan dibatalkan hanya oleh ambang penandatangan kepada perbendaharaan tetap, sekali lagi hanya di bawah seksyen vesting.)

Apa yang awam

awamtersembunyi
daftarsetiap baris: alamat, stake, baris gilir nyahikatan, ganjaran yang belum dibayar, alamat pembayaran, noncetiada
Bondvalidator, jumlah, sama ada pendaftaran dilampirkan, burn_r bundlenota mana yang membayar, siapa pemiliknya, baki
AdmitValidator (chain 20)calon dan setiap pengundi beserta tandatangannyatiada yang lain wujud
Unbondvalidator, jumlah, noncetiada yang lain wujud
Withdrawvalidator, jumlah, nonce, time dan r notasiapa yang boleh membuka nota itu, dan setiap perbelanjaan nota itu selepas itu

Ganjaran ialah yuran bagi blok yang dicadangkan oleh sesebuah validator. Tiada ganjaran blok dan tiada inflasi, dan pada chain 20 tiada slashing dan tiada penjaraan validator: validator yang berkelakuan tidak betul tidak merugikan stake-nya sedikit pun, dan penyelesaiannya terletak pada pengendali. Fullnode v0.6.8 memang membawa peraturan slashing bagi ekuivokasi pemimpin (audit v6, STAKE-1: dua pengepala blok bertandatangan bagi satu view oleh satu kunci memusnahkan equivocation_bps daripada stake dan memenjarakan kunci itu), tetapi hanya di bawah seksyen genesis staking.slashing, dan chain 20 tidak memilikinya (rand_getLimits.slashing ialah null); fullnode mengesyorkannya hanya apabila stake dipegang oleh lebih daripada seorang pengendali. (Kod pengagregatan blok juga membawa tindakan SlashAggregator bagi pengagregat yang menandatangani dua agregat berbeza pada satu nonce, dan ia tidak aktif pada chain 20, yang tidak mempunyai seksyen pengagregatan.)

Membacanya semula

rand validators        # the whole register
rand status            # is_validator / active_validator for the node asked
→ {"method":"rand_getValidators","params":[]}
← [{ "address": "2nRdFC…", "stake": "1000000000000",
     "pending": [{ "release_epoch": 71, "amount": "1000000000000" }],
     "rewards": "4000000", "payout": "rand1…", "nonce": 3, "active": true, "jailed_until": null }]
→ {"method":"rand_getAdmitted","params":[]}
← { "admission_by_vote": true, "admitted": [], "max": 256 }
→ {"method":"rand_getEpoch","params":[]}
← { "epoch": 69, "epoch_blocks": 1000, "next_set": ["2nRdFC…", "ByDkxs…"] }

Jumlah ialah rentetan perpuluhan bagi unit. active menyatakan sama ada baris itu berada dalam set yang menjalankan epok semasa; jailed_until ialah null kecuali di bawah seksyen slashing; admitted menyenaraikan kunci yang telah diundi masuk tetapi belum mendaftar; next_set ialah unjuran yang dialihkan oleh setiap ikatan dan nyahikatan sebelum sempadan. GET /validators penjelajah menambah share_percent, blocks_proposed dan ketinggian terakhir yang dicadangkan.

Disahkan kali terakhir terhadap commit fullnode c0878c3f (rantai 21) pada 2026-10-12. Jika kod dan halaman ini tidak selari, kodlah yang betul; sila maklumkan kepada kami.