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