SeedSigner - DIYから送金まで

# 趣旨
僕的にはSeedSignerがビットコインの署名機の中ではダントツでランク一位なのに日本では誰も推してないので僕が推します。

組み立てられたものを購入してもよいのですがせっかく自分でDIYできる設計になってるのでDIYしちゃいましょう！使い方もDIYの解説の下に載せておきます。

# SeedSignerのDIYの手引き

公式GitHubページ

https://github.com/SeedSigner/seedsigner

ここに全て書いてあります。英語が読める方なら公式サイトを参考にしましょう。

## 必要な道具
まずは必要なパーツを全て揃えましょう。以下の4つさえあればとりあえずは動かせます。
- Raspberry Pi ゼロ 2 （GPIOピン ヘッダー付き）
- Waveshare 1.3インチ キー付きスクリーン
- カメラ
- microSDカード

:::note info
本当はRaspberry Pi ゼロ（バージョン1.3のWiFiやBluetooth機能ないモノが良いんですが、もうほぼ売ってないのでRaspberry Pi ゼロ 2 （GPIOピン ヘッダー付き）を買って通信機能ぶっ壊す方が早いです。
:::

### あれば良いもの
以下のモノはなくても良いですが、あった方が便利です。
- microSDカードとPCを繋げるコード
- バッテリー
- SeedSigner用ケース

## 結局何を買えばいいのかわからない人向け
一番良いのはSeedSigner Kitを買ってどの部品を買うか迷うことなく組み立てるだけの状態で始めることなんですが、残念ながら日本でSeedSignerKitを売ってる業者は2024年5月時点では存在しないようなので自分で部品を集めるしかないです。

AliexpressにSeedSignerに相性の良いキットが売ってたので載せておきます。
![Screenshot 2024-05-19 at 11.35.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/0525e73a-fb34-4287-7d9d-b496a27df14c.png)
僕はAliexpress使ったことがないのでよくわかりませんが、抵抗ない方はこれを買えばほぼ全部揃います。あとはラズパイゼロ用のカメラとmicroSDカードだけ別途用意すれば動かせます。

https://ja.aliexpress.com/item/1005003170481178.html?spm=a2g0o.detail.pcDetailTopMoreOtherSeller.12.117a20ZO20ZO2a&gps-id=pcDetailTopMoreOtherSeller&scm=1007.40000.327270.0&scm_id=1007.40000.327270.0&scm-url=1007.40000.327270.0&pvid=04dda78c-cd45-4fcd-b969-81bac5eaa587&_t=gps-id%3ApcDetailTopMoreOtherSeller%2Cscm-url%3A1007.40000.327270.0%2Cpvid%3A04dda78c-cd45-4fcd-b969-81bac5eaa587%2Ctpp_buckets%3A668%232846%238109%231935&pdp_npi=4%40dis%21EUR%2179.15%2172.81%21%21%2183.95%2177.23%21%40211b81a317161110545912142eb938%2112000024474872141%21rec%21FR%21%21AB&utparam-url=scene%3ApcDetailTopMoreOtherSeller%7Cquery_from%3A&gatewayAdapt=glo2jpn

こちらのハードウェアの組み立て方は多分購入すればガイドがついてると思います。

## SeedSignerOSのインストール

### イメージのダウンロード
先ほどの公式ページを少しスクロールしたところにファイルがおいてあります。

https://github.com/SeedSigner/seedsigner?tab=readme-ov-file#downloading-the-software

僕はRaspberry Pi Zero 2 Wを利用したので下の画像のイメージをダウンロードしました。
![Screenshot 2024-05-19 at 11.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/1bfe035f-cf05-1e56-334a-7e0bcf33edd3.png)

もう少し下にスクロールすると署名をダウンロードできます。クリックするだけでダウンロードされます。署名確認も必ずやっておきましょう。
![Screenshot 2024-05-19 at 11.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/ca5d37ef-2153-5d8d-7092-4fe86078a6b7.png)

ダウンロードした後は関連ファイルを全てseedsignerというフォルダを作ってそこに入れておきましょう。デスクトップに置いておきましょう。

デスクトップ
![Screenshot 2024-05-19 at 11.45.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/b63cefb8-40de-c5d5-3533-2c28a00e3eb3.png)

seedsignerフォルダの中身
![Screenshot 2024-05-19 at 11.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/74be9057-98e1-c622-67e9-298a1d47f369.png)


### 署名検証
ターミナルを開いてデスクトップ上のseedsignerフォルダに移動するコマンドを打ちます。
```
cd Desktop/seedsigner 
```
GPG関連の鍵を配布しているサーバーからseedsignerの鍵を取ってきます。
```bash
gpg --fetch-keys https://keybase.io/seedsigner/pgp_keys.asc
```

実行結果
```bash
gpg: requesting key from 'https://keybase.io/seedsigner/pgp_keys.asc'
gpg: key C7EF709007260119: "seedsigner <btc.hardware.solutions@gmail.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1　
# 最後の行がunchangedかimportedならおk
```
次に署名の確認をします。
```bash
gpg --verify seedsigner.0.7.*.sha256.txt.sig
```
実行結果
```bash
gpg: assuming signed data in 'seedsigner.0.7.0.sha256.txt'
gpg: Signature made pon 13 cze 19:07:57 2022 CEST
gpg:                using RSA key 46739B74B56AD88F14B0882EC7EF709007260119
gpg: Good signature from "seedsigner <btc.hardware.solutions@gmail.com>" [unknown]
# Good signatureとここに出ていればおk
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 4673 9B74 B56A D88F 14B0  882E C7EF 7090 0726 0119
# Primary key fingerprintの最後の４ブロック C7EF 7090 0726 0119 に注目
```

先ほどの鍵サーバーに直接ブラウザからアクセスしてフィンガープリントを確認します。

https://keybase.io/seedsigner

![Screenshot 2024-05-19 at 11.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/c41e008f-b42c-b357-1e9c-52df4b57c86d.png)

Primary key fingerprintの最後の４ブロック C7EF 7090 0726 0119とkeybase.io/seedsignerの鍵マークのところの鍵の値が一致していればおk


### microSDカードにseedsignerOSを焼き付けます
焼き付けるソフトは2種類推奨されてます。Balenaの方が多分簡単です。

- Balena
https://etcher.balena.io/

- Raspberry Pi Imager
https://www.raspberrypi.com/software/

Balenaで実行する場合
先ほどのseedsignerフォルダの中のimg拡張子のものを選択し、microSDカードをMacに繋いで選択肢てFlashすれば完了です。

![Screenshot 2024-05-19 at 11.58.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/c3c013cb-8396-88a8-46dc-39428c9b0895.png)

これでmicroSDカードにSeedSignerOSが入っているのであとはRaspberry Pi ゼロ 2に挿して起動すれば立ち上がります。

:::note info
本来、接続したハードウェア（スクリーンやカメラ）を起動させるためにライブラリをインストールしたりそれらを動かすためのプログラムを常時起動するよう設定しないといけないのですが、SeedSignerOSは指定のスクリーンを繋いだ場合追加設定なしで動くように設計されているみたいなので、そういう作業一切必要ないです。開発者に感謝！
:::

カメラの取り付け方はインドの方が動画上げてたのでそれを見れば大体わかります。

https://youtu.be/oo0A_yRrIxQ?si=-Ni7PpI_-d2gYM8_&t=121

ケースが欲しい場合は３Dモデルが配布されているので、３Dプリンター会社にそのファイルを送って印刷依頼すれば作ってもらえます。

https://github.com/SeedSigner/seedsigner/tree/main/enclosures

# SeedSignerの使い方
LedgerやColdCardと違ってSeedSignerはデバイス内にシードを長期保管できません。シャットダウンするたびにワイプアウトされてます。なので毎回シードを読み込む必要があり、１２ワードや２４ワードを全部入力するのがだるいのでシードをQRコードにしてそれを読み込むことで署名できるようにしています。

一連の流れを言葉にすると以下のようになります。（間違ってたらすみません）

1. SeedSignerでシードQRを読み込む
2. モバイルウォレット送金したい金額を入力しSeedSignerでそのインボイスを読み込む
3. SeedSigner内で署名する
4. 署名されたトランザクションをSeedSignerのスクリーン上でQRコード表示する
5. モバイルウォレットでそのQRコードを読み込むことで署名を取り込み送金を完了する

SeedSignerはネットに接続しないのでシードが一度もネットに接続されてるデバイスと直接連結しないことにお気づきでしょうか？シードから生成したプライベートキーで署名だけをSeedSignerで行い、窓口は全てモバイルウォレットに任せるイメージですね。

では具体的な使い方を解説します。

## シード生成
SeedSignerを起動すると以下の4つの選択肢が表示されるのでToolsを選びます。
- Scan
- Seeds
- Tools
- Settings

Toolsの中は以下の5つの項目がありますが、Dice New seedを選択します。
- Camera New seed
- Dice New seed
- Calc 12th/24th word
- Address Exploror 
- Verify address

Dice New seedを選ぶと以下の2つの選択肢が出ます。好きな方を選びます。
12 words (50 rolls)
24 words (99 rolls)

:::note alert
ColdCardにもサイコロによるシード生成機能があり、同じサイコロの結果を入力すれば同じシードが生成されるのでColdCardを使ってもよいんですが、ColdCardはサイコロを振る回数を自分で決められるので12回以下のサイコロ数でシードを生成した場合、総当たり攻撃を受けて中のBTC奪われるので50回以上は必須です。
:::

50回か９９回サイコロを振って毎回その結果を入力していきます。終わればシードフレーズが生成されてメモするよう忠告が出ます。しっかりメモしてください。

その後BIP-39 Passphraseをセットするとかどうか聞かれるのでパスフレーズをセットしてシードを盗まれても簡単に中のビットコインを奪われないようにしたい場合はパスフレーズもセットします。

:::note info 
パスフレーズをセットした場合、署名するにはパスフレーズとシードの両方が必要になるのでパスフレーズをなくすとGOXします。簡単に突破できる単純なワードの場合パスフレーズをセットする必要もないので、できればパスワード生成機で特殊な文字を含むランダムな文字列を作り、それをLastPassのようなオンラインでのパスワード管理ツールに保管しておくのが良いです。物理的な侵入と電子上の侵入の両方を同時に実行するのは難しいので。
:::

## シードQRスキャンしてロード
選択すべき項目名だけを列挙していきます。

- Seeds
- Load a seed / choose fingerprint if loaded
:::note info
シードを生成したあとはシードがロードされた状態になっているので、そのシードのフィンガープリントを選択すればおk
:::
- Backup seed
- Export as SeedQR
- Standard: 25x25 / Compact: 21x21
:::note info
25でも21でもどちらでもおk
:::
- Begin

指示にしたがってQRコードを黒塗りしていきます。

QRコードを黒塗りするためのシートはここに置いてあります。プリントアウトして使えます。

https://github.com/SeedSigner/seedsigner?tab=readme-ov-file#seedqr-printable-templates

サンプル
![ダウンロード (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/239d1ac1-e59c-9ce2-2b03-b6a0f7fdae82.png)


海外ではメタルプレート版もショップで販売されてます。
![1-158.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670541/c5726ed2-9375-e4ef-f0af-0a28757208ef.jpeg)


## BlueWalletと連携して署名
文字での解説が非常に困難なので心苦しいですが英語での解説をしているビットコイナーの動画を引用します。

https://www.youtube.com/watch?time_continue=741&v=x0Ee35Ct0r4&embeds_referring_euri=https%3A%2F%2Fwww.notion.so%2F&source_ve_path=MjM4NTE&feature=emb_title