跳到主要内容

在 TON 上编译和构建智能合约

以下是构建智能合约的库和库列表。

简而言之:

  • 在大多数情况下,使用Blueprint SDK就足够了。
  • 如果您需要更低级别的方法,可以使用ton-compiler或func-js。

Blueprint

概览

TON区块链的开发环境,用于编写、测试和部署智能合约。在Blueprint git库中了解更多信息。

安装

在终端运行以下命令以创建一个新项目,并按照屏幕上的指示操作:

npm create ton@latest

特点

  • 构建、测试和部署智能合约的简化工作流程
  • 使用您最喜欢的钱包(例如Tonkeeper)轻松部署到主网/测试网
  • 在一个独立的区块链中快速测试多个智能合约,该区块链在进程中运行

技术栈

  1. 使用https://github.com/ton-community/func-js编译FunC(无CLI)
  2. 使用https://github.com/ton-community/sandbox测试智能合约
  3. 使用TON Connect 2Tonhub walletton://深链接部署智能合约

要求

如何使用?

ton-compiler

概览

打包的FunC编译器,用于TON智能合约:

安装

npm install ton-compiler

特点

  • 多个FunC编译器版本
  • 无需安装和编译TON
  • 程序化和CLI接口
  • 适用于cell测试

如何使用

这个包在项目中添加了ton-compiler二进制文件。

FunC编译是一个多阶段过程。其中之一是将Func编译为Fift代码,然后将其编译为二进制表示。Fift编译器已经内置了Asm.fif。

FunC标准库已被捆绑,但可以在运行时禁用。

控制台使用

# 编译为二进制形式(用于合约创建)
ton-compiler --input ./wallet.fc --output ./wallet.cell

# 编译为fift(用于调试)
ton-compiler --input ./wallet.fc --output-fift ./wallet.fif

# 同时编译为二进制形式和fift
ton-compiler --input ./wallet.fc --output ./wallet.cell --output-fift ./wallet.fif

# 禁用标准库
ton-compiler --no-stdlib --input ./wallet.fc --output ./wallet.cell --output-fift ./wallet.fif

# 选择版本
ton-compiler --version "legacy" --input ./wallet.fc --output ./wallet.cell --output-fift ./wallet.fif

程序化使用

import { compileContract } from "ton-compiler";
let result = await compileContract({ code: '

source code', stdlib: true, version: 'latest' });
if (result.ok) {
console.log(result.fift); // 编译的Fift汇编器
console.log(result.cell); // 编译的cell Buffer
} else {
console.warn(result.logs); // 输出日志
}

func-js

概览

Cross-platform绑定TON FunC编译器。

它比ton-compiler更低级,所以只有在ton-compiler不适用时才使用它。

安装

npm install @ton-community/func-js

特点

  • 无需编译或下载FunC二进制文件
  • 在Node.js和WEB中都可工作(需要WASM支持)
  • 直接编译为带有代码cell的BOC
  • 返回汇编版本用于调试目的
  • 不依赖文件系统

如何使用

在内部,这个包使用了FunC编译器和Fift解释器组合成单个编译为WASM的库。

简单架构:

(您的代码) -> WASM(FunC -> Fift -> BOC)

内部库的源代码可以在这里找到。

使用示例

import {compileFunc, compilerVersion} from '@ton-community/func-js';
import {Cell} from 'ton';

async function main() {
// 您可以获取编译器版本
let version = await compilerVersion();

let result = await compileFunc({
// 项目的入口点
entryPoints: ['main.fc'],
// 源代码
sources: {
"stdlib.fc": "<stdlibCode>",
"main.fc": "<contractCode>",
// 其他包含在main.fc中的文件
}
});

if (result.status === 'error') {
console.error(result.message)
return;
}

// result.codeBoc包含编码的BOC,带有代码cell
let codeCell = Cell.fromBoc(Buffer.from(result.codeBoc, "base64"))[0];

// result.fiftCode包含您代码的汇编版本(用于调试目的)
console.log(result.fiftCode)
}

请注意,项目中使用的所有FunC源文件内容都应传递给sources,包括:

  • 入口点
  • stdlib.fc(如果您使用它)
  • 所有包含在入口点中的文件

经TON社区验证

第三方贡献者

其他