跳到主要内容

应用特定原语

操作码Fift 语法堆栈Gas描述
Please enter a search query
No results found

TVM 指令内容列表

...

应用特定原语

与 Gas 相关的原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F800ACCEPT-将当前的 Gas 限制 g_l 设置为其允许的最大值 g_m,并将 Gas 信用 g_c 重置为零,同时减少 g_r 的值 g_c
换句话说,当前的智能合约同意购买一些 Gas 以完成当前交易。此操作是处理外部消息所必需的,这些消息本身不携带价值(因而没有 Gas)。
26
F801SETGASLIMITg - 将当前的 Gas 限制 g_l 设置为 gg_m 的最小值,并将 Gas 信用 g_c 重置为零。如果到目前为止所消耗的 Gas(包括当前指令)超过了所得的 g_l 值,则在设置新的 Gas 限制之前抛出(未处理的)Gas 超限异常。请注意,带有参数 g >= 2^63-1SETGASLIMIT 等同于 ACCEPT26
F80FCOMMIT-提交寄存器 c4(“持久数据”)和 c5(“操作”)的当前状态,以便即使后来抛出异常,当前执行也被视为“成功”,并保存了这些值。26

伪随机数生成器原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F810RANDU256- x生成一个新的伪随机的无符号 256 位 整数 x。算法如下: 如果 r 是旧的随机种子值,被视为一个 32 字节的数组(通过构造一个无符号 256 位整数的大端表示),则计算其 sha512(r);这个哈希的前 32 字节被存储为新的随机种子值 r',剩下的 32 字节作为下一个随机值 x 返回。26+\|c7\|+\|c1_1\|
F811RANDy - z0...y-1(或 y...-1, 如果 y<0)范围内生成一个新的伪随机整数 z。更确切地说,生成一个无符号随机值 x,如同在 RAND256U 中;然后计算 z:=floor(x*y/2^256)
等同于 RANDU256 256 MULRSHIFT.
26+\|c7\|+\|c1_1\|
F814SETRANDx - 将随机种子设置为无符号 256 位 整数 x26+\|c7\|+\|c1_1\|
F815ADDRAND
RANDOMIZE
x - 将无符号 256 位 整数 x 混入随机种子 r 中,通过将随机种子设为两个 32 字节字符串的连结的 Sha,第一个字符串以旧种子 r 的大端表示,第二个字符串以 x 的大端表示。26

配置原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F82i[i] GETPARAM - x从提供于 c7元组 中返回第 i 个参数,对于 0 <= i <= 15。等同于 c7 PUSHCTR FIRST [i] INDEX.
如果这些内部操作之一失败,则抛出相应的类型检查或范围检查异常。
26
F823NOW - x返回当前 Unix 时间作为一个 整数。如果从 c7 开始无法恢复请求的值,则抛出类型检查或范围检查异常。
等同于 3 GETPARAM.
26
F824BLOCKLT - x返回当前区块的开始逻辑时间。
等同于 4 GETPARAM.
26
F825LTIME - x返回当前交易的逻辑时间。
等同于 5 GETPARAM.
26
F826RANDSEED - x以无符号 256 位 整数 的形式返回当前的随机种子。
等同于 6 GETPARAM.
26
F827BALANCE - t元组 形式返回智能合约剩余的余额,元组 包含一个 整数(剩余的Gram余额,以nanograms为单位)和一个 可能的cell(以 32 位键表示的“额外代币”的余额字典)。
等同于 7 GETPARAM.
请注意,如 SENDRAWMSGRAW 原语不会更新此字段。
26
F828MYADDR - s分片 形式返回当前智能合约的内部地址,包含一个 MsgAddressInt。如果必要,可以使用诸如 PARSEMSGADDRREWRITESTDADDR 之类的原语进一步解析它。
等同于 8 GETPARAM.
26
F829CONFIGROOT - D可能的cell D 形式返回当前全局配置字典。等同于 9 GETPARAM 26
F830CONFIGDICT - D 32返回全局配置字典及其键长(32)。
等同于 CONFIGROOT 32 PUSHINT.
26
F832CONFIGPARAMi - c -1 或 0cell c 的形式返回整数索引 i 的全局配置参数的值,以及指示成功的标志位。
等同于 CONFIGDICT DICTIGETREF.
F833CONFIGOPTPARAMi - c^?可能的cell c^? 的形式返回整数索引 i 的全局配置参数的值。
等同于 CONFIGDICT DICTIGETOPTREF.

全局变量原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F840GETGLOBVARk - x返回第 k 个全局变量,对于 0 <= k < 255
相当于 c7 PUSHCTR SWAP INDEXVARQ
26
F85_k[k] GETGLOB - x返回第 k 个全局变量,对于 1 <= k <= 31
相当于 c7 PUSHCTR [k] INDEXQ
26
F860SETGLOBVARx k - x 分配给第 k 个全局变量,对于 0 <= k < 255
相当于 c7 PUSHCTR ROTREV SETINDEXVARQ c7 POPCTR
26+\|c7’\|
F87_k[k] SETGLOBx - x 分配给第 k 个全局变量,对于 1 <= k <= 31
相当于 c7 PUSHCTR SWAP k SETINDEXQ c7 POPCTR
26+\|c7’\|

哈希和密码学原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F900HASHCUc - x计算 cell c 的表示哈希,并将其作为 256 位无符号整数 x 返回。用于对由cell树表示的任意实体进行签名和检查签名。26
F901HASHSUs - x计算 分片 s 的哈希,并将其作为 256 位无符号整数 x 返回。结果与如果创建了一个仅包含 s 的数据和引用的普通cell并通过 HASHCU 计算其哈希相同。526
F902SHA256Us - x分片 s 的数据位计算 Sha。如果 s 的位长度不能被八整除,抛出一个cell下溢异常。哈希值作为 256 位无符号整数 x 返回。26
F910CHKSIGNUh s k - ?使用公钥 k(也用一个 256 位无符号整数表示)检查哈希 h(通常作为某些数据的哈希,为一个 256 位无符号整数)的 Ed25519 签名 s
签名 s 必须是至少包含 512 位数据的 分片;仅使用前 512 位。结果为 -1 则签名有效,否则为 0
请注意,CHKSIGNU 相当于 ROT NEWC 256 STU ENDC ROTREV CHKSIGNS,即,相当于用第一个参数 d 设置为包含 h 的 256 位 分片CHKSIGNS。因此,如果 h 是作为某些数据的哈希计算的,这些数据会被 两次 哈希,第二次哈希发生在 CHKSIGNS 内部。
26
F911CHKSIGNSd s k - ?检查 s 是否是使用公钥 k分片 d 的数据部分的有效 Ed25519 签名,类似于 CHKSIGNU。如果 分片 d 的位长度不能被八整除,抛出一个cell下溢异常。Ed25519 签名的验证是标准的,使用 Shad 缩减为实际签名的 256 位数字。26

其他原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
F940CDATASIZEQc n - x y z -1 或 0递归计算以 cell c 为根的 dag 中不同cell x、数据位 y 和cell引用 z 的计数,有效地返回考虑等价cell标识时该 dag 使用的总存储量。xyz 的值通过该 dag 的深度优先遍历来计算,使用访问过的cell哈希表来防止已访问cell的重复访问。访问的cell总数 x 不能超过非负 整数 n;否则,在访问第 (n+1) 个cell之前计算被中断,并返回零表示失败。如果 c,则返回 x=y=z=0
F941CDATASIZEc n - x y zCDATASIZEQ 的非静默版本,失败时抛出cell溢出异常(8)。
F942SDATASIZEQs n - x y z -1 或 0类似于 CDATASIZEQ,但接受一个 分片 s 而非 cell。返回的 x 值不包括包含切片 s 本身的cell;然而,s 的数据位和cell引用在 yz 中被计算在内。
F943SDATASIZEs n - x y zSDATASIZEQ 的非静默版本,失败时抛出cell溢出异常(8)。

代币操作原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
FA00LDGRAMS
LDVARUINT16
s - x s'分片 s 中加载(反序列化)一个 GramVarUInteger 16 数量,并以 整数 x 形式返回数量及 s 的剩余部分 s'x 的预期序列化格式包括一个 4 位无符号大端整数 l,随后是 x 的一个 8l 位无符号大端表示。
其效果大致等同于 4 LDU SWAP 3 LSHIFT# LDUX
26
FA01LDVARINT16s - x s'LDVARUINT16 相似,但加载一个 有符号 整数 x
大致等同于 4 LDU SWAP 3 LSHIFT# LDIX
26
FA02STGRAMS
STVARUINT16
b x - b'将范围为 0...2^120-1 内的 整数 x 存储(序列化)到 构建器 b 中,并返回 构建器 b'的结果。x 的序列化格式包括一个 4 位无符号大端整数 l,这是满足 x<2^(8l) 的最小的 l>=0 整数,随后是 x 的一个 8l 位无符号大端表示。如果 x 不在支持的范围内,则抛出范围检查异常。26
FA03STVARINT16b x - b'类似于 STVARUINT16,但序列化一个范围为 -2^119...2^119-1有符号 整数 x26

消息和地址操作原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
FA40LDMSGADDRs - s' s''分片 s 中加载唯一有效的 MsgAddress 前缀,并将该前缀 s's 的剩余部分 s'' 作为分片返回。26
FA41LDMSGADDRQs - s' s'' -1 或 s 0LDMSGADDR 的静默版本:成功时额外推送 -1;失败时推送原始 s 和零。26
FA42PARSEMSGADDRs - t将包含有效 MsgAddress分片 s 分解为一个具有此 MsgAddress 独立字段的 元组 t。如果 s 不是有效的 MsgAddress,则抛出cell反序列化异常。26
FA43PARSEMSGADDRQs - t -1 或 0PARSEMSGADDR 的静默版本:错误时返回零而不是抛出异常。26
FA44REWRITESTDADDRs - x y解析包含有效 MsgAddressInt(通常是 msg_addr_std)的 分片 s,应用从 anycast(如果存在)到地址的相同长度前缀的重写,并以整数形式返回工作链 x 和 256 位地址 y。如果地址不是 256 位的,或者如果 s 不是有效的 MsgAddressInt 序列化,则抛出cell反序列化异常。26
FA45REWRITESTDADDRQs - x y -1 或 0原语 REWRITESTDADDR 的静默版本。26
FA46REWRITEVARADDRs - x s'REWRITESTDADDR 的变体,即使地址不是完全为 256 位长(由 msg_addr_var 表示),也返回(重写的)地址作为 分片 s26
FA47REWRITEVARADDRQs - x s' -1 或 0原语 REWRITEVARADDR 的静默版本。26

出站消息和输出操作原语

xxxxxxx
操作码
xxxxxxxxxxxxxxxxxxxxxxxxxxxx
Fift 语法
xxxxxxxxxxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
xxxx
Gas
FB00SENDRAWMSGc x - 发送包含在 cell c 中的原始消息,其中应包含正确序列化的对象 Message X,唯一的例外是源地址允许有虚拟值 addr_none(将自动替换为当前智能合约地址),且 ihr_feefwd_feecreated_ltcreated_at 字段可以有任意值(在当前交易的操作阶段将被正确值重写)。整数参数 x 包含标志位。当前 x=0 用于普通消息;x=128 用于携带当前智能合约所有剩余余额的消息(而非消息最初指示的值);x=64 用于携带除初始指示的新消息值外,入站消息的所有剩余值的消息(如果未设置位 0,则此金额中扣除 gas 费用);x'=x+1 表示发送者想要单独支付转账费用;x'=x+2 表示在操作阶段处理此消息时发生的任何错误都应被忽略。最后,x'=x+32 意味着如果当前账户的最终余额为零,则必须销毁该账户。这个标志位通常与 +128 一起使用。526
FB02RAWRESERVEx y - 创建一个输出操作,该操作将从账户的剩余余额中准确预留 x nanograms(如果 y=0),最多 x nanograms(如果 y=2),或除 x nanograms外的所有nanograms(如果 y=1y=3)。这大致相当于创建一个携带 x nanograms(或 b-x nanograms,其中 b 是剩余余额)到自己的出站消息,以便后续输出操作无法花费超过剩余金额的资金。y 中的位 +2 表明,如果无法预留指定金额,外部操作不会失败;相反,将预留所有剩余余额。y 中的位 +8 表示在执行任何进一步操作之前 x:=-xy 中的位 +4 表示在执行任何其他检查和操作之前,x 会增加当前帐户(在计算阶段之前)的原始余额,包括所有额外货币。当前 x 必须是非负整数,且 y 必须在 0...15 范围内。526
FB03RAWRESERVEXx D y - 类似于 RAWRESERVE,但也接受一个代表额外代币的字典 D(由 cell 表示)。这种方式可以预留Grams以外的货币。526
FB04SETCODEc - 创建一个输出操作,该操作将此智能合约代码更改为由 cell c 给出的代码。请注意,此更改仅在当前智能合约运行成功终止后生效。526
FB06SETLIBCODEc x - 创建一个输出操作,用于修改此智能合约库的集合,通过添加或移除在 cell c 中给定代码的库。如果 x=0,若库先前存在于集合中,则实际上会被移除(如果不存在,则此操作无效)。如果 x=1,则库被作为私有库添加;如果 x=2,则库被作为公共库添加(如果当前智能合约位于主链中,则变得对所有智能合约可用);如果库之前已存在于集合中,则其公共/私有状态将根据 x 改变。另外,16 可以加到 x 上,以在失败时启用弹回交易。x 的值除了 0...2 (+16 可能) 之外都是无效的。526
FB07CHANGELIBh x - 类似于 SETLIBCODE,创建一个输出操作,但它接受库的哈希而非库代码,哈希以无符号 256 位整数 h 的形式给出。如果 x!=0 且该智能合约的库集合中不存在哈希值为 h 的库,此输出操作将失败。526

TVM 指令内容列表

...

参阅