メインコンテンツまでスキップ

書き込み操作を使用したトランザクションの送信

対象読者: 初めての状態変更操作(State-changing operation)を実行する準備ができている開発者。

前提条件: 資金のある Sui Devnet ウォレットと、基本的な Node.js セットアップ。

目標: Sui トークンを別のアドレスに送金するスクリプトを作成し、ガス代と署名の役割を理解する。


はじめに

これまでのチュートリアルでは、読み取り操作を行いました。これは SuiClient(窓口係)に情報を尋ねるもので、無料かつ匿名で行えました。

今回は、書き込み操作を実行します。あなたのウォレットから別のアドレスに Sui トークンを送金します。これによりブロックチェーンの状態が変化するため、以下の 2 つの新しい要件が適用されます。

  1. 署名(Signature): 資金の所有者であることを証明するために、リクエストに暗号署名を行う必要があります。
  2. ガス代(Gas / Postage): トランザクションを処理するための手数料として、ネットワークに 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();

// ガス コインから 1000 MIST(SUI の最小単位)を分割する
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);

// 分割したコインを受取人に送金する
tx.transferObjects([coinToSend], RECIPIENT);

ステップ 3: 署名、ガス代の支払い、発送

これはガス代が計算される重要なステップです。

以下のコードを実行すると、SuiClient は以下の処理を行います。

  1. ガス代の見積もり: トランザクション(箱)の内容を確認し、その重さ(計算の複雑さ)を測定して、必要な手数料を決定します。
  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();

このトランザクションにおけるガス代の理解

手数料の額を明示的に設定しなかったことに気付いたかもしれません。

  • 自動予算設定: デフォルトでは、SDK が自動的にガス代を見積もります。これにより、トランザクションの処理に十分な額を提供しつつ、大幅な過払いを防ぐことができます。
  • 支払いソース: SDK は、この手数料を支払うためにウォレットから Sui コイン オブジェクトを自動的に選択します。これが、保持している Sui をすべて送金できない理由です。送金自体のガス代を支払うために、常にわずかな残高を残しておく必要があります。

期待される出力

成功すると、トランザクション ダイジェストを受け取ります。これがあなたの追跡番号になります。

📦 送信者アドレス: 0x123...
📝 トランザクションに署名して送信中...
✅ トランザクションが送信されました!
ダイジェスト (追跡 ID): 5T7x...9B2a

このダイジェストをコピーして Sui Explorer(Suiscan など)に貼り付けると、実際に消費されたガス代を含む送金の永久的な記録を確認できます。