|
本帖最后由 riyad 于 2025-3-20 00:42 编辑
m, `$ z5 O+ L8 x* | }* [+ G& V% j0 [0 O# [# y( G
在上篇教程中,我分享了如何用 FunC 和 Blueprint 编写并编译一个红包智能合约。今天,我们将把这个合约部署到 TON 测试网,使用 测试币 来完成部署过程。这篇教程将详细介绍如何通过 Telegram 机器人 @testgiver_ton_bot 获取测试币、配置环境并成功部署合约。让我们开始吧!
1 H8 ~) C$ t& @9 e; R( s) m前提条件
- q* x* R# W$ K! X x3 b: O1 T部署到测试网需要以下准备:7 B0 o7 g! I$ j% m
* G3 g* O% |: d( O# m1 l+ n- 完成第一部分:你已经编写并编译了红包合约(参考上一教程)。
- 测试网 TON 币:我们将通过 @testgiver_ton_bot 获取免费测试币。
- 测试网钱包助记词:一个 TON 测试网钱包的 24 字助记词,用于支付部署费用。2 P6 Q$ R! k7 j/ t
获取测试币& k3 A1 L( i9 E5 Q+ j3 } M6 e2 h
由于这是测试网,我们需要测试币来支付部署费用。以下是通过 @testgiver_ton_bot 获取测试币的步骤:' d+ R$ l6 e1 m( _ b
创建测试网钱包:7 Y+ m+ B7 n. [: g- g
- 下载 TON Wallet 或使用支持测试网的钱包。
- 切换到测试网模式(例如在 wallet.ton.org 上启用 ?testnet=true)。
- 生成新钱包并保存 24 字助记词。
' E: s! v+ N9 D1 ~
, i( V/ N8 o1 Q# k% v- U$ u访问 @testgiver_ton_bot:! d$ }. S N5 m8 E1 ?
- 打开 Telegram,搜索 @testgiver_ton_bot 并启动它。
- 点击 “Start” 开始使用。
+ Y( U& ?1 K! n" j3 }0 \6 w) y/ p/ C
9 _! y9 F) o8 Z8 U7 E" d8 Q r领取测试币:7 ?) L/ g9 F8 C1 w) l4 I& l
- 在机器人界面点击 [ GET 2 TON ]。
- 返回你的测试网钱包,点击 “Deposit”(存款),复制钱包地址。
- 在机器人中完成验证码(captcha),粘贴你的钱包地址。
- 提交后,你将收到 2 TON 测试币(每小时可领取一次)。
- 如果需要更多测试币,可以在 TON 开发者社区(如 @tondev_eng)请求帮助。, g, k6 G. ]* S; x
$ f0 D: h* o* Q2 n" R' O9 H步骤 1:配置测试网环境; s1 I1 K9 I( J# ]* o; {+ m. R
我们将使用 TypeScript 和 TON SDK 连接测试网并部署合约。
, z, L% Q0 y0 j/ c6 d: n4 i安装依赖: 在项目根目录运行:& u* Z0 r- x' P
- npm install @ton/ton @ton/crypto @ton/core dotenv
复制代码- MNEMONIC="word1 word2 word3 ... word24"
复制代码 注意:这是测试网助记词,仅用于测试环境。3 M8 o: E9 z1 N( U* _' ^2 b
, z7 R' h& G' A$ |* T( i3 H7 }步骤 2:编写测试网部署脚本
% `3 Y z. ~/ I
9 U# F. `1 I/ E4 U" i& T4 R我在 scripts/deploy.ts 中编写了部署逻辑,以下是完整代码和说明: - import { TonClient, WalletContractV4, toNano, Address, Sender } from "@ton/ton";+ d; P% s+ q3 Z) w3 X, @
- import { mnemonicToWalletKey } from "@ton/crypto";
1 x; e$ J$ z7 F' N% t! F - import { Cell, beginCell, SendMode } from "@ton/core";
/ ?* ^3 r* k4 U2 S& A8 ` - import { RedPacket, redPacketConfigToCell } from "../wrappers/RedPacket";, b* v3 Y" g- Z) G: _
- import * as dotenv from "dotenv";
- m: B) c( g! R( r, C( h
( A! s8 E( o5 L1 T1 e+ z% I% x- dotenv.config();, ?( x8 }) x1 K' `1 L
- ) u. V5 D6 D. l* l7 O# C$ l
- async function main() {/ s7 @5 W9 W- C% M5 w( l. Q
- // 从 .env 加载测试网助记词
# ~: o0 U( H! K - const mnemonic = process.env.MNEMONIC;
; S$ V" x+ m* F n+ C - if (!mnemonic) {* M6 f2 i- ~# @5 `
- throw new Error("请在 .env 文件中设置测试网 MNEMONIC");
: v' p/ n0 t5 G! p - }
$ x, G& I) X7 O( a, J2 ~
1 W' i1 e# h, W0 {- // 将助记词转换为钱包密钥- b$ L) w3 o6 \* E0 w2 [; w7 j
- const key = await mnemonicToWalletKey(mnemonic.split(" "));" _' H! G+ L! y& l! e- m
% `- C' Q" Z/ @* {, t- ?0 I- // 初始化 TON 测试网客户端
; b5 O4 p9 w7 W' @$ L4 y - const client = new TonClient({
& ^9 k0 m" U) T M/ `% w2 z& @ - endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", // 测试网节点) _! @$ Z7 Z0 ?+ A
- });. R6 X. c; W1 O9 J2 W
- ) U. R6 w( \; t" e8 X$ }
- // 创建 V4 版本钱包(测试网)
/ b5 Q" m& c% N2 r - const wallet = WalletContractV4.create({
9 {- Q& |& l9 p: ]1 y) ~0 n( N - publicKey: key.publicKey,/ k- W' q5 N* c2 s3 ^
- workchain: 0, // 测试网使用基础链/ K7 N7 t( K1 l* A
- });
2 b L! ^. {2 s& a3 q
1 o! K8 [/ c/ O- // 打开钱包合约8 _- U: d5 {' Z& B! ~; z
- const walletContract = client.open(wallet);
9 Q( O2 k8 S! T9 L) X: A
; ~, Y3 z- V" j) D0 \4 }$ V- // 获取测试网钱包地址和余额
3 o* m$ F+ L; J; ^ g$ E2 P9 u - const walletAddress = walletContract.address.toString();
7 ^, O& _$ T- i# F! O1 Q - console.log("从测试网钱包部署:", walletAddress);
6 B- E, W x0 p' b- u% d+ V - 0 \. j( W+ Z/ u+ N, ~& ]- U b
- const balance = await walletContract.getBalance();
2 @: w( X s* s9 V - console.log("测试网钱包余额:", balance.toString(), "nanoTON"); k3 s: l2 P. H B
- 8 H2 Y' i* I9 A6 y. j+ D
- // 检查余额是否足够(至少 0.5 测试 TON)
6 g! e8 t- B y# B J: _ - if (balance < toNano("0.5")) {- j! A& n! G7 C! `& u! C7 e
- throw new Error("测试网余额不足,至少需要 0.5 测试 TON 用于部署");
8 q! W0 q- a! T, H* W# c4 ] - }
; M% \" I1 ^2 x" ^- \8 o# k
/ p+ f- ~2 j+ {9 b& V/ ~$ }& Q- // 加载编译后的合约代码9 J) m) p+ }" @) N
- const compiledJson = require("../build/RedPacket.compiled.json");
) O% E# k+ P5 a" { - const code = Cell.fromBoc(Buffer.from(compiledJson.hex, "hex"))[0];
6 A% j3 L: m$ G) K# l/ ]% V3 A0 V - ) f$ B* O9 s7 U8 }" N
- // 初始化红包合约(无初始配置)
, `& P1 G, H4 K6 E2 q- d - const config = {};
, u% R8 N/ `$ o* c - const redPacket = RedPacket.createFromConfig(config, code, 0); // workchain 08 y* o. L5 [9 t6 ~
- const redPacketAddress = redPacket.address;1 J6 Z7 a! Q3 H2 t+ q+ d2 R- {
8 a+ L8 D) i6 S! O6 O- W- // 创建 Sender 对象4 K; W! V# r: u" j% M6 p
- const sender: Sender = walletContract.sender(key.secretKey);: S" O: x1 p: u; H/ U0 R5 ]/ k; Q) t
- - @2 s2 J7 H: V% O
- // 部署合约到测试网/ v! {6 H" X% |0 d
- const deployAmount = toNano("0.1"); // 部署费用 0.1 测试 TON
: I2 k, ?" @. V/ X$ s% C: Z! i - console.log("部署合约到测试网地址:", redPacketAddress.toString());' z5 R8 L/ ]0 @# o* O
- : W$ ~* Z$ X; i0 I& P/ N- V, [
- const provider = client.open(redPacket) as any; // 类型转换简化处理
5 J7 l: E3 N# I& V+ ` m' b - await redPacket.sendDeploy(provider, sender, deployAmount);+ I( ?( ?. j" c+ l {
7 E5 K0 j" ^/ c. Q3 R- console.log("测试网部署交易已发送,等待确认...");
2 A# Z% U9 z( x9 Z/ ~
7 ^/ Y1 r) L; d/ r( F- // 轮询检查部署状态
0 x% O2 @; U% I5 N - let isDeployed = false;
3 j( K1 n8 Y- \. `) } - for (let i = 0; i < 10; i++) {
* T: h3 A6 q. R9 Z5 x" F; J - const state = await client.getContractState(redPacketAddress);
1 v: o# [$ `. b+ a) R' V - if (state.state === "active") {. i. h' G8 O8 m+ Z* Y9 ]3 e+ X
- isDeployed = true;
, S% _4 e4 L% D% n5 p" N* m2 Z - break;
+ x% M# T+ e- T6 v9 w2 Q1 r: g - }$ i0 _& `. g4 } y9 \) b H% Y! W
- console.log("等待测试网部署... 第", i + 1, "次尝试");
- |9 [' ^+ n+ C/ R% m/ U$ E - await new Promise((resolve) => setTimeout(resolve, 3000)); // 等待 3 秒% T) g, C: c r* }7 r D% G
- }
, [8 _3 Z! `& y- m9 j) ? - / E3 W/ u1 Q$ X
- if (isDeployed) {
; k/ E9 y9 j( P+ M6 `/ y - console.log("合约成功部署到测试网,地址:", redPacketAddress.toString()); a3 V6 T/ O8 U3 {6 Q/ A& S- S
- } else {
1 K+ R; ]. e5 j4 a# a, C$ ? - console.log("测试网部署可能失败或耗时较长,请检查地址:", redPacketAddress.toString());
, J2 g& B0 t1 m$ Y" G - }
# |0 d3 g! m8 h - }
4 |' r9 L8 E+ e8 O% v f
0 R' _$ y( p# }7 u- main().catch(console.error);
复制代码 代码说明. P2 J' ~8 M `$ U g! T- u3 J5 k
3 }6 q+ r" F* v9 K: U2 f- 加载测试网助记词:从 .env 获取测试网钱包助记词。
- 生成密钥:将助记词转为公私钥对。
- 连接测试网:使用 TonClient 连接 TON 测试网节点。
- 创建测试网钱包:初始化 V4 版本钱包,检查余额(需至少 0.5 测试 TON)。
- 加载合约代码:读取编译后的代码。
- 初始化合约:生成红包合约实例和测试网地址。
- 部署到测试网:发送 0.1 测试 TON 部署合约。
- 确认部署:轮询检查合约状态变为 "active"。3 r! }8 N! s3 w8 o
2 |# S( ~7 {3 G5 T步骤 3:运行部署脚本
" J/ H% I5 C+ _& Y安装依赖:* m% ]7 R6 v% q% f
执行部署:
2 T3 @& G% \/ \% D- _# ^- npx ts-node scripts/deploy.ts
复制代码 输出示例:
2 M0 e5 \, D2 y. R d- 从测试网钱包部署: EQ...xyz# l k( u6 j) @4 m# X" ~9 p4 R
- 测试网钱包余额: 2000000000 nanoTON* S) C& u4 q, e% d* `% ]4 X5 P
- 部署合约到测试网地址: EQ...abc, r9 O' }+ G; x- Z
- 测试网部署交易已发送,等待确认...
( N0 i/ z0 {9 C6 V+ M. ~3 [ - 合约成功部署到测试网,地址: EQ...abc
复制代码 $ v5 C* i0 C5 c: @2 v
下一步计划1 i- v* U" H4 `( a
合约已部署到测试网,接下来我计划:
+ S: h+ O* r5 O! N6 N) w- 测试交互:用测试币测试创建和领取红包。
- 前端开发:做一个界面,让用户在测试网上体验红包功能。" G0 T9 }, o' Q9 U& V
/ W7 W6 x7 \) I; y3 I- I8 n# g总结) t: v# K* Z+ E2 ~$ t. M3 J
这篇教程展示了如何通过 @testgiver_ton_bot 获取测试币并将红包合约部署到 TON 测试网。测试网为我们提供了一个免费的实验环境,完整代码已分享,你可以跟着部署自己的合约。如果测试币领取有问题或部署失败,欢迎留言交流!下次我会分享如何在测试网上与合约交互,敬请期待!
* y# W- ?' l3 a! @5 _: Z$ c |
|