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

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

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

استفاده از الگوریتم 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 را صدا بزنیم تا یک عدد تصادفی دریافت کنیم.

گفت و گودیدگاهتان را بنویسید

Your email address will not be published. Required fields are marked *

دیدگاه*

Name*

Website