Solidity

我使用 Oraclize 來獲取一個隨機數,但是 N 個字節讓我感到困惑

  • June 1, 2018

似乎當我給 Oraclize 查詢的 N 為 4 時,它總是返回一個 19 位的數字,這可能是巧合,但我認為不是。如果我真的想要一個介於 0 和 10 * 10^18 之間的數字怎麼辦?

這可能嗎?這就是我的 Oraclize 現在的樣子:

   oraclize_setProof(proofType_Ledger); // sets the Ledger authenticity proof
   uint N = 4; // number of random bytes we want the datasource to return
   uint delay = 0; // number of seconds to wait before the execution takes place
   uint callbackGas = 200000; // amount of gas we want Oraclize to set for the callback function
   bytes32 queryId = oraclize_newRandomDSQuery(delay, N, callbackGas);

在 __callBack

       uint maxRange = totalEth -1; // deduct one so that when one gets added later it cant be bigger than the total eth.
       randomNumber = (uint(sha3(_result)) % maxRange) + 1 // this is an efficient way to get the uint out in the [1, maxRange] range

看起來您正在使用隨機字節來生成介於1和之間的數字maxRange,包括在內。如果您想要一個介於0和之間的數字10**18,請將其設置maxRange10**18+ 1放入您的程式碼中。

但請注意,4 個隨機字節的熵不足以生成該範圍內的數字。4 個字節只為您提供2**32不同的值,即4,294,967,296. 這比 小得多10**18。您需要使用8 個字節。( log2(10^18) ~= 60 bits.)

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