سالیدیفا

چطوری تو سالیدیتی اعداد تصادفی تولید کنیم؟

هیچ تابعی تو سالیدیتی نداریم که با صدا زدنش عدد تصادفی دریافت کنیم. پس مجبوریم خودمون دست به کار بشیم. مثل بسیاری از زبان ها، تو قرارداد های هوشمند هم میشه از روش کلاسیک تولید اعداد تصادفی استفاده کرد.

استفاده محض از کد های زیر به هیچ عنوان پیشنهاد نمیشه. چرا که بسته به نوع قرارداد باید تغییر کنن. هدف از این مقاله آشنایی شما با روش پیاده سازیه.

استفاده از الگوریتم Keccak

اینجا توابع را از نوع public تعریف می کنیم که بتونیم آنها رو از remix صدا بزنیم. اما خارج از محیط تست اکثر مواقع باید internal باشن. با صدا زدن تابع  keccak256()  هش ورودی هامون رو خواهیم گرفت. برای اینکه عدد تصادفی ما، تصادفی تر باشد، ورودی های بیشتری بهش میدیم. همان طور که تو مثال زیر مشاهده می کنین، msg.sender، block.timestamp و randNo به عنوان ورودی داده شده.

//SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.7;

contract RandomNumber {
  uint public randNo = 0;
   function setNumber() external {
        randNo= uint (keccak256(abi.encodePacked (msg.sender, block.timestamp, randNo)))%1000;
     }
    function getNumber() external view returns (uint) {
    return randNo;
     }
}

حالا اینجا اگه getNumber رو صدا بزنیم با عدد صفر رو به رو میشیم. با صدا زدن تابع setNumber مقدار randNo یک عدد از صفر تا هزار میگیره. بعدش می توانیم getNumber را صدا بزنیم تا یک عدد تصادفی دریافت کنیم!