書き込み操作を使用したトランザクションの送信
対象読者: 初めての状態変更操作を実行する開発者。
前提条件: 資金が入ったSui devnetウォレットと基本的なNode.js環境。
目標: ガスと署名の役割を理解した上で、Suiトークンを別のアドレスに送金するスクリプトを作成する。
はじめに
前のチュートリアルでは、ネットワーク手数料を発生させずにSuiClientにデータを問い合わせる読み取り操作を行いました。
ここでは、ウォレットから別のアドレスにSuiトークンを送金する書き込み操作を実行します。これはオンチェーンの状態を変更するため、次の2つの要件が適用されます:
- 署名: 資金の所有権を証明するために、リクエストに暗号学的署名を行う必要があります。
- ガス(手数料): トランザクションの処理に対してネットワークに支払う手数料(Suiトークン)が必要です。
前提条件
このチュートリアルを実行するには以下が必要です:
- 資金が入ったウォレット: Sui
devnetトークンを保有するウォレットの12語のリカバリーフレーズ。無料のテストトークンは、Sui Discord ファウセットまたは互換性のあるSuiウォレット内から直接リクエストできます。 - Ed25519キーペアパッケージ: トランザクションに署名するための
@mysten/sui。
必要なパッケージをインストールします(まだインストールしていない場合):
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}`);
トランザクションを送信する前に、送信者アドレスにはガス代を支払うためのテストトークンが必要です。ターミナルに表示された送信者アドレスをコピーし、Sui Discordの#devnet-faucetチャンネルからトークンをリクエストしてください。
2. トランザクションの構築
Suiでは、直接生のコマンドを送信するのではなく、Transactionを構築します。これは、配送ラベルを記入し、箱に品物を詰めてから封をするようなものです。
プライマリガスコインから指定した金額を分割するためにtx.splitCoinsコマンドを使用します:
// 3. 受取人の定義
const RECIPIENT = '0x9999...'; // 友人のアドレスまたはバーンアドレスに置き換えてください
// 4. トランザクションコンテナの作成
const tx = new Transaction();
// ガスコインから1000 MIST(SUIの最小単位)を分割
const [coinToSend] = tx.splitCoins(tx.gas, [1000]);
// 分割したコインを受取人に送金
tx.transferObjects([coinToSend], RECIPIENT);
3. トランザクションの署名と送信
このステップでは、オンチェーンでトランザクションを実行する前にガスを計算して支払います。
┌─────────────────────────┐ ┌─────────────────────────┐ ┌───────────────────────────┐
│ 1. トランザクション構築 │ ──► │ 2. キーペアによる署名 │ ──► │ 3. SuiClient経由で送信 │
│ (splitCoins, transfer) │ │ (暗号学的証明) │ │ (Devnetへの配信) │
└─────────────────────────┘ └─────────────────────────┘ └───────────────────────────┘
signAndExecuteTransactionを呼び出すと、SuiClientは以下を実行します:
- ガス量の見積もり: 計算の複雑度を算出し、必要なガス予算を設定します。
- 署名: 状態変更を承認するために
keypair署名を適用します。 - 送信: 署名済みトランザクションをRPCフルノード経由でネットワークに送信します。
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を残しておいてください。
期待される出力
成功すると、スクリプトはトランザクションダイジェスト(トランザクション追跡ID)を出力します:
📦 送信者アドレス: 0x123...
📝 トランザクションに署名して送信中...
✅ トランザクションが送信されました!
ダイジェスト (追跡ID): 5T7x...9B2a
このダイジェストをコピーし、Suiscanで検索してください。エクスプローラーにはガス消費量や実行状態を含む恒久的なオンチェーン記録が表示されます。
次のステップ
これで、初めてのオンチェーン書き込みトランザクションを実行できました:
- 受信者が新しく受け取ったオブジェクトを検査するには、オブジェクトデータの取得方法をお読みください。
- Suiノードと局員の概念モデルについては、SuiClientのアーキテクチャを確認してください。
- 詳細なトランザクション効果やオブジェクトスキーマを照会するには、
getObjectAPIリファレンスを参照してください。