|
本帖最后由 riyad 于 2025-3-20 00:42 编辑
) E% d% M/ F8 K' N# y+ s* f& t ~$ W9 B6 c' z. \5 C
在上篇教程中,我分享了如何用 FunC 和 Blueprint 编写并编译一个红包智能合约。今天,我们将把这个合约部署到 TON 测试网,使用 测试币 来完成部署过程。这篇教程将详细介绍如何通过 Telegram 机器人 @testgiver_ton_bot 获取测试币、配置环境并成功部署合约。让我们开始吧!
) C! q7 d1 F4 _$ c0 x3 L6 b前提条件
! z0 X: p O" M" r* b部署到测试网需要以下准备:) `2 Y% N1 S6 ]$ X
, u* B6 I! R$ m# o
- 完成第一部分:你已经编写并编译了红包合约(参考上一教程)。
- 测试网 TON 币:我们将通过 @testgiver_ton_bot 获取免费测试币。
- 测试网钱包助记词:一个 TON 测试网钱包的 24 字助记词,用于支付部署费用。% Y: o$ ?, y; Z$ X- c2 I
获取测试币0 R" i& d' w8 w7 |4 x* W2 ~
由于这是测试网,我们需要测试币来支付部署费用。以下是通过 @testgiver_ton_bot 获取测试币的步骤:
8 v! j4 {% N7 F6 _4 Y; B9 n; P: {创建测试网钱包:
4 M4 j" B* n# m3 P- 下载 TON Wallet 或使用支持测试网的钱包。
- 切换到测试网模式(例如在 wallet.ton.org 上启用 ?testnet=true)。
- 生成新钱包并保存 24 字助记词。
* a5 y" v2 l5 K/ F
9 u/ W! r; Q# [2 l0 u: Z访问 @testgiver_ton_bot:! `2 |- Q" l+ V* O+ t! r( v
- 打开 Telegram,搜索 @testgiver_ton_bot 并启动它。
- 点击 “Start” 开始使用。
1 [5 t* [3 U* ^+ |) Y7 K 8 J) u5 ]) {( i9 W+ q0 ~: ]2 b
领取测试币:
4 b: g4 C6 I% U, D0 L- 在机器人界面点击 [ GET 2 TON ]。
- 返回你的测试网钱包,点击 “Deposit”(存款),复制钱包地址。
- 在机器人中完成验证码(captcha),粘贴你的钱包地址。
- 提交后,你将收到 2 TON 测试币(每小时可领取一次)。
- 如果需要更多测试币,可以在 TON 开发者社区(如 @tondev_eng)请求帮助。
% n# K* `/ M7 A# B$ A$ r& T. X) {4 V
9 O9 ]3 z5 L @! u步骤 1:配置测试网环境
; w$ Q/ B0 V& l+ E% V& A/ X* K1 ?我们将使用 TypeScript 和 TON SDK 连接测试网并部署合约。
l# O% j# o" Z2 N: e6 A安装依赖: 在项目根目录运行:
% {$ f s9 s# ], X( P2 J- npm install @ton/ton @ton/crypto @ton/core dotenv
复制代码- MNEMONIC="word1 word2 word3 ... word24"
复制代码 注意:这是测试网助记词,仅用于测试环境。0 B5 x6 n5 t* p
6 T1 w+ S( p% M
步骤 2:编写测试网部署脚本
) h+ w$ t6 P9 m' I* \
0 @" F3 X: {4 x我在 scripts/deploy.ts 中编写了部署逻辑,以下是完整代码和说明: - import { TonClient, WalletContractV4, toNano, Address, Sender } from "@ton/ton";
* V5 X ^9 i' @. i6 O) X! l - import { mnemonicToWalletKey } from "@ton/crypto";
: S/ p5 g$ ?: I# y - import { Cell, beginCell, SendMode } from "@ton/core";0 W2 }, j4 S4 O. d
- import { RedPacket, redPacketConfigToCell } from "../wrappers/RedPacket";$ x, {4 T" Q- H. J' w& i5 O& a
- import * as dotenv from "dotenv";
+ a. X! N2 k4 l. M5 v( B
9 j4 h+ h6 M3 ~5 N) M- dotenv.config();8 Z. Y9 L& l$ U! y9 c$ A4 r- {
- , c2 v s1 d0 P9 [7 L7 E- ]
- async function main() {. i- X, Z; r/ r9 P
- // 从 .env 加载测试网助记词, |4 r; e' m) I* ?$ B/ s
- const mnemonic = process.env.MNEMONIC;
: {' z% K7 w% z/ t - if (!mnemonic) {
$ _0 ^- i: A" U! R* z2 o) t) N - throw new Error("请在 .env 文件中设置测试网 MNEMONIC");6 _4 }4 q6 J- m# }! J
- }
/ V! U/ T: s+ D5 H. P+ E
: t3 n3 C. G, u- [, n; }8 G. L- // 将助记词转换为钱包密钥* u t( F5 X8 e
- const key = await mnemonicToWalletKey(mnemonic.split(" ")); T3 s S; u& X1 F) y* q
- # L# k, x3 r' p4 Z8 U o f
- // 初始化 TON 测试网客户端
7 [" N3 y. M6 ~6 j5 _ - const client = new TonClient({0 r; k+ q) k5 Z( i
- endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", // 测试网节点6 H/ s: T; V2 ], i6 U
- });
5 _. h0 [4 q1 ]' ?( [
. ^" s" ]# [4 q% b) n; N2 j- // 创建 V4 版本钱包(测试网); G4 R" @6 S' k. ^) ]
- const wallet = WalletContractV4.create({
; o: `9 S+ ~( I3 K9 Y - publicKey: key.publicKey,! z R- {6 ?, Z& J2 y! F
- workchain: 0, // 测试网使用基础链
b9 `% o j! f, q! Q; h - });
# G8 q; h3 a3 i0 w: a+ | w - $ k& o+ A/ {; U% M' ]
- // 打开钱包合约# a% s# g& l" t( U T/ Z
- const walletContract = client.open(wallet);7 M' T! {, b2 N0 O0 |
- & o+ W9 ?& C% ~- [ S" m7 d2 n
- // 获取测试网钱包地址和余额
. ^, u( [9 l4 g/ G' D- ` - const walletAddress = walletContract.address.toString();, } d7 k$ ~8 q8 q1 F1 [
- console.log("从测试网钱包部署:", walletAddress);, s9 ?3 I6 D0 ^5 k$ M2 [
- 0 A( g$ p8 k0 e
- const balance = await walletContract.getBalance();
) G, z5 J u" o/ L0 q - console.log("测试网钱包余额:", balance.toString(), "nanoTON");
. f8 Q' A' X) Y
/ r9 Z9 @* u% e' u- // 检查余额是否足够(至少 0.5 测试 TON), e8 j! Q# _ W. I$ J
- if (balance < toNano("0.5")) {7 ?6 B" |' N" |9 x& }. I
- throw new Error("测试网余额不足,至少需要 0.5 测试 TON 用于部署");
" i% ]- R7 d3 Z - }0 K4 V$ I8 D* x( c8 r
+ W; ^% d+ X& c- // 加载编译后的合约代码2 |7 U' |9 }+ N) V) @& Y: _+ C
- const compiledJson = require("../build/RedPacket.compiled.json");9 s% b( P" w* O2 A# r& H
- const code = Cell.fromBoc(Buffer.from(compiledJson.hex, "hex"))[0];
$ D2 L, j% m+ B- W
" A j" F' x( H) [ ^: Q: s5 `& `3 l- // 初始化红包合约(无初始配置)4 k4 ^# F4 T7 H6 g6 L% t0 i
- const config = {};
8 B" @( N# i& `( F z - const redPacket = RedPacket.createFromConfig(config, code, 0); // workchain 0
/ x5 z; A6 I) m1 G# j. _& ? - const redPacketAddress = redPacket.address;
6 \. u+ C$ ~8 i# j8 C$ _' a
. ]: O3 _) F' K9 z7 S- // 创建 Sender 对象( H# a4 `* e0 ]
- const sender: Sender = walletContract.sender(key.secretKey);5 \" p& B; O3 D/ Y( a% }) u+ o
7 e# `- y" U/ b+ @# W: j- // 部署合约到测试网6 ~- h$ p0 ]- ^! ^0 E5 r- e8 [" p; A
- const deployAmount = toNano("0.1"); // 部署费用 0.1 测试 TON
9 [8 q! V% D& p2 B - console.log("部署合约到测试网地址:", redPacketAddress.toString());1 \1 O, d" E+ Q* k& p& m2 ?/ Q
$ [4 @" x9 V1 s- const provider = client.open(redPacket) as any; // 类型转换简化处理5 c7 T( X y$ u4 z
- await redPacket.sendDeploy(provider, sender, deployAmount);
7 w2 _& s! n+ D3 c* f - 4 Z$ r5 {! |1 m2 Q6 ?
- console.log("测试网部署交易已发送,等待确认...");
9 w; C* r2 ~9 F8 C9 s- q - ; h0 l- c4 O8 P( a
- // 轮询检查部署状态
( y# D3 k* J) O- f* i' u - let isDeployed = false;! Q# G2 K$ B7 S- ?6 H6 X$ `# N. T/ D. T: Z
- for (let i = 0; i < 10; i++) {! `1 b/ [9 P4 f% `4 |4 Z
- const state = await client.getContractState(redPacketAddress);
, r* D3 Z: l) R. R, F. B - if (state.state === "active") {
* D5 U7 Y+ n% Q k- E& P - isDeployed = true;* |4 s4 I* H/ v- a
- break;
( b) q" P0 j6 p) H5 S1 k - }* W- u! r1 B/ s* ?
- console.log("等待测试网部署... 第", i + 1, "次尝试");
+ y* H. `$ C1 b! y( C, r" Z( E! d8 K - await new Promise((resolve) => setTimeout(resolve, 3000)); // 等待 3 秒6 C: M: i5 X# ~2 g) t
- }
- k7 L# J5 ^9 G
( N3 }# ^# G( |" q$ o- if (isDeployed) {0 L$ n7 l/ l% ~
- console.log("合约成功部署到测试网,地址:", redPacketAddress.toString());
. ^; [( ]* k4 [ - } else {( C* d' e" p1 g. y
- console.log("测试网部署可能失败或耗时较长,请检查地址:", redPacketAddress.toString());
: ~/ c4 O o& J$ l; p: f - }
5 x/ o& z: Q# ^8 H$ d - }4 e7 d S I$ H, d7 S7 g) s# A% e
- : H; j ?* K& B7 H- G0 G! b$ A
- main().catch(console.error);
复制代码 代码说明
- n( W* Z" h0 M$ [% j
: H% S+ p8 @5 G* R- 加载测试网助记词:从 .env 获取测试网钱包助记词。
- 生成密钥:将助记词转为公私钥对。
- 连接测试网:使用 TonClient 连接 TON 测试网节点。
- 创建测试网钱包:初始化 V4 版本钱包,检查余额(需至少 0.5 测试 TON)。
- 加载合约代码:读取编译后的代码。
- 初始化合约:生成红包合约实例和测试网地址。
- 部署到测试网:发送 0.1 测试 TON 部署合约。
- 确认部署:轮询检查合约状态变为 "active"。5 O1 d# H' W% `0 M& o
1 V& C% `! A. M2 r" ?$ n. e; E步骤 3:运行部署脚本& }$ S T; }5 ]; o0 {
安装依赖:* `4 u0 k# I% |4 c# {5 d
执行部署:# n' d. Q6 R2 v, j4 D, K' \
- npx ts-node scripts/deploy.ts
复制代码 输出示例:/ o4 h/ ? N0 l) F8 d j1 j9 j
- 从测试网钱包部署: EQ...xyz* o. z% ^ e/ |. C
- 测试网钱包余额: 2000000000 nanoTON8 p. @1 J( \7 V
- 部署合约到测试网地址: EQ...abc! C# g6 W- R9 }# G) _5 ?( Y; J1 y
- 测试网部署交易已发送,等待确认.../ o, X2 b4 J, l n
- 合约成功部署到测试网,地址: EQ...abc
复制代码
6 X7 `& \0 _7 H下一步计划0 ?+ P' Q1 z$ v
合约已部署到测试网,接下来我计划:5 D0 o4 T+ l: \! I3 j
- 测试交互:用测试币测试创建和领取红包。
- 前端开发:做一个界面,让用户在测试网上体验红包功能。
# @2 J0 _1 l7 w0 K W& g
, x( _) W7 B' k$ ^) |总结
* X7 P# t* M# q/ S8 h这篇教程展示了如何通过 @testgiver_ton_bot 获取测试币并将红包合约部署到 TON 测试网。测试网为我们提供了一个免费的实验环境,完整代码已分享,你可以跟着部署自己的合约。如果测试币领取有问题或部署失败,欢迎留言交流!下次我会分享如何在测试网上与合约交互,敬请期待!& i+ h X) b! u A0 \0 R
|
|