Symbol(XYM)のウォレットを作りました。名前は heika です。Rust で書いていて、画面は Leptos、外側は Tauri 2 です。もはや Rust 定食と言っても過言ではないです。デスクトップもスマホも、同じコードで画面を作っています。幅が狭いと、左のメニューが下のタブに変わります。そうです、社会人の常識、レスポンシブ対応です✨
もともと heika は、ノードの証明書や鍵を扱うコマンドラインのツールとして作っていました。その中に、ブロックの署名を確かめるところや、状態の Merkle の経路をたどるところなど、ウォレットに要る部品がだいたいそろってきました。それなら画面も付けちゃえ、というのが始まりです。
残高は、極力確かめてから出す
いちばんこだわったのはここです。
いちばん素直な作りは、REST に「このアドレスの残高いくら?」と聞いて、返ってきた数字をそのまま出すことです。でも REST がすごい雑に嘘をついたら、それをそのまま見せることになります。
heika は REST から、ブロックのヘッダーと、アカウントの状態と、状態の Merkle の経路をもらいます。そのうえで、次の3つを手元で確かめます。
- ブロックの署名
- 9本の根から求め直した StateHash
- アカウントと、持っているモザイクの定義が、状態の経路でその根につながること
全部通ったときだけ、残高の横に盾のマークを出します。
ただ、これで何でも保証できるわけではありません。正直なところ「そのブロックが本当に正しいチェーンのものか」は、まだ REST を信じています。なので「くわしく」を開くと、確かめたことと信じていることを分けて書くようにしました。信じているものを黙っているのはあまりに気持ち悪かったので。ただここまでやって状態遷移を検証しないのも気持ち悪いけどさすがにそれはノードに任せたいです。だってたいへんそうなんだもん。
設定の画面にも同じことを書いて、良い子は部屋を明るくしてテレビから離れて、REST は自分のノードか、信じられる人のノードにして、石油王になって私を養ってね、とお願いしています。
送る前の画面は、色ごと変える
送金は取り消せません。なので、送る前に確かめる画面だけ、背景を深い青にしました。ふだんの白い画面とはっきり違うので、「あ、ここは大事なところだ」と手が止まるはずです。
![]() |
![]() |
この画面には、宛先、送る量、手数料、合わせて減る量、期限、どの REST に渡すか、を全部出します。メッセージは暗号化しないので、その場で「誰でも読めます」とも書いています。
宛先のアドレスは、6文字ずつ区切って出しています。相手から聞いたものと見比べやすいように、です。
送ったものは、ブロックに入るまで追いかける
送ったあとはホームに戻って、ブロックに入るのを待ちます。入ったら、そのトランザクションがブロックの TransactionsHash につながることを、Merkle の経路で確かめてから「入りました」と出します。
![]() |
![]() |
この「送ったもの」の記録は、どこにも保存しません。キーストアを閉じるか、アプリを終えると消えます。ディスクに履歴を残さないためです。消えても困らないように、残高のほうは毎回チェーンから確かめ直しています。
細かいところ
- 目のボタンで、金額を ●●●●●● にできます。人前で開くときや、スクショを撮るときに便利です
- 期限の切れたモザイクは、残高の下に畳んで出します
- ニーモニックはほかのウォレットと同じパスで導出するので、ほかのウォレットで控えた単語から戻せます
配っているもの
GitHub の Releases に、デスクトップとスマホのものを置いています。
- Linux:
.deb、.rpm、.AppImage - macOS(Apple Silicon):
.dmg - Windows:
.msi、-setup.exe - Android:
.apk - iOS: 署名していない
.ipa。入れるには、自分で署名し直してください
どれも GitHub Actions でビルドしていて、来歴の証明(attestation)を付けています。なので、ダウンロードしたものが、このリポジトリの CI で作られたものかどうかは、gh attestation verify で確かめられるはずです、しらんけど。ですが、https://github.com/HinaBlogChannel/heika/attestationsを見たほうが楽そうだったのでそれで済ませちゃいました。
タグを打っても、ビルドはし直しません。master の CI で作って、全部通ったものを、そのまま Release に出しています。リリースの手順が「CI が緑か見る → タグを打つ」だけになって、かなり楽になりました。
macOS と Windows のものは、公証も署名もしていません。macOS なら xattr -d com.apple.quarantine <アプリ> で拡張属性を外し、Windows なら SmartScreen の「詳細情報」から開いてください。
おわりに
画面の文言は、全部日本語です。「トランザクション」より「送ったもの」、「アナウンス」より「署名して送る」のように、なるべくふつうの言葉にしてみました。
まだ足りないものはそれはもうたくさんあります。受け取り用の QR、履歴、アカウントの追加と削除、などです。少しずつ足していこうかなーどうしよっかなー。しいて言うなら人気どころのマルチシグより否認可能性が気になるお年頃だったり……。
- リポジトリ: https://github.com/HinaBlogChannel/heika
- ライセンス: AGPL-3.0
※ これだけやっておきながら、記事のスクショは、テストネットのアカウントと、手元に立てたダミーの REST(localhost:3000)で撮っています。






