Chainlink

使用模數從 Chainlink 的 VRF 數中獲取範圍是個好主意嗎?

  • August 12, 2022

我正在建立一個彩票遊戲合約,我需要從 chainlink VRF 的號碼中獲取一系列值。範圍是玩家列表的長度。為簡單起見,我製作了一個簡單的合約,展示了我如何從 Chainlink 的 VRF 數中獲取範圍隨機數的想法。為此,我決定採用 Chainlink 號碼的模 N,其中 N 是玩家列表的長度。

我擔心的是這個過程會使數字不那麼隨機,更有偏見,因此不公平。我有理由擔心嗎?如果是這樣,解決這個問題的更好方法是什麼?

pragma solidity ^0.8.0;

contract GetRandomNumber{
   string[] playersList = ["bob", "alice", "lux", "ahri", "nunu", "amumu", "jax", "olaf", "jinx", "vayne", "twitch", "alistar", "annie", "leona", "warwick"];
   uint256 public randomNumber;

//actual random number from Chainlink VRF
   uint256[] chainlinkVRFNumberList = [64062631830175213092191689838209884690462398265195175129745934432936884152163];
   uint256 public chainlinkVRFNumber = chainlinkVRFNumberList[0];

   constructor(){
       getNumber(chainlinkVRFNumber);
   }

   function getNumber(uint256 x) internal {
       uint256 value = (x % playersList.length) + 1;
       randomNumber = value;
   }


}```

由於 Chainlink VRF 返回的數字是可驗證的隨機數,這就是隨機性的重要來源。N 對於隨機性並不是很重要,因為 N 在呼叫的整個生命週期中可能會或可能不會保持恆定值。

但由於 VRF 返回的 uint 是隨機的,因此對該數字應用模 N 的結果也將是隨機的。

作為一個簡單的思維實驗,在你的腦海中隨機選擇 0 到 20 之間的數字並應用模 4(或其他數字)。根據您選擇號碼的隨機程度,結果會有所不同且“隨機”。

這是假設您每次都丟棄 VRF 返回的數字並使用一個新數字。重複使用隨機數進行多次計算可能會降低隨機性。

您的方法很好,並且與在 range 內獲取隨機數的最佳實踐一致。

引用自:https://ethereum.stackexchange.com/questions/133469