以太坊系列之十三: evm指令集

evm指令集手册

Opcodes

结果列为"-"表示没有运算结果(不会在栈上产生值),为"*"是特殊情况,其他都表示运算产生唯一值,并放在栈顶.

mem[a...b] 表示内存中a到b(不包含b)个字节
storage[p] 表示从p开始的32个字节
谨记evm虚拟机的word(字)是256位32字节

操作码结果注释
stop-stop execution, identical to return(0,0)
add(x, y)x + y
sub(x, y)x - y
mul(x, y)x * y
div(x, y)x / y
sdiv(x, y)x / y, for signed numbers in two’s complement
mod(x, y)x % y
smod(x, y)x % y, for signed numbers in two’s complement
exp(x, y)x to the power of y
not(x)~x, every bit of x is negated
lt(x, y)1 if x < y, 0 otherwise
gt(x, y)1 if x > y, 0 otherwise
slt(x, y)1 if x < y, 0 otherwise, for signed numbers in two’s complement
sgt(x, y)1 if x > y, 0 otherwise, for signed numbers in two’s complement
eq(x, y)1 if x == y, 0 otherwise
iszero(x)1 if x == 0, 0 otherwise
and(x, y)bitwise and of x and y
or(x, y)bitwise or of x and y
xor(x, y)bitwise xor of x and y
byte(n, x)nth byte of x, where the most significant byte is the 0th byte
addmod(x, y, m)(x + y) % m with arbitrary precision arithmetics
mulmod(x, y, m)(x * y) % m with arbitrary precision arithmetics
signextend(i, x)sign extend from (i*8+7)th bit counting from least significant
keccak256(p, n)keccak(mem[p...(p+n)))
sha3(p, n)keccak(mem[p...(p+n)))
jump(label)-jump to label / code position
jumpi(label, cond)-jump to label if cond is nonzero
pccurrent position in code
pop(x)-remove the element pushed by x
dup1 ... dup16copy ith stack slot to the top (counting from top)
swap1 ... swap16*swap topmost and ith stack slot below it
mload(p)mem[p..(p+32))
mstore(p, v)-mem[p..(p+32)) := v
mstore8(p, v)-mem[p] := v & 0xff - only modifies a single byte
sload(p)storage[p]
sstore(p, v)-storage[p] := v
msizesize of memory, i.e. largest accessed memory index
gasgas still available to execution
addressaddress of the current contract / execution context
balance(a)wei balance at address a
callercall sender (excluding delegatecall)
callvaluewei sent together with the current call
calldataload(p)call data starting from position p (32 bytes)
calldatasizesize of call data in bytes
calldatacopy(t, f, s)-copy s bytes from calldata at position f to mem at position t
codesizesize of the code of the current contract / execution context
codecopy(t, f, s)-copy s bytes from code at position f to mem at position t
extcodesize(a)size of the code at address a
extcodecopy(a, t, f, s)-like codecopy(t, f, s) but take code at address a
returndatasizesize of the last returndata
returndatacopy(t, f, s)-copy s bytes from returndata at position f to mem at position t
create(v, p, s)create new contract with code mem[p..(p+s)) and send v wei and return the new address
create2(v, n, p, s)create new contract with code mem[p..(p+s)) at address keccak256( . n . keccak256(mem[p..(p+s))) and send v wei and return the new address
call(g, a, v, in, insize, out, outsize)call contract at address a with input mem[in..(in+insize)) providing g gas and v wei and output area mem[out..(out+outsize)) returning 0 on error (eg. out of gas) and 1 on success
callcode(g, a, v, in, insize, out, outsize)identical to call but only use the code from a and stay in the context of the current contract otherwise
delegatecall(g, a, in, insize, out, outsize)identical to callcode but also keep caller and callvalue
staticcall(g, a, in, insize, out, outsize)identical to call(g, a, 0, in, insize, out, outsize) but do not allow state modifications
return(p, s)-end execution, return data mem[p..(p+s))
revert(p, s)-end execution, revert state changes, return data mem[p..(p+s))
selfdestruct(a)-end execution, destroy current contract and send funds to a
invalid-end execution with invalid instruction
log0(p, s)-log without topics and data mem[p..(p+s))
log1(p, s, t1)-log with topic t1 and data mem[p..(p+s))
log2(p, s, t1, t2)-log with topics t1, t2 and data mem[p..(p+s))
log3(p, s, t1, t2, t3)-log with topics t1, t2, t3 and data mem[p..(p+s))
log4(p, s, t1, t2, t3, t4)-log with topics t1, t2, t3, t4 and data mem[p..(p+s))
origintransaction sender
gaspricegas price of the transaction
blockhash(b)hash of block nr b - only for last 256 blocks excluding current
coinbasecurrent mining beneficiary
timestamptimestamp of the current block in seconds since the epoch
numbercurrent block number
difficultydifficulty of the current block
gaslimitblock gas limit of the current block

其中call,callcode,delegatecall,staticcall非常重要,要搞清楚,才能理解evm的执行模型.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值