Ethers.js

ethers.js 中的隨機 BigNumber

  • August 18, 2021

我正在尋找在一定範圍內生成隨機ethers.js BigNumber 。雖然這個問題有關於隨機數生成的答案,但截至撰寫本文時(2021 年 4 月)的答案僅涵蓋 BigInt、BN.js 和 web3.js,此外,不討論範圍。

我的主要用途是在測試期間生成隨機令牌數量。令牌傳統上具有大量小數位,因此需要大數字庫。

我已經嘗試在那裡採用答案,但即使在解決創建最小/最大範圍的問題之前,也無法讓它們發揮作用。例如,我試過:

const randBytes = randomBytes(16); // from the node.js crypto library
const amount = BigNumber.from(`0x${randBytes.toString()}`);

或代替第二行:

const amount = BigNumber.from(`0x${new BN(randBytesMint.toString('hex'), 16)}`);

這給了我:

Error: invalid BigNumber value (argument="value", value=undefined, code=INVALID_ARGUMENT, version=bignumber/5.0.13)```

由於在我個人的情況下,我不需要安全保證,我也願意使用解決方案Math.random(),然後使用 擴展ethers.utils.parseUnits(),儘管安全隨機數答案當然也值得讚賞。

這僅回答非安全生成(使用Math.random())。例如,如果您想要一個具有 18 位小數的令牌的隨機令牌值,範圍在令牌的 1000 到 0.0001 之間,您可以使用:

const randNum = Math.random() * 100000;
const amount = ethers.utils.parseUnits(randNum.toString(), 18);

第一行生成一個介於 1 和 100,000(6 個零)之間的數字。第二個將其乘以1e18(1 和 18 個零),這意味著令牌的數量將達到 100,000,小數點後的位數為小數(也就是說,不僅僅是整數)。

生成整個 uint256 範圍內的數字

ethers.BigNumber.from(ethers.utils.randomBytes(32))

如果您在某個範圍內需要它,您可以在其周圍添加函式包裝器,例如

function randomBN(max) {
 return ethers.BigNumber.from(ethers.utils.randomBytes(32)).mod(max);
}

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