Ethers.js
ethers.js 中的隨機 BigNumber
我正在尋找在一定範圍內生成隨機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); }