|
本帖最后由 riyad 于 2025-3-20 00:42 编辑 3 i5 v3 L4 n, X7 j
! N9 Q! r# n' x% s8 S在上篇教程中,我分享了如何用 FunC 和 Blueprint 编写并编译一个红包智能合约。今天,我们将把这个合约部署到 TON 测试网,使用 测试币 来完成部署过程。这篇教程将详细介绍如何通过 Telegram 机器人 @testgiver_ton_bot 获取测试币、配置环境并成功部署合约。让我们开始吧!: L, V; w$ u5 l( r E4 G. H
前提条件
" C8 h+ W# N5 E部署到测试网需要以下准备:: k8 X6 K; s4 T9 T
( h2 O* o2 Q {/ @ @6 M
- 完成第一部分:你已经编写并编译了红包合约(参考上一教程)。
- 测试网 TON 币:我们将通过 @testgiver_ton_bot 获取免费测试币。
- 测试网钱包助记词:一个 TON 测试网钱包的 24 字助记词,用于支付部署费用。/ K2 c% A" p/ L
获取测试币
. A/ u. M1 ?. n! N" \* @' @由于这是测试网,我们需要测试币来支付部署费用。以下是通过 @testgiver_ton_bot 获取测试币的步骤:
2 x7 V, {1 z% J8 H9 j# | a4 w" p创建测试网钱包:" C( J/ B+ d( r; }
- 下载 TON Wallet 或使用支持测试网的钱包。
- 切换到测试网模式(例如在 wallet.ton.org 上启用 ?testnet=true)。
- 生成新钱包并保存 24 字助记词。; Y( Z' `9 ?' U
3 g! Z$ p. u, z; D& v. {访问 @testgiver_ton_bot:
& \+ s. H) L# m( [1 j9 N6 M& U- 打开 Telegram,搜索 @testgiver_ton_bot 并启动它。
- 点击 “Start” 开始使用。; h* e) v! m1 Z" v1 k8 F
% D$ y. V1 A/ R) v6 u; X领取测试币:
4 U2 o6 X M6 y! w+ T: Y- 在机器人界面点击 [ GET 2 TON ]。
- 返回你的测试网钱包,点击 “Deposit”(存款),复制钱包地址。
- 在机器人中完成验证码(captcha),粘贴你的钱包地址。
- 提交后,你将收到 2 TON 测试币(每小时可领取一次)。
- 如果需要更多测试币,可以在 TON 开发者社区(如 @tondev_eng)请求帮助。6 m* l v* f9 U8 F8 R" w% N
) s9 p# j5 v5 ]4 ]4 `! q" C3 S& g步骤 1:配置测试网环境
$ W' t8 g& q6 ~. s8 g! v; g我们将使用 TypeScript 和 TON SDK 连接测试网并部署合约。
$ g; }7 Q- {, V; b+ w- k- C安装依赖: 在项目根目录运行:
0 k/ T r. `& t9 }4 n" I' f8 z- npm install @ton/ton @ton/crypto @ton/core dotenv
复制代码- MNEMONIC="word1 word2 word3 ... word24"
复制代码 注意:这是测试网助记词,仅用于测试环境。+ G( z4 D1 D, u1 m7 j7 M
6 P( b# s6 E9 @步骤 2:编写测试网部署脚本' `5 e$ ?( c! w4 K( z
9 }" Y: m% P, K2 O: _$ F8 _
我在 scripts/deploy.ts 中编写了部署逻辑,以下是完整代码和说明: - import { TonClient, WalletContractV4, toNano, Address, Sender } from "@ton/ton";
' V, y% @ T, s - import { mnemonicToWalletKey } from "@ton/crypto";
0 t" B- p/ x l$ ]2 T) f) c, f/ L3 | - import { Cell, beginCell, SendMode } from "@ton/core";5 h9 e1 c. |: l1 a5 `$ ?
- import { RedPacket, redPacketConfigToCell } from "../wrappers/RedPacket";
# F7 C( J7 d# c% B$ p: l6 o - import * as dotenv from "dotenv";
" [ N# P5 @- [/ p: p9 s9 k - # p' G' J4 T4 p, [( w7 g, g* h; @/ a
- dotenv.config();
! l/ T7 r5 }% }3 [$ V
' c& f/ o" s# u' l& K; v& x- async function main() {, O1 p- @" W; J3 n
- // 从 .env 加载测试网助记词8 |+ u3 \: s% e. z
- const mnemonic = process.env.MNEMONIC;( `: L ]7 h) ]- P& L, j8 S
- if (!mnemonic) {
% f7 N2 w4 R5 e% t$ g8 G - throw new Error("请在 .env 文件中设置测试网 MNEMONIC");
) A. x: b( W# h. Y - }
8 O/ O* t" ^- E# O1 ] - " z0 W+ F1 [4 ?0 ]
- // 将助记词转换为钱包密钥8 t! R' U0 R1 J6 o# y
- const key = await mnemonicToWalletKey(mnemonic.split(" "));) K9 B O; E- B; n* \+ J1 B
- ' L! r7 q, j9 x+ }* s
- // 初始化 TON 测试网客户端7 a$ h5 V5 \) N$ B; [& d
- const client = new TonClient({
9 m4 T& O& z! I" l( P - endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", // 测试网节点+ D5 _& _$ ~) T6 l
- });# ~/ y" G. Z7 r6 k
- 0 g4 _9 ^$ \' I c
- // 创建 V4 版本钱包(测试网)3 Y" D" e" f8 p4 f6 Y$ u: j
- const wallet = WalletContractV4.create({
- v6 D& C/ Z5 O - publicKey: key.publicKey,; e' l! \- N4 j& r. Z
- workchain: 0, // 测试网使用基础链
8 t3 ~$ j( O5 `! m! ]8 z - });/ Q/ S' e: d( y0 ]( ^8 j$ ?
- $ J) Y0 P. a h- m
- // 打开钱包合约
: K7 a/ f5 D* F; Z5 t- J - const walletContract = client.open(wallet);
: F7 d" U3 ?3 F
0 w1 i2 x6 {/ |" P; _- // 获取测试网钱包地址和余额
) h- c/ |$ z: R' J; w. i0 N - const walletAddress = walletContract.address.toString();
9 s1 q, s& x6 j, s$ }1 I& ^ - console.log("从测试网钱包部署:", walletAddress);
* R$ v7 y+ }: g! ]
5 x% P/ P" V9 s/ a! c0 p- const balance = await walletContract.getBalance();
- C& u5 l) [% P - console.log("测试网钱包余额:", balance.toString(), "nanoTON");2 t3 }; X2 d; }) ~- u1 R }
- \8 v9 M) u+ r( U; e* M X% w, Y- // 检查余额是否足够(至少 0.5 测试 TON)! [+ i ]7 M) z% `, P7 T$ A- H
- if (balance < toNano("0.5")) {
1 S- v' F# Z6 ^0 U - throw new Error("测试网余额不足,至少需要 0.5 测试 TON 用于部署");( L$ A/ L2 s, u+ R+ h9 J+ V6 M
- }7 D. v6 Z) f0 Y; o! V0 b! }2 R
0 ]7 W1 f! S) N# {, B0 ]- // 加载编译后的合约代码
' Y4 Z3 t6 r2 Z. M, ~' T2 Q - const compiledJson = require("../build/RedPacket.compiled.json");" V/ q6 t: Z% t! s' D5 K. h
- const code = Cell.fromBoc(Buffer.from(compiledJson.hex, "hex"))[0];
1 }' Z+ X7 a' s - 3 ~1 S' r" Z' O, `/ `' |; C
- // 初始化红包合约(无初始配置); R# Y& ^: I9 ?% W6 R
- const config = {};6 |, H9 g+ G w3 |- d z: h
- const redPacket = RedPacket.createFromConfig(config, code, 0); // workchain 03 G7 i* n; ~' x' z. Q% O
- const redPacketAddress = redPacket.address;
& @6 S, H$ T, U1 o5 m O4 ]
) J1 M( K3 F/ q& s2 M- // 创建 Sender 对象
! d3 R* d. R$ N+ C' V! o. [ - const sender: Sender = walletContract.sender(key.secretKey);" u6 J/ K8 v" q* e2 b
9 j# @1 m8 _; p# u& g% g) C- // 部署合约到测试网: `( f# a8 A/ H! |; B- C
- const deployAmount = toNano("0.1"); // 部署费用 0.1 测试 TON& @9 |" `+ B% B2 ^
- console.log("部署合约到测试网地址:", redPacketAddress.toString());3 l# c! }) e' j7 L0 l2 ?
' c7 h, J/ r- _% v- const provider = client.open(redPacket) as any; // 类型转换简化处理- `3 s. K* }: D- Q' _
- await redPacket.sendDeploy(provider, sender, deployAmount);
9 M* f: o: w8 u: ~ - ) g8 e2 u; {2 n, r9 g% f
- console.log("测试网部署交易已发送,等待确认...");
* v" k& _6 i& z: T - 5 e; f. n( T' v- c) _
- // 轮询检查部署状态
! x* C' Q+ g4 N1 n/ N' K* A; z' g& [ - let isDeployed = false;
& I; _$ Q K- q7 h - for (let i = 0; i < 10; i++) {
/ W& i9 u. g$ O1 B/ J - const state = await client.getContractState(redPacketAddress);
5 H9 u- `8 j; L - if (state.state === "active") {% o& Z7 k7 E; w6 i/ R6 \
- isDeployed = true;+ t! t7 T2 x7 l. c
- break; R: |0 e' X& G8 g" S$ U
- }
" O1 t/ `5 u1 f* P - console.log("等待测试网部署... 第", i + 1, "次尝试");
3 u! B2 e% }5 d; _) s& q/ |5 w5 B4 V - await new Promise((resolve) => setTimeout(resolve, 3000)); // 等待 3 秒, L/ @& ^8 d+ S& c, q1 m4 }, R7 E; [
- }
2 p2 T5 g- f9 l& l1 o - 0 p0 P$ Q6 O$ U7 L# i( o1 X; {; b
- if (isDeployed) {
U: J) m. V) c a* E2 c$ B* C - console.log("合约成功部署到测试网,地址:", redPacketAddress.toString());# l( g# B1 d8 n$ ^
- } else {
* R' }( N4 {+ s$ d. S |: _2 @# {7 l - console.log("测试网部署可能失败或耗时较长,请检查地址:", redPacketAddress.toString());+ p) a G# D/ G+ U7 F1 w2 \/ ~2 x
- }$ v# E4 e& O( ~' x t3 }
- }
- r, o! x2 F& Q6 p9 f
) S0 O3 P) S( R1 u- main().catch(console.error);
复制代码 代码说明- v9 ~' n, O) f
- M0 J! U& m' _3 D' U1 T
- 加载测试网助记词:从 .env 获取测试网钱包助记词。
- 生成密钥:将助记词转为公私钥对。
- 连接测试网:使用 TonClient 连接 TON 测试网节点。
- 创建测试网钱包:初始化 V4 版本钱包,检查余额(需至少 0.5 测试 TON)。
- 加载合约代码:读取编译后的代码。
- 初始化合约:生成红包合约实例和测试网地址。
- 部署到测试网:发送 0.1 测试 TON 部署合约。
- 确认部署:轮询检查合约状态变为 "active"。
' i4 l7 j2 D, U# k( Z- b! B7 b8 A & k- M: v" _: {; w+ \
步骤 3:运行部署脚本
0 D3 I# _ z$ g- o) n$ q( W安装依赖:
/ P% G( V: n& U7 h. D执行部署:$ K' h# O# N8 j0 n
- npx ts-node scripts/deploy.ts
复制代码 输出示例:8 P9 C& [% X4 P/ M8 |
- 从测试网钱包部署: EQ...xyz, A! O/ L' u) U
- 测试网钱包余额: 2000000000 nanoTON
6 X( Q# B( Q+ { - 部署合约到测试网地址: EQ...abc
& b x+ E, P h" P9 s1 X - 测试网部署交易已发送,等待确认...8 `% H c- C) M& d
- 合约成功部署到测试网,地址: EQ...abc
复制代码
+ N# H+ d5 S! }+ E. \ @6 I6 v/ e5 e下一步计划( e; Q0 T( S6 }4 }& k; E
合约已部署到测试网,接下来我计划:
' }, `8 X8 [ g1 K, m# Q/ r- 测试交互:用测试币测试创建和领取红包。
- 前端开发:做一个界面,让用户在测试网上体验红包功能。
& c- u0 m9 t% `0 B; l$ u
" H6 v t4 h3 A, E) w% m6 x总结( j) e1 P+ ~' I% v6 W2 f8 L/ J! J
这篇教程展示了如何通过 @testgiver_ton_bot 获取测试币并将红包合约部署到 TON 测试网。测试网为我们提供了一个免费的实验环境,完整代码已分享,你可以跟着部署自己的合约。如果测试币领取有问题或部署失败,欢迎留言交流!下次我会分享如何在测试网上与合约交互,敬请期待!, V: x0 ], e& F- n4 b b$ D
|
|