Solidity
我使用 Oraclize 來獲取一個隨機數,但是 N 個字節讓我感到困惑
似乎當我給 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
,請將其設置maxRange
為10**18
並+ 1
放入您的程式碼中。但請注意,4 個隨機字節的熵不足以生成該範圍內的數字。4 個字節只為您提供
2**32
不同的值,即4,294,967,296
. 這比 小得多10**18
。您需要使用8 個字節。(log2(10^18) ~= 60 bits
.)