Projects
Rust学習個人開発TypeScript

Tron Pocket

仮想通貨Tron用ウォレットアプリ

Tron Pocket

TRON ブロックチェーン向けのデスクトップウォレットアプリ。Tauri 2(Rust)+ Vue 3(TypeScript)で構築されており、秘密鍵はすべて Rust バックエンド内で管理し、フロントエンドに一切露出しないセキュアなアーキテクチャを採用しています。

スクリーンショット

ダッシュボード・送金・受取画面を追加予定

主な機能

機能 説明
ウォレット作成 BIP39 準拠の 12 ワードニーモニック自動生成
ウォレット読み込み ニーモニックによるインポート(BIP44 m/44'/195'/0'/0/0
暗号化キーストア Argon2id + AES-256-GCM でローカルに安全保存
TRX 残高表示 メインネット・Nile テストネット対応
USDT 残高表示 TRC20 コントラクト balanceOf を直接呼び出し
リソース表示 帯域幅(Bandwidth)・エネルギー(Energy)の使用量と上限
TRX 送金 送金前の手数料見積もり付き確認画面
USDT 送金 TRC20 transfer 呼び出し・エネルギー不足時の TRX 補填額を計算
受取 QR コード アドレスを QR コード表示
トランザクション履歴 TronGrid v1 API から最新の取引履歴を取得
ネットワーク切り替え メインネット / Nile テストネット

技術スタック

フロントエンド

技術 用途
Vue 3 (Composition API) UI フレームワーク
TypeScript 型安全な実装
Pinia ウォレット状態管理
Vue Router 5 SPA ルーティング
Tailwind CSS v4 スタイリング
Reka UI アクセシブルな UI プリミティブ
qrcode 受取アドレスの QR コード生成
Vite 8 ビルドツール

バックエンド(Rust / Tauri 2)

クレート / ライブラリ 用途
Tauri 2 デスクトップアプリシェル・IPC
tron-core(ワークスペース内クレート) TRON コアロジック
k256 secp256k1 ECDSA 署名
bip39 / bip32 ニーモニック生成・鍵導出
Argon2 パスワードハッシュ(KDF)
aes-gcm AES-256-GCM 暗号化
zeroize 秘密鍵のメモリゼロクリア
reqwest TronGrid REST API クライアント
sha2 / sha3 Base58Check・アドレス導出

アーキテクチャ

┌─────────────────────────────────────┐
│  Vue 3 フロントエンド(TypeScript)  │
│  Pinia Store / Views / Components   │
└────────────────┬────────────────────┘
                 │ Tauri IPC (invoke)
┌────────────────▼────────────────────┐
│  Tauri コマンド層(Rust)            │
│  commands/{wallet, balance,         │
│            transaction, network}    │
└────────────────┬────────────────────┘
                 │
┌────────────────▼────────────────────┐
│  tron-core クレート(Rust)          │
│  keys / address / sign              │
│  keystore / client / trc20          │
└─────────────────────────────────────┘
  • 秘密鍵は Rust 層に閉じる — フロントエンドには公開アドレスと署名済みトランザクション結果のみ返す
  • トランザクション構築は TronGrid に委譲raw_data_hex を受け取り Rust 側で secp256k1 署名してブロードキャスト
  • キーストア形式 — Argon2id で導出した 256-bit 鍵で AES-256-GCM 暗号化し、ソルト・ノンス・暗号文を JSON で保存

セキュリティ設計

  • 鍵導出: Argon2id(メモリ 19 MiB、反復 2 回)— OWASP 推奨のパラメータ
  • 暗号化: AES-256-GCM による認証付き暗号化(改ざん検知あり)
  • メモリ保護: zeroize クレートによりドロップ時に秘密鍵をゼロクリア
  • IPC 境界: Tauri の型付きコマンドで入力を検証し、生の秘密鍵バイト列はフロントエンドへ渡さない

ビルド方法

# 依存関係のインストール
npm install

# 開発サーバー起動
npm run tauri dev

# リリースビルド
npm run tauri build

動作要件: Rust (stable)、Node.js 20+、各 OS のネイティブ依存(Tauri 前提条件

ディレクトリ構成

tron-pocket/
├── src/                    # Vue 3 フロントエンド
│   ├── views/              # ページコンポーネント
│   ├── components/         # 共通 UI・ウォレット部品
│   ├── stores/             # Pinia ストア
│   ├── lib/                # TauriAPI ラッパー・フォーマッタ
│   └── types/              # 型定義
└── src-tauri/
    ├── src/
    │   ├── commands/       # Tauri コマンドハンドラ
    │   └── storage/        # キーストア永続化
    └── crates/
        └── tron-core/      # TRON コアロジック(独立クレート)
            └── src/
                ├── keys.rs       # BIP39/44 鍵導出
                ├── address.rs    # アドレスエンコーディング
                ├── keystore.rs   # Argon2id + AES-GCM 暗号化
                ├── sign.rs       # ECDSA トランザクション署名
                ├── client.rs     # TronGrid API クライアント
                ├── trc20.rs      # TRC20 ABI エンコーディング
                └── units.rs      # SUN ↔ TRX 単位変換

ライセンス

MIT