A Rust implementation demonstrating how the CLZ opcode works in Ethereum.
CLZ counts the number of leading zero bits in a 256-bit number. If the input is zero, it returns 256.
Currently, implementing CLZ in Solidity costs ~184 gas and requires complex bitwise operations. Adding it as a native opcode provides:
- Lower gas costs for mathematical operations
- Reduced ZK proving costs
- Smaller bytecode size
- Opcode:
0x1e - Gas Cost:
5 - Stack Input: 1 value (x)
- Stack Output: 1 value (leading zero count)
- Mathematical functions (sqrt, log, pow)
- Calldata compression/decompression
- Bitmap operations
- Post-quantum cryptography
The core function uses a 4-limb approach for efficiency:
fn clz(x: U256) -> u32 {
if x.is_zero() {
return 256;
}
let limbs = x.0;
if limbs[3] != 0 { return limbs[3].leading_zeros(); }
if limbs[2] != 0 { return 64 + limbs[2].leading_zeros(); }
if limbs[1] != 0 { return 128 + limbs[1].leading_zeros(); }
if limbs[0] != 0 { return 192 + limbs[0].leading_zeros(); }
256
}# run the demo
cargo run
# run tests
cargo testrunning 8 tests
test tests::test_clz_zero ... ok
test tests::test_clz_one ... ok
test tests::test_clz_powers_of_two ... ok
test tests::test_clz_various_values ... ok
test tests::test_clz_max_value ... ok
test tests::test_evm_stack_clz ... ok
test tests::test_limb_boundaries ... ok
test tests::test_both_implementations_match ... ok
CLZ(0) = 256
CLZ(1) = 255
CLZ(256) = 247
CLZ(2^255) = 0
CLZ(2^256 - 1) = 0Official EIP: https://eips.ethereum.org/EIPS/eip-7939
CC0