|
本帖最后由 riyad 于 2025-3-20 00:42 编辑 / U6 L5 y* R/ C$ n7 L/ {0 Z. p6 r
% O& \% C1 s7 N+ _
在上篇教程中,我分享了如何用 FunC 和 Blueprint 编写并编译一个红包智能合约。今天,我们将把这个合约部署到 TON 测试网,使用 测试币 来完成部署过程。这篇教程将详细介绍如何通过 Telegram 机器人 @testgiver_ton_bot 获取测试币、配置环境并成功部署合约。让我们开始吧!
' z- I0 F: y' u8 F" N9 D% V2 T3 K4 O9 H前提条件
8 d# ~6 T3 ?# q2 h部署到测试网需要以下准备:( E2 O& i* U V" b, @
* m/ ~" D: g0 x- T: v5 q5 V
- 完成第一部分:你已经编写并编译了红包合约(参考上一教程)。
- 测试网 TON 币:我们将通过 @testgiver_ton_bot 获取免费测试币。
- 测试网钱包助记词:一个 TON 测试网钱包的 24 字助记词,用于支付部署费用。
0 L" q6 @/ R6 Z& j 获取测试币6 I" P5 |, U% Y2 d& T! p) n9 n6 a
由于这是测试网,我们需要测试币来支付部署费用。以下是通过 @testgiver_ton_bot 获取测试币的步骤:
. _/ I' x2 G4 s) |' t8 m创建测试网钱包:
2 O7 y% c. M) A# a) S4 q3 c- 下载 TON Wallet 或使用支持测试网的钱包。
- 切换到测试网模式(例如在 wallet.ton.org 上启用 ?testnet=true)。
- 生成新钱包并保存 24 字助记词。
) c, Z! g% u- u3 L$ c6 T
+ k0 ^6 J) I- X) B$ R, T. v+ u, z访问 @testgiver_ton_bot:
. Z/ D( O! @( c: u; s6 m- 打开 Telegram,搜索 @testgiver_ton_bot 并启动它。
- 点击 “Start” 开始使用。
! \. Z" d5 L/ `
+ V' }3 t# R2 U领取测试币:7 E8 t2 @# ]5 L" ] \% m! i7 N
- 在机器人界面点击 [ GET 2 TON ]。
- 返回你的测试网钱包,点击 “Deposit”(存款),复制钱包地址。
- 在机器人中完成验证码(captcha),粘贴你的钱包地址。
- 提交后,你将收到 2 TON 测试币(每小时可领取一次)。
- 如果需要更多测试币,可以在 TON 开发者社区(如 @tondev_eng)请求帮助。' i1 a5 J0 J7 `+ Z0 Q4 n) c9 F) R
( r$ `, H3 f+ Q
步骤 1:配置测试网环境
" w" K/ W1 b4 g! T; K我们将使用 TypeScript 和 TON SDK 连接测试网并部署合约。2 [( Y) b/ d% ?2 ?* b. V
安装依赖: 在项目根目录运行:, U& r- z7 b8 G
- npm install @ton/ton @ton/crypto @ton/core dotenv
复制代码- MNEMONIC="word1 word2 word3 ... word24"
复制代码 注意:这是测试网助记词,仅用于测试环境。8 X, N" l$ c# z7 c4 W
8 f. u1 k& \: h8 D/ R2 |) e7 e步骤 2:编写测试网部署脚本
7 l9 Y9 i I$ {4 \0 r. o# ]. C
6 w2 @# k/ D# ^* p: T我在 scripts/deploy.ts 中编写了部署逻辑,以下是完整代码和说明: - import { TonClient, WalletContractV4, toNano, Address, Sender } from "@ton/ton";( M, ]& z4 `2 q
- import { mnemonicToWalletKey } from "@ton/crypto";
# p1 ?; c2 e" b, w, A; V7 L4 P - import { Cell, beginCell, SendMode } from "@ton/core";/ c4 M; [& E, u0 }/ z
- import { RedPacket, redPacketConfigToCell } from "../wrappers/RedPacket";
6 ?0 Q9 v: g& o& ?2 K: u - import * as dotenv from "dotenv";
* o: T+ W( W1 E- C8 v
X, o% i2 l9 s1 D- dotenv.config();) _, J" k0 \$ _ q, P0 P; Z6 f& X
- . C4 d6 u' C/ a9 U; x
- async function main() {
& h4 A k2 G; ^ - // 从 .env 加载测试网助记词7 ]0 A$ }4 | [9 y
- const mnemonic = process.env.MNEMONIC;7 o' A, `, f9 q4 v! l8 B
- if (!mnemonic) {1 x! I; ^7 i1 c
- throw new Error("请在 .env 文件中设置测试网 MNEMONIC");- G/ l" h* l# t; G
- }
5 l3 C) F5 G% k- x5 _
( h8 u1 C- M* Y @4 @: p6 I$ m- // 将助记词转换为钱包密钥: Y) f9 j. U: u# B) o& p
- const key = await mnemonicToWalletKey(mnemonic.split(" "));
4 h, o7 _- H2 |9 v
6 @1 q; Q& [. z- }0 V. ~2 _- // 初始化 TON 测试网客户端6 N) C+ x5 ]0 T; g p7 m
- const client = new TonClient({/ D4 g* Z$ K* e2 E* j% X
- endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", // 测试网节点+ l. _" H; p$ }7 ?) t
- });
. T/ I3 T' s# ]6 M; `5 q - % g9 A$ E5 R/ `& G) }! w
- // 创建 V4 版本钱包(测试网)# W0 e) B5 `+ D. ]
- const wallet = WalletContractV4.create({4 I% Q) Z8 ?, b( j
- publicKey: key.publicKey,
( e4 h8 d5 W3 G7 k - workchain: 0, // 测试网使用基础链' p% N+ Z/ A$ E: m) e
- });
" l3 P: z# O H _ - , N L5 I5 O5 g2 |$ Z, l1 r
- // 打开钱包合约1 B; l+ Y Q( O9 I& f& r
- const walletContract = client.open(wallet);
, q- N* B: \% j+ V1 y/ M* @7 N - - W, j9 q$ A% D u" j
- // 获取测试网钱包地址和余额
) V: i! q. f. ?' z" j' q - const walletAddress = walletContract.address.toString();, I2 T3 ~' T+ a9 |8 ^
- console.log("从测试网钱包部署:", walletAddress);/ U g) c e# Y2 H) x0 ?; D
- " R; [7 l( q/ H: {) g
- const balance = await walletContract.getBalance();& Z' G( ~6 U6 B
- console.log("测试网钱包余额:", balance.toString(), "nanoTON");9 u Y$ n; M) e( h0 @
) J$ }9 L2 M: m9 P5 B- // 检查余额是否足够(至少 0.5 测试 TON)- @. N0 L0 A5 m" ?
- if (balance < toNano("0.5")) {1 l" P! u3 m4 n3 @: M1 }) f3 C
- throw new Error("测试网余额不足,至少需要 0.5 测试 TON 用于部署");
: j Y6 h' U% N) X - }
+ ?7 N. z' `# i5 b! ]% ?' w% A
5 D2 ^: ]% u* {" q1 o7 M' q- // 加载编译后的合约代码
. t: j! j- z0 \3 K9 Y( c( e - const compiledJson = require("../build/RedPacket.compiled.json");
; P, n+ r& v& I' Y' b - const code = Cell.fromBoc(Buffer.from(compiledJson.hex, "hex"))[0];) a# k* m: H, o. r7 n+ v& `9 j. K
# p. C+ b, ?% D: |( q6 S% q- // 初始化红包合约(无初始配置)( n! L5 e( A. v0 E, R: K! r
- const config = {};
0 M0 A% u7 S' R - const redPacket = RedPacket.createFromConfig(config, code, 0); // workchain 0
- }9 H0 Z& `+ U& c - const redPacketAddress = redPacket.address;
+ a* |4 \( O( a4 N
6 S" J7 c4 Q7 f' v7 g& A" G- // 创建 Sender 对象
0 ~, @1 ~7 E; b8 y - const sender: Sender = walletContract.sender(key.secretKey);; z% l2 e( U) ?( m! D L, b
- 2 ~7 {4 `, l# D! j1 k; m7 g
- // 部署合约到测试网
! I: d* I0 t2 z - const deployAmount = toNano("0.1"); // 部署费用 0.1 测试 TON
3 ^, A" w' b8 A0 c- [$ V1 T/ v, \ - console.log("部署合约到测试网地址:", redPacketAddress.toString());' L& ~5 i% c l: A
- 6 s' P9 h. a' f) w( D# }
- const provider = client.open(redPacket) as any; // 类型转换简化处理8 ] J$ o7 ^ C; A
- await redPacket.sendDeploy(provider, sender, deployAmount);
/ @: Y7 |+ H; W- {. j! n7 _
6 \2 S" Y( ^: [, M- console.log("测试网部署交易已发送,等待确认...");
) h% C" Z8 u' m" \ m& x$ ~& V/ t
1 [8 t* C; B; b- // 轮询检查部署状态
2 U1 G; S! m. _# M - let isDeployed = false;
9 q6 g# I- ~7 x7 a3 g1 L% y5 P - for (let i = 0; i < 10; i++) {* X# v4 G6 `' d3 V- Z$ [ k9 |
- const state = await client.getContractState(redPacketAddress);; `: X. E+ Q) ^! ^' M1 s8 S2 M1 x$ o
- if (state.state === "active") {6 ]) X2 C- t3 |
- isDeployed = true;
+ J6 C7 y5 ?! a2 Q8 J5 O7 h: s0 \ - break;3 i5 ~* D2 g1 C9 K: f2 i
- }
$ g9 M- J ~# M0 a2 o - console.log("等待测试网部署... 第", i + 1, "次尝试");" G9 K8 g: \, } d
- await new Promise((resolve) => setTimeout(resolve, 3000)); // 等待 3 秒
# |0 P' i4 z: g1 y* ^+ w2 N" x - }4 Y( b. y( f& ^8 v& z0 N( A
- ( p3 a; F4 C* F6 x6 s
- if (isDeployed) { E/ @/ b* d7 J
- console.log("合约成功部署到测试网,地址:", redPacketAddress.toString());
. q1 g6 [' Z( ]* f8 I) [ - } else {( h& V: K0 `# O. ? Y. v' p! ]
- console.log("测试网部署可能失败或耗时较长,请检查地址:", redPacketAddress.toString());
* {( _$ y" t2 s1 S8 P) ?: l - }6 v: Y- J8 C( K
- }
* z- y0 s# Q: o+ Y8 d - " D/ p$ ?$ b ]5 r* ?
- main().catch(console.error);
复制代码 代码说明
: z* d' s6 R- L. _* L
9 O3 O. |! I4 Y, b3 C- 加载测试网助记词:从 .env 获取测试网钱包助记词。
- 生成密钥:将助记词转为公私钥对。
- 连接测试网:使用 TonClient 连接 TON 测试网节点。
- 创建测试网钱包:初始化 V4 版本钱包,检查余额(需至少 0.5 测试 TON)。
- 加载合约代码:读取编译后的代码。
- 初始化合约:生成红包合约实例和测试网地址。
- 部署到测试网:发送 0.1 测试 TON 部署合约。
- 确认部署:轮询检查合约状态变为 "active"。
) _: L* b) f. ?! v" Y$ F' t1 D1 v" J
$ a- {1 S, P) j3 ?& }4 [: O: {步骤 3:运行部署脚本0 I% o) v+ u/ P+ d# H" w
安装依赖:
, y' s+ ^4 M7 r( I" X, P' y; m执行部署:, k- y, a9 S9 I( R/ c! o
- npx ts-node scripts/deploy.ts
复制代码 输出示例:
e4 p- A% I* I4 o4 x5 j, t" ~' f# r- 从测试网钱包部署: EQ...xyz( Q& C( g; k1 G: b( ?7 h
- 测试网钱包余额: 2000000000 nanoTON. w( D, t. g3 Z2 ~% ` g* [8 K
- 部署合约到测试网地址: EQ...abc
! m% g3 w0 D, V: i1 ~9 y: e - 测试网部署交易已发送,等待确认...
# f; [: a6 x3 o. Z$ r s/ g3 ^6 d - 合约成功部署到测试网,地址: EQ...abc
复制代码 ) ]3 f: n" M" @. a: C+ \4 r: n
下一步计划
8 |8 j+ y9 B2 x) z& G合约已部署到测试网,接下来我计划:
: ~& I1 U4 Z }1 ~. y- 测试交互:用测试币测试创建和领取红包。
- 前端开发:做一个界面,让用户在测试网上体验红包功能。7 p2 n* M# m& q% x5 K4 M
; t5 J7 g9 `2 V0 U9 ^( J总结
+ {* [8 [! r# ~9 W这篇教程展示了如何通过 @testgiver_ton_bot 获取测试币并将红包合约部署到 TON 测试网。测试网为我们提供了一个免费的实验环境,完整代码已分享,你可以跟着部署自己的合约。如果测试币领取有问题或部署失败,欢迎留言交流!下次我会分享如何在测试网上与合约交互,敬请期待!* A3 H; n1 v5 a1 a9 Q" ^; k- m
|
|