HCU
This guide explains how to use Fully Homomorphic Encryption (FHE) operations in your smart contracts on FHEVM. Understanding HCU is critical for designing efficient confidential smart contracts.
Overview
FHE operations in FHEVM are computationally intensive compared to standard Ethereum operations, as they require complex mathematical computations to maintain privacy and security. To manage computational load and prevent potential denial-of-service attacks, FHEVM implements a metering system called Homomorphic Complexity Units ("HCU").
To represent this complexity, we introduced the Homomorphic Complexity Unit ("HCU"). In Solidity, each FHE operation consumes a set amount of HCU based on the operational computational complexity for hardware computation. Since FHE transactions are symbolic, this helps preventing resource exhaustion outside of the blockchain.
To do so, there is a contract named HCULimit
, which monitors HCU consumption for each transaction and enforces two key limits:
Sequential homomorphic operations depth limit per transaction: Controls HCU usage for operations that must be processed in order.
Global homomorphic operations complexity per transaction: Controls HCU usage for operations that can be processed in parallel.
If either limit is exceeded, the transaction will revert.
HCU limit
The current devnet has an HCU limit of 20,000,000 per transaction and an HCU depth limit of 5,000,000 per transaction. If either HCU limit is exceeded, the transaction will revert.
To resolve this, you must do one of the following:
Refactor your code to reduce the number of FHE operations in your transaction.
Split your FHE operations across multiple independent transactions.
HCU costs for common operations
Boolean operations (ebool
)
ebool
)and
22,000
25,000
or
22,000
24,000
xor
2,000
22,000
not
-
2
select
-
55,000
randEbool
-
19,000
Unsigned integer operations
HCU increase with the bit-width of the encrypted integer type. Below are the detailed costs for various operations on encrypted types.
8-bit Encrypted integers (euint8
)
euint8
)add
84,000
88,000
sub
84,000
91,000
mul
122,000
150,000
div
210,000
-
rem
440,000
-
and
31,000
31,000
or
30,000
30,000
xor
31,000
31,000
shr
32,000
91,000
shl
32,000
92,000
rotr
31,000
93,000
rotl
31,000
91,000
eq
55,000
55,000
ne
55,000
55,000
ge
52,000
63,000
gt
52,000
59,000
le
58,000
58,000
lt
52,000
59,000
min
84,000
119,000
max
89,000
121,000
neg
-
79,000
not
-
9
select
-
55,000
randEuint8
-
23,000
16-bit Encrypted integers (euint16
)
euint16
)add
93,000
93,000
sub
93,000
93,000
mul
193,000
222,000
div
302,000
-
rem
580,000
-
and
31,000
31,000
or
30,000
31,000
xor
31,000
31,000
shr
32,000
123,000
shl
32,000
125,000
rotr
31,000
125,000
rotl
31,000
125,000
eq
55,000
83,000
ne
55,000
83,000
ge
55,000
84,000
gt
55,000
84,000
le
58,000
83,000
lt
58,000
84,000
min
88,000
146,000
max
89,000
145,000
neg
-
93,000
not
-
16
select
-
55,000
randEuint16
-
23,000
32-bit Encrypted Integers (euint32
)
euint32
)add
95,000
125,000
sub
95,000
125,000
mul
265,000
328,000
div
438,000
-
rem
792,000
-
and
32,000
32,000
or
32,000
32,000
xor
32,000
32,000
shr
32,000
163,000
shl
32,000
162,000
rotr
32,000
160,000
rotl
32,000
163,000
eq
82,000
86,000
ne
83,000
85,000
ge
84,000
118,000
gt
84,000
118,000
le
84,000
117,000
lt
83,000
117,000
min
117,000
182,000
max
117,000
180,000
neg
-
131,000
not
-
32
select
-
55,000
randEuint32
-
24,000
64-bit Encrypted integers (euint64
)
euint64
)add
133,000
162,000
sub
133,000
162,000
mul
365,000
596,000
div
715,000
-
rem
1,153,000
-
and
34,000
34,000
or
34,000
34,000
xor
34,000
34,000
shr
34,000
209,000
shl
34,000
208,000
rotr
34,000
209,000
rotl
34,000
209,000
eq
83,000
120,000
ne
84,000
118,000
ge
116,000
152,000
gt
117,000
152,000
le
119,000
149,000
lt
118,000
146,000
min
150,000
219,000
max
149,000
218,000
neg
-
131,000
not
-
63
select
-
55,000
randEuint64
-
24,000
128-bit Encrypted integers (euint128
)
euint128
)add
172,000
259,000
sub
172,000
260,000
mul
696,000
1,686,000
div
1,225,000
-
rem
1,943,000
-
and
37,000
37,000
or
37,000
37,000
xor
37,000
37,000
shr
37,000
272,000
shl
37,000
272,000
rotr
37,000
283,000
rotl
37,000
278,000
eq
117,000
122,000
ne
117,000
122,000
ge
149,000
210,000
gt
150,000
218,000
le
150,000
218,000
lt
149,000
215,000
min
186,000
289,000
max
180,000
290,000
neg
-
168,000
not
-
130
select
-
57,000
randEuint128
-
25,000
256-bit Encrypted integers (euint256
)
euint256
)and
38,000
38,000
or
38,000
38,000
xor
39,000
39,000
shr
38,000
369,000
shl
39,000
378,000
rotr
40,000
375,000
rotl
38,000
378,000
eq
118,000
152,000
ne
117,000
150,000
neg
-
269,000
not
-
130
select
-
108,000
randEuint256
-
30,000
Encrypted addresses (euint160
)
euint160
)When using eaddress
(internally represented as euint160
), the HCU costs for equality and inequality checks and select are as follows:
eq
115,000
125,000
ne
115,000
124,000
select
-
83,000
Additional Operations
cast
32
trivialEncrypt
32
randBounded
23,000-30,000
Last updated