Empat program ini masing-masing ialah aplikasi lengkap bagi panggilan sulit: satu masalah, satu antara muka, satu guest Rust, perkakasan di sisi hos, serta satu penempatan dan satu panggilan pada testnet langsung. Program-program ini lebih panjang daripada tutorial, dan setiap satu bergantung pada bahagian mesin yang berbeza. Write a program in Rust or C ialah panduan kepada model yang digunakan oleh kesemuanya. Bacalah dahulu jika read_input, segmen awam atau lapan slot output masih baharu bagi anda.
Semuanya pertama kali dijalankan pada chain 18 dengan fullnode v0.6.7, pada 2026-09-30, dan setiap output pada halaman ini ditampal daripada larian tersebut. Program tidak dibawa merentasi pemotongan chain, maka pada 2026-10-01 keempat-empatnya ditempatkan semula, tanpa perubahan, pada chain 19 dan kemudian pada chain 20 (fullnode v0.6.8), dan panggilan diulang setiap kali. ID program ialah cincangan bagi kod dan segmen awam, bukan bagi chain, maka setiap ID adalah sama; cincangan transaksi dalam transkrip ialah milik chain 18, dan jadual di bawah memaut kepada milik chain 20. Pada chain 20, sesebuah program juga boleh menyimpan keadaan antara panggilan (RPL-2); keempat-empat program ini tidak menggunakannya, dan Program state serta repositori example-programs merangkumi program yang menggunakannya.
Empat program
| program | apa yang dibuktikan oleh sesuatu panggilan | bergantung pada | perkataan | tier |
|---|---|---|---|---|
| An anonymous vote | pemanggil ialah ahli senarai yang diterbitkan, tanpa menyatakan yang mana satu, dan belum pernah mengundi sebelum ini | Keccak-256, segmen awam | 427 | 12 |
| A proof of liabilities | baki pelanggan yang persendirian berjumlah tidak melebihi rizab yang diterbitkan, di bawah satu root yang boleh disemak oleh setiap pelanggan | SHA-256, pokok yang dibina di dalam program | 994 | 14 |
| An off-chain ledger | satu kelompok pemindahan membawa lejar daripada satu keadaan ke keadaan seterusnya, dengan setiap penghantar diberi kuasa dan tiada apa-apa dicipta | Poseidon2, keadaan dibawa antara panggilan | 773 | 14 |
| A private credit decision | model yang diterbitkan meluluskan atau menolak data pemohon persendirian yang disahkan oleh seorang pengaku | aritmetik integer, model dalam segmen awam | 462 | 12 |
Kesemuanya aktif pada chain 20. Setiap panggilan dalam jadual mengulangi, dengan input yang sama, panggilan chain 18 yang ditunjukkan pada halaman program itu:
| program | ID program | ditempatkan pada chain 20 dalam | panggilan pertama pada chain 20 |
|---|---|---|---|
| anonymous vote | ad2f719f12d01c9f3c0962092b9898b75b0914bbb817031d51be13e54c05b970 | f6ae5528…0f82 | 3a304e7a…427b |
| proof of liabilities | fce8474dfdf80b9733e04fb72d4d8d19c40ba5ab646b3d867322daf4b9b599c0 | a8bc281b…17d9 | 6116c15f…d62a |
| off-chain ledger | c4ddd388f2d94299610c7c3409dfdfb4dcb4ae3e0bc9ec78d0c45f51d8231cab | 72cc95f2…3d51 | 9c9998bb…66eb |
| private credit decision | 7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c | 413e6658…e42b | d3ceb306…124a |
Penjelajah menyenaraikan setiap program dan panggilannya di randscan.org/programs. Sesebuah chain testnet digantikan dari semasa ke semasa, dan program tidak dibawa bersama: selepas pemotongan seterusnya, ID ini akan hilang dan program perlu ditempatkan semula.
Persediaan
Rantaian alat. Guest dibina dengan rand-guest daripada repositori circuits, pada commit yang divendor oleh fullnode v0.6.7 dan 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 itu penting atas dua sebab. hc ialah fungsi bagi sumber dan rantaian alat, maka guest yang dibina semula pada commit guest-sdk yang lain boleh menghasilkan hc yang berbeza. Selain itu, tandatangan SDK telah berubah: pada aeacf31, keccak dan sha256_compress menerima rujukan tatasusunan, sedangkan commit yang lebih lama menerima penuding mentah.
Sumber. Keempat-empat guest, skrip hos dan data demonya terdapat dalam satu muat turun. Nyahpaknya di dalam checkout, kerana rand-guest build mencari guest-sdk dengan menelusuri 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
Fail-fail tersebut juga boleh dilayari satu demi satu di bawah https://randprotocol.org/examples/programs/, contohnya allowlist/src/main.rs.
Dompet. Penempatan dan panggilan memerlukan dompet rand daripada fullnode v0.6.8 (cargo build --release -p randprotocol-client dalam checkout fullnode pada tag v0.6.8, atau rand yang dilampirkan pada keluaran v0.6.8), sebuah kunci, dan RAND. Dompet yang lebih lama tidak dapat bertransaksi pada chain 20: chain 20 mengikat setiap bukti dan mesej bertandatangan kepada genesisnya, dan dompet v0.6.7 tidak berbuat demikian.
RPC. Titik akhir awam, https://rpc.randprotocol.org, mencukupi untuk segala-galanya pada halaman ini: membaca program dan resit, menyegerakkan dompet, menempatkan dan memanggil. Penyegerakan pertama sesebuah dompet membaca setiap pengepala blok dan setiap blok yang membawa nota, iaitu 645 permintaan pada ketinggian chain 18 pada 2026-09-30, dan mengambil masa kira-kira tiga minit melalui titik akhir tersebut. Titik akhir ini membenarkan setiap alamat 1,200 bacaan dan 6 penghantaran seminit. Nod anda sendiri (Running a node) tidak mempunyai had sedemikian.
export RAND_RPC=https://rpc.randprotocol.org
export RAND_KEY=$HOME/wallet.key.json
Pada chain 18, salah satu undi yang dikira pada halaman anonymous vote, fdbcc960…fc2b, dibuktikan pada komputer riba dan dihantar melalui titik akhir awam sahaja. Pada chain 19 dan 20, kesemua tiga belas transaksi setiap kali, iaitu empat penempatan dan sembilan panggilan, dihantar dengan cara itu.
Apa yang diubah oleh chain 18 untuk sesebuah program
Sesuatu panggilan mengisytiharkan had gas, dan membayar untuknya. Set kekangan 8 mengukur setiap larian. Satu kitaran biasa ialah 1 gas. Syscall cincangan merupakan pengecualian:
| arahan | gas |
|---|---|
mana-mana arahan RV32IM, HALT, WRITE_OUTPUT, READ_INPUT, READ_PUBLIC | 1 |
POSEIDON2 ke atas n perkataan | 3 + 3 × ⌈n / 4⌉ |
SHA256, satu pemampatan | 64 |
KECCAK, satu pilih atur | 192 |
Bukti membawa satu nilai awam baharu, iaitu had yang diisytiharkan, dan litar menguatkuasakan bahawa gas larian adalah sama dengan atau di bawahnya. Gas yang tepat kekal persendirian. rand call menjalankan program dalam emulator terlebih dahulu dan mencetak kedua-duanya:
gas: 5636 (declaring 6144, tier 12)
Secara lalai, dompet membundarkan gas yang tepat ke atas kepada gandaan 2^(tier − 2), iaitu 1,024 pada tier 12 dan 4,096 pada tier 14, maka had yang diisytiharkan tidak banyak mendedahkan tentang larian itu. --gas-limit max mengisytiharkan siling tier dan tidak mendedahkan apa-apa selain tier. --gas-limit N mengisytiharkan angka yang tepat.
Yuran mengikut had yang diisytiharkan dan bait.
floor = 0.001 RAND + gas price × declared limit + byte price × ⌈bytes / 1024⌉
Harga bermula pada 100 unit setiap gas dan 800 unit setiap KiB (satu unit ialah 10⁻⁹ RAND), dan bergerak sedikit setiap blok ke arah sasaran. rand_getLimits menyediakan harga semasa. Dompet menambah ruang lebihan sebanyak dua langkah harga, iaitu faktor 1.125², kerana sesuatu panggilan mendarat dua atau tiga blok selepas dinilai harganya.
Satu perincian menentukan sebahagian besar yuran. Sejak chain 18, bukti sesuatu panggilan diikat kepada transaksinya sendiri, maka dompet perlu menetapkan yuran sebelum bukti wujud, dan ia menilai harga bukti pada had chain sebanyak 4 MiB dan bukannya saiz sebenar. Bagi anonymous vote, itu ialah (1,000,000 + 100 × 6,144 + 800 × 4,097) × 1.125² = 6,191,437 unit, 0.0062 RAND, yang mana gas merangkumi kira-kira satu perlapan. Empat panggilan pada halaman ini masing-masing berharga antara 0.0057 dan 0.0075 RAND. --fee mengatasi nilai lalai.
Setiap bundle ialah dua bukti. Chain 18 menjalankan pengesahan kuasa terpisah: bundle yang membayar yuran membawa bukti pengesahan kuasa tier-10 yang kecil di samping bukti bundle tier-14. Dompet menghasilkan kedua-duanya dan mencetak satu baris bagi setiap satu. Sesuatu panggilan oleh itu terdiri daripada tiga bukti: panggilan, pengesahan kuasa dan bundle. Pada komputer riba Apple Silicon, empat panggilan di sini masing-masing mengambil masa antara tiga dan lima setengah minit, dengan puncak memori 6.1 hingga 6.6 GB. Bukti bundle memakan kira-kira dua minit daripadanya setiap kali. Bukti panggilan tier-12 menambah setengah minit dan bukti tier-14 menambah dua minit.
Had yang mesti dipatuhi oleh sesuatu panggilan.
| had | chain 18 hingga 20 |
|---|---|
| tier | paling tinggi 14: 16,383 kitaran, termasuk baris cincangan |
| pilih atur Poseidon2 | 2,048 pada tier 14, termasuk cincangan program, input dan awam |
| pilih atur Keccak | 128 |
| pemampatan SHA-256 | 128 |
| bukti panggilan | 4,194,304 bait (4 MiB) |
| program | 8,180 perkataan tanpa segmen awam, beberapa perkataan lebih sedikit dengan segmen: chain 20, seperti chain 18 dan 19, menolak penempatan yang tiada panggilan tier-14 mampu memuatkannya (ProgramUncallable), walau apa pun yang dibenarkan oleh max_program_words (65,535) |
| segmen awam | 32,768 perkataan, ditetapkan semasa penempatan |
| input persendirian dengan transkrip termeterai | 16,071 perkataan |
rand-guest run --tier 14 menyemak dua had pertama sebelum anda menempatkan. Jadual cincangan membesarkan sesuatu bukti. Bukti tier-14 bagi lejar, tanpa jadual cincangan, ialah 1.50 MB. Jadual SHA-256 membawa bukti liabilities kepada 1.91 MB, dan jadual Keccak membawa bukti undian kepada 3.35 MB, iaitu sebahagian besar daripada had 4 MiB.
Konvensyen yang dikongsi oleh keempat-empatnya
- Slot 0 ialah status, dan 0 tidak pernah menjadi status yang sah. Setiap hasil, termasuk kegagalan, mempunyai nombor bermula dari 1, dan kegagalan dihentikan dengan bersih supaya ia dapat dibuktikan. Resit yang semuanya sifar tidak mungkin dikelirukan dengan sesuatu hasil.
- Slot 7 dibiarkan tidak disentuh. Guest Rust yang mengalami panic menulis
0xdeadbeef(3,735,928,559) di situ. Pembaca menyemak slot 7 terlebih dahulu. - Slot 2 hingga 6 memuatkan nilai 160-bit: nullifier, root, pautan, komitmen. Hash 256-bit penuh ialah lapan perkataan dan tidak akan meninggalkan ruang untuk status. Pemotongan kepada lima perkataan mengekalkan 80 bit rintangan perlanggaran, dan setiap halaman menyatakan apa yang dilindungi oleh nilai itu.
- Tertib bait mengikut hash. Nilai Keccak ialah perkataan little-endian dan nilai SHA-256 ialah perkataan big-endian, kerana begitulah cara setiap syscall membaca bloknya. Skrip hos dan guest yang tidak bersetuju tentang hal ini menghasilkan digest yang sekali-kali tidak sepadan.
- Apa-apa yang berbeza bagi setiap instans berada dalam segmen awam; apa-apa yang berbeza bagi setiap panggilan ialah input persendirian. Root sesuatu undian, angka rizab dan pemberat sesebuah model ditetapkan semasa deploy dan diikat ke dalam id program. Sesuatu panggilan tidak membawa perkataan awam tersendiri.
- Perkataan input ialah perpuluhan pada baris perintah. Halaman-halaman ini menukar fail witness kepada flag dengan
$(sed 's/[0-9][0-9]*/--input &/g' witness.txt).
Panggil sendiri
Setelah sumber dinyahpak, toolchain dibina dan dompet v0.6.8 yang telah dibiayai tersedia, mengundi sebagai salah seorang ahli demo memerlukan 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)
Panggilan tidak memerlukan imej: rand call mengambil kod dan segmen awam program daripada nod, menyemak bahawa kedua-duanya menghasilkan hash yang sama dengan id, dan membuat bukti ke atasnya.
Membaca sesuatu hasil tidak memerlukan dompet mahupun nod. Mana-mana resit hanyalah satu permintaan kepada endpoint awam:
$ 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 peneroka memberikan panggilan sesebuah program dalam satu permintaan: https://randscan.org/api/v1/programs/<program id> memulangkan call_count dan recent_calls (API Peneroka).
Apa yang tidak dilakukan oleh mana-mana daripadanya
Sesebuah program pada Rand ialah bukti tentang suatu pengiraan, dan rantaian tidak bertindak atas mana-mana outputnya. Tiada satu pun program ini memindahkan RAND atau token, menyimpan baki, atau mengingati panggilan sebelumnya. Undian dikira oleh sesiapa yang membaca resit. Liabiliti dibandingkan dengan rizab yang memerlukan bukti tersendiri. Baki dalam lejar ialah nombor dalam pokok luar rantaian. Keputusan kredit ialah satu bit yang dipilih oleh pemberi pinjaman untuk dihormati. Setiap halaman diakhiri dengan senarai perkara yang ditinggalkan oleh buktinya kepada orang yang menggunakannya.