Перейти к основному содержимому

Tolk и FunC: стандартная библиотека

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

FunC обладает богатой [стандартной библиотекой] (/v3/documentation/smart-contracts/func/docs/stdlib), известной как файл "stdlib.fc ". Она довольно низкоуровневая и содержит множество asmфункций, названия которых очень похожи на команды TVM.

Tolk также имеет стандартную библиотеку, основанную на библиотеке FunC. Три основных отличия:

  1. Она разделена на несколько файлов: common.tolk, tvm-dicts.tolk и другие. Функции из common.tolk доступны всегда. Функции из других файлов доступны после импорта:
import "@stdlib/tvm-dicts"

beginCell() // available always
createEmptyDict() // available due to import
  1. Вам не нужно загружать ее с GitHub, она является частью дистрибутива Tolk.
  2. Почти все функции FunC были переименованы в подробные понятные названия. Это позволяет лучше понимать, что происходит, при написании контрактов или чтении примеров.

Список переименованных функций

Если столбец "Требуемый импорт" пуст - функция доступна без импорта.

Обратите внимание, что некоторые функции были удалены, так как их можно выразить синтаксически или они были крайне редко используемы на практике.

Название в FunCНазвание в TolkНеобходимый импорт
empty_tuplecreateEmptyTuple
tpushtuplePush
firsttupleFirst
attupleAt
touchstackMoveToToptvm-lowlevel
impure_touch(удалено)
single(удалено)
unsingle(удалено)
pair(удалено)
unpair(удалено)
triple(удалено)
untriple(удалено)
tuple4(удалено)
untuple4(удалено)
second(удалено)
third(удалено)
fourth(удалено)
pair_first(удалено)
pair_second(удалено)
triple_first(удалено)
triple_second(удалено)
triple_third(удалено)
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(удалено)
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(удалено)
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 будет полностью переписана.

И помните, что все вышеупомянутые функции на самом деле являются обёртками над ассемблером 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 под капотом

Как упоминалось ранее, все стандартные функции доступны "из коробки". Да, для нестандартных функций потребуется import (это сделано намеренно), но при этом внешние загрузки не нужны.

Это работает следующим образом.

Первое, что делает компилятор Tolk при запуске - ищет папку stdlib, выполняя поиск по предопределённым путям относительно исполняемого бинарного файла Например, если вы запускаете компилятор Tolk из установленного пакета (например, /usr/bin/tolk), он найдёт stdlib в /usr/share/ton/smartcont. Если у вас нестандартная установка, вы можете указать переменную окружения TOLK_STDLIB. Это стандартная практика для компиляторов.

Обертка WASM tolk-js также содержит stdlib. Таким образом, при использовании tolk-js или blueprint все функции stdlib доступны "из коробки".

Плагины IDE (как JetBrains и VS Code) также автоматически находят stdlib для автозавершения кода. Если вы используете blueprint, он автоматически устанавливает tolk-js, и, соответственно, в структуре файлов вашего проекта появляется папка node_modules/@ton/tolk-js/. Внутри находятся файлы common.tolk, tvm-dicts.tolk и другие.