跳到主要内容

Tolk vs FunC:标准库

FunC 有一个丰富的 标准库, ,称为 "stdlib.fc " 文件。它相当低级,包含大量与 TVM 命令命名非常接近的 asm 函数 。

Tolk 也有一个基于 FunC 的标准库。三个主要区别

  1. 它分为多个文件:common.tlktvm-dicts.tlk 和其他文件。来自 common.tolk 的函数始终可用。其他文件中的函数在导入后可用:
import "@stdlib/tvm-dicts"

beginCell() // available always
createEmptyDict() // available due to import
  1. 您无需从 GitHub 下载,它是 Tolk 发行版的一部分。
  2. 几乎所有 FunC 函数都被重命名为 verbose 清晰的名称。这样,当您编写合约或阅读示例时,就能更好地理解发生了什么。

重命名函数列表

如果 "Required import(需要导入)"列为空,则表示函数无需导入即可使用。

请注意,有些函数被删除,因为它们要么可以用语法表达, ,要么在实践中非常不常见。

FunC nameTolk nameRequired import
empty_tuplecreateEmptyTuple
tpushtuplePush
firsttupleFirst
attupleAt
touchstackMoveToToptvm-lowlevel
impure_touch(deleted)
single(deleted)
unsingle(deleted)
pair(deleted)
unpair(deleted)
triple(deleted)
untriple(deleted)
tuple4(deleted)
untuple4(deleted)
second(deleted)
third(deleted)
fourth(deleted)
pair_first(deleted)
pair_second(deleted)
triple_first(deleted)
triple_second(deleted)
triple_third(deleted)
minmaxminMax
my_addressgetMyAddress
get_balancegetMyOriginalBalanceWithExtraCurrencies
cur_ltgetLogicalTime
block_ltgetCurrentBlockLogicalTime
cell_hashcellHash
slice_hashsliceHash
string_hashstringHash
check_signatureisSignatureValid
check_data_signatureisSliceSignatureValid
compute_data_sizecalculateCellSizeStrict
slice_compute_data_sizecalculateSliceSizeStrict
compute_data_size?calculateCellSize
slice_compute_data_size?calculateSliceSize
~dumpdebugPrint
~strdumpdebugPrintString
dump_stackdebugDumpStack
get_datagetContractData
set_datasetContractData
get_c3getTvmRegisterC3tvm-lowlevel
set_c3setTvmRegisterC3tvm-lowlevel
blesstransformSliceToContinuationtvm-lowlevel
accept_messageacceptExternalMessage
set_gas_limitsetGasLimit
buy_gas(deleted)
commitcommitContractDataAndActions
divmoddivMod
moddivmodDiv
muldivmulDivFloor
muldivrmulDivRound
muldivcmulDivCeil
muldivmodmulDivMod
begin_parsebeginParse
end_parseassertEndOfSlice
load_refloadRef
preload_refpreloadRef
load_intloadInt
load_uintloadUint
preload_intpreloadInt
preload_uintpreloadUint
load_bitsloadBits
preload_bitspreloadBits
load_gramsloadCoins
load_coinsloadCoins
skip_bitsskipBits
first_bitsgetFirstBits
skip_last_bitsremoveLastBits
slice_lastgetLastBits
load_dictloadDict
preload_dictpreloadDict
skip_dictskipDict
load_maybe_refloadMaybeRef
preload_maybe_refpreloadMaybeRef
cell_depthgetCellDepth
slice_refsgetRemainingRefsCount
slice_bitsgetRemainingBitsCount
slice_bits_refsgetRemainingBitsAndRefsCount
slice_empty?isEndOfSlice
slice_data_empty?isEndOfSliceBits
slice_refs_empty?isEndOfSliceRefs
slice_depthgetSliceDepth
equal_slice_bitsisSliceBitsEqual
builder_refsgetBuilderRefsCount
builder_bitsgetBuilderBitsCount
builder_depthgetBuilderDepth
begin_cellbeginCell
end_cellendCell
store_refstoreRef
store_uintstoreUint
store_intstoreInt
store_slicestoreSlice
store_gramsstoreCoins
store_coinsstoreCoins
store_dictstoreDict
store_maybe_refstoreMaybeRef
store_builderstoreBuilder
load_msg_addrloadAddress
parse_addrparseAddress
parse_std_addrparseStandardAddress
parse_var_addr(deleted)
config_paramgetBlockchainConfigParam
raw_reservereserveToncoinsOnBalance
raw_reserve_extrareserveExtraCurrenciesOnBalance
send_raw_messagesendRawMessage
set_codesetContractCodePostponed
randrandomRange
get_seedrandomGetSeed
set_seedrandomSetSeed
randomizerandomizeBy
randomize_ltrandomizeByLogicalTime
dumpdebugPrint
strdumpdebugPrintString
dump_stkdebugDumpStack
empty_listcreateEmptyListlisp-lists
conslistPrependlisp-lists
unconslistSplitlisp-lists
list_nextlistNextlisp-lists
carlistGetHeadlisp-lists
cdrlistGetTaillisp-lists
new_dictcreateEmptyDicttvm-dicts
dict_empty?dictIsEmptytvm-dicts
idict_set_refiDictSetReftvm-dicts
udict_set_refuDictSetReftvm-dicts
idict_get_refiDictGetRefOrNulltvm-dicts
idict_get_ref?iDictGetReftvm-dicts
udict_get_ref?uDictGetReftvm-dicts
idict_set_get_refiDictSetAndGetRefOrNulltvm-dicts
udict_set_get_refiDictSetAndGetRefOrNulltvm-dicts
idict_delete?iDictDeletetvm-dicts
udict_delete?uDictDeletetvm-dicts
idict_get?iDictGettvm-dicts
udict_get?uDictGettvm-dicts
idict_delete_get?iDictDeleteAndGettvm-dicts
udict_delete_get?uDictDeleteAndGettvm-dicts
udict_setuDictSettvm-dicts
idict_setiDictSettvm-dicts
dict_setsDictSettvm-dicts
udict_add?uDictSetIfNotExiststvm-dicts
udict_replace?uDictSetIfExiststvm-dicts
idict_add?iDictSetIfNotExiststvm-dicts
idict_replace?iDictSetIfExiststvm-dicts
udict_set_builderuDictSetBuildertvm-dicts
idict_set_builderiDictSetBuildertvm-dicts
dict_set_buildersDictSetBuildertvm-dicts
udict_add_builder?uDictSetBuilderIfNotExiststvm-dicts
udict_replace_builder?uDictSetBuilderIfExiststvm-dicts
idict_add_builder?iDictSetBuilderIfNotExiststvm-dicts
idict_replace_builder?iDictSetBuilderIfExiststvm-dicts
udict_delete_get_minuDictDeleteFirstAndGettvm-dicts
idict_delete_get_miniDictDeleteFirstAndGettvm-dicts
dict_delete_get_minsDictDeleteFirstAndGettvm-dicts
udict_delete_get_maxuDictDeleteLastAndGettvm-dicts
idict_delete_get_maxiDictDeleteLastAndGettvm-dicts
dict_delete_get_maxsDictDeleteLastAndGettvm-dicts
udict_get_min?uDictGetFirsttvm-dicts
udict_get_max?uDictGetLasttvm-dicts
udict_get_min_ref?uDictGetFirstAsReftvm-dicts
udict_get_max_ref?uDictGetLastAsReftvm-dicts
idict_get_min?iDictGetFirsttvm-dicts
idict_get_max?iDictGetLasttvm-dicts
idict_get_min_ref?iDictGetFirstAsReftvm-dicts
idict_get_max_ref?iDictGetLastAsReftvm-dicts
udict_get_next?uDictGetNexttvm-dicts
udict_get_nexteq?uDictGetNextOrEqualtvm-dicts
udict_get_prev?uDictGetPrevtvm-dicts
udict_get_preveq?uDictGetPrevOrEqualtvm-dicts
idict_get_next?iDictGetNexttvm-dicts
idict_get_nexteq?iDictGetNextOrEqualtvm-dicts
idict_get_prev?iDictGetPrevtvm-dicts
idict_get_preveq?iDictGetPrevOrEqualtvm-dicts
udict::delete_get_minuDictDeleteFirstAndGettvm-dicts
idict::delete_get_miniDictDeleteFirstAndGettvm-dicts
dict::delete_get_minsDictDeleteFirstAndGettvm-dicts
udict::delete_get_maxuDictDeleteLastAndGettvm-dicts
idict::delete_get_maxiDictDeleteLastAndGettvm-dicts
dict::delete_get_maxsDictDeleteLastAndGettvm-dicts
pfxdict_get?prefixDictGettvm-dicts
pfxdict_set?prefixDictSettvm-dicts
pfxdict_delete?prefixDictDeletetvm-dicts

新增功能列表

Tolk 标准库中有一些 FunC 中没有的函数,但在日常工作中却很常用。

由于 Tolk 正在积极开发,其标准库也在不断变化,因此最好考虑使用源代码 此处 中的 tolk-stdlib/ 文件夹 。 除了函数,这里还添加了一些常量:SEND_MODE_*RESERVE_MODE_* 等。

一旦 FunC 被弃用,有关 Tolk stdlib 的文档将全部重写。

请记住,上述所有函数实际上都是 TVM 汇编程序的封装器。如果缺少什么, ,你可以很容易地自己封装任何 TVM 指令。

某些函数变得易变,不返回副本

FunCTolk
int flags = cs~load_uint(32);var flags = cs.loadUint(32);
dict~udict_set(...);dict.uDictSet(...);
......

大多数在实践中使用 ~(波浪号)的 FunC 函数,现在会直接修改对象,详见上述示例。

例如,如果您使用了 dict~udict_set(…),只需使用 dict.uDictSet(…),一切都会好起来。 但如果使用 dict.udict_set(…) 来获取副本,则需要用其他方式来表达。

了解可变性

嵌入式 stdlib 在引擎盖下如何工作

如上所述,所有标准功能都是开箱即用的。 是的,对于非通用函数,你需要 "导入"(这是有意为之),但仍然不需要外部下载。

其工作原理如下。

Tolk 编译器启动后做的第一件事就是通过搜索相对于可执行二进制文件的预定义路径来定位 stdlib 文件夹。 例如,如果从安装的软件包启动 Tolk 编译器 (如 /usr/bin/tolk),则将 stdlib 定位在 /usr/share/ton/smartcont。 如果是非标准安装,可以通过 TOLK_STDLIB 环境变量。这是编译器的标准做法。

WASM wrapper tolk-js 也包含 stdlib。 因此,当你使用 tolk-js 或 blueprint 时,所有 stdlib 函数仍然是开箱即用的。

集成开发环境插件(JetBrains 和 VS Code)也会自动定位 stdlib 以提供自动完成功能。 如果使用 blueprint,它会自动安装 tolk-js,因此项目文件结构中会出现 node_modules/@ton/tolk-js/ 文件夹。 里面有 common.tolk, tvm-dicts.tolk 等文件。