FunC CLI: установка и первая компиляция

Скомпилируешь FunC через @ton-community/func-js (рекомендуемый путь) и поймёшь, когда нужен нативный func.

Два способа компилировать FunC

FunC — низкоуровневый язык контрактов TON. На практике есть два пути:

  1. @ton-community/func-js (WASM) — работает на macOS/Linux/Windows, так компилирует Blueprint.
  2. Нативный func — бинарник из сборки TON; нужен реже (кастомные пайплайны, Fift вручную).

Для старта бери func-js. На момент публикации: @ton-community/func-js@0.11.0.


Компиляция через func-js

bash
# @ton-community/func-js 0.11.0, @ton/core 0.63.x
npm i -D @ton-community/func-js@0.11.0 @ton/core@0.63.1

Минимальный контракт echo.fc (нужен stdlib.fc из стандартной библиотеки FunC — в Blueprint он уже в проекте):

func (fallback highlight)
;; минимальный recv_internal: принять сообщение и завершиться
() recv_internal() impure {
  return ();
}

Скрипт компиляции compile.mjs:

typescript
// @ton-community/func-js 0.11.0, @ton/core 0.63.1
import { compileFunc } from "@ton-community/func-js";
import { Cell } from "@ton/core";
import fs from "fs";

const result = await compileFunc({
  targets: ["echo.fc"],
  sources: {
    "echo.fc": fs.readFileSync("./echo.fc", "utf-8"),
    // stdlib.fc — из node_modules или contracts/imports Blueprint-шаблона
    "stdlib.fc": fs.readFileSync("./stdlib.fc", "utf-8"),
  },
});

if (result.status === "error") {
  console.error(result.message);
  process.exit(1);
}

const code = Cell.fromBoc(Buffer.from(result.codeBoc, "base64"))[0]!;
console.log("hash:", code.hash().toString("hex"));
bash
node compile.mjs
# ожидаешь hash: <64 hex-символа>

В Blueprint то же самое делает одна команда:

bash
npx blueprint build

Нативный func (опционально)

Нужен, если собираешь toolchain из исходников TON или вызываешь func/fift вне Node. На Windows проще через WSL2. После установки бинарников в PATH:

bash
func -o echo.fif -SPA stdlib.fc echo.fc

Флаг -SPA подключает стандартную библиотеку и обрабатывает импорты. Без корректного stdlib.fc компиляция падает сразу.

Как это работает

  • FunC → Fift-ассемблер → BoC с кодом контракта.
  • func-js гоняет тот же компилятор в WebAssembly внутри Node — результат совместим с нативным func.
  • Blueprint читает wrappers/*.compile.ts (lang: 'func', targets: [...]) и вызывает func-js за тебя.

Частые ошибки

Нет stdlib.fc в sources → ошибка на первой же стандартной функции. Скопируй stdlib из шаблона Blueprint (func-counter) или укажи путь к нему.

Смешиваешь FunC 0.4.x stdlib с другим набором файлов → странные undeclared identifier. Держи stdlib из того же шаблона, что и проект.

Ищешь отдельный npm-пакет func-cli → его нет как единого продукта. Либо Blueprint/func-js, либо нативные бинарники TON.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация