ہر ایک یہ چار پروگرام ایک خفیہ کال کی مکمل ایپلیکیشن ہیں: ایک مسئلہ، ایک انٹرفیس، Rust میں لکھا گیا ایک گیسٹ، ہوسٹ کی جانب کے ٹولز، اور لائیو testnet پر ایک ڈیپلائے اور ایک کال۔ یہ ٹیوٹوریلز سے طویل ہیں، اور ہر ایک مشین کے ایک الگ حصے پر انحصار کرتا ہے۔ Rust یا C میں پروگرام لکھیں اس ماڈل کی رہنمائی ہے جسے یہ سب استعمال کرتے ہیں۔ اگر read_input، پبلک سیگمنٹ یا آٹھ آؤٹ پٹ سلاٹس آپ کے لیے نئے ہیں تو پہلے اسے پڑھیں۔
یہاں کی ہر چیز پہلی بار 2026-09-30 کو fullnode v0.6.7 کے ساتھ chain 18 پر چلائی گئی، اور ان صفحات پر موجود ہر آؤٹ پٹ انہی رنز سے نقل کیا گیا ہے۔ پروگرام چین کٹ کے بعد باقی نہیں رہتے، اس لیے 2026-10-01 کو یہ چاروں بغیر کسی تبدیلی کے دوبارہ chain 19 پر اور پھر chain 20 (fullnode v0.6.8) پر ڈیپلائے کیے گئے، اور ہر بار کالز دہرائی گئیں۔ پروگرام id کوڈ اور پبلک سیگمنٹ کا ہیش ہے، چین کا نہیں، اس لیے ہر id وہی رہتی ہے؛ ٹرانسکرپٹس میں ٹرانزیکشن ہیش chain 18 کے ہیں، اور نیچے دیا گیا جدول chain 20 کے ہیشوں سے لنک کرتا ہے۔ chain 20 پر ایک پروگرام کالز کے درمیان اسٹیٹ بھی محفوظ رکھ سکتا ہے (RPL-2)؛ یہ چاروں اسے استعمال نہیں کرتے، اور جو پروگرام اسے استعمال کرتے ہیں ان کا احاطہ پروگرام اسٹیٹ اور example-programs ریپوزٹری کرتے ہیں۔
چار پروگرام
| پروگرام | ایک کال کیا ثابت کرتی ہے | کس پر انحصار | ورڈز | درجہ |
|---|---|---|---|---|
| ایک گمنام ووٹ | کال کنندہ ایک شائع شدہ فہرست کا رکن ہے، یہ بتائے بغیر کہ کون سا، اور اس نے پہلے ووٹ نہیں دیا | Keccak-256، ایک پبلک سیگمنٹ | 427 | 12 |
| واجبات کا ثبوت | صارفین کے نجی بیلنس کا مجموعہ ایک شائع شدہ ریزرو سے زیادہ نہیں، ایک ایسے روٹ کے تحت جسے ہر صارف جانچ سکتا ہے | SHA-256، پروگرام کے اندر بنایا گیا ایک ٹری | 994 | 14 |
| ایک آف چین لیجر | ٹرانسفرز کا ایک بیچ لیجر کو ایک اسٹیٹ سے اگلی اسٹیٹ تک لے جاتا ہے، ہر بھیجنے والا مجاز ہے اور کچھ بھی نیا تخلیق نہیں ہوتا | Poseidon2، کالز کے درمیان منتقل ہونے والی اسٹیٹ | 773 | 14 |
| ایک نجی قرض فیصلہ | ایک شائع شدہ ماڈل درخواست دہندہ کے ان نجی کوائف کو منظور یا مسترد کرتا ہے جن کی ایک تصدیق کنندہ نے ضمانت دی | عددی صحیح حساب، پبلک سیگمنٹ میں ایک ماڈل | 462 | 12 |
چاروں chain 20 پر لائیو ہیں۔ جدول میں ہر کال، انہی ان پٹس کے ساتھ، اس chain 18 کال کو دہراتی ہے جو اس پروگرام کے صفحے پر دکھائی گئی ہے:
| پروگرام | پروگرام id | chain 20 پر ڈیپلائے کی ٹرانزیکشن | chain 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 چین وقتاً فوقتاً تبدیل کی جاتی ہے، اور پروگرام باقی نہیں رہتے: اگلے چین کٹ کے بعد یہ ids ختم ہو جائیں گی اور پروگراموں کو دوبارہ ڈیپلائے کرنا ہوگا۔
سیٹ اپ
ٹول چین۔ گیسٹ 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۔ پرانا والیٹ chain 20 پر ٹرانزیکشن نہیں کر سکتا: chain 20 ہر ثبوت اور ہر دستخط شدہ پیغام کو اپنے جینیسس سے منسلک کرتی ہے، اور v0.6.7 والیٹ ایسا نہیں کرتا۔
ایک RPC۔ پبلک اینڈ پوائنٹ، https://rpc.randprotocol.org، ان صفحات کی ہر چیز کے لیے کافی ہے: پروگرام اور رسیدیں پڑھنا، والیٹ کو سنک کرنا، ڈیپلائے اور کال کرنا۔ والیٹ کی پہلی سنک ہر بلاک ہیڈر اور ہر اس بلاک کو پڑھتی ہے جس میں کوئی نوٹ ہو، جو 2026-09-30 کو chain 18 کی بلندی پر 645 درخواستیں تھیں، اور اینڈ پوائنٹ کے ذریعے اس میں تقریباً تین منٹ لگے۔ اینڈ پوائنٹ ہر ایڈریس کو فی منٹ 1,200 ریڈز اور 6 سینڈز کی اجازت دیتا ہے۔ آپ کے اپنے نوڈ (نوڈ چلانا) پر ایسی کوئی حدود نہیں۔
export RAND_RPC=https://rpc.randprotocol.org
export RAND_KEY=$HOME/wallet.key.json
chain 18 پر، گمنام ووٹ کے صفحے پر شمار کیے گئے ووٹوں میں سے ایک، fdbcc960…fc2b، ایک لیپ ٹاپ پر ثابت کیا گیا اور صرف پبلک اینڈ پوائنٹ کے ذریعے بھیجا گیا۔ chain 19 اور 20 پر ہر بار تمام تیرہ ٹرانزیکشنز، یعنی چار ڈیپلائے اور نو کالز، اسی طرح بھیجی گئیں۔
chain 18 نے پروگرام کے لیے کیا بدلا
کال ایک گیس حد کا اعلان کرتی ہے، اور اس کی ادائیگی کرتی ہے۔ قیود کا سیٹ 8 ہر رن کی پیمائش کرتا ہے۔ ایک عام سائیکل 1 گیس ہے۔ ہیش سسکالز اس سے مستثنیٰ ہیں:
| ہدایت | گیس |
|---|---|
کوئی بھی 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² کا ضارب، شامل کرتا ہے، کیونکہ کال قیمت طے ہونے کے دو یا تین بلاک بعد شامل ہوتی ہے۔
ایک تفصیل فیس کے بیشتر حصے کا تعین کرتی ہے۔ chain 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 ڈیفالٹ کو تبدیل کر دیتا ہے۔
ہر بنڈل دو ثبوت ہے۔ chain 18 منقسم اجازت نامہ چلاتی ہے: جو بنڈل فیس ادا کرتا ہے وہ درجہ 14 کے بنڈل ثبوت کے ساتھ درجہ 10 کا ایک چھوٹا اجازت نامے کا ثبوت بھی رکھتا ہے۔ والیٹ دونوں بناتا ہے اور ہر ایک کے لیے ایک سطر پرنٹ کرتا ہے۔ اس لیے ایک کال تین ثبوت ہے: کال، اجازت نامہ اور بنڈل۔ Apple Silicon لیپ ٹاپ پر یہاں کی چار کالز میں سے ہر ایک میں تین سے ساڑھے پانچ منٹ لگے، اور میموری کا عروج 6.1 سے 6.6 GB رہا۔ اس میں سے بنڈل ثبوت ہر بار تقریباً دو منٹ لیتا ہے۔ درجہ 12 کا کال ثبوت آدھا منٹ اور درجہ 14 کا دو منٹ کا اضافہ کرتا ہے۔
وہ حدود جن میں کال کو سمانا ضروری ہے۔
| حد | chains 18 تا 20 |
|---|---|
| درجہ | زیادہ سے زیادہ 14: 16,383 سائیکلز، ڈائجسٹ رو شامل |
| Poseidon2 پرمیوٹیشنز | درجہ 14 پر 2,048، پروگرام، ان پٹ اور پبلک ڈائجسٹ شامل |
| Keccak پرمیوٹیشنز | 128 |
| SHA-256 کمپریشنز | 128 |
| کال ثبوت | 4,194,304 بائٹس (4 MiB) |
| پروگرام | پبلک سیگمنٹ کے بغیر 8,180 ورڈز، پبلک سیگمنٹ کے ساتھ چند کم: chain 20، chains 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 ایک اسٹیٹس ہے، اور 0 کبھی درست اسٹیٹس نہیں ہوتا۔ ہر نتیجے کا، ناکامیوں سمیت، 1 سے شروع ہونے والا ایک نمبر ہے، اور ناکامی صاف طور پر رکتی ہے تاکہ اسے ثابت کیا جا سکے۔ تمام صفر والی رسید کو کبھی نتیجہ نہیں سمجھا جا سکتا۔
- سلاٹ 7 کو نہیں چھیڑا جاتا۔ جو Rust گیسٹ panic کرے وہ وہاں
0xdeadbeef(3,735,928,559) لکھتا ہے۔ پڑھنے والا سب سے پہلے سلاٹ 7 جانچتا ہے۔ - سلاٹ 2 سے 6 ایک 160 بٹ قدر رکھتے ہیں: ایک نلیفائر، ایک روٹ، ایک لنک، ایک کمٹمنٹ۔ مکمل 256 بٹ ہیش آٹھ ورڈز کا ہوتا ہے اور اسٹیٹس کے لیے کوئی جگہ نہ چھوڑتا۔ اسے پانچ ورڈز تک مختصر کرنے سے 80 بٹ کی تصادم مزاحمت برقرار رہتی ہے، اور ہر صفحہ بتاتا ہے کہ وہ کس چیز کی حفاظت کر رہی ہے۔
- بائٹ ترتیب ہیش کے مطابق ہوتی ہے۔ Keccak قدریں little-endian ورڈز ہیں اور SHA-256 قدریں big-endian ورڈز، کیونکہ ہر 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 یا کوئی ٹوکن منتقل کرتا ہے، نہ بیلنس رکھتا ہے، نہ کسی پچھلی کال کو یاد رکھتا ہے۔ ووٹ کی گنتی وہی کرتا ہے جو رسیدیں پڑھتا ہے۔ واجبات کا موازنہ ان ریزروز سے کیا جاتا ہے جن کے لیے الگ ثبوت درکار ہے۔ لیجر کے بیلنس ایک آف چین ٹری میں درج اعداد ہیں۔ قرض کا فیصلہ ایک بٹ ہے جسے ماننا یا نہ ماننا قرض دہندہ کی مرضی ہے۔ ہر صفحہ اس فہرست پر ختم ہوتا ہے کہ اس کا ثبوت کن باتوں کو اسے استعمال کرنے والوں پر چھوڑ دیتا ہے۔