Instruction | Explanation | ||
---|---|---|---|
stop | - |
F | 停止执行,与 return(0,0) 等价 |
add(x, y) | F | x + y | |
sub(x, y) | F | x - y | |
mul(x, y) | F | x * y | |
div(x, y) | F | x / y | |
sdiv(x, y) | F | x / y,以二进制补码作为符号 | |
mod(x, y) | F | x % y | |
smod(x, y) | F | x % y,以二进制补码作为符号 | |
exp(x, y) | F | x 的 y 次幂 | |
not(x) | F | ~x,对 x 按位取反 | |
lt(x, y) | F | 如果 x < y 为 1,否则为 0 | |
gt(x, y) | F | 如果 x > y 为 1,否则为 0 | |
slt(x, y) | F | 如果 x < y 为 1,否则为 0,以二进制补码作为符号 | |
sgt(x, y) | F | 如果 x > y 为 1,否则为 0,以二进制补码作为符号 | |
eq(x, y) | F | 如果 x == y 为 1,否则为 0 | |
iszero(x) | F | 如果 x == 0 为 1,否则为 0 | |
and(x, y) | F | x 和 y 的按位与 | |
or(x, y) | F | x 和 y 的按位或 | |
xor(x, y) | F | x 和 y 的按位异或 | |
byte(n, x) | F | x 的第 n 个字节,这个索引是从 0 开始的 | |
shl(x, y) | C | 将 y 逻辑左移 x 位 | |
shr(x, y) | C | 将 y 逻辑右移 x 位 | |
sar(x, y) | C | 将 y 算术右移 x 位 | |
addmod(x, y, m) | F | 任意精度的 (x + y) % m | |
mulmod(x, y, m) | F | 任意精度的 (x * y) % m | |
signextend(i, x) | F | 对 x 的最低位到第 (i * 8 + 7) 进行符号扩展 | |
keccak256(p, n) | F | keccak(mem[p...(p + n))) | |
jump(label) | - |
F | 跳转到标签 / 代码位置 |
jumpi(label, cond) | - |
F | 如果条件为非零,跳转到标签 |
pc | F | 当前代码位置 | |
pop(x) | - |
F | 删除(弹出)栈顶的 x 个元素 |
dup1 ... dup16 | F | 将栈内第 i 个元素(从栈顶算起)复制到栈顶 | |
swap1 ... swap16 | * |
F | 将栈顶元素和其下第 i 个元素互换 |
mload(p) | F | mem[p...(p + 32)) | |
mstore(p, v) | - |
F | mem[p...(p + 32)) := v |
mstore8(p, v) | - |
F | mem[p] := v & 0xff (仅修改一个字节) |
sload(p) | F | storage[p] | |
sstore(p, v) | - |
F | storage[p] := v |
msize | F | 内存大小,即最大可访问内存索引 | |
gas | F | 执行可用的 gas | |
address | F | 当前合约 / 执行上下文的地址 | |
balance(a) | F | 地址 a 的余额,以 wei 为单位 | |
caller | F | 调用发起者(不包括 ) |
|
callvalue | F | 随调用发送的 Wei 的数量 | |
calldataload(p) | F | 位置 p 的调用数据(32 字节) | |
calldatasize | F | 调用数据的字节数大小 | |
calldatacopy(t, f, s) | - |
F | 从调用数据的位置 f 的拷贝 s 个字节到内存的位置 t |
codesize | F | 当前合约 / 执行上下文地址的代码大小 | |
codecopy(t, f, s) | - |
F | 从代码的位置 f 开始拷贝 s 个字节到内存的位置 t |
extcodesize(a) | F | 地址 a 的代码大小 | |
extcodecopy(a, t, f, s) | - |
F | 和 codecopy(t, f, s) 类似,但从地址 a 获取代码 |
returndatasize | B | 最后一个 returndata 的大小 | |
returndatacopy(t, f, s) | - |
B | 从 returndata 的位置 f 拷贝 s 个字节到内存的位置 t |
create(v, p, s) | F | 用 mem[p...(p + s)) 中的代码创建一个新合约、发送 v wei 并返回新地址 | |
create2(v, n, p, s) | C | 用 mem[p...(p + s)) 中的代码,在地址keccak256( . n . keccak256(mem[p...(p + s))) 上创建新合约、发送 v wei 并返回新地址 | |
call(g, a, v, in,insize, out, outsize) | F | 使用 mem[in...(in + insize)) 作为输入数据,提供 g gas 和 v wei 对地址 a 发起消息调用,输出结果数据保存在 mem[out...(out + outsize)),发生错误(比如 gas 不足)时返回 0,正确结束返回 1 | |
callcode(g, a, v, in,insize, out, outsize) | F | 与 等价,但仅使用地址 a 中的代码且保持当前合约的执行上下文 |
|
delegatecall(g, a, in,insize, out, outsize) | F | 与
|
|
staticcall(g, a, in,insize, out, outsize) | F | 与 等价但不允许状态修改 |
|
return(p, s) | - |
F | 终止运行,返回 mem[p...(p + s)) 的数据 |
revert(p, s) | - |
B | 终止运行,撤销状态变化,返回 mem[p...(p + s)) 的数据 |
selfdestruct(a) | - |
F | 终止运行,销毁当前合约并且把资金发送到地址 a |
invalid | - |
F | 以无效指令终止运行 |
log0(p, s) | - |
F | 以 mem[p...(p + s)) 的数据产生不带 topic 的日志 |
log1(p, s, t1) | - |
F | 以 mem[p...(p + s)) 的数据和 topic t1 产生日志 |
log2(p, s, t1, t2) | - |
F | 以 mem[p...(p + s)) 的数据和 topic t1、t2 产生日志 |
log3(p, s, t1, t2, t3) | - |
F | 以 mem[p...(p + s)) 的数据和 topic t1、t2、t3 产生日志 |
log4(p, s, t1, t2, t3,t4) | - |
F | 以 mem[p...(p + s)) 的数据和 topic t1、t2、t3 和 t4 产生日志 |
origin | F | 交易发起者地址 | |
gasprice | F | 交易所指定的 gas 价格 | |
blockhash(b) | F | 区块号 b 的哈希 - 目前仅适用于不包括当前区块的最后 256 个区块 | |
coinbase | F | 当前的挖矿收益者地址 | |
timestamp | F | 从当前 epoch 开始的当前区块时间戳(以秒为单位) | |
number | F | 当前区块号 | |
difficulty | F | 当前区块难度 | |
gaslimit | F | 当前区块的 gas 上限 |
暂无评论