Precompiled Contracts (Previous docs)
Klaytn provides several useful precompiled contracts. These contracts are implemented in the platform itself as a native implementation. The precompiled contracts from address 0x01 through 0x08 are the same as those in Ethereum. Klaytn additionally implements precompiled contracts from 0x09 through 0x0B to support new Klaytn features.
NOTE: This document contains the gas table used before the activation of the protocol upgrade. If you want the latest document, please refer to latest document.
Address 0x01: ecrecover(hash, v, r, s)
The address 0x01 implements ecrecover. It returns the address from the given signature by calculating a recovery function of ECDSA. Its function prototype is as follows:
Address 0x02: sha256(data)
The address 0x02 implements SHA256 hash. It returns a SHA256 hash from the given data. Its function prototype is as follows:
Address 0x03: ripemd160(data)
The address 0x03 implements RIPEMD160 hash. It returns a RIPEMD160 hash from the given data. Its function prototype is as follows:
Address 0x04: datacopy(data)
The address 0x04 implements datacopy (i.e., identity function). It returns the input data directly without any modification. This precompiled contract is not supported by the Solidity compiler. The following code with inline assembly can be used to call this precompiled contract.
Address 0x05: bigModExp(base, exp, mod)
The address 0x05 implements the formula base**exp % mod
. It returns the result from the given data. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract. Note that although this precompiled contract supports an arbitrary length of inputs, the below code uses a fixed length of inputs as an example.
Address 0x06: bn256Add(ax, ay, bx, by)
The address 0x06 implements a native elliptic curve point addition. It returns an elliptic curve point representing (ax, ay) + (bx, by)
such that (ax, ay) and (bx, by) are valid points on the curve bn256. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract.
Address 0x07: bn256ScalarMul(x, y, scalar)
The address 0x07 implements a native elliptic curve multiplication with a scalar value. It returns an elliptic curve point representing scalar * (x, y)
such that (x, y) is a valid curve point on the curve bn256. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract.
Address 0x08: bn256Pairing(a1, b1, a2, b2, a3, b3, ..., ak, bk)
The address 0x08 implements elliptic curve paring operation to perform zkSNARK verification. For more information, see EIP-197. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract.
Address 0x09: vmLog(str)
The address 0x09 prints the specified string str
to a specific file or passes it to the logger module. For more information, see debug_setVMLogTarget. Note that this precompiled contract should be used only for debugging purposes, and it is required to enable the --vmlog
option when the Klaytn node starts. Also, the log level of the Klaytn node should be 4 or more to see the output of vmLog. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract.
Address 0x0A: feePayer()
The address 0x0A returns a fee payer of the executing transaction. This precompiled contract is not supported by the Solidity compiler. The following code can be used to call this precompiled contract.
Address 0x0B: validateSender()
The address 0x0B validates the sender's signature with the message. Since Klaytn decouples key pairs from addresses, it is required to validate that a signature is properly signed by the corresponding sender. To do that, this precompiled contract receives three parameters:
The sender's address to get the public keys
The message hash that is used to generate the signature
The signatures that are signed by the sender's private keys with the given message hash
The precompiled contract validates that the given signature is properly signed by the sender's private keys. Note that Klaytn natively support multi signatures, the signatures can be multiple. The length of a signature must be 65 byte long.
Last updated