Hashgard VM 指令集

1.VM指令集

1.1 常数指令
序号 指令 字节码 别名 功能
1 PUSH0 0x00 PUSHF 向计算栈中压入一个长度为 0 的字节数组
2 PUSHBYTES 0x01~0x4b - 向计算栈中压入一个字节数组,其长度等于本指令字节码的数值
3 PUSHDATA 0x4c, 0x4d, 0x4e - 向计算栈中压入一个字节数组,其长度由本指令后的 1|2|4字节指定
4 PUSHM1 0x4f - 向计算栈中压入一个大整数,其数值等于-1
5 PUSHN 0x51~0x60 PUSHT 向计算栈中压入一个大整数,其数值等于 1~16
1.2 逻辑控制指令
序号 指令 字节码 功能
1 NOP 0x61 没有任何额外的功能,但是会使指令计步器加 1
2 JMP 0x62 无条件跳转到指定偏移位置,偏移量由本指令后的 2 字节指定
3 JMPIF 0x63 当计算栈栈顶元素不等于 0 时,跳转到指定偏移位置,偏移量由本指令后的 2字节指定。不论条件判断成功与否,栈顶元素将被移除
4 JMPIFNOT 0x64 当计算栈栈顶元素等于 0 时,跳转到指定偏移位置,偏移量由本指令后的 2 字节指定。不论条件判断成功与否,栈顶元素将被移除
5 CALL 0x65 调用指定偏移位置的函数,偏移量由本指令后的 2 字节指定
6 RET 0x66 移除调用栈的顶部元素,并使程序在调用栈的下一帧中继续执行。如果调用栈为空,则虚拟机进入停机状态
7 APPCALL 0x67 调用指定地址的函数,函数地址由本指令后的 20 字节指定
8 SYSCALL 0x68 调用指定的互操作函数,函数名称由本指令后的字符串指定
9 TAILCALL 0x69 以尾调用的方式,调用指定的互操作函数,函数名称由本指令后的字符串 指定
1.3 栈操作指令
序号 指令 字节码 功能 输入 输出
1 TOALTSTACK 0x6b 移除计算栈栈顶的元素,并将其压入备用栈 - -
2 FROMALTSTACK 0x6c 移除备用栈栈顶的元素,并将其压入计算栈 - -
3 XDROP 0x6d 移除计算栈栈顶的元素 n,并移除剩余的索引为 n 的元素 Xn Xn-1 ...X2 X1 X0 n Xn-1 ... X2 X1 X0
4 XSWAP 0x72 移除计算栈栈顶的元素 n,并将剩余的索引为 0 的元素和索引为 n 的元素交换位置 Xn Xn-1 ...X2 X1 X0 n X0 Xn-1 ... X2 X1 Xn
5 XTUCK 0x73 移除计算栈栈顶的元素 n,并将剩余的索引为 0 的元素复制并插入到索引为 n的位置 Xn Xn-1 ...X2 X1 X0 n Xn X0 Xn-1 ... X2 X1 X0
6 DEPTH 0x74 将当前计算栈中的元素数量压入计算栈顶 - -
7 DROP 0x75 移除计算栈栈顶的元素 - -
8 DUP 0x76 复制计算栈栈顶的元素 X XX
9 NIP 0x77 移除计算栈栈顶的第 2 个元素 X1 X0 X0
10 OVER 0x78 复制计算栈栈顶的第二个元素,并压入栈顶 X1 X0 X1 X0 X1
11 PICK 0x79 移除计算栈栈顶的元素 n,并将剩余的索引为 n 的元素复制到栈顶 Xn Xn-1 ...X2 X1 X0 n Xn Xn-1 ... X2 X1 X0 Xn
12 ROLL 0x7a 移除计算栈栈顶的元素 n,并将剩余的索引为 n 的元素移动到栈顶 Xn Xn-1 ...X2 X1 X0 n Xn-1 ... X2 X1 X0 Xn
13 ROT 0x7b 移除计算栈栈顶的第 3 个元素,并将其压入栈顶 X2 X1 X0 X1 X0 X2
14 SWAP 0x7c 交换计算栈栈顶两个元素的位置 X1 X0 X0 X1
15 TUCK 0x7d 复制计算栈栈顶的元素到索引为 2 的位置 X1 X0 X0 X1 X0
1.4 字符串指令
序号 指令 字节码 功能 输入 输出
1 CAT 0x7e 移除计算栈栈顶的两个元素,并将其拼接后压入栈顶 X1 X0 Concat(X1, X0)
2 SUBSTR 0x7f 移除计算栈栈顶的三个元素,取子串后压入栈顶 X index len SubString(X, index, len)
3 LEFT 0x80 移除计算栈栈顶的两个元素,取子串后压入栈顶 X len Left(X, len)
4 RIGHT 0x81 移除计算栈栈顶的两个元素,取子串后压入栈顶 X len Right(X, len)
5 SIZE 0x82 将计算栈栈顶元素的长度压入栈顶 X X len(X)
1.5 按位逻辑运算指令
序号 指令 字节码 功能 输入 输出
1 INVERT 0x83 对计算栈栈顶的元素按位取反 X ~X
2 AND 0x84 对计算栈栈顶的两个元素执行按位与运算 A B A&B
3 OR 0x85 对计算栈栈顶的两个元素执行按位或运算 A B A|B
4 XOR 0x86 对计算栈栈顶的两个元素执行按位异或运算 A B A^B
5 EQUAL 0x87 对计算栈栈顶的两个元素执行逐字节的相等判断 A B Equals(A, B)
1.6 算数运算指令
序号 指令 字节码 功能 输入 输出
1 INC 0x8b 对计算栈栈顶的大整数执行递增运算 X X+1
2 DEC 0x8c 对计算栈栈顶的大整数执行递减运算 X X-1
3 SAL 0x8d 对计算栈栈顶的大整数执行乘以 2 的运算 X X*2
4 SAR 0x8e 对计算栈栈顶的大整数执行除以 2 的运算 X X/2
5 NEGATE 0x8f 求计算栈栈顶的大整数的相反数 X -X
6 ABS 0x90 求计算栈栈顶的大整数的绝对值 X Abs(X)
7 NOT 0x91 对计算栈栈顶的元素执行逻辑非运算 X !X
8 NZ 0x92 判断计算栈栈顶的大整数是否为非 0 值 X X!=0
9 ADD 0x93 对计算栈栈顶的两个大整数执行加法运算 A B A+B
10 SUB 0x94 对计算栈栈顶的两个大整数执行减法运算 A B A-B
11 MUL 0x95 对计算栈栈顶的两个大整数执行乘法运算 A B A*B
12 DIV 0x96 对计算栈栈顶的两个大整数执行除法运算 A B A/B
13 MOD 0x97 对计算栈栈顶的两个大整数执行求余运算 A B A%B
14 SHL 0x98 对计算栈中的大整数执行左移运算 X n X<<n
15 SHR 0x99 对计算栈中的大整数执行右移运算 X n X>>n
16 BOOLAND 0x9a 对计算栈栈顶的两个元素执行逻辑与运算 A B A&&B
17 BOOLOR 0x9b 对计算栈栈顶的两个元素执行逻辑或运算 A B A||B
18 NUMEQUAL 0x9c 对计算栈栈顶的两个大整数执行相等判断 A B A==B
19 NUMNOTEQUAL 0x9e 对计算栈栈顶的两个大整数执行不相等判断 A B A!=B
20 LT 0x9f 对计算栈栈顶的两个大整数执行小于判断 A B A<B
21 GT 0xa0 对计算栈栈顶的两个大整数执行大于判断 A B A>B
22 LTE 0xa1 对计算栈栈顶的两个大整数执行小于等于判断 A B A<=B
23 GTE 0xa2 对计算栈栈顶的两个大整数执行大于等于判断 A B A>=B
24 MIN 0xa3 取出计算栈栈顶的两个大整数中的最小值 A B Min(A, B)
25 MAX 0xa4 取出计算栈栈顶的两个大整数中的最大值 A B Max(A, B)
26 WITHIN 0xa5 判断计算栈中的大整数是否在指定的数值范围内 X A B A<=X&&X<B
1.7 密码学指令
序号 指令 字节码 功能 输入 输出
1 SHA1 0xa7 对计算栈栈顶的元素执行 SHA1 运算 X SHA1(X)
2 SHA256 0xa8 对计算栈栈顶的元素执行 SHA256 运算 X SHA256(X)
3 HASH160 0xa9 对计算栈栈顶的元素执行内置的 160 位散列运算 X HASH160(X)
4 HASH160(X) 0xaa 对计算栈栈顶的元素执行内置的 256 位散列运算 X HASH256(X)
5 CHECKSIG 0xac 利用计算栈栈顶元素中的签名和公钥,对当前验证对象执行内置的非对称签 名验证操作 S K Verify(S, K)
6 CHECKMULTISIG 0xae 利用计算栈栈顶元素中的多个签名和公钥,对当前验证对象执行内置的非对 称多重签名验证操作 Sm-1 ... S2 S1 S0 m Kn-1 ... K2 K1 K0 n V(对 于 任 意 的 𝑆𝑖 ∈{𝑆0,...,𝑆𝑚−1} , 存 在 一 个 𝐾𝑗 ∈{𝐾0,...,𝐾𝑛−1} 使 得Verify(𝑆𝑖 , 𝐾𝑗 ) == 1,则 V=1;否则,V=0。)
1.8数据结构指令
序号 指令 字节码 功能 输入 输出
1 ARRAYSIZE 0xc0 获取计算栈栈顶的数组的元素数量 [X0 X1 X2 ... Xn-1] n
2 PACK 0xc1 将计算栈栈顶的 n 个元素打包成数组 Xn-1 ... X2 X1 X0 n [X0 X1 X2 ... Xn-1]
3 UNPACK 0xc2 将计算栈栈顶的数组拆包成元素序列 [X0 X1 X2 ... Xn-1] Xn-1 ... X2 X1 X0 n
4 PICKITEM 0xc3 获取计算栈栈顶的数组中的指定元素 [X0 X1 X2 ... Xn-1] i Xi

2. 互操作

2.1 存储指令
序号 指令 功能 输入 输出
1 System.Storage.Get 读取数据 key value
2 System.Storage.Put 存入数据 key,value -
3 System.Storage.Delete 删除数据 key -
2.2 账户指令
序号 指令 功能 输入 输出
1 System.Account.IsValid 判断账户地址是否合法 value true/false
2.3 资金账户指令
序号 指令 功能 输入 输出
1 System.Bank.ContractAccAddressGet 获取合约资金账户 - address s
2 System.Bank.ContractBalanceGet 获取合约地址余额 denom_list balance
3 System.Bank.ContractBalanceSend 合约地址资金转出 to_address, denom, amount -
4 System.Bank.ContractBalanceInject 合约地址资金转入 from_address, denom, amount -
5 System.Bank.BalanceOf 获取指定账户地址余额 address, denom_list balance
2.4 运行时指令
序号 指令 功能 输入 输出
1 System.Runtime.Assert 断言 condition, msg true/false
2 System.Runtime.GetTxSender 获取合约调用者地址 - address
3 System.Runtime.GetTime 获取上一个块的时间 - timestamp
4 System.Runtime.GetLastCommitHash 获取上一个块的哈希 - blockhash
5 System.Runtime.GetBlockHeight 获取当前块高度 - height
6 System.Runtime.TimeFormat 格式化时间 timestamp formatdate
7 System.Runtime.GetRand 获取给定位数的n位随机数 n randnumber
2.5 合约指令
序号 指令 功能 输入 输出
1 System.Contract.Call 合约调用 静态调用:合约代码 给定 合约地址+参数
动态调用1: 调用者 给定 合约地址,合约代码给定参数
动态调用2: 调用者 给定 合约地址+参数
-
2 System.Contract.Create 合约部署 合约代码,合约名,合约版本 -
3 System.Contract.Upgrade 合约升级(已完成,待后续开放) 合约代码,合约名,合约版本 -
4 System.Contract.Destroy 合约销毁(已完成,待后续开放) 合约地址 -
5 System.Contract.Exists 合约是否存在 合约地址 -
2.6 HRC10合约指令
序号 指令 功能 输入 输出
1 System.Bank.TokenInit 初始化HRC10合约 address, amount, prefix -
2 System.Bank.TokenAdd 增加账户HRC10-Token余额 address, amount -
3 System.Bank.TokenSub 减少账户HRC10-Token余额 address, amount -
4 System.Bank.TokenGet 获取账户HRC10-Token余额 address balance
5 System.Bank.TokenSend HRC10-Token转账 from_addr, to_addr, amount -
Last Updated: 9/29/2019, 4:25:59 PM