跳到主要内容

使用写入操作发送交易

受众: 准备执行首次状态变更操作的开发者。

先决条件: 一个已充值的 Sui Devnet 钱包和基本的 Node.js 环境。

目标: 编写脚本将 Sui 代币转账至另一个地址,并理解 Gas 和签名的作用。


简介

在之前的教程中,我们执行了 读取操作。 我们向 SuiClient(即“职员”)查询信息,该操作是免费且匿名的。

现在,我们将执行 写入操作。我们将把 Sui 代币从您的钱包转账至另一个地址。由于这会改变区块链的状态,因此有两项新要求:

  1. 签名: 您必须对请求进行加密签名,以证明您拥有这些资金。
  2. Gas(手续费): 您必须支付 Sui 代币作为费用,以补偿网络处理交易。

先决条件

在本教程中,您不能仅使用一个随机的公共端点。您需要:

  1. 已充值钱包: 一个包含 Sui Devnet 代币的钱包及其 12 字恢复短语。
  2. Ed25519 密钥对库: 用于对交易进行签名。

安装所需的加密包(若尚未安装):

npm install @mysten/sui
注意

在实际应用中,切勿硬编码私钥或助记词。请始终使用环境变量(例如 .env)。 出于简便起见,本教程中我们将使用变量,但请勿将此代码提交至 GitHub。

分步指南

步骤 1:导入工具并配置客户端

创建一个名为 transfer.js 的文件。我们需要 SuiClient 用于连接,以及 Ed25519Keypair 作为我们的“笔”来执行签名。

import { SuiClient, getFullnodeUrl } from '@mysten/sui/client';
import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
import { Transaction } from '@mysten/sui/transactions';

// 1. 连接到 Devnet
const client = new SuiClient({ url: getFullnodeUrl('devnet') });

// 2. 加载您的钱包(发送方)
// 请将此处替换为您实际的 12 词助记词
const MNEMONIC = "word1 word2 word3 ... word12";
const keypair = Ed25519Keypair.deriveKeypair(MNEMONIC);
const senderAddress = keypair.getPublicKey().toSuiAddress();

console.log(`📦 发送方地址:${senderAddress}`);

步骤 2:构建“包裹”(交易)

在 Sui 中,您不会直接发送原始命令。而是需要构建一个 交易。您可以将其理解为:在封箱前填写运单并装箱。

我们将使用 tx.splitCoins 命令。这会向网络传达:"取我的主 SUI 币,拆分出特定金额,并准备进行转账。"

// 3. 定义收件人
const RECIPIENT = '0x9999...'; // 替换为朋友的地址或销毁地址

// 4. 创建交易容器
const tx = new Transaction();

// 从 gas 币中拆分 1000 MIST(SUI 的最小单位)
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);

// 将拆分后的币转给收件人
tx.transferObjects([coinToSend], RECIPIENT);

步骤 3:签名、支付 gas 费用并提交

这是计算 Gas 的关键步骤。

当你执行以下代码时,SuiClient 会:

  1. 估算 Gas: 它会检查你的 tx 对象,评估其计算复杂度,并确定所需的 gas 费用。
  2. 签名: 使用您的 keypair 对交易进行加密签名。
  3. 执行: 将已签名的交易提交至网络。
async function sendTransaction() {
try {
console.log("📝 正在签名并提交交易...");

const result = await client.signAndExecuteTransaction({
signer: keypair,
transaction: tx,
});

console.log("✅ 交易已提交!");
console.log(`摘要 (追踪 ID): ${result.digest}`);

} catch (error) {
console.error("❌ 交易失败:", error);
}
}

sendTransaction();

了解本次交易的 gas 费用

您可能会注意到,我们并未显式设置手续费金额。

  • 自动预算: 默认情况下,SDK 会自动为您估算 gas 费用。这既能确保您不会支付过多费用,又能提供足够的 gas 费用以确保交易成功处理。
  • 支付来源: SDK 会自动从您的钱包中选取一个 Sui 币对象来支付这笔费用。这就是为什么您无法发送 全部 的 Sui;您必须始终留出一小部分来支付转账本身的 gas 费用。

预期输出

成功后,您将收到一个 交易摘要。这就是您的追踪号。

您可以复制此摘要并将其粘贴到 Sui 浏览器(如 Suiscan)中,以查看转账的永久记录,包括确切的 Gas 消耗量。