常见数值操作码

关键字值(十六进制)描述
OP_1ADD0x8b返回栈顶数据加1
OP_1SUB0x8c返回栈顶数据减1
OP_2MUL0x8d返回栈顶数据乘2
OP_2DIV0x8e返回栈顶数据除2
OP_NEGATE0x8f返回栈顶数据符号取反结果
OP_ABS0x90返回栈顶数据符号取正结果
OP_NOT0x91判断输入值是否为0,如果为0则返回true,否则返回false
OP_0NOTEQUAL0x92判断输入值是否不为0,如果不为0则返回true,否则返回false
OP_ADD0x93返回两个输入值之和
OP_SUB0x94返回两个输入值之差,即x-y,其中两个输入值的顺序为y、x
OP_MUL0x95返回两个输入值之积
OP_DIV0x96返回两个输入值相除的结果,即x/y,其中两个输入值的顺序为y、x
OP_MOD0x97返回两个输入值取余的结果,即x mod y,其中两个输入值的顺序为y、x
OP_LSHIFT0x98返回左移位结果,表示y向左移动x位,即 y << uint(x),其中第一个输入值表示移位系数x,第二个输入值表示操作数y
OP_RSHIFT0x99返回右移位结果,表示y向右移动x位,即 y >> uint(x),其中第一个输入值表示移位系数x,第二个输入值表示操作数y
OP_BOOLAND0x9a布尔类型逻辑与操作,即两个输入值都为非零时返回true,否则返回false
OP_BOOLOR0x9b布尔类型逻辑或操作,即两个输入值至少有一个为非零时返回true,否则返回false
OP_NUMEQUAL0x9c判断两个整型输入值是否相等,如果相等则返回true,否则返回false
OP_NUMEQUALVERIFY0x9d先执行OP_NUMEQUAL操作,然后再执行OP_VERIFY操作,即两个整型输入值相等时,返回nil(VERIFY成功),否则VERIFY失败
OP_NUMNOTEQUAL0x9e如果栈顶两项不是相等数的话,则输出1
OP_LESSTHAN0x9f两个输入值的顺序为x、y,如果 y<x 则返回true,否则返回false
OP_GREATERTHAN0xa0两个输入值的顺序为x、y,如果 y>x 则返回true,否则返回false
OP_LESSTHANOREQUAL0xa1两个输入值的顺序为x、y,如果 y<=x 则返回true,否则返回false
OP_GREATERTHANOREQUAL0xa2两个输入值的顺序为x、y,如果 y>=x 则返回true,否则返回false
OP_MIN0xa3返回两个栈顶数值中较小的一项
OP_MAX0xa4返回两个栈顶数值中较大的一项
OP_WITHIN0xa5三个输入值的顺序为x、y、z,如果 y <= z <= x 则返回true,否则返回fale

加密和散列操作码

关键字值(16进制)描述
OP_SHA2560xa8返回输入项的sha256哈希值
OP_SHA30xaa返回输入项的sha3哈希值
OP_HASH1600xab返回输入项的Ripemd160哈希值
OP_CHECKSIG0xac验证交易签名是否正确,如果验证成功则返回true,否则返回false
OP_CHECKMULTISIG0xad依次验证每个签名和公钥对是否正确,如果所有的签名和公钥对都验证成功则返回true,否则返回false
OP_TXSIGHASH0xae返回交易签名哈希,即虚拟机中context的TxSigHash

VM检查操作码

这些指令会导致VM立即停止并返回false 。

关键字值(16进制)描述
OP_CHECKOUTPUT0xc1从数据堆栈中弹出5项进行检查:prog,version,assetid,amount,index
OP_ASSET0xc2这条指令已经删掉了Nonce类型)返回资产ID(assetid),即虚拟机中context的AssetID。校验context的资产ID,主要有两种情况:1)如果第一个action对象是Issuance,则直接推送value.AssetID;2)如果第一个action对象是Spend,则推送SpentOutput.Source.Value.AssetID
OP_AMOUNT0xc3这条指令已经删掉了Nonce类型)返回资产数量(amount),即虚拟机中context的Amount。校验context的资产数量,主要有两种情况:1)如果第一个action对象是Issuance,则直接推送value.Amount; 2)如果第一个action对象是Spend,则推送SpentOutput.Source.Value.Amount
OP_PROGRAM0xc4返回接收的program,即虚拟机中context的Code
OP_INDEX0xc9返回目标接收对象的索引位置,即虚拟机中context的DestPos
OP_ENTRYID0xca返回目标接收对象的交易entryID,即虚拟机中context的EntryID
OP_OUTPUTID0xcb返回已花费UTXO生成的交易SpentOutputID,即虚拟机中context的SpentOutputID
OP_BLOCKHEIGHT0xcd返回当前块的高度height,即虚拟机中context的BlockHeight

位操作码

关键字值(16进制)描述
OP_INVERT0x83返回输入值按位取反的运算结果
OP_AND0x84返回输入值按位逻辑与运算
OP_OR0x85返回输入值按位逻辑或运算
OP_XOR0x86返回输入值按位逻辑异或运算
OP_EQUAL0x87判断两个输入值是否相等,如果相等则返回true,否则返回false
OP_EQUALVERIFY0x88先执行OP_EQUAL操作,然后再执行OP_VERIFY操作,即两个输入值相等时,返回nil(VERIFY成功),否则VERIFY失败

字符串处理操作码

关键字值(16进制)描述
OP_CAT0x7e返回连接两个字符串的结果,输入字符串的顺序为a、b,返回结果为 ab
OP_SUBSTR0x7f返回从指定偏移量开始截取固定长度的字符串子集,输入值的顺序为size、offset、str,返回结果为从str字符串的offset位置截取size大小的字符串子集。输入大小2,offset=c,str=abdcfghk,返回结果为fg
OP_LEFT0x80返回截取字符串左边指定长度的子串,输入值的顺序为size、str,返回结果为截取str字符串左边size大小的字符串子集。输入size=3,str=hello,返回结果为hel
OP_RIGHT0x81返回截取字符串右边指定长度的子串,输入值的顺序为size、str,返回结果为截取str字符串右边size大小的字符串子集。输入size=3,str=hello,返回结果为llo
OP_SIZE0x82返回字符串的长度大小,即len(str)
OP_CATPUSHDATA0x89返回连接两个[]byte数据结果,输入数据的顺序为a、b,返回结果为 append(b, a)

堆栈控制操作码

关键字值(16进制)描述
OP_TOALTSTACK0x6b把主堆栈的栈顶元素压入辅堆栈顶部,从主堆栈删除
OP_FROMALTSTACK0x6c把辅堆栈的栈顶元素压入主堆栈顶部,从辅堆栈删除。如果辅堆栈为空则执行失败
OP_2DROP0x6d删除栈顶两个元素
OP_2DUP0x6e复制栈顶两个元素
OP_3DUP0x6f复制栈顶三个元素
OP_2OVER0x70把栈底的两个元素复制到栈顶
OP_2ROT0x71将数据堆栈中的第五和第六个元素移动到栈顶。
OP_2SWAP0x72将数据堆栈中的第三第四个元素移动到栈顶
OP_IFDUP0x73当数据堆栈的栈顶不是false时进行复制栈顶
OP_DEPTH0x74把数据堆栈的元素个数压入堆栈
OP_DROP0x75从数据堆栈中删除栈顶元素
OP_DUP0x76复制数据堆栈的栈顶元素
OP_NIP0x77删除栈顶的下一个元素
OP_OVER0x78复制数据堆栈的栈顶下一个元素到栈顶
OP_PICK0x79将数据堆栈的第n个元素复制到栈顶
OP_ROLL0x7a将数据堆栈的第n个元素移动到栈顶
OP_ROT0x7b将数据堆栈中的第三个元素向左翻转
OP_SWAP0x7c数据堆栈中栈顶的两个元素交换
OP_TUCK0x7d从数据堆栈中栈顶元素复制并插入到栈顶下一个元素后面

控制流程操作码

关键字值(16进制)描述
OP_JUMP0x63无条件跳转到堆栈的指定位置,将PC设置为栈顶的四字节小端存储的无符号整数地址。如果该值不存在则执行失败
OP_ JUMPIF0x64条件跳转到堆栈的指定位置,跟OP_JUMP的区别在于该操作从数据堆栈中取出一个boolean值,如果为true才把PC设置到该地址,如果为false则不进行任何操作
OP_VERIFY0x69校验数据堆栈的栈顶的结果,如果为true,则删除栈顶元素,并返回nil,否则执行失败
OP_FAIL0x6a无条件执行失败
OP_CHECKPREDICATE0xc0调用子虚拟机执行对应的program,如果执行成功则返回true,否则返回false。如果VM的运行限制小于256,则立即执行失败

入栈操作

关键字值(16进制)描述
OP_PUSHDATA10x4c将一个字节的数据长度前缀和对应长度大小的字节数据压入堆栈,即(prefix + data),其中prefix=len(data),而前缀prefix所能表示的范围为:(0, 255)bytes,对应的十六进制范围为:(0x00, 0xFF)
OP_PUSHDATA20x4d将两个字节的数据长度前缀和对应长度大小的字节数据压入堆栈,即(prefix + data),其中prefix=len(data),而前缀prefix所能表示的范围为:(0, 65535)bytes,对应的十六进制范围为:(0x0000, 0xFFFF)
OP_PUSHDATA40x4e将四个字节的数据长度前缀和对应长度大小的字节数据压入堆栈,即(prefix + data),其中prefix=len(data),而前缀prefix所能表示的范围为:(0, 4294967295)bytes,对应的十六进制范围为:(0x00000000, 0xFFFFFFFF)
OP_1NEGATE0x4f数字 -1 被压入堆栈
OP_NOP0x61无任何操作

常见关键字字段

关键字值(16进制)描述
OP_FALSE0x00一个字节空串被推到堆栈中(并非OP_NOP操作,这里会有一个元素被压入堆栈)
OP_00x00一个字节空串被推到堆栈中(并非OP_NOP操作,这里会有一个元素被压入堆栈)
OP_10x51数字 1 被压入堆栈
OP_TRUE0x51数字 1 被压入堆栈
OP_20x52数字 2 被压入堆栈
OP_30x53数字 3 被压入堆栈
OP_40x54数字 4 被压入堆栈
OP_50x55数字 5 被压入堆栈
OP_60x56数字 6 被压入堆栈
OP_70x57数字 7 被压入堆栈
OP_80x58数字 8 被压入堆栈
OP_90x59数字 9 被压入堆栈
OP_100x5a数字 10 被压入堆栈
OP_110x5b数字 11 被压入堆栈
OP_120x5c数字 12 被压入堆栈
OP_130x5d数字 13 被压入堆栈
OP_140x5e数字 14 被压入堆栈
OP_150x5f数字 15 被压入堆栈
OP_160x60数字 16 被压入堆栈

十进制数值操作码

下一个操作码字节是要被压入堆栈的数据

每个操作码 0x00≤n≤0x4b 是n要作为单个VM字符串推送到数据堆栈的数据字节。因此操作码0x01后跟1个字节数据,0x09后可跟9个字节,依此类推,最高可达0x4b(75字节)。

简单地说就是,将对应字节的数据压入堆栈,最小为1个字节(0x01),最大为75字节(0x4b)

关键字值(16进制)描述
OP_DATA_10x011个字节大小的数据
OP_DATA_20x022个字节大小的数据
OP_DATA_30x033个字节大小的数据
OP_DATA_40x044个字节大小的数据
OP_DATA_50x055个字节大小的数据
OP_DATA_60x066个字节大小的数据
OP_DATA_70x077个字节大小的数据
OP_DATA_80x088个字节大小的数据
OP_DATA_90x099个字节大小的数据
OP_DATA_100x0a10个字节大小的数据
OP_DATA_110x0b11个字节大小的数据
OP_DATA_120x0c12个字节大小的数据
OP_DATA_130x0d13个字节大小的数据
OP_DATA_140x0e14个字节大小的数据
OP_DATA_150x0f15个字节大小的数据
OP_DATA_160x1016个字节大小的数据
OP_DATA_170x1117个字节大小的数据
OP_DATA_180x1218个字节大小的数据
OP_DATA_190x1319个字节大小的数据
OP_DATA_200x1420个字节大小的数据
OP_DATA_210x1521个字节大小的数据
OP_DATA_220x1622个字节大小的数据
OP_DATA_230x1723个字节大小的数据
OP_DATA_240x1824个字节大小的数据
OP_DATA_250x1925个字节大小的数据
OP_DATA_260x1a26个字节大小的数据
OP_DATA_270x1b27个字节大小的数据
OP_DATA_280x1c28个字节大小的数据
OP_DATA_290x1d29个字节大小的数据
OP_DATA_300x1e30个字节大小的数据
OP_DATA_310x1f31个字节大小的数据
OP_DATA_320x2032个字节大小的数据
OP_DATA_330x2133个字节大小的数据
OP_DATA_340x2234个字节大小的数据
OP_DATA_350x2335个字节大小的数据
OP_DATA_360x2436个字节大小的数据
OP_DATA_370x2537个字节大小的数据
OP_DATA_380x2638个字节大小的数据
OP_DATA_390x2739个字节大小的数据
OP_DATA_400x2840个字节大小的数据
OP_DATA_410x2941个字节大小的数据
OP_DATA_420x2a42个字节大小的数据
OP_DATA_430x2b43个字节大小的数据
OP_DATA_440x2c44个字节大小的数据
OP_DATA_450x2d45个字节大小的数据
OP_DATA_460x2e46个字节大小的数据
OP_DATA_470x2f47个字节大小的数据
OP_DATA_480x3048个字节大小的数据
OP_DATA_490x3149个字节大小的数据
OP_DATA_500x3250个字节大小的数据
OP_DATA_510x3351个字节大小的数据
OP_DATA_520x3452个字节大小的数据
OP_DATA_530x3553个字节大小的数据
OP_DATA_540x3654个字节大小的数据
OP_DATA_550x3755个字节大小的数据
OP_DATA_560x3856个字节大小的数据
OP_DATA_570x3957个字节大小的数据
OP_DATA_580x3a58个字节大小的数据
OP_DATA_590x3b59个字节大小的数据
OP_DATA_600x3c60个字节大小的数据
OP_DATA_610x3d61个字节大小的数据
OP_DATA_620x3e62个字节大小的数据
OP_DATA_630x3f63个字节大小的数据
OP_DATA_640x4064个字节大小的数据
OP_DATA_650x4165个字节大小的数据
OP_DATA_660x4266个字节大小的数据
OP_DATA_670x4367个字节大小的数据
OP_DATA_680x4468个字节大小的数据
OP_DATA_690x4569个字节大小的数据
OP_DATA_700x4670个字节大小的数据
OP_DATA_710x4771个字节大小的数据
OP_DATA_720x4872个字节大小的数据
OP_DATA_730x4973个字节大小的数据
OP_DATA_740x4a74个字节大小的数据
OP_DATA_750x4b75个字节大小的数据