Rand Protocol
Dokumentasi
Program contoh

Empat program di chain 20

Empat program rahasia lengkap yang dideploy di testnet - pemungutan suara anonim, bukti kewajiban (proof of liabilities), buku besar off-chain, dan keputusan kredit privat - beserta id program, pengaturan yang mereka gunakan bersama, apa yang diubah chain 18 bagi penulis program, dan cara memanggilnya sendiri.

Program-program ini masing-masing merupakan satu aplikasi lengkap dari sebuah panggilan rahasia: sebuah masalah, sebuah antarmuka, sebuah guest Rust, perangkat di sisi host, serta deploy dan pemanggilan di testnet yang aktif. Program-program ini lebih panjang daripada tutorial, dan masing-masing bertumpu pada bagian mesin yang berbeda. Menulis program dalam Rust atau C adalah panduan untuk model yang mereka semua gunakan. Bacalah terlebih dahulu jika read_input, segmen publik, atau delapan slot keluaran masih asing bagi Anda.

Semuanya pertama kali dijalankan pada chain 18 dengan fullnode v0.6.7, pada 2026-09-30, dan setiap keluaran di halaman-halaman ini ditempelkan dari proses tersebut. Program tidak terbawa melintasi pergantian chain, sehingga pada 2026-10-01 keempatnya di-deploy ulang tanpa perubahan di chain 19 dan kemudian di chain 20 (fullnode v0.6.8), dan pemanggilannya diulang setiap kali. Id program adalah hash dari kode dan segmen publik, bukan dari chain, sehingga setiap id tetap sama; hash transaksi dalam transkrip adalah milik chain 18, dan tabel di bawah ini menautkan milik chain 20. Pada chain 20, sebuah program juga dapat menyimpan state di antara pemanggilan (RPL-2); keempat program ini tidak menggunakannya, dan State program serta repositori example-programs membahas program yang menggunakannya.

Empat program

programyang dibuktikan oleh sebuah panggilanbertumpu padakatatier
Pemungutan suara anonimpemanggil adalah anggota dari daftar yang dipublikasikan, tanpa menyebutkan yang mana, dan belum pernah memberikan suara sebelumnyaKeccak-256, sebuah segmen publik42712
Bukti kewajibansaldo privat para nasabah berjumlah tidak lebih dari cadangan yang dipublikasikan, di bawah sebuah root yang dapat diperiksa setiap nasabahSHA-256, sebuah pohon yang dibangun di dalam program99414
Buku besar off-chainsekumpulan transfer membawa sebuah buku besar dari satu state ke state berikutnya, dengan setiap pengirim terotorisasi dan tanpa ada yang terciptaPoseidon2, state yang dibawa di antara pemanggilan77314
Keputusan kredit privatsebuah model yang dipublikasikan menyetujui atau menolak data pemohon privat yang dijamin oleh seorang attesteraritmetika bilangan bulat, sebuah model dalam segmen publik46212

Keempatnya aktif di chain 20. Setiap pemanggilan dalam tabel mengulang, dengan input yang sama, pemanggilan chain 18 yang ditampilkan di halaman program tersebut:

programid programdi-deploy di chain 20 padapemanggilan pertama di chain 20
pemungutan suara anonimad2f719f12d01c9f3c0962092b9898b75b0914bbb817031d51be13e54c05b970f6ae5528…0f823a304e7a…427b
bukti kewajibanfce8474dfdf80b9733e04fb72d4d8d19c40ba5ab646b3d867322daf4b9b599c0a8bc281b…17d96116c15f…d62a
buku besar off-chainc4ddd388f2d94299610c7c3409dfdfb4dcb4ae3e0bc9ec78d0c45f51d8231cab72cc95f2…3d519c9998bb…66eb
keputusan kredit privat7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c413e6658…e42bd3ceb306…124a

Penjelajah mencantumkan setiap program beserta pemanggilannya di randscan.org/programs. Sebuah chain testnet diganti dari waktu ke waktu, dan program tidak terbawa: setelah pergantian berikutnya, id-id ini akan hilang dan program perlu di-deploy ulang.

Persiapan

Toolchain. Guest dibangun dengan rand-guest dari repositori circuits, pada commit yang di-vendor oleh fullnode v0.6.7 maupun v0.6.8:

git clone https://github.com/randprotocol/zkp-circuits circuits
cd circuits
git checkout aeacf31                      # branch feat/v067-circuits
rustup toolchain install 1.98.1
rustup target add riscv32im-unknown-none-elf --toolchain 1.98.1
(cd rand-guest && cargo +1.98.1 build --release)
alias rand-guest="$PWD/rand-guest/target/release/rand-guest"

Commit tersebut penting karena dua alasan. hc adalah fungsi dari kode sumber dan toolchain, sehingga guest yang dibangun ulang pada commit lain dari guest-sdk dapat menghasilkan hc yang berbeda. Dan tanda tangan fungsi SDK berubah: pada aeacf31, keccak dan sha256_compress menerima referensi array, sedangkan commit yang lebih lama menerima pointer mentah.

Kode sumber. Keempat guest, skrip host-nya, dan data demonya adalah satu unduhan. Ekstrak di dalam checkout, karena rand-guest build menemukan guest-sdk dengan mencari ke atas dari direktori guest:

mkdir -p my-guests
curl -sSf https://randprotocol.org/examples/rand-example-programs.tar.gz | tar -xz --strip-components=1 -C my-guests
ls my-guests
# allowlist  ledger  ledger-host  score  solvency

Berkas-berkasnya juga dapat dijelajahi satu per satu di bawah https://randprotocol.org/examples/programs/, misalnya allowlist/src/main.rs.

Wallet. Deploy dan pemanggilan memerlukan wallet rand dari fullnode v0.6.8 (cargo build --release -p randprotocol-client dalam checkout fullnode pada tag v0.6.8, atau rand yang dilampirkan pada rilis v0.6.8), sebuah kunci, dan RAND. Wallet yang lebih lama tidak dapat bertransaksi di chain 20: chain 20 mengikat setiap bukti dan pesan bertanda tangan pada genesis-nya, sedangkan wallet v0.6.7 tidak melakukannya.

RPC. Endpoint publik, https://rpc.randprotocol.org, sudah cukup untuk semua yang ada di halaman-halaman ini: membaca program dan receipt, menyinkronkan wallet, melakukan deploy dan pemanggilan. Sinkronisasi pertama sebuah wallet membaca setiap header blok dan setiap blok yang membawa note, 645 permintaan pada ketinggian chain 18 tanggal 2026-09-30, dan memakan waktu sekitar tiga menit melalui endpoint tersebut. Endpoint mengizinkan setiap alamat 1.200 pembacaan dan 6 pengiriman per menit. Node milik Anda sendiri (Menjalankan node) tidak memiliki batasan semacam itu.

export RAND_RPC=https://rpc.randprotocol.org
export RAND_KEY=$HOME/wallet.key.json

Di chain 18, salah satu suara yang dihitung pada halaman pemungutan suara anonim, fdbcc960…fc2b, dibuktikan di sebuah laptop dan dikirim hanya melalui endpoint publik. Di chain 19 dan 20, ketiga belas transaksi setiap kalinya, yaitu empat deploy dan sembilan pemanggilan, berjalan dengan cara itu.

Apa yang diubah chain 18 bagi sebuah program

Sebuah pemanggilan mendeklarasikan batas gas, dan membayarnya. Constraint set 8 mengukur setiap eksekusi. Satu siklus biasa bernilai 1 gas. Syscall hash adalah pengecualiannya:

instruksigas
instruksi RV32IM apa pun, HALT, WRITE_OUTPUT, READ_INPUT, READ_PUBLIC1
POSEIDON2 atas n word3 + 3 × ⌈n / 4⌉
SHA256, satu kompresi64
KECCAK, satu permutasi192

Bukti membawa satu nilai publik baru, yaitu batas yang dideklarasikan, dan sirkuit menegakkan bahwa gas eksekusi tidak melebihinya. Gas yang tepat tetap privat. rand call menjalankan program di emulator terlebih dahulu dan mencetak keduanya:

gas: 5636 (declaring 6144, tier 12)

Secara default, wallet membulatkan ke atas gas yang tepat menjadi kelipatan 2^(tier − 2), yaitu 1.024 pada tier 12 dan 4.096 pada tier 14, sehingga batas yang dideklarasikan hanya sedikit menjelaskan eksekusinya. --gas-limit max mendeklarasikan batas tertinggi tier dan tidak mengungkapkan apa pun selain tier. --gas-limit N mendeklarasikan angka yang tepat.

Biaya mengikuti batas yang dideklarasikan dan jumlah byte.

floor = 0.001 RAND  +  gas price × declared limit  +  byte price × ⌈bytes / 1024⌉

Harga awalnya adalah 100 unit per gas dan 800 unit per KiB (satu unit adalah 10⁻⁹ RAND), dan bergeser sedikit setiap blok menuju sebuah target. rand_getLimits menyajikan harga yang berlaku saat ini. Wallet menambahkan ruang cadangan sebesar dua langkah harga, yaitu faktor 1,125², karena sebuah pemanggilan masuk ke blok dua atau tiga blok setelah dihargai.

Satu hal menentukan sebagian besar biaya. Sejak chain 18, bukti sebuah pemanggilan terikat pada transaksinya sendiri, sehingga wallet harus menetapkan biaya sebelum bukti ada, dan wallet menghargai bukti pada batas maksimum chain sebesar 4 MiB, bukan pada ukuran sebenarnya. Untuk pemungutan suara anonim, itu adalah (1.000.000 + 100 × 6.144 + 800 × 4.097) × 1,125² = 6.191.437 unit, 0,0062 RAND, yang sekitar seperdelapannya adalah gas. Keempat pemanggilan di halaman-halaman ini masing-masing berbiaya antara 0,0057 dan 0,0075 RAND. --fee menimpa nilai default.

Setiap bundle terdiri atas dua bukti. Chain 18 menjalankan otorisasi terpisah: bundle yang membayar biaya membawa sebuah bukti otorisasi tier-10 yang kecil di samping bukti bundle tier-14. Wallet membuat keduanya dan mencetak satu baris untuk masing-masing. Karena itu, sebuah pemanggilan terdiri atas tiga bukti: pemanggilan, otorisasi, dan bundle. Pada laptop Apple Silicon, keempat pemanggilan di sini memakan waktu antara tiga hingga lima setengah menit masing-masing, dengan puncak memori 6,1 hingga 6,6 GB. Bukti bundle memakan sekitar dua menit dari itu setiap kalinya. Bukti pemanggilan tier-12 menambah setengah menit dan bukti tier-14 menambah dua menit.

Batas yang harus dipenuhi sebuah pemanggilan.

bataschain 18 hingga 20
tierpaling tinggi 14: 16.383 siklus, termasuk baris digest
permutasi Poseidon22.048 pada tier 14, termasuk digest program, input, dan publik
permutasi Keccak128
kompresi SHA-256128
bukti pemanggilan4.194.304 byte (4 MiB)
program8.180 word tanpa segmen publik, sedikit lebih sedikit jika ada: chain 20, seperti chain 18 dan 19, menolak deploy yang tidak dapat ditampung oleh pemanggilan tier-14 mana pun (ProgramUncallable), berapa pun yang diizinkan max_program_words (65.535)
segmen publik32.768 word, ditetapkan saat deploy
input privat dengan transkrip tersegel16.071 word

rand-guest run --tier 14 memeriksa dua batas pertama sebelum Anda melakukan deploy. Tabel hash membuat bukti lebih besar. Bukti tier-14 buku besar, tanpa tabel hash, berukuran 1,50 MB. Tabel SHA-256 membawa bukti kewajiban menjadi 1,91 MB, dan tabel Keccak membawa bukti pemungutan suara menjadi 3,35 MB, yang merupakan sebagian besar dari batas 4 MiB.

Konvensi yang dimiliki keempatnya

  • Slot 0 adalah status, dan 0 tidak pernah menjadi status yang valid. Setiap hasil, termasuk kegagalan, memiliki nomor mulai dari 1, dan kegagalan berhenti dengan bersih sehingga dapat dibuktikan. Tanda terima yang seluruhnya bernilai nol tidak mungkin keliru dianggap sebagai sebuah hasil.
  • Slot 7 tidak disentuh. Guest Rust yang mengalami panic menulis 0xdeadbeef (3.735.928.559) di sana. Pembaca memeriksa slot 7 terlebih dahulu.
  • Slot 2 sampai 6 membawa nilai 160-bit: sebuah nullifier, sebuah root, sebuah link, sebuah komitmen. Hash 256-bit penuh terdiri dari delapan word dan tidak menyisakan ruang untuk status. Pemangkasan menjadi lima word mempertahankan ketahanan tabrakan 80 bit, dan setiap halaman menjelaskan apa yang dilindungi oleh ketahanan tersebut.
  • Urutan byte mengikuti hash. Nilai Keccak adalah word little-endian dan nilai SHA-256 adalah word big-endian, karena begitulah cara setiap syscall membaca bloknya. Skrip host dan guest yang tidak sepakat soal ini menghasilkan digest yang tidak akan pernah cocok.
  • Segala sesuatu yang berbeda pada setiap instans berada di segmen publik; segala sesuatu pada setiap panggilan adalah input privat. Root sebuah pemungutan suara, angka cadangan, dan bobot sebuah model ditetapkan saat deploy dan terikat pada id program. Sebuah panggilan tidak membawa word publik sendiri.
  • Word input berupa desimal pada baris perintah. Halaman-halaman tersebut mengubah sebuah file witness menjadi flag dengan $(sed 's/[0-9][0-9]*/--input &/g' witness.txt).

Panggil sendiri

Dengan sumber yang telah diekstrak, toolchain yang telah dibangun, dan wallet v0.6.8 yang telah didanai, pemungutan suara sebagai salah satu anggota demo membutuhkan empat perintah:

cd my-guests/allowlist
python3 allowlist.py witness 10 1 demo-secrets.txt 6 1 > witness.txt    # member 6, choice 1
rand-guest build . --max-words 65535      # only needed to run it in the emulator first
rand call ad2f719f12d01c9f3c0962092b9898b75b0914bbb817031d51be13e54c05b970 \
    $(sed 's/[0-9][0-9]*/--input &/g' witness.txt)

Pemanggilan tidak memerlukan image: rand call mengambil kode dan segmen publik program dari node, memeriksa bahwa keduanya menghasilkan hash yang sama dengan id, lalu membuktikan di atasnya.

Membaca hasil tidak memerlukan wallet maupun node. Setiap tanda terima cukup dengan satu permintaan ke endpoint publik:

$ curl -s https://rpc.randprotocol.org -H 'content-type: application/json' \
    -d '{"jsonrpc":"2.0","id":1,"method":"rand_getReceipt","params":["8aa13d1f76d28f63a46c30bb09ef44b1ba35083ca80ba7301997f98e5f783666"]}'
{"id":1,"jsonrpc":"2.0","result":{"h_in":"ea71e7701e62d49cac37b239bef132178f481835027d62b34da45fd6cf2667c6","h_pub":"2296cfca8db9d38bd0b7579056c9dea3c8d8005df7b42e2b1e954a75fed67510","height":98335,"index":0,"outputs":[1,2,392974773,873526743,1921224601,3950868247,2248722827,0],"program":"ad2f719f12d01c9f3c0962092b9898b75b0914bbb817031d51be13e54c05b970","tier":12,"tx":"8aa13d1f76d28f63a46c30bb09ef44b1ba35083ca80ba7301997f98e5f783666"}}

API explorer memberikan panggilan sebuah program dalam satu permintaan: https://randscan.org/api/v1/programs/<program id> mengembalikan call_count dan recent_calls (Explorer API).

Yang tidak dilakukan oleh satu pun dari program ini

Sebuah program di Rand adalah bukti tentang sebuah komputasi, dan chain tidak bertindak atas satu pun keluarannya. Tidak ada program ini yang memindahkan RAND atau token, menyimpan saldo, atau mengingat panggilan sebelumnya. Pemungutan suara dihitung oleh siapa pun yang membaca tanda terima. Liabilitas dibandingkan dengan cadangan yang membutuhkan buktinya sendiri. Saldo pada buku besar adalah angka dalam sebuah tree di luar chain. Keputusan kredit adalah sebuah bit yang dipilih oleh pemberi pinjaman untuk dihormati. Setiap halaman diakhiri dengan daftar hal-hal yang diserahkan oleh buktinya kepada para penggunanya.

Terakhir diverifikasi terhadap commit fullnode 48dc04b (chain 18) pada 2026-09-30, dan circuits `aeacf31` (`guest-sdk/src/lib.rs`, `rand-guest`), the commit fullnode v0.6.7 vendors; `docs/fees.md`, `docs/zkvm.md`, `docs/cli.md` and `crates/randprotocol-client/src/main.rs` at fullnode `48dc04b`; the four deploys and the four calls were made on chain 18 on 2026-09-30, and every receipt was read back from `https://rpc.randprotocol.org`. Jika kode dan halaman ini tidak sesuai, kodelah yang benar; beri tahu kami.