این صفحه را بخوانید تا تصمیم بگیرید روی چه چیزی بسازید و از کجا شروع کنید: مدل زنجیره در چند بند، پارامترهای testnet زنده، روش دریافت RAND آزمایشی، و نقشهای از بقیهٔ مستندات.
Rand Protocol چیست
Rand یک زنجیرهٔ شیلدشدهٔ پساکوانتومی است. سکهٔ بومی آن RAND است و RAND در یک استخر کاملاً شیلدشده قرار دارد: در زنجیره نه حسابی وجود دارد و نه موجودیای، فقط تعهدهای نوت (note commitment) و نالفایرها (nullifier) هستند، و یک انتقال عبارت است از اثبات دانشصفر بر اینکه چهار نوت به چهار نوت دیگر تبدیل شدهاند (نوتهای ساختگی جاهای خالی را پر میکنند)، بدون آنکه نشان دهد کدام دارایی جابهجا شده است. RAND و هر توکنی که از استاندارد خود زنجیره، یعنی RPL، پیروی کند، در همین یک استخر مشترک هستند. همین سکه هزینهٔ برنامههای محرمانه را نیز میپردازد: برنامههای RISC-V که خارج از زنجیره درون یک ماشین مجازی دانشصفر اجرا میشوند و بهجای ورودیهایشان، با یک اثبات در زنجیره تسویه میشوند.
هر اولیهٔ رمزنگاری بهگونهای انتخاب شده است که در برابر یک مهاجم کوانتومی پایدار بماند:
| لایه | چه چیزی اجرا میشود |
|---|---|
| امضاها | Dilithium2 (مبتنی بر مشبکه). اعتبارسنجها (validators) بلوکها و رأیها را با آن امضا میکنند؛ faucet، کنشهای استیکینگ و ثبتنامهای پل نیز با آن امضا میشوند. کیف پول هرگز تراکنش را امضا نمیکند: یک بسته (bundle) با اثبات خودش مجاز میشود. |
| رمزگذاری نوت | کپسولهسازی کلید ML-KEM-768 بههمراه ChaCha20-Poly1305. هر نوت در زنجیره با یک پاکت (envelope) همراه است که فقط مالک آن (و فرستندهاش) میتواند بازش کند. |
| درهمسازی | BLAKE3 با جداسازی دامنه برای آدرسها، شناسهٔ تراکنشها، ریشهٔ حالت و هر چیز دیگری که بیرون از سامانهٔ اثبات است؛ Poseidon2 روی میدان Goldilocks برای نوتها، نالفایرها، درخت تعهد و هر چیزی که درون یک اثبات قرار دارد. |
| اثباتها | یک STARK دستهای Plonky3 با FRI پنهانکننده (۸۰ پرسوجو، blowup برابر ۸، ۲۰ بیت اثبات کار). شفاف: بدون تنظیم مورد اعتماد (trusted setup)، بدون منحنی جفتسازی، و فرض آن یک تابع درهمساز مقاوم در برابر برخورد است. |
| محاسبات محرمانه | zkVM مربوط به Rand، یک ماشین RV32IM که زیر همان STARK اثبات میشود. یک برنامه با یک چکیدهٔ درونمدار شناسایی میشود و وریفایر (verifier) هرگز یک کلمهٔ دستورالعمل را نمیبیند. |
| اجماع | HotStuff BFT زنجیرهای: حد نصابهای وزندار بر پایهٔ استیک با بیش از دو سوم، رهبران چرخشی (round-robin)، و قاعدهٔ کامیت پس از سه نمای متوالی. |
| ذخیرهسازی و شبکه | یک RocksDB برای هر نود با کامیتهای fsyncشده و بررسی صحت در راهاندازی؛ libp2p (TCP، Noise، Yamux، gossipsub، Kademlia، و mDNS در شبکههای محلی). |
پیادهسازی مرجع randprotocol/fullnode است، به زبان Rust: باینری rand-node همان نود است، باینری rand کیف پول است، و متدهای JSON-RPC با پیشوند rand_ شروع میشوند. کاوشگر randscan.org است.
testnet: زنجیرهٔ ۲۰
ناوگان عمومی روی زنجیرهٔ ۲۰ اجرا میشود که از 2026-10-01 06:17 UTC روی fullnode v0.6.8 زنده است. زنجیرههای ۱۵ تا ۱۹ بازنشسته شدهاند. چهار زنجیره در چهار روز ساخته شد، هر کدام برای تغییری که همهٔ اثباتها یا قالب تراکنش را عوض میکند:
- زنجیرهٔ ۱۶ (2026-09-28، fullnode v0.6.1) zkVM را به مجموعهٔ قیود ۷ برد، که آنچه را یک اثبات دربارهٔ ورودیهای خصوصی کوچک آشکار میکرد پنهان میسازد، و قواعد
hardening_v6را فعال کرد. - زنجیرهٔ ۱۷ (2026-09-29، v0.6.3) مجوزدهی یک انتقال را از اثبات آن جدا کرد: هر بسته یک اثبات دوم و کوچک نیز دارد که با کلید خرج (spend key) ساخته میشود، تا اثبات بزرگ را ماشینی بسازد که فقط یک کلید مشاهده (viewing key) دارد.
- زنجیرهٔ ۱۸ (2026-09-29، v0.6.7) فراخوانیهای محرمانه را با گس اندازه میگیرد (مجموعهٔ قیود ۸) و یادداشت رمزگذاریشده را در پاکت هر نوت فعال میکند.
- زنجیرهٔ ۲۰ (2026-10-01، v0.6.8) هر اثبات و هر پیام امضاشده را به هش genesis پیوند میدهد، حالت برنامه (RPL-2) را اضافه میکند، از mintها و burnهای پل zUSD کارمزد میگیرد، و قواعد audit-v6 فهرستشده در جدول زیر را فعال میکند.
زنجیرهٔ ۱۹ (2026-10-01 03:43 UTC، v0.6.7) یک re-genesis از زنجیرهٔ ۱۸ روی همان build بود و هیچ قاعدهای را تغییر نداد. زنجیرهٔ ۱۸ در ارتفاع 143,776 متوقف شد و زنجیرهٔ ۱۹ از یک اسنپشات در ارتفاع 141,935 ساخته شد. genesis آن تنها در شناسهٔ زنجیره، زماننگاشت، نوتهای منتقلشده و بخش پل با زنجیرهٔ ۱۸ تفاوت داشت: منتشرکنندههای (emitter) جدید برای نقاط پایانی Ethereum، Binance Smart Chain و Tron، و شمارندههای ترتیب که منتقل شدند.
زنجیرهٔ ۲۰ یک هارد فورک از زنجیرهٔ ۱۹ است: genesis آن از یک اسنپشات زنجیرهٔ ۱۹ در ارتفاع 7,258 ساخته شد، زنجیرهٔ ۱۹ در ارتفاع 7,700 متوقف شد، و هر ۲۶ اعتبارسنج با هم روی زنجیرهٔ ۲۰ راهاندازی مجدد شدند، با همان کلیدها، شناسههای peer و نودهای bootstrap. زنجیرهٔ ۱۹ و زنجیرهٔ ۱۸ بازنشسته شدهاند. برای ارسال روی زنجیرهٔ ۲۰ به کیف پول v0.6.8 نیاز است: اثباتها و امضاهای یک کیف پول قدیمیتر پیوند genesis را ندارند و زنجیره آنها را رد میکند.
هر یک زنجیرهای تازه است. موجودیهای RAND در کیف پولهای اپراتور و zUSD در گردش به genesis بعدی منتقل شد و چیز دیگری منتقل نشد: برنامهای که روی یک زنجیره مستقر شده باشد، روی زنجیرهٔ بعدی وجود ندارد. این نرمافزار آزمایشی است: ممیزی نشده است و RAND روی آن ارزشی ندارد.
برنامهها روی زنجیرهٔ ۲۰ میتوانند حالت نگه دارند: سلولهای برنامهٔ RPL-2، خزانههای برنامه و کنش Invoke زندهاند.
| شناسه زنجیره | 20 (rand_chainId) |
| هش genesis | 6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135 |
| فایل genesis | deploy/genesis-chain20.json در مخزن fullnode |
| نسخه ساخت | fullnode v0.6.8 (تگ c9c9bd3c)؛ هر نود نسخه ساخت خود را در rand_getVersion گزارش میدهد. این نسخه زنجیرههای ۱۴ تا ۱۷ را نمیپذیرد و کیف پولی قدیمیتر از v0.6.8 نمیتواند روی زنجیره 20 تراکنش بفرستد |
| اتصال به genesis | binding_domain 1: اتصال اثبات هر بسته و پیام هر اقدام امضاشده شامل هش genesis است، بنابراین چیزی که برای یک زنجیره اثبات یا امضا شده باشد روی زنجیرهای دیگر تأیید نمیشود |
| نشانگر testnet | testnet برابر true: genesis خود را شبکه آزمایشی اعلام میکند و همین امکان میدهد faucet در کنار پل کار کند |
| اعتبارسنجها | 26 اعتبارسنج، هرکدام با سهام 1,000 RAND، یعنی حداقل سهامگذاری |
| حدنصاب | 18 از 26: بهطور دقیق بیش از دوسوم سهام |
| فاصله بلوکها | پیشفرض --block-interval-ms 1000؛ تقریباً یک بلوک در ثانیه |
| زمان بلوک | برچسب زمانیای که بیش از 60 s از والدش جلوتر باشد نامعتبر است و اعتبارسنج به بلوکی که بیش از 15 s از ساعت خودش جلوتر باشد رأی نمیدهد، بنابراین اعتبارسنجها NTP اجرا میکنند |
| پنجره اثبات | proof_window_blocks 1,024: لنگر هر بسته باید یکی از 1,024 ریشه پایان بلوک اخیر باشد و time آن نیز قدیمیتر از این نباشد (256 بلوک در زنجیرههای 18 و 19) |
| دورهها (epochs) | 1,000 بلوک؛ یک بند (bond) جدید دو دوره اضافه منتظر میماند تا حساب شود (bond_activation_epochs 2، فعالشدن در دوره e + 3)، و سهام آزادشده از بند دو دوره بعد آزاد میشود |
| سهامگذاری | ثبتنامها از نوع v2 هستند (rand-node register --v2) و کلید جدید فقط وقتی ثبت میشود که اعتبارسنجهایی با بیش از دوسوم وزن به آن رأی دهند (admission_by_vote)؛ وزن هر اعتبارسنج حداکثر 33.33 % است؛ سهام جدیدی که در مرز دوره وارد میشود حداکثر 25 % از وزن فعال است (max_stake_entry_bps_per_epoch 2,500)؛ بدون slashing |
| zkVM | مجموعه قیود 8، پروفایل FRI تولیدی (80 پرسوجو) |
| guest بسته | hc_bundle 60af094acfe65d85fdb18fb3d06cf9085dcf28c96e59e87f1ee527226e6e3fce: بسته دارایی پنهان با 4 ورودی و 4 خروجی، نسخه 3، لایه 14 |
| guest احراز | hc_auth 1e4e347f44cf86750b30a9a4bdf9ec9256efe353d4ff8017451eca7d195639c1: مجوز خرج که هر بسته با خود دارد، لایه 10 |
| گس (gas) | هر فراخوانی یک سقف گس اعلام میکند که مدار آن را اعمال میکند و برای آن gas_price میپردازد: در کف قیمت، 100 واحد به ازای هر گس و 800 واحد به ازای هر KiB، که هر دو در هر بلوک به سمت هدف 262,144 گس و 10,485,760 بایت حرکت میکنند و هرگز از سقفهای 10,000 به ازای هر گس و 80,000 به ازای هر KiB بالاتر نمیروند. فقط بایتهایی که قیمت بایت روی آنها اعمال میشود (اثبات فراخوانی و پاکت ورودی آن) در بار بایت حساب میشوند (byte_load: "paying")، بنابراین بلوکی از انتقالها آن را بالا نمیبرد. هر بسته سقف ثابت 20,479 را اعلام میکند و کارمزد ثابت 0.001 RAND را میپردازد |
| وضعیت برنامه | RPL-2 فعال: سلولهای برنامه، خزانههای برنامه و Invoke (Action 33)؛ ایجاد یک سلول 0.01 RAND هزینه دارد (cell_fee 10,000,000 واحد)؛ هر invoke حداکثر 8 سلول میخواند، حداکثر 8 سلول مینویسد و حداکثر 4 پرداخت انجام میدهد (rand_getLimits.program_state) |
| پاکت نوت | envelope_bytes 1860: پاکت هر نوت 1,860 بایت است و یادداشت رمزگذاریشدهای را حمل میکند |
| سقف برنامه | max_program_words 65,535، اما تحت hardening_v6 استقراری که هیچ فراخوانی در لایه 14 نتواند آن را در خود جا دهد رد میشود (ProgramUncallable): 8,180 کلمه برای برنامهای بدون بخش عمومی |
| سقف اثبات | max_proof_bytes 4,194,304 (4 MiB)؛ در زنجیرههای 13 تا 16 برابر 8 MiB بود |
| سقف بلوک | max_block_bytes 20,971,520 (20 MiB) |
| سقف پاکت فراخوانی | max_call_envelope_bytes 65,536 |
| ورودی عمومی هر برنامه | max_program_public_words 32,768، که هنگام استقرار ثابت میشود |
| faucet | روشن، اما فقط برای 16 کیف پول فهرست مجاز genesis (staking.faucet_recipients) و فقط از طرف 18 اعتبارسنجی که genesis آنها را minter معرفی کرده است (staking.faucet_minters): تا 100 RAND در هر فراخوانی و در مجموع 10,000 RAND در هر دوره |
| محاسبات محرمانه | روشن؛ اثبات هر فراخوانی تا لایه 14 سقف دارد. برنامهها از یک cut به cut بعدی منتقل نمیشوند؛ برنامههای نمونه میگویند هرکدام روی کدام زنجیره مستقر است |
| توکنها | رجیستری RPL روشن است: کارمزد ثبت 1 RAND که سوزانده میشود؛ حداکثر 4,096 توکن؛ مقدار هر نوت کمتر از 2⁶³. zUSD در genesis با اندیس 1 فهرست شده است |
| پل | روشن: مجموعه نگهبانان 1 با هشت نگهبان، هشت نگهبان PQ از نوع Dilithium2، یک کلید توقف، emitterهایی برای چهار زنجیره مبدأ، سقف ضرب روزانه 100,000 zUSD به ازای هر پشتوانه و سقف سراسری 4,000 zUSD در هر 24 ساعت غلتان در همه پشتوانهها. zUSD هفت پشتوانه دارد؛ عرضه آن همان مقداری است که قفل شده و بهصورت زنده از rand_getTokenSupply خوانده میشود. از زنجیره 20، کارمزد 10 bps روی هر ضرب و هر سوزاندن، به zUSD و بهصورت یک نوت به نشانی خزانه (bridge.fees) دریافت میشود: واریز مبلغ ناخالص منهای کارمزد را اعتبار میدهد و سوزاندن amount − fee را روی زنجیره مبدأ آزاد میکند. چرخش نگهبانان PQ یا کلید توقف امضای خود هر کلید جدید را دارد و 86,400 s پس از پذیرش اعمال میشود (bridge.rotation) |
| تاریخچه | 24 اعتبارسنج بلوکهای 24 ساعت را نگه میدارند (--prune-history 24h) و برای پایینتر از آن -32010 پاسخ میدهند؛ دو نود آرشیو همه بلوکها را نگه میدارند و RPC عمومی https://rpc.randprotocol.org به یک آرشیو هدایت میشود |
| تجمیع بلوک | خاموش (بخش aggregation در genesis نیست؛ این نسخه روی genesis دارای آن بخش راهاندازی نمیشود) |
| ارزش genesis | 26,000 RAND سهامگذاریشده در رجیستر اعتبارسنجها بهعلاوه هفت نوت واریزی به مجموع 5,184.243719258 RAND که از کیف پولهای اپراتور در زنجیره 19 منتقل شدهاند: 31,184.243719258 RAND، پیش از ضربهای faucet (rand_getSupply مقادیر genesis_staked و genesis_deposited را گزارش میکند)؛ بهعلاوه دو نوت genesis به مجموع 99 zUSD، مطابق با 99 zUSD قفلشده روی پشتوانههایش |
نودهای راهانداز (deploy/nodes.env):
/ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe
/ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw
/ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
زنجیره 20 روی همان کلیدهای اعتبارسنجیای اجرا میشود که زنجیرههای 14 تا 19 استفاده میکردند، بنابراین این شناسههای peer از زمان چرخش کلید زنجیره 14 تغییری نکردهاند.
اکسپلورر در randscan.org زنجیره 20 را ایندکس میکند و یک REST API در https://randscan.org/api/v1 ارائه میدهد (Explorer API). JSON-RPC نود کامل بهطور پیشفرض روی 127.0.0.1:8545 متصل میشود؛ یک نود اجرا کنید (اجرای یک نود)، از نودی که به آن اعتماد دارید استفاده کنید، یا از نقطه پایانی عمومی https://rpc.randprotocol.org بهره ببرید (rand --rpc https://rpc.randprotocol.org …). نقطه پایانی عمومی هر آنچه یک کیف پول لازم دارد، از جمله همگامسازی نخست و ارسال تراکنشها، را ارائه میدهد، با سقف 1,200 خواندن و 6 ارسال در دقیقه به ازای هر نشانی. این نقطه پایانی faucet را ارائه نمیدهد.
دریافت RAND از faucet
faucet یک نوع تراکنش است: یک اعتبارسنج یک نوت با مقدار عمومی به یک نشانی محافظتشده (shielded) ضرب میکند و این نوت فقط توسط دارنده نشانی قابل گشودن است. در زنجیره 20 فقط به 16 نشانی فهرست مجاز genesis پرداخت میکند: ضرب به هر نشانی دیگر با پیام the faucet may not mint to this recipient (not in staking.faucet_recipients) رد میشود، پس کیف پولی که در آن فهرست نیست با دریافت مقداری RAND آزمایشی از دیگران آن را به دست میآورد. هر یک از سه مسیر زیر از یک نود اعتبارسنج درخواست ضرب میکند؛ نودهای ناظر پاسخ میدهند faucet mints are signed by validators; ask a validator node و نقطه پایانی RPC عمومی اصلاً rand_mint را هدایت نمیکند.
با کیف پول rand، با اشاره به RPC یک اعتبارسنج:
rand keygen # writes wallet.key.json; refuses to overwrite
rand address # the rand1… address on stdout (about 1,665 characters), its fingerprint on stderr
rand faucet # an allowlisted wallet: 100 RAND into a note only it can open
rand balance # scans the tree with this key; prints 100 RAND
rand faucet [ADDRESS] --amount <RAND> به نشانی دیگر یا با مقداری کمتر ضرب میکند؛ 100 RAND هم مقدار پیشفرض است و هم سقف هر فراخوانی. در JSON-RPC همین درخواست rand_mint است:
curl -s http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"rand_mint","params":["rand1…", "100000000000"]}'
نتیجه، هش تراکنش ضرب است؛ rand_getTransaction را تا زمانی که یک بلوک برگرداند فراخوانی کنید. مقادیر رشتههایی از واحدها هستند و 1 RAND برابر 10⁹ واحد است. اپلیکیشنهای کیف پول همین faucet را با یک لمس دارند؛ از آنها با Rand Wallet v0.6.8 یا جدیدتر، نخستین نسخه برای زنجیره 20، ارسال کنید. صفحه faucet در این سایت درخواستهای فهرست انتظار برای کمکهزینههای devnet را میپذیرد.
مقدار یک ضرب روی زنجیره عمومی است: همان دیدهشدن یکگامی که هر واریز از شفاف به محافظتشده دارد. اینکه نوت پس از آن برای چه کسی چقدر ارزش دارد، مانند هر نوت دیگر پنهان است.
گام بعدی
- حسابها و نشانیها: دو نوع کلید، نشانی
rand1…چیست و چرا نشانی ۵۴ نویسهای زنجیرهٔ 11 بازگردانده شد. - نوتها و درخت تعهد، تراکنشها و کنشها، کارمزدها، اجماع و قطعیت، عرضه: مدل پروتکل.
- رمزنگاری و اثباتها: اولیههای رمزنگاری، پارامترهای STARK، و نحوهٔ اثبات و راستیآزمایی یک بسته.
- توکنها و استقرار یک توکن RPL: استاندارد RPL، توکن بهعنوان یک ورودی در رجیستری با شناسهٔ
rpl1…، و ساخت آن از درون کیف پول. - برنامهها: استقرار و فراخوانی یک برنامهٔ محرمانه، و آنچه هنوز ممکن نیست.
- پل، ضرب و سوزاندن، استیکینگ، راهاندازی یک نود.
- نوشتن برنامه با Rust یا C: راهنمای کامل، از طراحی ورودیها و خروجیهای یک برنامه تا یک مزایدهٔ مهرومومشده که به هر دو زبان نوشته شده است، بودجهٔ اثبات، استقرار و بررسی یک فراخوانی.
- چهار برنامهٔ نمونه: برنامههای کاربردی کامل که هر یک روی testnet اجرا شدهاند: یک رأیگیری ناشناس روی فهرست مجاز مبتنی بر Keccak، یک اثبات بدهیها روی درخت مجموع SHA-256، یک دفتر کل برونزنجیرهای که وضعیتش میان فراخوانیها منتقل میشود، و یک تصمیم اعتباری خصوصی بر پایهٔ یک مدل منتشرشده.
- معماری مجموعه دستورالعمل RISC-V، استقرار یک برنامهٔ Rust، استقرار یک برنامهٔ RISC-V: ساخت و استقرار برنامههای خودتان با زنجیرهٔ ابزار
rand-guest. - مترجم Solana و مترجم Ethereum: SPL Token و یک ERC-20 که به RISC-V ترجمه شدهاند و کلمهبهکلمه با مفسرها تطبیق داده شدهاند.
- راهاندازی یک validator و یک aggregator: RAM، CPU و دیسک برای هر نقش، و کرانهای اندازهگیریشدهٔ حافظهٔ اثبات.
- توسعهدهندگان: مخزنها، پشتهٔ فناوری، نقاط عطف zkVM، آنچه مشخص شده اما عرضه نشده است، و نحوهٔ ساخت، آزمون و مشارکت.
- JSON-RPC، خط فرمان، API اکتشافگر: مراجع.
مخزن fullnode دایرکتوری docs/ خودش را دارد که این صفحهها در برابر آن بررسی میشوند، و مقالهها پیشینهٔ رمزنگاری را در بر دارند.