Get-методы
Прежде чем продолжить, рекомендуется ознакомиться с основами языка программирования FunC на блокчейне TON. Это поможет лучше понять представленную ниже информацию.
Введение
Get-методы — это специальные функции, предназначенные для получения конкретных данных из состояния смарт-контракта. Их выполнение происходит вне блокчейна и не требует комиссии.
Эти функции встречаются во многих смарт-контрактах. Например, стандартный смарт-контракт кошелька содержит несколько get-методов: seqno()
, get_subwallet_id()
и get_public_key()
. Они позволяют получать данные о кошельке из самого контракта, SDK и API.
Шаблоны проектирования для get-методов
Базовые шаблоны
-
Получение отдельных данных. Данный шаблон представляет собой набор методов, которые позволяют получить в качестве результата вызова отдельные параметры из состояния контракта. Данные методы не содержат аргументов и возвращают только одно значение.
Например:
int get_balance() method_id {
return get_data().begin_parse().preload_uint(64);
} -
Получение агрегированных данных. Ещё один распространённый шаблон - набор методов, позволяющих извлечь сразу массив данных из состояния контракта в рамках одиночного вызова. Это может быть удобно для случаев, когда для какой-то операции необходимо несколько параметров. Такие методы применяются, например, в контрактах Jetton и NFT.
Например:
(int, slice, slice, cell) get_wallet_data() method_id {
return load_data();
}
Продвинутые шаблоны
-
Получение вычисляемых данных. В некоторых случаях искомые данные не хранятся в текущем состоянии контракта, однако могут быть вычислены, если в метод будут переданы дополнительные аргументы для расчета.
Например:
slice get_wallet_address(slice owner_address) method_id {
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
return calculate_user_jetton_wallet_address(owner_address, my_address(), jetton_wallet_code);
} -
Получение данных с учетом условий. Иногда значения, которые нужно получить, зависят от каких-либо параметров, к примеру, от текущего времени.
Например:
(int) get_ready_to_be_used() method_id {
int ready? = now() >= 1686459600;
return ready?;
}