Rand Protocol
مستندات
شروع

مقدمه

پروتکل Rand چیست، چه چیزی امروز روی testnet عمومی اجرا می‌شود، و چگونه می‌توان RAND را برای ساخت روی آن به دست آورد.

این صفحه را بخوانید تا تصمیم بگیرید روی چه چیزی بسازید و از کجا شروع کنید: مدل زنجیره در چند بند، پارامترهای 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)
هش genesis6210cf071a390d7ac61d8cbea5dd9d139d1a493a862b54a45a498f36af2d5135
فایل genesisdeploy/genesis-chain20.json در مخزن fullnode
نسخه ساختfullnode v0.6.8 (تگ c9c9bd3c)؛ هر نود نسخه ساخت خود را در rand_getVersion گزارش می‌دهد. این نسخه زنجیره‌های ۱۴ تا ۱۷ را نمی‌پذیرد و کیف پولی قدیمی‌تر از v0.6.8 نمی‌تواند روی زنجیره 20 تراکنش بفرستد
اتصال به genesisbinding_domain 1: اتصال اثبات هر بسته و پیام هر اقدام امضاشده شامل هش genesis است، بنابراین چیزی که برای یک زنجیره اثبات یا امضا شده باشد روی زنجیره‌ای دیگر تأیید نمی‌شود
نشانگر testnettestnet برابر 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 دارای آن بخش راه‌اندازی نمی‌شود)
ارزش genesis26,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 را می‌پذیرد.

مقدار یک ضرب روی زنجیره عمومی است: همان دیده‌شدن یک‌گامی که هر واریز از شفاف به محافظت‌شده دارد. اینکه نوت پس از آن برای چه کسی چقدر ارزش دارد، مانند هر نوت دیگر پنهان است.

گام بعدی

مخزن fullnode دایرکتوری docs/ خودش را دارد که این صفحه‌ها در برابر آن بررسی می‌شوند، و مقاله‌ها پیشینهٔ رمزنگاری را در بر دارند.

آخرین بار با کامیت c0878c3f از fullnode (زنجیرهٔ 21) در تاریخ 2026-10-12 بررسی شد.