English 简体中文 繁體中文 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE คนไทย Français русский

回答

收藏

如何在 TON 区块链上用 FunC 和 Blueprint 部署红包智能合约(第二部分)

开源社区 开源社区 6326 人阅读 | 0 人回复 | 2025-03-20

本帖最后由 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
  1. npm install @ton/ton @ton/crypto @ton/core dotenv
复制代码
  1. 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 中编写了部署逻辑,以下是完整代码和说明:
  1. import { TonClient, WalletContractV4, toNano, Address, Sender } from "@ton/ton";+ d; P% s+ q3 Z) w3 X, @
  2. import { mnemonicToWalletKey } from "@ton/crypto";
    1 x; e$ J$ z7 F' N% t! F
  3. import { Cell, beginCell, SendMode } from "@ton/core";
    / ?* ^3 r* k4 U2 S& A8 `
  4. import { RedPacket, redPacketConfigToCell } from "../wrappers/RedPacket";, b* v3 Y" g- Z) G: _
  5. import * as dotenv from "dotenv";
    - m: B) c( g! R( r, C( h

  6. ( A! s8 E( o5 L1 T1 e+ z% I% x
  7. dotenv.config();, ?( x8 }) x1 K' `1 L
  8. ) u. V5 D6 D. l* l7 O# C$ l
  9. async function main() {/ s7 @5 W9 W- C% M5 w( l. Q
  10.   // 从 .env 加载测试网助记词
    # ~: o0 U( H! K
  11.   const mnemonic = process.env.MNEMONIC;
    ; S$ V" x+ m* F  n+ C
  12.   if (!mnemonic) {* M6 f2 i- ~# @5 `
  13.     throw new Error("请在 .env 文件中设置测试网 MNEMONIC");
    : v' p/ n0 t5 G! p
  14.   }
    $ x, G& I) X7 O( a, J2 ~

  15. 1 W' i1 e# h, W0 {
  16.   // 将助记词转换为钱包密钥- b$ L) w3 o6 \* E0 w2 [; w7 j
  17.   const key = await mnemonicToWalletKey(mnemonic.split(" "));" _' H! G+ L! y& l! e- m

  18. % `- C' Q" Z/ @* {, t- ?0 I
  19.   // 初始化 TON 测试网客户端
    ; b5 O4 p9 w7 W' @$ L4 y
  20.   const client = new TonClient({
    & ^9 k0 m" U) T  M/ `% w2 z& @
  21.     endpoint: "https://testnet.toncenter.com/api/v2/jsonRPC", // 测试网节点) _! @$ Z7 Z0 ?+ A
  22.   });. R6 X. c; W1 O9 J2 W
  23. ) U. R6 w( \; t" e8 X$ }
  24.   // 创建 V4 版本钱包(测试网)
    / b5 Q" m& c% N2 r
  25.   const wallet = WalletContractV4.create({
    9 {- Q& |& l9 p: ]1 y) ~0 n( N
  26.     publicKey: key.publicKey,/ k- W' q5 N* c2 s3 ^
  27.     workchain: 0, // 测试网使用基础链/ K7 N7 t( K1 l* A
  28.   });
    2 b  L! ^. {2 s& a3 q

  29. 1 o! K8 [/ c/ O
  30.   // 打开钱包合约8 _- U: d5 {' Z& B! ~; z
  31.   const walletContract = client.open(wallet);
    9 Q( O2 k8 S! T9 L) X: A

  32. ; ~, Y3 z- V" j) D0 \4 }$ V
  33.   // 获取测试网钱包地址和余额
    3 o* m$ F+ L; J; ^  g$ E2 P9 u
  34.   const walletAddress = walletContract.address.toString();
    7 ^, O& _$ T- i# F! O1 Q
  35.   console.log("从测试网钱包部署:", walletAddress);
    6 B- E, W  x0 p' b- u% d+ V
  36. 0 \. j( W+ Z/ u+ N, ~& ]- U  b
  37.   const balance = await walletContract.getBalance();
    2 @: w( X  s* s9 V
  38.   console.log("测试网钱包余额:", balance.toString(), "nanoTON");  k3 s: l2 P. H  B
  39. 8 H2 Y' i* I9 A6 y. j+ D
  40.   // 检查余额是否足够(至少 0.5 测试 TON)
    6 g! e8 t- B  y# B  J: _
  41.   if (balance < toNano("0.5")) {- j! A& n! G7 C! `& u! C7 e
  42.     throw new Error("测试网余额不足,至少需要 0.5 测试 TON 用于部署");
    8 q! W0 q- a! T, H* W# c4 ]
  43.   }
    ; M% \" I1 ^2 x" ^- \8 o# k

  44. / p+ f- ~2 j+ {9 b& V/ ~$ }& Q
  45.   // 加载编译后的合约代码9 J) m) p+ }" @) N
  46.   const compiledJson = require("../build/RedPacket.compiled.json");
    ) O% E# k+ P5 a" {
  47.   const code = Cell.fromBoc(Buffer.from(compiledJson.hex, "hex"))[0];
    6 A% j3 L: m$ G) K# l/ ]% V3 A0 V
  48. ) f$ B* O9 s7 U8 }" N
  49.   // 初始化红包合约(无初始配置)
    , `& P1 G, H4 K6 E2 q- d
  50.   const config = {};
    , u% R8 N/ `$ o* c
  51.   const redPacket = RedPacket.createFromConfig(config, code, 0); // workchain 08 y* o. L5 [9 t6 ~
  52.   const redPacketAddress = redPacket.address;1 J6 Z7 a! Q3 H2 t+ q+ d2 R- {

  53. 8 a+ L8 D) i6 S! O6 O- W
  54.   // 创建 Sender 对象4 K; W! V# r: u" j% M6 p
  55.   const sender: Sender = walletContract.sender(key.secretKey);: S" O: x1 p: u; H/ U0 R5 ]/ k; Q) t
  56. - @2 s2 J7 H: V% O
  57.   // 部署合约到测试网/ v! {6 H" X% |0 d
  58.   const deployAmount = toNano("0.1"); // 部署费用 0.1 测试 TON
    : I2 k, ?" @. V/ X$ s% C: Z! i
  59.   console.log("部署合约到测试网地址:", redPacketAddress.toString());' z5 R8 L/ ]0 @# o* O
  60. : W$ ~* Z$ X; i0 I& P/ N- V, [
  61.   const provider = client.open(redPacket) as any; // 类型转换简化处理
    5 J7 l: E3 N# I& V+ `  m' b
  62.   await redPacket.sendDeploy(provider, sender, deployAmount);+ I( ?( ?. j" c+ l  {

  63. 7 E5 K0 j" ^/ c. Q3 R
  64.   console.log("测试网部署交易已发送,等待确认...");
    2 A# Z% U9 z( x9 Z/ ~

  65. 7 ^/ Y1 r) L; d/ r( F
  66.   // 轮询检查部署状态
    0 x% O2 @; U% I5 N
  67.   let isDeployed = false;
    3 j( K1 n8 Y- \. `) }
  68.   for (let i = 0; i < 10; i++) {
    * T: h3 A6 q. R9 Z5 x" F; J
  69.     const state = await client.getContractState(redPacketAddress);
    1 v: o# [$ `. b+ a) R' V
  70.     if (state.state === "active") {. i. h' G8 O8 m+ Z* Y9 ]3 e+ X
  71.       isDeployed = true;
    , S% _4 e4 L% D% n5 p" N* m2 Z
  72.       break;
    + x% M# T+ e- T6 v9 w2 Q1 r: g
  73.     }$ i0 _& `. g4 }  y9 \) b  H% Y! W
  74.     console.log("等待测试网部署... 第", i + 1, "次尝试");
    - |9 [' ^+ n+ C/ R% m/ U$ E
  75.     await new Promise((resolve) => setTimeout(resolve, 3000)); // 等待 3 秒% T) g, C: c  r* }7 r  D% G
  76.   }
    , [8 _3 Z! `& y- m9 j) ?
  77. / E3 W/ u1 Q$ X
  78.   if (isDeployed) {
    ; k/ E9 y9 j( P+ M6 `/ y
  79.     console.log("合约成功部署到测试网,地址:", redPacketAddress.toString());  a3 V6 T/ O8 U3 {6 Q/ A& S- S
  80.   } else {
    1 K+ R; ]. e5 j4 a# a, C$ ?
  81.     console.log("测试网部署可能失败或耗时较长,请检查地址:", redPacketAddress.toString());
    , J2 g& B0 t1 m$ Y" G
  82.   }
    # |0 d3 g! m8 h
  83. }
    4 |' r9 L8 E+ e8 O% v  f

  84. 0 R' _$ y( p# }7 u
  85. 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
  1. npm install
复制代码
执行部署:
2 T3 @& G% \/ \% D- _# ^
  1. npx ts-node scripts/deploy.ts
复制代码
输出示例:
2 M0 e5 \, D2 y. R  d
  1. 从测试网钱包部署: EQ...xyz# l  k( u6 j) @4 m# X" ~9 p4 R
  2. 测试网钱包余额: 2000000000 nanoTON* S) C& u4 q, e% d* `% ]4 X5 P
  3. 部署合约到测试网地址: EQ...abc, r9 O' }+ G; x- Z
  4. 测试网部署交易已发送,等待确认...
    ( N0 i/ z0 {9 C6 V+ M. ~3 [
  5. 合约成功部署到测试网,地址: 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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则