TON 区块链基于TON币(以前称为 TonCoin)。这种加密货币用于支付执行交易的费用(gas),就像以太坊区块链上的 ETH 一样。如果您参与了 TON 生态系统,您很可能已经持有一些 TON 并且可能已经有一个钱包。
在本分步教程中,我们将使用其中一个钱包应用创建一个新的 TON 钱包,然后尝试以编程方式访问它。例如,如果您计划通过代码部署智能合约或编写接收和发送 TON 的机器人,这将非常有用。我们还将了解钱包在 TON 上的工作原理并熟悉如何使用它们。
主网或测试网主网或测试网
我们可以使用两种 TON 区块链变体 -主网和测试网。主网是真正的 TON 区块链,我们必须支付真正的 TON 币才能进行交易,而质押验证者将执行我们的交易并保证极高的安全性 - 我们的钱包将能够做一些危险的事情,比如持有大量资金而不必过于担心。
Testnet 是一个测试场所,其中的 TON 币不是真实的,而且是免费提供的。当然,testnet 不会提供任何真正的安全性,所以我们只会用它来练习,看看我们的代码是否按预期运行。
测试网通常对新开发者很有吸引力,因为它是免费的,但经验表明,主网实际上更具成本效益。由于测试网是一个模拟环境,它需要特殊的钱包,并不总是像真实的一样运行,而且更容易出现不稳定和随机错误。
由于 TON 交易非常便宜,每笔交易约 1 美分,因此只需投资 5 美元就足以进行数百笔交易。如果您决定在主网上工作,您将获得更加流畅的体验。您节省的时间绝对比您花费的 5 美元更有价值。
步骤 1:使用应用程序创建新钱包
创建 TON 钱包的最简单方法是访问Get a wallet并从列表中选择一个钱包应用程序。此页面解释了托管钱包和非托管钱包之间的区别。使用非托管钱包,您拥有钱包并自己持有其私钥。使用托管钱包,您信任其他人为您完成此操作。
区块链的意义在于控制自己的资金,所以我们自然会选择非托管选项。它们都非常相似,我们选择Tonkeeper。继续在手机上安装 Tonkeeper 应用程序并运行它。
Tonkeeper 默认在 TON 主网上工作。如果您决定在测试网上工作,则需要手动将应用程序切换到开发模式。打开“设置”选项卡,快速点击底部的 Tonkeeper 徽标 5 次。应该会显示“开发菜单”。单击“切换到测试网”并进行切换。您稍后可以使用此菜单返回主网。
如果您尚未将钱包连接到应用程序,请点击“设置钱包”按钮。我们将创建一个新钱包。几秒钟后,您的钱包就创建好了,Tonkeeper 会显示您的恢复短语 - 24 个秘密单词,可用于访问您的钱包资金。
第 2 步:备份 24 个单词的恢复短语
恢复短语是访问钱包的关键。丢失此短语,您将无法访问您的资金。将此短语告诉某人,他们就能拿走您的资金。请保密并备份到安全的地方。
为什么是 24 个单词?OG 加密钱包(如早期的比特币)不使用单词短语,而是使用一堆随机字母来指定密钥。由于拼写错误,这种方法效果不佳。人们会犯一个字母的错误,从而无法访问他们的资金。单词背后的想法是消除这些错误,使密钥更容易写下来。这些短语也被称为“助记符”,因为它们充当助记符,使人类更容易记住它们。
步骤 3:在浏览器中按地址查看钱包
如果您点击 Tonkeeper 应用程序左上角,您将复制您的钱包地址。或者,您可以点击“接收”按钮,然后屏幕上会显示您的钱包地址。
它看起来应该是这样的:
kQCJRglfvsQzAIF0UAhkYH6zkdGPFxVNYMH1nPTN_UpDqEFK
这个钱包地址不是秘密。你可以与任何人分享它,而他们无法触及你的资金。如果你想让任何人向你发送一些 TON,你需要向他们提供这个地址。不过你应该注意一些隐私问题。TON 和大多数区块链中的钱包地址都是伪匿名的,这意味着它们不会在现实世界中泄露你的身份。如果你告诉某人你的地址,而他们在现实世界中认识你,他们现在就可以建立联系。
浏览器是一种工具,可让您查询链中的数据并调查 TON 地址。有许多浏览器可供选择。我们将使用 Tonscan。请注意,主网和测试网有不同的浏览器,因为它们是不同的区块链。
Tonscan 的测试网版本可在https://testnet.tonscan.org上获取- 打开它并输入您的钱包地址。
TON 中的钱包也是智能合约!此消息意味着此智能合约尚未部署,因此未初始化。部署智能合约意味着将其代码上传到区块链。
另一件有趣的事情是,Tonscan 中显示的地址可能与您在搜索栏中输入的地址不同!有多种方法可以对同一个 TON 地址进行编码。您可以使用TON Address查看一些其他表示,并验证它们是否都共享相同的 HEX 公钥。
步骤 4:资助并部署钱包合约
正如您在浏览器中看到的,我们钱包的 TON 余额目前为零。我们需要请别人将一些 TON 币转移到我们的地址来为我们的钱包提供资金。但等等……这不是很危险吗?我们如何在部署智能合约之前将一些币转移到智能合约中?
事实证明,这在 TON 上不是问题。TON 区块链按地址维护一个帐户列表,并存储每个地址的 TON 币余额。由于我们的钱包智能合约有一个地址,因此即使在部署之前它也可以有余额。让我们将 2 个 TON 发送到我们的钱包地址。
使用测试网时,可以免费获得 TON 币。使用 Telegram messenger,打开水龙头https://t.me/testgiver_ton_bot,并通过提供您的钱包地址向机器人请求一些币。
那么你的钱包智能合约何时部署?这通常会在你执行第一笔交易时发生 - 通常是一笔外发转账。此交易将花费 gas,因此你的余额不能为零。当我们发出第一笔转账时,Tonkeeper 将自动部署我们的智能合约。
让我们通过 Tonkeeper 将 0.01 TON 发送到某个地方。
批准交易后刷新浏览器。我们可以看到 Tonkeeper 确实部署了我们的合约!“状态”现在为“活动”。合约不再处于未初始化状态,而是显示“钱包 v4 r2”。如果 Tonkeeper 在编写本教程后进行了更新,您的合约可能会显示不同的版本。
我们还可以看到,我们还支付了一些部署和转移费用。发送 0.01 TON 后,我们还剩下 1.9764 TON,这意味着我们总共支付了 0.0136 TON 的费用,还不错。
步骤 5:钱包合约有版本
浏览器显示“合约类型”为“钱包 v4 r2”(如果您的 Tonkeeper 已更新,则可能是其他版本)。这指的是我们的智能合约代码的版本。如果我们的钱包智能合约以“v4”作为其代码部署,则意味着某处必须存在“v1”、“v2”和“v3”。
这确实是正确的。随着时间的推移,TON 核心团队发布了多个版本的钱包合约 —— 这是v4 源代码。
同一个秘密助记词是否可以部署多个不同版本的钱包?当然可以!这意味着同一个用户可能有多个不同的钱包,每个钱包都有自己独特的地址。这可能会造成混淆。下次您尝试使用秘密助记词访问钱包时,如果看到与预期不同的地址且余额为零,请不要惊慌。没有人偷走您的钱,您可能只是查看了错误的钱包版本。
步骤 6:设置本地机器进行编码
我们将使用代码以编程方式访问我们的钱包。在开始编写代码之前,我们需要在计算机上安装某些开发工具。
node -v
对于 IDE 的选择,你需要任何具有良好 TypeScript 支持的 IDE。我推荐Visual Studio Code - 它是免费的开源软件。
让我们为我们的项目创建一个新目录并支持 TypeScript。在项目目录中打开终端并运行以下命令:
npm install ts-node
接下来,我们将安装一个名为ton的 JavaScript 包,该包允许我们进行 TON API 调用并操作 TON 对象。通过在项目目录中打开终端并运行来安装该包:
npm install @ton/ton @ton/crypto @ton/core
步骤 7:以编程方式获取钱包地址
我们要做的第一件事是在代码中计算钱包的地址,并查看它是否与我们在浏览器中看到的地址相匹配。此操作完全是离线的,因为钱包地址是从钱包的版本和用于创建钱包的私钥派生出来的。
unfold sugar water ...
step7.ts
import { mnemonicToWalletKey } from "@ton/crypto";
import { WalletContractV4 } from "@ton/ton";
async function main() {
// open wallet v4 (notice the correct wallet version here)
const mnemonic = "unfold sugar water ..."; // your 24 secret words (replace ... with the rest of the words)
const key = await mnemonicToWalletKey(mnemonic.split(" "));
const wallet = WalletContractV4.create({ publicKey: key.publicKey, workchain: 0 });
// print wallet address
console.log(wallet.address.toString({ testOnly: true }));
// print wallet workchain
console.log("workchain:", wallet.address.workChain);
}
main();
要查看钱包地址,请使用终端运行它:
npx ts-node step7.ts
请注意,我们不仅打印地址,还打印工作链编号。TON 支持多个并行区块链实例(称为工作链)。目前,只有两个工作链,工作链 0 用于我们所有的常规合约,工作链 -1(主链)由验证者使用。除非您要做一些特殊的事情,否则您将始终使用工作链 0。
WalletContractV4
WalletContractV3R2
步骤 8:从链中读取钱包状态
seqno
要从实时网络查询信息,需要 RPC 服务提供商 - 类似于以太坊上的Infura。这些提供商运行 TON 区块链节点并允许我们通过 HTTP 与它们通信。TON Access是一项很棒的服务,它将免费为我们提供不受限制的 API 访问。它也是去中心化的,这是访问网络的首选方式。
通过在项目目录中打开终端并运行来安装它:
npm install @orbs-network/ton-access
step8.ts
import { getHttpEndpoint } from "@orbs-network/ton-access";
import { mnemonicToWalletKey } from "@ton/crypto";
import { WalletContractV4, TonClient, fromNano } from "@ton/ton";
async function main() {
// open wallet v4 (notice the correct wallet version here)
const mnemonic = "unfold sugar water ..."; // your 24 secret words (replace ... with the rest of the words)
const key = await mnemonicToWalletKey(mnemonic.split(" "));
const wallet = WalletContractV4.create({ publicKey: key.publicKey, workchain: 0 });
// initialize ton rpc client on testnet
const endpoint = await getHttpEndpoint({ network: "testnet" });
const client = new TonClient({ endpoint });
// query balance from chain
const balance = await client.getBalance(wallet.address);
console.log("balance:", fromNano(balance));
// query seqno from chain
const walletContract = client.open(wallet);
const seqno = await walletContract.getSeqno();
console.log("seqno:", seqno);
}
main();
要查看余额和序列号,请使用终端运行:
npx ts-node step8.ts
如果您遇到网络连接问题并收到后端节点不健康或超时等错误,请加入Telegram 支持聊天以获取 TON 访问以获得帮助。
步骤 9:将转账交易发送到链上
上一个操作是只读的,即使您没有钱包的私钥,通常也应该可以执行。现在,我们要从钱包中转移一些 TON。由于这是一个特权写入操作,因此需要私钥。
奖励:我们将向特殊地址发送 0.05 TON,以从“TON Masters”系列(测试网链接)中铸造秘密 NFT。您的奖励如下:
step9.ts
import { getHttpEndpoint } from "@orbs-network/ton-access";
import { mnemonicToWalletKey } from "@ton/crypto";
import { TonClient, WalletContractV4, internal } from "@ton/ton";
async function main() {
// open wallet v4 (notice the correct wallet version here)
const mnemonic = "unfold sugar water ..."; // your 24 secret words (replace ... with the rest of the words)
const key = await mnemonicToWalletKey(mnemonic.split(" "));
const wallet = WalletContractV4.create({ publicKey: key.publicKey, workchain: 0 });
// initialize ton rpc client on testnet
const endpoint = await getHttpEndpoint({ network: "testnet" });
const client = new TonClient({ endpoint });
// make sure wallet is deployed
if (!await client.isContractDeployed(wallet.address)) {
return console.log("wallet is not deployed");
}
// send 0.05 TON to EQA4V9tF4lY2S_J-sEQR7aUj9IwW-Ou2vJQlCn--2DLOLR5e
const walletContract = client.open(wallet);
const seqno = await walletContract.getSeqno();
await walletContract.sendTransfer({
secretKey: key.secretKey,
seqno: seqno,
messages: [
internal({
to: "EQA4V9tF4lY2S_J-sEQR7aUj9IwW-Ou2vJQlCn--2DLOLR5e",
value: "0.05", // 0.05 TON
body: "Hello", // optional comment
bounce: false,
})
]
});
// wait until confirmed
let currentSeqno = seqno;
while (currentSeqno == seqno) {
console.log("waiting for transaction to confirm...");
await sleep(1500);
currentSeqno = await walletContract.getSeqno();
}
console.log("transaction confirmed!");
}
main();
function sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
通过在终端中运行来执行脚本:
npx ts-node step9.ts
一旦钱包签署并发送交易,我们必须等待 TON 区块链验证器将此交易插入新区块。由于 TON 上的区块时间约为 5 秒,因此通常需要 5-10 秒才能确认交易。尝试在 Tonscan 浏览器中查找此传出交易。运行代码后,您很快就会在钱包中看到铸造的 NFT。
如果您在此步骤中遇到错误,请仔细检查您使用的钱包合约是否已部署并已注资。例如,如果您使用的钱包版本错误,您最终将使用未部署的钱包合约,交易将失败。
结论
为了您的方便,本教程中的所有代码均可在此处以可执行形式获得。
如果您发现本教程中有错误,请提交 PR并帮助我们修复。本教程平台完全开源,可在GitHub - ton-community/tutorials: Step by step onboarding tutorials for TON blockchain上获取。
祝你编码愉快!