Basic gas usage (per bit of executed code)
Each instruction consumes a fixed amount of10 gas and 1 gas for each bit of this instruction, not including variable-length operands and references.
Examples:
| Instruction | TL-B | Gas | Notes |
|---|---|---|---|
NEWC | #C8 | 18 | 8-bit prefix without operands |
STU | #CB cc:uint8 | 26 | 8-bit prefix, 8-bit operand |
PUSHINT_LONG | #82 l:(## 5) xxx:(int (8 * l + 19)) | 23 | 8-bit prefix, 5-bit operand, length of xxx depends on l, so it is not included |
STSLICE_CONST | #CFC0_ x:(## 2) y:(## 3) c:(x * ^Cell) sss:((8 * y + 2) * Bit) | 24 | 9-bit prefix (CF is 8 bits, C0_ is C_, which is just bit 1), 2-bit and 3-bit operands, refs c and variable-length sss are not included |
Cell operations
When any instruction internally finalizes aBuilder to a Cell, it consumes 500 gas. When a Cell is loaded as a Slice, it consumes 100 gas for the first access in current smart contract invocation, and 25 gas for each subsequent load from cache. Cells are identified by representation hash, e.g., loading cell with the same hash for the second time will always cost 25 gas.
This applies to all instructions that internally operate with cells (including dictionary operations). The only exceptions are:
BTOSconverts aBuilderto aSlicewithout consuming gas for cell operations.HASHBUcomputes hash without consuming gas for convertingBuilderto aCell
Exceptions
TVM consumes50 gas when any exception is thrown, both explicitly by THROW-like instructions or implicitly during execution of other instructions. This happens before the jump to the exception handler c2.
Implicit jumps and returns
When the current continuation ends and there is a remaining reference, TVM jumps to it and consumes10 gas. When there are no instructions to execute and references to jump to, implicit return to c0 occurs, which consumes 5 gas.
Nested continuations
Calling more than8 extraordinary continuations in a chain consumes 1 gas for each subsequent continuation.
Tuple operations
TUPLE, TUPLEVAR, UNTUPLE, UNTUPLEVAR, UNPACKFIRST, UNPACKFIRSTVAR, EXPLODE, EXPLODEVAR consumes 1 gas for each entry been pushed or popped into a tuple. TPUSH, TPOP, SETINDEX, SETINDEXVAR, SETINDEXQ/SETINDEXVARQ consumes len(tuple) gas for the resulting tuple size after push/pop/set. Same applies to instructions operating with c7: SETGLOB/SETGLOBVAR, RANDU256/RAND, SETRAND, ADDRAND.
Stack operations
TVM consumes 1 gas for each stack element deeper than 32 elements inside the resulting new stack each time stack gets copied: when calling or jumping to a continuation with a non-empty argument number, an initial stack, or both, when extending a continuation stack usingSETCONTARGS and similar instructions, when using RUNVM (both for initial and resulting stacks of the vm).
Extra currency
The first5 executions of GETEXTRABALANCE consume at most 26 + 200 gas each. The subsequent executions incur the full gas cost of 26 (normal instruction cost) plus gas for loading cells (up to 3300 if the dictionary has maximum depth).
RUNVM
RUNVM and RUNVMX consume 40 extra gas before starting a VM.
Cryptography
CHKSIGNS/CHKSIGNU
CHKSIGNS and CHKSIGNU can be invoked 10 times without extra gas cost. Next checks will cost 4000 gas each.
HASHEXT
HASHEXT* instructions always consume 1 extra gas for each part of the input. Additionally, the following gas is consumed for each hashed byte:
| Algorithm | Gas consumed |
|---|---|
| SHA256 | 1/33 per byte |
| SHA512 | 1/16 per byte |
| BLAKE2B | 1/19 per byte |
| KECCAK256 | 1/11 per byte |
| KECCAK512 | 1/6 per byte |
RIST255
Instructions consume constant extra gas.| Instruction | Extra gas |
|---|---|
RIST255_FROMHASH | 600 |
RIST255_VALIDATE | 200 |
RIST255_ADD | 600 |
RIST255_MUL | 2000 |
RIST255_MULBASE | 750 |
Other instructions
ECRECOVER consumes 1500 extra gas.
SECP256K1_XONLY_PUBKEY_TWEAK_ADD consumes 1250 extra gas.
P256_CHKSIGNU and P256_CHKSIGNS consume 3500 extra gas.
BLS
Signature verification and aggregation
| Instruction | Gas consumed | Notes |
|---|---|---|
BLS_VERIFY | 61000 | |
BLS_AGGREGATE | -2650 + 4350 * n | n is the number of signatures aggregated. |
BLS_FASTAGGREGATEVERIFY | 58000 + 3000 * n | n is the number of public keys verified against one message/signature pair. |
BLS_AGGREGATEVERIFY | 38500 + 22500 * n | n is the number of (public key, message) pairs checked against one signature. |
G1 group helpers
| Instruction | Gas consumed |
|---|---|
BLS_G1_ADD / BLS_G1_SUB | 3900 |
BLS_G1_NEG | 750 |
BLS_G1_MUL | 5200 |
BLS_MAP_TO_G1 | 2350 |
BLS_G1_INGROUP | 2950 |
BLS_G1_MULTIEXP consumes 11375 + 630 * n + (8820 * n) / max(log₂ n, 4) extra gas, where n is the number of (point, scalar) pairs.
Instructions BLS_G1_ZERO and BLS_G1_ISZERO do not charge additional gas.
G2 group helpers
| Instruction | Gas consumed |
|---|---|
BLS_G2_ADD / BLS_G2_SUB | 6100 |
BLS_G2_NEG | 1550 |
BLS_G2_MUL | 10550 |
BLS_MAP_TO_G2 | 7950 |
BLS_G2_INGROUP | 4250 |
BLS_G2_MULTIEXP consumes 30388 + 1280 * n + (22840 * n) / max(log₂ n, 4) gas, where n is the number of (point, scalar) pairs.
Instructions BLS_G2_ZERO and BLS_G2_ISZERO do not charge additional gas.
Pairing and constants
| Instruction | Gas consumed | Notes |
|---|---|---|
BLS_PAIRING | 20000 + 11800 * n | n is the number of (G1, G2) pairs supplied for the pairing product check. |
BLS_PUSHR do not charge additional gas.
GasLimits structure
TVM has inner structure GasLimits for gas manipulations. Its fields are:
gas_max: the equivalent of contract’s balance at the start of the compute phase in gas units.gas_limit: the amount of gas that can be consumed during the virtual machine execution. At the start of the execution, it equals:- minimum of
gas_maxand the amount of gas that can be bought with the incoming message value (i.e., the amount of TON coins attached to the message) in the case of an internal message; 0in the case of an external message.
- minimum of
gas_credit: the amount of free gas that can be spent during the execution before accepting an external message. At the start of the execution, it equals:- minimum of
gas_maxand corresponding value in configuration parameter20for masterchain and21for basechain in the case of an external message; 0in the case of an internal message.
- minimum of
gas_remaining: the amount of available but not spent gas. At the start of the execution, it equalsgas_limit + gas_credit. It decreases after each instruction execution by the amount of gas consumed by the instruction.gas_base: an auxiliary parameter that is necessary for rebasing and shows the initial value ofgas_remaining. At the start of the execution, it equalsgas_remaining.
SETGASLIMIT and ACCEPT change all above values except gas_max:
SETGASLIMITsetsgas_limitto the minimum of the indicated value andgas_max,gas_creditto zero,gas_baseto the newgas_limit, andgas_remainingtogas_remaining + (new gas_base - old gas_base).ACCEPTis equivalent toSETGASLIMITwith the new gas limit equal to2**63 - 1(the maximum value of a signed 64-bits integer).
gas_base - gas_remaining. Note that this value will be deducted if and only if after the execution gas_credit is zero, i.e. if SETGASLIMIT or ACCEPT was called at least once during the execution in the case of incoming external message. Without condition gas_credit == 0, there will be no commit of the new code and data.