VM Opcodes¶
Overview¶
Lity’s EVM is a stack-based, big-endian VM with a word size of 256-bits and is used to run the smart contracts on the blockchain. Each opcode is encoded as one byte.
Arithmetic¶
- integer : UADD, UMUL, USUB, SADD, SSUB, SMUL
- fixed-point : UFMUL, SFMUL, UFDIV, SFDIV
The values are popped from the operand stack,
and the result will be pushed back to the stack.
Opcode starts with S
is a signed operation, and U
is an unsigned operation.
All arithmetic operations are overflow-checked. An overflow would cause the contract execution fail. See overflow protection for more details.
ISVALIDATOR¶
This operation will check whether an address popped from the stack is a validator of CyberMiles blockchain, and the result will be pushed back to the stack. With this feature, smart contract developers can make a contract modifiable only by the validators.
See Validator Only Contract for more details.
FREEGAS¶
This operation allows developers to use contract balance to pay the transaction fee for the users. See Freegas-Let contract owner pay the tx fee for you for more details.
RAND¶
This operation will use random seed, nonce, code hash, and a counter number to generate a random number.
After RAND
is called, the counter will automaticlly increase. The counter number depends on the the called time of RAND
.
Even if transations are in the same code block, we can still receive different results.
See Rand-Get random number on the chain for more details.
Opcodes¶
OpCode | uint8 | Stack Input | Stack Output | Expression | Notes |
---|---|---|---|---|---|
UADD |
0x01 |
[a|b|$ |
[a+b|$ |
a + b | unsigned integer addition |
UMUL |
0x02 |
[a|b|$ |
[a*b|$ |
a * b | unsigned integer multiplication |
USUB |
0x03 |
[a|b|$ |
[a-b|$ |
a - b | unsigned integer substraction |
SADD |
0x0c |
[a|b|$ |
[a+b|$ |
a + b | signed integer addition |
SSUB |
0x0d |
[a|b|$ |
[a-b|$ |
a - b | signed integer substraction |
SMUL |
0x0e |
[a|b|$ |
[a*b|$ |
a * b | signed intger multiplication |
UFMUL |
0x2a |
[a|b|N|$ |
[a*b/pow(10,N)|$ |
A [1] * B [2] | unsigned fixed-point multiplication |
SFMUL |
0x2b |
[a|b|N|$ |
[a*b/pow(10,N)|$ |
A [1] * B [2] | signed fixed-point multiplication |
UFDIV |
0x2c |
[a|b|N|$ |
[a*pow(10,N)/b|$ |
A [1] / B [2] | unsigned fixed-point division |
SFDIV |
0x2d |
[a|b|N|$ |
[a*pow(10,N)/b|$ |
A [1] / B [2] | signed fixed-point division |
ENI |
0xf5 |
||||
ISVALIDATOR |
0xf6 |
[addr|$ |
[boolean|$ |
isValidator(addr) | make a contract modifiable only by the validators |
SCHEDULE |
0xf7 |
||||
FREEGAS |
0xf8 |
[|$ |
[|$ |
function modifier freegas | let contract owner pay the tx fee for you |
RAND |
0xf9 |
[|$ |
[keccak256|$ |
rand() | get the random number on the chain |
[1] | (1, 2, 3, 4) A = a * pow(10,N) |
[2] | (1, 2, 3, 4) B = b * pow(10,N) |