ये चार प्रोग्राम, प्रत्येक, एक गोपनीय कॉल का पूर्ण अनुप्रयोग हैं: एक समस्या, एक इंटरफ़ेस, एक Rust गेस्ट, होस्ट-पक्ष की टूलिंग, और लाइव testnet पर एक डिप्लॉय और एक कॉल। ये ट्यूटोरियल से लंबे हैं, और प्रत्येक मशीन के एक अलग हिस्से पर निर्भर करता है। Rust या C में प्रोग्राम लिखें उस मॉडल की मार्गदर्शिका है जिसका ये सभी उपयोग करते हैं। यदि read_input, सार्वजनिक खंड या आठ आउटपुट स्लॉट आपके लिए नए हैं, तो पहले उसे पढ़ें।
यहाँ सब कुछ पहली बार 2026-09-30 को fullnode v0.6.7 के साथ चेन 18 पर चलाया गया था, और इन पृष्ठों का प्रत्येक आउटपुट उन्हीं रनों से लिया गया है। चेन कट के बाद प्रोग्राम आगे नहीं जाते, इसलिए 2026-10-01 को चारों को बिना किसी बदलाव के चेन 19 पर और फिर चेन 20 (fullnode v0.6.8) पर दोबारा डिप्लॉय किया गया, और हर बार कॉल दोहराई गईं। प्रोग्राम id कोड और सार्वजनिक खंड का हैश है, चेन का नहीं, इसलिए प्रत्येक id वही है; ट्रांसक्रिप्ट में दिए ट्रांज़ैक्शन हैश चेन 18 के हैं, और नीचे की तालिका चेन 20 के ट्रांज़ैक्शनों से लिंक करती है। चेन 20 पर एक प्रोग्राम कॉलों के बीच स्टेट भी रख सकता है (RPL-2); ये चार इसका उपयोग नहीं करते, और प्रोग्राम स्टेट तथा example-programs रिपॉज़िटरी उन प्रोग्रामों को कवर करते हैं जो इसका उपयोग करते हैं।
चार प्रोग्राम
| प्रोग्राम | एक कॉल क्या सिद्ध करती है | किस पर निर्भर | वर्ड | टियर |
|---|---|---|---|---|
| एक गुमनाम मतदान | कॉलर एक प्रकाशित सूची का सदस्य है, यह बताए बिना कि कौन-सा, और उसने पहले मतदान नहीं किया है | Keccak-256, एक सार्वजनिक खंड | 427 | 12 |
| देनदारियों का प्रमाण | निजी ग्राहक शेष राशियों का योग एक प्रकाशित रिज़र्व से अधिक नहीं है, एक ऐसे रूट के अंतर्गत जिसे प्रत्येक ग्राहक जाँच सकता है | SHA-256, प्रोग्राम के भीतर बनाया गया एक ट्री | 994 | 14 |
| एक ऑफ़-चेन लेजर | ट्रांसफ़रों का एक बैच लेजर को एक स्टेट से अगली स्टेट तक ले जाता है, जिसमें प्रत्येक प्रेषक अधिकृत है और कुछ भी नया सृजित नहीं होता | Poseidon2, कॉलों के बीच ले जाई गई स्टेट | 773 | 14 |
| एक निजी क्रेडिट निर्णय | एक प्रकाशित मॉडल उस निजी आवेदक डेटा को स्वीकृत या अस्वीकृत करता है जिसकी पुष्टि एक अटेस्टर ने की है | पूर्णांक अंकगणित, सार्वजनिक खंड में एक मॉडल | 462 | 12 |
चारों चेन 20 पर लाइव हैं। तालिका की प्रत्येक कॉल, समान इनपुट के साथ, उस प्रोग्राम के पृष्ठ पर दिखाई गई चेन 18 की कॉल को दोहराती है:
| प्रोग्राम | प्रोग्राम id | चेन 20 पर डिप्लॉय का ट्रांज़ैक्शन | चेन 20 पर पहली कॉल |
|---|---|---|---|
| गुमनाम मतदान | ad2f719f12d01c9f3c0962092b9898b75b0914bbb817031d51be13e54c05b970 | f6ae5528…0f82 | 3a304e7a…427b |
| देनदारियों का प्रमाण | fce8474dfdf80b9733e04fb72d4d8d19c40ba5ab646b3d867322daf4b9b599c0 | a8bc281b…17d9 | 6116c15f…d62a |
| ऑफ़-चेन लेजर | c4ddd388f2d94299610c7c3409dfdfb4dcb4ae3e0bc9ec78d0c45f51d8231cab | 72cc95f2…3d51 | 9c9998bb…66eb |
| निजी क्रेडिट निर्णय | 7bbec14289f4446231b3a9a5ac18cb0613a373ca8a14fe4f046f3fde7ae6c73c | 413e6658…e42b | d3ceb306…124a |
एक्सप्लोरर randscan.org/programs पर प्रत्येक प्रोग्राम और उसकी कॉलों की सूची देता है। testnet चेन समय-समय पर बदली जाती है, और प्रोग्राम आगे नहीं जाते: अगले कट के बाद ये id नहीं रहेंगे और प्रोग्रामों को फिर से डिप्लॉय करना होगा।
सेटअप
टूलचेन। गेस्ट circuits रिपॉज़िटरी के rand-guest से बनते हैं, उस कमिट पर जिसे fullnode v0.6.7 और 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"
कमिट दो कारणों से महत्वपूर्ण है। hc स्रोत कोड और टूलचेन का फ़ंक्शन है, इसलिए guest-sdk के किसी अन्य कमिट पर दोबारा बनाए गए गेस्ट का hc भिन्न हो सकता है। और SDK के सिग्नेचर बदल गए हैं: aeacf31 पर keccak और sha256_compress ऐरे रेफ़रेंस लेते हैं, जबकि पुराने कमिट रॉ पॉइंटर लेते थे।
स्रोत। चारों गेस्ट, उनकी होस्ट स्क्रिप्ट और डेमो डेटा एक ही डाउनलोड में हैं। इन्हें चेकआउट के भीतर अनपैक करें, क्योंकि rand-guest build गेस्ट की डायरेक्टरी से ऊपर की ओर खोजकर guest-sdk ढूँढता है:
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
फ़ाइलें https://randprotocol.org/examples/programs/ के अंतर्गत एक-एक करके भी देखी जा सकती हैं, उदाहरण के लिए allowlist/src/main.rs।
वॉलेट। डिप्लॉय और कॉल करने के लिए fullnode v0.6.8 का rand वॉलेट (टैग v0.6.8 पर fullnode चेकआउट में cargo build --release -p randprotocol-client, या v0.6.8 रिलीज़ के साथ संलग्न rand), एक कुंजी, और RAND आवश्यक हैं। पुराना वॉलेट चेन 20 पर लेन-देन नहीं कर सकता: चेन 20 प्रत्येक प्रूफ़ और हस्ताक्षरित संदेश को अपने जेनेसिस से बाँधती है, और v0.6.7 वॉलेट ऐसा नहीं करता।
एक RPC। सार्वजनिक एंडपॉइंट, https://rpc.randprotocol.org, इन पृष्ठों की हर चीज़ के लिए पर्याप्त है: प्रोग्राम और रसीदें पढ़ना, वॉलेट सिंक करना, डिप्लॉय और कॉल करना। वॉलेट का पहला सिंक प्रत्येक ब्लॉक हेडर और नोट वाले प्रत्येक ब्लॉक को पढ़ता है, जो 2026-09-30 को चेन 18 की ऊँचाई पर 645 अनुरोध थे, और एंडपॉइंट के माध्यम से इसमें लगभग तीन मिनट लगे। एंडपॉइंट प्रत्येक पते को प्रति मिनट 1,200 रीड और 6 सेंड की अनुमति देता है। आपके अपने नोड (नोड चलाना) पर ऐसी कोई सीमा नहीं होती।
export RAND_RPC=https://rpc.randprotocol.org
export RAND_KEY=$HOME/wallet.key.json
चेन 18 पर, गुमनाम मतदान के पृष्ठ पर गिने गए मतों में से एक, fdbcc960…fc2b, एक लैपटॉप पर सिद्ध किया गया और केवल सार्वजनिक एंडपॉइंट के माध्यम से भेजा गया। चेन 19 और 20 पर हर बार सभी तेरह ट्रांज़ैक्शन, चार डिप्लॉय और नौ कॉल, इसी मार्ग से गए।
चेन 18 ने एक प्रोग्राम के लिए क्या बदला
एक कॉल गैस सीमा घोषित करती है, और उसका भुगतान करती है। कंस्ट्रेंट सेट 8 प्रत्येक रन की गैस मापता है। एक साधारण साइकिल 1 गैस है। हैश syscall इसके अपवाद हैं:
| निर्देश | गैस |
|---|---|
कोई भी RV32IM निर्देश, HALT, WRITE_OUTPUT, READ_INPUT, READ_PUBLIC | 1 |
n वर्डों पर POSEIDON2 | 3 + 3 × ⌈n / 4⌉ |
SHA256, एक कम्प्रेशन | 64 |
KECCAK, एक परम्यूटेशन | 192 |
प्रूफ़ एक नया सार्वजनिक मान वहन करता है, घोषित सीमा, और सर्किट यह लागू करता है कि रन की गैस उसके बराबर या उससे कम हो। सटीक गैस निजी रहती है। rand call पहले एम्युलेटर में प्रोग्राम चलाता है और दोनों प्रिंट करता है:
gas: 5636 (declaring 6144, tier 12)
डिफ़ॉल्ट रूप से वॉलेट सटीक गैस को 2^(tier − 2) के गुणज तक ऊपर पूर्णांकित करता है, जो टियर 12 पर 1,024 और टियर 14 पर 4,096 है, इसलिए घोषित सीमा रन के बारे में बहुत कम बताती है। --gas-limit max टियर की अधिकतम सीमा घोषित करता है और टियर से आगे कुछ नहीं बताता। --gas-limit N एक सटीक आँकड़ा घोषित करता है।
शुल्क घोषित सीमा और बाइट्स के अनुसार तय होता है।
floor = 0.001 RAND + gas price × declared limit + byte price × ⌈bytes / 1024⌉
मूल्य 100 यूनिट प्रति गैस और 800 यूनिट प्रति KiB से शुरू हुए (एक यूनिट 10⁻⁹ RAND है), और प्रत्येक ब्लॉक में एक लक्ष्य की ओर थोड़ा खिसकते हैं। rand_getLimits वर्तमान मूल्य देता है। वॉलेट दो मूल्य-चरणों का अतिरिक्त मार्जिन जोड़ता है, यानी 1.125² का गुणक, क्योंकि एक कॉल मूल्य तय होने के दो या तीन ब्लॉक बाद पहुँचती है।
एक विवरण शुल्क का अधिकांश भाग तय करता है। चेन 18 से एक कॉल का प्रूफ़ उसके अपने ट्रांज़ैक्शन से बँधा होता है, इसलिए वॉलेट को प्रूफ़ के अस्तित्व में आने से पहले शुल्क तय करना पड़ता है, और वह प्रूफ़ का मूल्य उसके वास्तविक आकार के बजाय चेन की 4 MiB की अधिकतम सीमा पर लगाता है। गुमनाम मतदान के लिए यह (1,000,000 + 100 × 6,144 + 800 × 4,097) × 1.125² = 6,191,437 यूनिट है, यानी 0.0062 RAND, जिसमें गैस का हिस्सा लगभग आठवाँ भाग है। इन पृष्ठों की चार कॉलों में से प्रत्येक की लागत 0.0057 और 0.0075 RAND के बीच रही। --fee डिफ़ॉल्ट को ओवरराइड करता है।
प्रत्येक बंडल दो प्रूफ़ है। चेन 18 विभाजित प्राधिकरण पर चलती है: जो बंडल शुल्क चुकाता है, वह टियर-14 बंडल प्रूफ़ के साथ एक छोटा टियर-10 प्राधिकरण प्रूफ़ भी वहन करता है। वॉलेट दोनों बनाता है और प्रत्येक के लिए एक पंक्ति प्रिंट करता है। इसलिए एक कॉल तीन प्रूफ़ है: कॉल, प्राधिकरण और बंडल। एक Apple Silicon लैपटॉप पर यहाँ की चार कॉलों में से प्रत्येक में तीन से साढ़े पाँच मिनट लगे, और मेमोरी का शिखर 6.1 से 6.6 GB रहा। इसमें से हर बार लगभग दो मिनट बंडल प्रूफ़ के होते हैं। टियर-12 कॉल प्रूफ़ आधा मिनट जोड़ता है और टियर-14 वाला दो मिनट।
वे सीमाएँ जिनके भीतर एक कॉल को रहना होगा।
| सीमा | चेन 18 से 20 |
|---|---|
| टियर | अधिकतम 14: 16,383 साइकिल, डाइजेस्ट पंक्तियों सहित |
| Poseidon2 परम्यूटेशन | टियर 14 पर 2,048, प्रोग्राम, इनपुट और सार्वजनिक डाइजेस्ट सहित |
| Keccak परम्यूटेशन | 128 |
| SHA-256 कम्प्रेशन | 128 |
| कॉल प्रूफ़ | 4,194,304 बाइट्स (4 MiB) |
| प्रोग्राम | सार्वजनिक खंड के बिना 8,180 वर्ड, सार्वजनिक खंड के साथ कुछ कम: चेन 20, चेन 18 और 19 की तरह, ऐसे डिप्लॉय को अस्वीकार करती है जिसे कोई भी टियर-14 कॉल समाहित न कर सके (ProgramUncallable), चाहे max_program_words (65,535) कितनी भी अनुमति दे |
| सार्वजनिक खंड | 32,768 वर्ड, डिप्लॉय के समय निश्चित |
| सीलबंद ट्रांसक्रिप्ट के साथ निजी इनपुट | 16,071 वर्ड |
rand-guest run --tier 14 डिप्लॉय करने से पहले पहली दो सीमाओं की जाँच करता है। हैश तालिका प्रूफ़ को बड़ा बनाती है। हैश तालिका के बिना लेजर का टियर-14 प्रूफ़ 1.50 MB है। SHA-256 तालिका देनदारियों के प्रूफ़ को 1.91 MB तक ले जाती है, और Keccak तालिका मतदान के प्रूफ़ को 3.35 MB तक, जो 4 MiB की सीमा का अधिकांश भाग है।
चारों की साझा परिपाटियाँ
- स्लॉट 0 एक स्थिति (status) है, और 0 कभी भी वैध स्थिति नहीं होती। विफलताओं सहित प्रत्येक परिणाम की एक संख्या होती है, जो 1 से आरंभ होती है, और विफलता की स्थिति में प्रोग्राम सुव्यवस्थित ढंग से रुकता है ताकि उसे सिद्ध किया जा सके। पूर्णतः शून्य वाली रसीद को परिणाम समझने की भूल नहीं हो सकती।
- स्लॉट 7 को छुआ नहीं जाता। panic करने वाला Rust गेस्ट वहाँ
0xdeadbeef(3,735,928,559) लिखता है। पढ़ने वाला सबसे पहले स्लॉट 7 जाँचता है। - स्लॉट 2 से 6 में 160-बिट का मान रहता है: एक नलिफ़ायर, एक रूट, एक लिंक या एक कमिटमेंट। पूरा 256-बिट हैश आठ शब्दों का होता है और उसके बाद स्थिति के लिए कोई स्थान नहीं बचता। इसे पाँच शब्दों तक छोटा करने पर 80 बिट का कोलिज़न प्रतिरोध बना रहता है, और प्रत्येक पृष्ठ बताता है कि यह किस चीज़ की रक्षा कर रहा है।
- बाइट क्रम हैश के अनुसार होता है। Keccak मान लिटिल-एंडियन शब्द होते हैं और SHA-256 मान बिग-एंडियन शब्द, क्योंकि प्रत्येक syscall अपना ब्लॉक इसी तरह पढ़ता है। यदि होस्ट स्क्रिप्ट और गेस्ट इस पर असहमत हों, तो उनके डाइजेस्ट कभी मेल नहीं खाते।
- जो कुछ प्रत्येक इंस्टेंस के अनुसार बदलता है, वह सार्वजनिक सेगमेंट में होता है; जो कुछ प्रत्येक कॉल के अनुसार बदलता है, वह निजी इनपुट होता है। किसी मतदान का रूट, रिज़र्व का आँकड़ा और किसी मॉडल के वेट डिप्लॉय के समय तय होते हैं और प्रोग्राम id में बँध जाते हैं। किसी कॉल के अपने कोई सार्वजनिक शब्द नहीं होते।
- कमांड लाइन पर इनपुट शब्द दशमलव में दिए जाते हैं। पृष्ठ
$(sed 's/[0-9][0-9]*/--input &/g' witness.txt)के द्वारा विटनेस फ़ाइल को फ़्लैग में बदलते हैं।
स्वयं एक कॉल करें
स्रोत अनपैक हों, टूलचेन बिल्ड हो और v0.6.8 का धनयुक्त वॉलेट उपलब्ध हो, तो डेमो सदस्यों में से किसी एक के रूप में मत देने के लिए चार कमांड पर्याप्त हैं:
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)
कॉल करने के लिए इमेज की आवश्यकता नहीं होती: rand call नोड से प्रोग्राम का कोड और सार्वजनिक सेगमेंट प्राप्त करता है, जाँचता है कि उनका हैश id से मेल खाता है, और उन्हीं पर प्रूफ़ बनाता है।
परिणाम पढ़ने के लिए न वॉलेट चाहिए, न नोड। कोई भी रसीद सार्वजनिक एंडपॉइंट पर एक अनुरोध से प्राप्त होती है:
$ 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 एक ही अनुरोध में किसी प्रोग्राम की कॉल दे देता है: https://randscan.org/api/v1/programs/<program id> call_count और recent_calls लौटाता है (एक्सप्लोरर API)।
इनमें से कोई क्या नहीं करता
Rand पर प्रोग्राम किसी गणना का प्रूफ़ है, और चेन उसके किसी भी आउटपुट पर कोई कार्रवाई नहीं करती। इनमें से कोई भी प्रोग्राम RAND या कोई टोकन स्थानांतरित नहीं करता, कोई बैलेंस नहीं रखता, और किसी पिछली कॉल को याद नहीं रखता। मतों की गिनती वही करता है जो रसीदें पढ़ता है। देनदारियों की तुलना ऐसे रिज़र्व से की जाती है जिनके लिए अलग प्रमाण चाहिए। लेजर के बैलेंस ऑफ़-चेन ट्री में दर्ज संख्याएँ हैं। क्रेडिट निर्णय एक बिट है, जिसका पालन करना या न करना ऋणदाता पर निर्भर है। प्रत्येक पृष्ठ के अंत में यह सूची दी गई है कि उसका प्रूफ़ किन बातों को उसका उपयोग करने वालों पर छोड़ देता है।