منابع ضعیف تصادفی Weak Sources of Randomness from Chain Attributes در بلاکچین؛ چالشها و راهکارها

در بسیاری از اپلیکیشنهای غیرمتمرکز (DApps)، نیاز به تولید عدد تصادفی وجود دارد. برای مثال، در برنامههای شرطبندی یا قرعهکشیهای مبتنی بر بلاکچین، عدد تصادفی نقش تعیینکنندهای در انتخاب برنده دارد. با این حال، تولید تصادفی امن در شبکه اتریوم یکی از چالشبرانگیزترین موضوعات برای توسعهدهندگان قراردادهای هوشمند است.
در نگاه اول ممکن است استفاده از دادههایی مثل block.timestamp
یا blockhash
ساده و مفید بهنظر برسد. اما واقعیت این است که این مقادیر توسط ماینرها قابل کنترل یا دستکاری هستند. برای مثال، یک ماینر میتواند زمانبندی بلاک را چند ثانیه تغییر دهد و همچنان بلاک او پذیرفته شود. اگر شرطبندیها یا پاداشها قابل توجه باشند، ممکن است ماینر با اجرای چندین بلاک، فقط بلوکی را منتشر کند که خروجی تصادفی آن به نفع خودش باشد.
چرا تصادفیسازی در قراردادهای هوشمند پیچیده است؟
در زبانهای برنامهنویسی سنتی مانند Python یا JavaScript، تولید عدد تصادفی کار پیچیدهای نیست. اما قراردادهای هوشمند در اتریوم بر بستر ماشین مجازی اتریوم (EVM) اجرا میشوند، که یک محیط کاملاً قطعی (Deterministic) است.
به بیان سادهتر، اگر یک قرارداد هوشمند با ورودی یکسان اجرا شود، باید همیشه خروجی یکسانی تولید کند تا بین نودهای شبکه همخوانی وجود داشته باشد. این موضوع با ماهیت عدد تصادفی — که باید غیرقابل پیشبینی باشد — در تضاد قرار میگیرد.
بنابراین، هرگونه روش تولید تصادفی باید طوری طراحی شود که هم قابل تأیید توسط شبکه باشد و هم امنیت و انصاف را حفظ کند.
ریسکهای استفاده از منابع ضعیف تصادفی در بلاکچین
تکیه بر ویژگیهایی مانند block.timestamp
، block.difficulty
یا block.coinbase
برای تولید عدد تصادفی، زمینهساز سوءاستفاده مهاجمان است. آنها میتوانند این مقادیر را پیشبینی یا در برخی شرایط، کنترل کنند.
در نتیجه، نتایج ظاهراً تصادفی میتوانند بهنفع یک بازیگر خاص دستکاری شوند. این مسئله نهتنها منجر به بردهای ناعادلانه یا ضرر مالی برای سایر کاربران میشود، بلکه اعتماد عمومی به عدالت قرارداد نیز تضعیف خواهد شد.
طبق گزارش OWASP، Insecure Randomness در فهرست ۱۰ آسیبپذیری امنیتی رایج قراردادهای هوشمند قرار دارد و بهعنوان تهدیدی جدی در پروژههای Web3 شناخته میشود.
راهکارهایی برای تولید عدد تصادفی امن در اتریوم
برای جلوگیری از این آسیبپذیری، توسعهدهندگان میتوانند از روشها و ابزارهای مختلفی استفاده کنند که در ادامه برخی از بهترین گزینهها معرفی شدهاند:
1. استفاده از اوراکلهای تصادفی (مثل Oraclize)
اوراکلها میتوانند بهعنوان منابع خارجی تصادف مورد استفاده قرار گیرند. اگرچه باید با دقت انتخاب شوند، استفاده از چندین اوراکل بهصورت موازی میتواند امنیت را افزایش دهد.
2. طرحهای تعهد و افشا (Commitment Schemes)
در این روش رمزنگاری، ابتدا یک مقدار بهصورت تعهدی ثبت میشود و سپس در مرحلهای دیگر افشا میگردد. الگوریتمهایی مانند RANDAO از این رویکرد استفاده میکنند و در مواردی مثل قرعهکشی و بازیها کاربرد دارند.
3. Chainlink VRF (Verifiable Random Function)
Chainlink VRF یک راهحل پیشرفته است که عدد تصادفی را بهشکلی تولید میکند که هم منصفانه و هم قابل تأیید باشد. این روش به قراردادهای هوشمند اجازه میدهد تا بدون بهخطر افتادن امنیت، به مقادیر تصادفی دسترسی داشته باشند.
4. الگوریتم Signidice
این الگوریتم برای تولید اعداد شبهتصادفی در تعاملات بین دو طرف مناسب است و بر پایه امضاهای رمزنگاری شده عمل میکند.
5. هش بلاکهای بیتکوین
از طریق اوراکلهایی مانند BTCRelay، قراردادهای اتریوم میتوانند هش بلاکهای آینده بیتکوین را بهعنوان منبع تصادف استفاده کنند. البته لازم است توجه شود که این روش نیز در برابر انگیزش ماینرها کاملاً مصون نیست و باید با احتیاط اجرا شود.
با استفاده از codeauditplus ، در کمترین زمان و با هزینه بسیار معقول، میتوانید آسیب پذیری ها را شناسایی و در نتیجه برای بهبود کد قرارداد اقدام متناسب انجام دهید.
نتیجهگیری
استفاده از منابع ضعیف زنجیرهای برای تولید عدد تصادفی در قراردادهای هوشمند، یکی از رایجترین و در عین حال خطرناکترین اشتباهات امنیتی است. این ضعف میتواند منجر به دستکاری نتایج، از بین رفتن اعتماد کاربران، و آسیب به شهرت پروژه شود.
راهکار مناسب آن است که از روشهای امن، قابل اثبات و تأییدپذیر برای تصادفیسازی استفاده شود — تا پروژه شما نهتنها از نظر فنی، بلکه از نظر اخلاقی نیز قابل دفاع باشد.
راهکار ما:
- ثبت درخواست ممیزی
- مشاهده راهنمای چگونگی ثبت درخواست ممیزی در آپارات
- مشاهده راهنمای چگونگی ثبت درخواست ممیزی در یوتیوب
منابع
https://owasp.org/www-project-smart-contract-top-10/2025/en/src/SC09-insecure-randomness.html
https://swcregistry.io/docs/SWC-120