مجموعهی کامل ابزار، تحلیل و مستندات برای ماینکردن NFTهای پروژهی hashcats.fun روی شبکهی Robinhood Chain.
همهی اعداد و ادعاهای این مخزن مستقیماً از روی زنجیره (on-chain) و از روی کد خود سایت استخراج و صحتسنجی شدهاند — نه حدس و نه ادعای بیپایه.
- پروژه چیست و چطور کار میکند
- مکانیک دقیق ماینینگ (اثباتشده)
- مدل سختی (Difficulty)
- ⭐ کشف مهم: رقابت بین ۱۰ نهنگ است، نه افراد عادی
- ابزارها و ساختار مخزن
- نحوهی اجرا
- استراتژی و محاسبات اقتصادی
- هشدارهای امنیتی
Hashcats یک کالکشن ۱۶٬۳۸۴ عددی از «گربههای پیکسلی» است که برخلاف اکثر NFTها، با دکمه «خرید» ساخته نمیشوند؛ بلکه باید با اثبات کار (Proof of Work) روی زنجیره ماین شوند. تصویر، ویژگیها و پالت هر گربه در حافظهی خود قرارداد ذخیره میشود.
| مورد | مقدار (تأییدشده از زنجیره) |
|---|---|
| شبکه | Robinhood Chain، chainId = 4663 |
| RPC | https://rpc.mainnet.chain.robinhood.com |
| Explorer | https://robinhoodchain.blockscout.com |
| قرارداد کالکشن | 0xCA75DF55Cc9C476DB27a7375D1fc8E794cf80721 (name() == "Hashcats") |
| کل عرضه | ۱۶٬۳۸۴ گربه |
| قیمت ورودی فعلی | ~۰.۰۲ ETH (بومی شبکه، پلهای بالا میرود) |
مکانیک با فراخوانی مستقیم قرارداد و مقایسهی بایتبهبایت با خروجی on-chain ۱۰۰٪ تأیید شد:
workHash = keccak256( abi.encodePacked(miner, nonce, prevWork, anchorHash) )
شرط برد: workHash < targetFor(miner)
ثبت (mint): mine(uint256 nonce, uint256 anchorBlock) با msg.value == mintPrice()
miner: آدرس ماینر (۲۰ بایت)nonce: عددی که ما تغییر میدهیم تا شرط برقرار شود (۳۲ بایت، big-endian)prevWork: «کارِ» گربهی قبلی — با هر mint توسط هرکسی عوض میشودanchorHash: هش یک بلاک اخیر L2 (۳۲ بایت)- سلکتور واقعی تابع
mine:0x071e9503(با تراکنشهای واقعی برندهها تطبیق داده شد)
نکتهی کلیدی: چون prevWork با هر mint عوض میشود، هر تلاشِ در جریان برای
prevWork قدیمی باطل میشود. بنابراین باید prevWork را مدام تازه خواند و
بلافاصله پس از یافتن راهحل، تراکنش را فرستاد.
سختی بهصورت «تعداد بیتهای صفر ابتدایی» لازم در workHash تعریف میشود و از
فرمول زیر میآید (با آزمایش مستقیم تابع targetAt و متن رسمی سایت تأیید شد):
بیتهای سختی = کفِ epoch (currently 32) + burst
burst: تعداد mintهای اخیر شبکه. هر mint، سختی را ۲ برابر میکند (یک بیت اضافه). خودِ سایت میگوید: «Each recent mint doubles the work, and the streak cools by one every 10 seconds.»burstهرDECAY_HALFLIFE = 10ثانیه یک واحد خنک میشود.FLOOR_BITS = 26، کفِ epoch فعلی = ۳۲ بیت.- سختی سراسری است؛ آدرس تازه یا
personalBurstتخفیفی نمیدهد (آزمایش شد).
جدول زمان حل (با یک ماینر CPU دو-هستهای ~۲۶۰ هزار هش/ثانیه):
| burst | بیت | زمان تقریبی |
|---|---|---|
| 0 | 32 | ~۴.۵ ساعت |
| 2 | 34 | ~۱۸ ساعت |
| 8 | 40 | ~۱۸۸ ساعت |
| ~16 | 48 | ~۳۲ سال |
با ماینر GPU سرعت بهشدت بالاتر است (بخش استراتژی).
این مهمترین یافتهی این تحقیق است و با کالبدشکافی تراکنشهای واقعیِ برندهها و اندازهگیری زندهی زنجیره اثبات شد:
چطور اندازه گرفتیم؟
با شمارش رویدادهای Transfer از آدرس صفر (که همان mint است) در بازههای چند
هزار بلاکی، محاسبهی فاصلهی زمانی بین mintها، و اینکه هر mint نیازمند حدود
2^48 ≈ ۲۸۰ تریلیون هش است. از اینجا قدرت کل شبکه و تعداد آدرسهای
فعال بهدست میآید.
اعداد واقعی اندازهگیریشده (در چند بازه):
| بازه | قدرت کل شبکه | ماینرهای فعال | قدرت هر ماینر |
|---|---|---|---|
| نمونه ۱ | ~۱۶٬۵۰۰ GH/s | ~۱۰ | ~۱٬۶۵۰ GH/s |
| نمونه ۲ | ~۳۵٬۳۰۰ GH/s | ~۱۸ | ~۱٬۹۶۰ GH/s |
| نمونه ۳ | ~۹٬۷۰۰ GH/s | ~۲۵ | ~۳۹۰ GH/s |
نتیجهگیری صادقانه:
- کل کالکشن را عملاً حدود ۱۰ تا ۲۵ آدرس بین خودشان تقسیم میکنند.
- هر یک از این ماینرها صدها تا هزاران GH/s قدرت دارد — یعنی معادل صدها کارت گرافیک قوی یا سختافزار ASIC مخصوص، نه یک کارت گرافیک خانگی.
- تصور «با یک کارت گرافیک معمولی و زورِ بازو میشود گربه گرفت» نادرست است. کسی که با کارت معمولی زور میزند، عملاً هیچ سهمی از این ~۱۰-۳۵ تراهش شبکه ندارد.
- تنها با یک کارت معمولی (~۱ GH/s) سهم ما از شبکه در حدِ ۰.۰۱٪ است؛ یعنی بهطور میانگین دهها ساعت طول میکشد تا یک گربه نصیبمان شود — آن هم اگر کالکشن تا آن موقع تمام نشده باشد.
به بیان ساده: این یک بازیِ رقابت قدرتِ خام بین چند بازیگر بزرگ است. برای برندهشدن باید سهم معناداری از قدرت کل شبکه را داشت.
| فایل | کاربرد |
|---|---|
config.py |
ثابتها (RPC، آدرس قرارداد، مسیر والت) |
chain.py |
توابع کمکی web3 و خواندن وضعیت زنده (کلید خصوصی هرگز چاپ نمیشود) |
hashcats_abi.json |
ABI کامل قرارداد (۱۷۹ ورودی، از باندل سایت استخراج شد) |
miner.py |
ماینر مرجع تکهسته (keccak پایتون) + بنچمارک |
keccak_miner.c |
ماینر سریع C (~۸۱۰k هش/ثانیه در هر هسته، ۵.۶ برابر پایتون) |
solver_mp.py |
راهحلیابِ چند-هستهای پایتون |
csolver.py |
رانندهی چند-هستهای ماینر C |
mint.py |
ساخت/شبیهسازی/ارسال تراکنش mine (ارسال پشت گیت allow_send) |
bot.py |
ربات «انتظار پنجرهی خلوت» (CPU) |
hunter.py |
ربات شکارچی پنجره با ماینر C |
watcher.py |
رصدگر ۲۴/۷ سختی/burst/فاصلهی mint (خروجی CSV + state) |
run_watcher.sh |
نگهبان keepalive رصدگر |
analyze.py |
تحلیل دادهی رصدگر (توزیع burst، الگوی ساعتی) |
feasibility.py |
اندازهگیری زندهی نرخ mint و احتمال پنجره |
verify_correctness.py |
اثبات: هش ما == هش قرارداد + حل یک هدف آسان |
verify_tx_path.py |
اثبات مسیر تراکنش با طبقهبندی خطاهای revert |
gpu/ |
پکیج کامل GPU (کرنل CUDA + صحتسنجی + کنترلر) — راهنما |
# ۱) پیشنیازها
pip install web3 eth-account pycryptodome
# ۲) والت خود را بگذارید (کلید خصوصی هرگز کامیت نمیشود)
cp wallet.env.example wallet.env
# سپس private-key واقعی را داخل wallet.env بگذارید، یا:
export HASHCATS_WALLET=/path/to/your/wallet.env
# ۳) اثبات درستی (بدون هیچ تراکنش/هزینهای)
python3 verify_correctness.py
python3 verify_tx_path.py
# ۴) ماینر سریع C
gcc -O3 -march=native -funroll-loops -o keccak_miner keccak_miner.c
# ۵) رصد زندهی شبکه
python3 watcher.py
python3 analyze.py
# ۶) اجرای ربات (پیشفرض DRY-RUN، چیزی نمیفرستد)
python3 hunter.py # فقط شبیهسازی
python3 hunter.py --send # ارسال واقعی (نیازمند والت شارژشده)برای GPU به gpu/README_GPU.md مراجعه کنید.
چون رقابت بینِ چند نهنگ با قدرت بالاست، تنها راهِ داشتنِ شانسِ واقعی، رساندنِ قدرتِ خودمان به کسری معنادار از قدرت کل شبکه است:
| قدرت ما | سهم از شبکه (~۳۵٬۰۰۰ GH/s) | زمان تقریبی تا ۱ گربه |
|---|---|---|
| ۱x کارت معمولی (~۱ GH/s) | ~۰.۰۰۳٪ | دهها ساعت |
| ۸x RTX 4090 (~۲۸ GH/s) | ~۰.۰۸٪ | چند ساعت |
| ~۱۰۰x کارت قوی (~۳۵۰ GH/s) | ~۱٪ | ~۲۷ دقیقه |
ماینینگ بیحافظه (memoryless) است: لازم نیست منتظر «پنجرهی خلوت» بمانیم؛
اگر مداوم ماین کنیم و prevWork را سریع تازه کنیم، زمان مورد انتظار
= 2^bits / rate است. ربات gpu/gpu_hunter_continuous.py دقیقاً همین کار را
میکند و هنگام ارسال، با کارمزد گس کمی بالاتر از رقبا (که گس پیشفرض میدهند)
جلو میزند.
نکتهی صادقانه: با کارتهای ضعیف/ارزان، سهم ما ناچیز است و شانس نزدیک صفر. برای شانس واقعی به سختافزار قوی (چند ده کارت ردهبالا یا معادلش) نیاز است.
- کلید خصوصی هرگز کامیت نمیشود. فقط
wallet.env.exampleدر مخزن است؛ فایل واقعیwallet.envدر.gitignoreقرار دارد. - کلید خصوصی فقط بهصورت محلی خوانده میشود و در هیچ لاگ/خروجی چاپ نمیشود.
- هر ارسال تراکنش، قبل از فرستادن با
eth_callشبیهسازی میشود تا گس هدر نرود. - ارسال واقعی فقط با پرچم صریح
--sendو در صورت کافیبودن موجودی انجام میشود.
این مخزن صرفاً برای تحقیق فنی و آموزشی دربارهی مکانیک Proof-of-Work این پروژه است. ماینینگ و mint هزینهی واقعی (قیمت ورودی + گس) دارد و هیچ تضمینی برای سود یا ارزش NFT وجود ندارد. مسئولیت هر استفاده بر عهدهی کاربر است.