اجرای یک نود Rand
نود کامل مرجع و کیف پول آن با Rust نوشته شدهاند و از سورس ساخته میشوند. دو فایل اجرایی به دست میآید: rand-node، یعنی نود و ابزارهای اپراتور، و rand، کیف پولی که یک کلید خرج محافظتشده را نگه میدارد، از طریق JSON-RPC با هر نودی ارتباط میگیرد و برای هر انتقال و هر فراخوانی محرمانه، اثباتکننده zkVM را بهصورت محلی اجرا میکند. یک testnet آزمایشی با شناسه زنجیره 21 با 26 اعتبارسنج روی dropletهای DigitalOcean فعال است. این شبکه ممیزی نشده و ارزش واقعی ندارد. فایلهای اجرایی هر دو برای Linux x86_64 به انتشار v0.8.0 پیوست شدهاند؛ همان ساختی که ناوگان به آن ارتقا یافت.
# 1. Rust (rustup نسخهی قفلشده 1.98.1 را برمیدارد) و وابستگیهای ساخت RocksDB
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
sudo apt install build-essential clang cmake pkg-config libssl-dev # Linux
# 2. کلون و ساخت (بار اول 10 تا 20 دقیقه)
git clone https://github.com/randprotocol/fullnode.git
cd fullnode
cargo build --release # target/release/rand-node, target/release/rand
# 3. یک زنجیره دو اعتبارسنجی روی همین دستگاه (RPC روی 8545 و 8546)
scripts/local-testnet.sh
target/release/rand --rpc http://127.0.0.1:8545 status
# 4. تستها؛ بهصورت release چون اثبات STARK در حالت debug کند است (678 تست، حدود 43 دقیقه، اندازهگیریشده در 2026-09-14)
cargo test --workspace --release
# نسخهٔ v0.8.0 (c0878c3f) زنجیرهٔ 21 را اجرا میکند و هیچ نسخهٔ پیشین چنین نمیکند: زنجیرهٔ 21 مجموعهٔ قیود 9 را اجرا میکند و کلیدهای راستیآزما و رمزگذاری اثبات آن را هیچ نسخهٔ قدیمیتری ندارد. آن را از تگ بسازید، یا روی Linux x86_64
# فایلهای اجرایی انتشار را بردارید و با SHA256SUMS منتشرشده همراه آن بسنجید.
git checkout v0.8.0 && cargo build --release
curl -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand-node -LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/rand \
-LO https://github.com/randprotocol/fullnode/releases/download/v0.8.0/msauth-vk-production.bin# کلید راستیآزمای چندامضایی پینشده: rand-node آن را از کنار فایل اجرایی خود بارگذاری میکند و بدون آن از راهاندازی خودداری میکند
sha256sum rand-node rand msauth-vk-production.bin # باید مقادیر نسخه را چاپ کند (SHA256SUMS، امضاشده بهصورت SHA256SUMS.sig):
# 324a4ab1029d39e67fc2de36b036341b0f88f13089997d7fe24c596363a58278 rand-node
# e3a38e74ee28743a960fc1c3eb1ac6c538e18dc259411e10afff7f54e268bbf4 rand
# 68facb06c7f321aaf1d4d541acf6b5c0e9d7f17788ed1c9add6c5a8a8f7acd30 msauth-vk-production.bin
# هویت گره شما: کلید اعتبارسنج Dilithium2 و شناسهٔ همتای p2p در یک فایل. کلید خودتان را تولید کنید
# و آن را بیرون از checkout نگه دارید؛ مخزن دیگر هیچ کلیدی را ردیابی نمیکند
rand-node keygen --out node.key.json
# بلوک پیدایش همراه مخزن عرضه میشود؛ هر گره باید دقیقاً همین فایل را داشته باشد.
# init هش آن را چاپ میکند که باید با هش زیر یکسان باشد
rand-node init --datadir ./data --genesis deploy/genesis-chain21.json
# به اعتبارسنجهای عمومی وصل شوید (زنجیرهٔ 21 کلیدهای زنجیرهٔ 14 را نگه داشت، پس شناسههای همتا و IPها نیز هماناند).
# --validator را حذف کنید: کلید شما در مجموعهٔ اعتبارسنجها نیست. اعتبارسنج همچنین به NTP نیاز دارد
rand-node run --datadir ./data --key node.key.json \
--listen /ip4/0.0.0.0/tcp/30303 --rpc 127.0.0.1:8545 --no-mdns \
--bootstrap /ip4/164.90.239.200/tcp/30303/p2p/12D3KooWEQEbUwZRgqhDPXhW7vNBmcRcnhUDGUADe81VFdv3ALYe \
--bootstrap /ip4/165.245.173.74/tcp/30303/p2p/12D3KooWJyc5oDHggAr89e9QrRFBy9Tg8TxXh18yzrb1SM6KKLYw \
--bootstrap /ip4/188.166.235.187/tcp/30303/p2p/12D3KooWSyX84P1DAbWByLHpRBMLRWD53r3Jj4aqVt6tHoF8B2ZQ
# کیف پول یک کلید جداگانهٔ محافظتشده (shielded) است. نشانی rand1… آن حدود 1.6 KB متن است
rand keygen && rand address
# مینت faucet را یک اعتبارسنج امضا میکند، پس به RPC یک اعتبارسنج نیاز دارد: روی
# زنجیرهٔ محلی دواعتبارسنجی همانطور که هست کار میکند؛ یک ناظر پاسخ میدهد «ask a validator node». در زنجیرهٔ 21
# faucet فقط به 16 کیف پولی مینت میکند که پیدایش آنها را مجاز شمرده، و فقط از اعتبارسنجهایی که نام میبرد
rand faucet # 100 RAND در یک یادداشت (note) که فقط شما میتوانید بازش کنید
rand balance # درخت را با کلید شما پویش میکند؛ هیچکس دیگری نمیتواند
rand send <rand1 address> 1.5 # تأیید میخواهد، اثبات میسازد (~2 دقیقه)، منتظر کامیت میماند
# یک guest داخلی را مونتاژ کنید: اگر چهار موجودی خصوصی آن را پوشش دهند، مازاد بر 1000 را بپردازید
rand program build --guest private_payment --arg 1000 --out pp.json
rand program deploy pp.json # شناسه برنامه (هش محتوای آن) را چاپ میکند
# اثبات محلی؛ فقط اثبات، هشت کلمه خروجی و یک رونوشت ورودی مهرومومشده روی زنجیره میرود
rand call <program id> --input 400 --input 250 --input 300 --input 75
rand receipt <tx> # خروجیها [1, 0, 25, 0, ...]: مازاد، منتشرشده بهصورت داده
# بعداً رونوشت را باز کنید و با H_IN منتشرشده در اثبات بسنجید
rand open-call <tx> # inputs: [400, 250, 300, 75] — verdict: faithful
نیازمندیها
- سیستمعامل
- Linux x86_64 یا macOS arm64
- Rust
- 1.98.1، قفلشده با rust-toolchain.toml؛ rustup آن را نصب میکند
- وابستگیهای ساخت
- کامپایلر C++، cmake، pkg-config، هدرهای OpenSSL (برای RocksDB)
- ساخت اول
- 10 تا 20 دقیقه: RocksDB و Plonky3 از سورس
- پورتها
- TCP 30303 ورودی روی نودهای عمومی؛ RPC روی 127.0.0.1:8545
- سرور
- یک نمونه ابری با 1 تا 2 vCPU یک اعتبارسنج testnet را اجرا میکند
- ساعت
- NTP (chrony) روی اعتبارسنج: اعتبارسنج از رأی دادن به بلوکی که بیش از 15 s جلوتر از ساعت خودش باشد خودداری میکند، پس ساعت کند بیسروصدا رأی دادن را متوقف میکند
- اثباتسازی
- امروز فقط روی CPU: یک انتقال محافظتشده روی لپتاپ حدود دو دقیقه طول میکشد (اثبات مجوز 7 s و اثبات بسته حدود 110 s) و حدود 6 GB حافظه میخواهد؛ یک فراخوانی کوچک حدود 30 s اضافه میکند
یک نقش انتخاب کنید
- ناظر باز برای همه
همان فایل اجرایی بدون --validator. زنجیره را همگام میکند، هر گواهی و هر اثبات بسته و فراخوانی را راستیآزمایی میکند، هر بلوک را دوباره اجرا میکند، رسیدها را مقایسه میکند و JSON-RPC ارائه میدهد. این همان چیزی است که یک کلید جدید روی testnet عمومی اجرا میکند.
- اعتبارسنج با سپرده
تحت HotStuff زنجیرهای رأی میدهد و پیشنهاد میکند. در زنجیرهٔ 21، مانند زنجیرهٔ 20، یک اعتبارسنج جدید ابتدا با رأی پذیرفته میشود: اعتبارسنجهایی که بیش از دوسوم سهام را در اختیار دارند، یک کنش AdmitValidator را برای کلید آن امضا میکنند. سپس کلید گره را ثبت میکند (rand-node register --v2)، دستکم 1,000 RAND را از یک کیف پول وثیقه میگذارد، و در سومین مرز دورهٔ 1,000 بلوکی پس از وثیقه وارد مجموعه میشود (تأخیر دودورهای وثیقه در زنجیرهٔ 18). زنجیرهٔ 18 با 26 اعتبارسنج و برای هر کدام 1,000 RAND آغاز شد؛ برای کامیت، بیش از دوسوم سهام، یعنی 18 از 26، باید برخط باشد و رأی دهد. کلید خودتان را تولید کنید: دیگر هیچ کلید اعتبارسنجی در مخزن نگه داشته نمیشود، و فایلهای کلیدی که برای زنجیرههای پیشین کامیت شدهاند seedهایی منتشرشدهاند.
- کیف پول و اثباتکننده محلی
کلاینت rand یک کلید خرج 256 بیتی نگه میدارد و چیزی را امضا نمیکند: دو اثبات مجوز هستند، یک اثبات کوچک که با کلید خرج ساخته میشود و اثبات بسته 4-ورودی-4-خروجی. درخت را برای یادداشتهای خودش پویش میکند، هر دو اثبات را روی دستگاه شما میسازد، با همان شکل برای RAND و هر توکن RPL، و برای فراخوانی محرمانه برنامه را هم اثبات میکند. فقط اثباتها، تعهدها، نالیفایرها و پاکتهای مهرومومشده به زنجیره میرسند.
نود اجرا نمیکنید؟ همین کیف پول بهصورت اپ برای iOS، Android، Chrome و Firefox عرضه میشود: کیف پولها.
هر نود همهچیز را بررسی میکند
نودی که همگام میشود پیش از پذیرش، هر گواهی را دوباره راستیآزمایی میکند، هر بلوک را همراه اثباتهایش دوباره اجرا میکند و رسیدها را مقایسه میکند. هنگام راهاندازی پایگاه داده خودش را بررسی میکند، هر چیز ناسازگار را کوتاه میکند و در عین حال وضعیت ایمنی رأی را نگه میدارد، و شکاف را از همتایان دوباره میگیرد.
# نود متوقف شد: هشها، QCها، امضاها، اثباتها، بازپخش
rand-node verify --datadir ./data --mode full
rand-node verify --datadir ./data --repair
آزمونهای خطا روی testnet زنده اجرا میشوند
- ›یکی از چهار اعتبارسنج را متوقف کنید: زنجیره به commit ادامه میدهد و نود پس از بازگشت در چند ثانیه عقبماندگی را جبران میکند.
- ›دو تا از چهار را متوقف کنید: زنجیره بدون حدنصاب میایستد و با بازگشت آنها بدون fork از سر گرفته میشود.
- ›پایگاه داده یک نود را خراب کنید: هنگام راهاندازی شناسایی میشود، کوتاه میشود، از همتایان دوباره همگام میشود و پس از آن بایتبهبایت یکسان است.
- ›انتقالها از طریق نودهای مختلف: همه commit شدند، موجودیها همهجا یکساناند و عرضه تغییر نکرده است.
- ›پیوند همتای قطعشده ظرف حدود 30 ثانیه با منطق اتصال مجدد دوباره برقرار میشود.
هنوز پیادهسازی نشده
این فهرست آمده تا فاصله میان مقاله و نود خوانا باشد و نیازی به حدس نباشد.
- ›وضعیت پایدار هر برنامه و فراخوانیهای میانبرنامهای
- ›یک کامپایلر در خود کیف پول: برنامه یا یک guest اسمبلشده و درونی است، یا یک ایمیج که با ابزار جداگانهٔ rand-guest ساخته میشود
- ›برش (slashing) و زندانیکردن (jailing)، پاداش بلوک، بازارهای کارمزد، و بیکن انتخاب رهبر مبتنی بر hash-sortition
- ›یک انباشتهگر nullifier، هرس اثباتها پس از قطعیت، و دستهبندی اثباتها
- ›یک اثبات رده ۲۰ برای انتقال SPL Token، و بازار prover مبتنی بر GPU که در مقاله آمده است