docs/solidity-guides/operations/random.md
This document explains how to generate cryptographically secure random encrypted numbers fully on-chain using the FHE library in fhevm. These numbers are encrypted and remain confidential, enabling privacy-preserving smart contract logic.
eth_call RPC method.{% hint style="info" %}
Random number generation must be performed during transactions, as it requires the pseudo-random number generator (PRNG) state to be mutated on-chain. Therefore, it cannot be executed using the eth_call RPC method.
{% endhint %}
The FHE library allows you to generate random encrypted numbers of various bit sizes. Below is a list of supported types and their usage:
// Generate random encrypted numbers
ebool rb = FHE.randEbool(); // Random encrypted boolean
euint8 r8 = FHE.randEuint8(); // Random 8-bit number
euint16 r16 = FHE.randEuint16(); // Random 16-bit number
euint32 r32 = FHE.randEuint32(); // Random 32-bit number
euint64 r64 = FHE.randEuint64(); // Random 64-bit number
euint128 r128 = FHE.randEuint128(); // Random 128-bit number
euint256 r256 = FHE.randEuint256(); // Random 256-bit number
function randomBoolean() public returns (ebool) {
return FHE.randEbool();
}
To generate random numbers within a specific range, you can specify an upper bound. The specified upper bound must be a power of 2. The random number will be in the range [0, upperBound - 1].
// Generate random numbers with upper bounds
euint8 r8 = FHE.randEuint8(32); // Random number between 0-31
euint16 r16 = FHE.randEuint16(512); // Random number between 0-511
euint32 r32 = FHE.randEuint32(65536); // Random number between 0-65535
function randomBoundedNumber(uint16 upperBound) public returns (euint16) {
return FHE.randEuint16(upperBound);
}