Zenn
🌊

Sui CLIで始めるブロックチェーン入門:マルチシグとガススマッシング

2025/02/08に公開

Sui CLI で始めるブロックチェーン入門

はじめに

Sui ブロックチェーンは、Move 言語を採用した高性能な第 3 世代ブロックチェーンです。

この記事では、Sui CLI を使用した基本的な操作から。
マルチシグトランザクションの実装。
そして興味深いガススマッシング現象までを実践的に解説します。

なぜ Sui を選ぶのか?

  1. 高いスケーラビリティ

    • 並列トランザクション処理による高スループットを実現。
    • 独自のコンセンサスメカニズムを採用。
    • 低レイテンシーで高速な処理が可能。
  2. 開発者フレンドリー

    • Move 言語による型安全なスマートコントラクトの開発。
    • 充実した CLI ツールで簡単に操作。
    • 分かりやすい公式ドキュメントで学習も容易。
  3. セキュリティ重視

    • オブジェクト中心の設計で安全性を確保。
    • 厳格な所有権モデルでリスクを最小化。
    • 包括的な監査システムで安全性を担保。

他のブロックチェーンとの比較

特徴 Sui Solana Ethereum
言語 Move Rust Solidity
TPS 120k+ 65k+ 15-30
ガス代 低コスト 低コスト 変動大
開発難易度

本記事で学べること

  • Sui CLI の基本的な使い方
  • マルチシグトランザクションの実装方法
  • ガススマッシング現象の理解と対処法
  • 実践的なトラブルシューティング

用語解説

ブロックチェーンの世界には独特の用語が多く登場します。
まずは主要な用語を理解しましょう。

重要な単位について

  • SUI: このブロックチェーンのネイティブトークン(通貨)です。
  • MIST: SUI の最小単位です。
    • 1 SUI = 1,000,000,000 MIST
    • 例: 1.5 SUI = 1,500,000,000 MIST

基本用語

  • ガス代: トランザクション(取引)を実行するために必要な手数料です。
    ブロックチェーンを利用するためのコストとなります。

  • DevNet: 開発者用のテストネットワークです。
    本番環境ではないので、自由に実験が可能です。

  • CLI: Command Line Interface(コマンドライン・インターフェース)の略です。
    テキストベースで操作を行うツールとして使用します。

トランザクション関連

  • マルチシグ: 複数の署名(承認)が必要な取引形式です。
    セキュリティを高めるために使用されます。

  • ガスバジェット: 取引に使用可能な最大ガス代です。
    取引失敗を防ぐため、適切な設定が重要です。

  • オブジェクト: Sui で管理される全てのデータの基本単位です。
    コインや NFT などが該当します。

  • アドレス: ウォレット(財布)の住所のようなものです。
    取引の送金先として使用されます。

Sui CLI のインストール方法

1. 事前準備

必要なツール:

  • Git
  • Rust(バージョン 1.70.0 以上)
  • CMake(バージョン 3.20.0 以上)
  • C++コンパイラ

2. Rust のインストール(未インストールの場合)

# Rustのインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# パスの設定を反映
source $HOME/.cargo/env

3. Sui CLI のインストール

# cargoを使用してSui CLIをインストール
cargo install --locked --git https://github.com/MystenLabs/sui.git --branch devnet sui

# インストールの確認
sui --version

4. 初期設定

# 新しいウォレットの作成
sui client new-address ed25519

# DevNet環境への切り替え
sui client switch --env devnet

# Faucetからテスト用のSUIを取得
sui client faucet

1. 環境構築

Sui CLI のインストール確認

$ sui --version
sui 1.42.0-ae8883db4bbc

DevNet 環境の設定

$ sui client envs
╭─────────┬─────────────────────────────────────┬────────╮
│ alias   │ url                                 │ active │
├─────────┼─────────────────────────────────────┼────────┤
│ testnet │ https://fullnode.testnet.sui.io:443 │        │
│ devnet  │ https://fullnode.devnet.sui.io:443  │ *      │
╰─────────┴─────────────────────────────────────┴────────╯

現在の DevNet 環境が正しく設定されていることが確認できます。

2. アカウント管理

アドレスの確認

$ sui client addresses
╭──────────────────────┬────────────────────────────────────────────────────────────────────┬────────╮
│ alias                │ address                                                            │ active  │
├──────────────────────┼────────────────────────────────────────────────────────────────────┼────────┤
│ example-wallet-1     │ 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef │ *      │
│ example-wallet-2     │ 0xabcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 │        │
╰──────────────────────┴────────────────────────────────────────────────────────────────────┴────────╯

ガス残高の確認

$ sui client gas
╭────────────────────────────────────────────────────────────────────┬────────────────────┬──────────╮
│ gasCoinId                                                          │ mistBalance (MIST) │ suiBalance│
├────────────────────────────────────────────────────────────────────┼────────────────────┼──────────┤
│ 0x1111111111111111111111111111111111111111111111111111111111111111 │ 10000000001.00     │
│ 0x2222222222222222222222222222222222222222222222222222222222222222 │ 14980021201.49     │
╰────────────────────────────────────────────────────────────────────┴────────────────────┴──────────╯

3. マルチシグトランザクションの実装

トランザクションのプレビュー

$ sui client ptb --gas-budget 10000000 --split-coins gas [500000000] --assign split_result \
  --transfer-objects [split_result] @0x1234...cdef --preview
╭─────────────────────────────────────────────────────────────────────────────────────────╮
│ PTB Preview                                                                             │
├──────────────────┬──────────────────────────────────────────────────────────────────────┤
│ command          │ values                                                               │
├──────────────────┼──────────────────────────────────────────────────────────────────────┤
│ split-coins      │ gas [500000000]                                                      │
│ assign           │ split_result                                                         │
│ transfer-objects │ [split_result] @0x1234...cdef                                        │
│ gas-budget       │ 10000000                                                             │
╰──────────────────┴──────────────────────────────────────────────────────────────────────╯

ガススマッシング現象の観察

実際のトランザクション実行時に興味深い現象が観察されました:

Gas Cost Summary:
    Storage Cost: 1976000 MIST
    Computation Cost: 1000000 MIST
    Storage Rebate: 978120 MIST
    Non-refundable Storage Fee: 9880 MIST

この現象で注目すべき点:

  1. ストレージコスト

    • 全体の 66.4%を占める最も大きな部分です(1,976,000 MIST)
    • 内訳:
      • 返金: 49.5%(978,120 MIST)
      • 手数料: 0.5%(9,880 MIST)
      • ストレージ保持: 50.0%(988,000 MIST)
  2. 計算コスト

    • 全体の 33.6%を占めています(1,000,000 MIST)
    • 返金されない固定費用です
  3. リベートシステム

    • ストレージコストの約 49.5%が返金されます
    • 実質的な負担を軽減する仕組みです
    • 次回のトランザクションで使用可能です

4. ガススマッシング現象の分析

現象の説明

ガススマッシング現象とは、トランザクション実行時のガス代(手数料)が予想以上に高くなる現象です。

これは以下の要素で構成されています:

  1. ストレージコスト

    • データの保存にかかる費用です。
    • 全体の約 66%を占める最も大きな部分です。
    • 一部は後で返金される(リベート)仕組みがあります。
  2. 計算コスト

    • トランザクションの処理にかかる費用です。
    • 全体の約 33%を占めています。
    • 返金されない固定費用となります。
  3. リベート(返金)システム

    • ストレージコストの約 50%が返金されます。
    • 実質的な負担を軽減する仕組みです。
    • 次回のトランザクションで使用可能です。

図解

実践的なアドバイス

  1. 適切なガス代の設定方法

    # 安全な取引のための推奨設定
    sui client transfer-sui \
      --amount 1000000 MIST \
      --to $ADDRESS \
      --gas-budget 10000000 MIST  # 余裕を持った設定
    
  2. コスト削減のコツ

    • 複数の小さな取引をまとめる
    • 同じオブジェクトを再利用する
    • 不要なデータは削除する

5. トラブルシューティング

よくあるエラーと解決方法

  1. ガス不足エラー

    Error: InsufficientGas
    

    解決方法:

    • ガス予算を増やす(推奨:10,000,000 MIST)
    • トランザクションサイズの最適化
    • バッチ処理の検討
  2. オブジェクトロックエラー

    Error: ObjectLocked
    

    解決方法:

    • トランザクションの完了を待つ
    • 別のコインオブジェクトを使用
    • ロック状態の確認コマンド実行
  3. 不正なアドレス指定

    Error: InvalidAddress
    

    解決方法:

    • アドレスフォーマットの確認
    • チェックサムの検証
    • テスト環境での事前確認

デバッグのベストプラクティス

  1. ステップバイステップのアプローチ

    # 1. オブジェクトの状態確認
    sui client object $OBJECT_ID
    
    # 2. トランザクションの詳細確認
    sui client transaction $TX_DIGEST
    
    # 3. ガス情報の分析
    sui client gas
    
  2. ログの活用

    # トランザクションの詳細なログ出力
    sui client transfer-sui --amount 1000000 MIST --to $ADDRESS --gas-budget 10000000 MIST --verbose
    
  3. テスト環境での検証

    • DevNet での事前テスト
    • 少額での動作確認
    • エラーケースの再現確認

コミュニティリソース

  1. 公式サポート

  2. 開発者リソース

まとめ

  1. 学んだこと

    • Sui CLI の基本的な使い方
    • マルチシグトランザクションの実装手順
    • ガススマッシング現象の理解
  2. 次のステップ

    • Move 言語でのスマートコントラクト開発
    • カスタムトランザクションの実装
    • テストネットでの検証

参考リンク

Discussion

ログインするとコメントできます