ハードウェアウォレット
ハードウェアウォレットとは、秘密鍵を保持し、自身の画面上で署名する小さなデバイスで、鍵がコンピューターに触れることはありません。ZooBC は、そのようなデバイスのメーカー向けに署名仕様を書いています。それは、デバイスが ZooBC のトランザクションに署名する前に、何を確認し、表示し、計算しなければならないかを定めています。
考え方:何に署名するかはデバイスが決める
コンピューターは侵害されることがありますが、デバイスはユーザーが信頼する部分です。そのため仕様は、デバイスに決定権を持たせています。コンピューターはトランザクションを提案するだけです。デバイスはそれをフィールドごとに読み、それが何を意味するかをユーザーに示し、ユーザーが承認したものにだけ、自分でダイジェストを計算して署名します。
鍵
デバイスは、Ed25519 用の SLIP-0010 を使い、リカバリーフレーズからパス m/44'/883'/account' に沿って鍵を導出します。883 は ZooBC のコインタイプです(鍵とアカウントタイプ)。したがって署名は、Bitcoin のデバイスが作る secp256k1 の署名ではなく、ネイティブの ZooBC アカウントと同じ Ed25519 です。鍵がデバイスから出ることはありません。
デバイスがしなければならないこと
- コンピューターから未署名のトランザクションのバイト列とチェーンのジェネシスハッシュを受け取る。
- すべてのフィールドを自分で解析し、長さのフィールドの合計がちょうど合わないトランザクションは拒否する。
- 送信者を確認する:送信者がデバイス自身の導出したアカウントでなければ拒否する。
- ネットワーク、トランザクションタイプ、金額、受取人の全体、手数料、延命の支払い(データ保持のための支払い(ロンジェビティ))、メッセージ、エスクロー(エスクロー)を表示する。
- ユーザーの承認を待つ。
- チェーン束縛ダイジェスト SHA3-256("ZBC-TX" ‖ genesis hash ‖ bytes) を自分で計算し、Ed25519 で署名する(チェーン束縛署名)。
- 署名だけをコンピューターに返す。
これらのルールの理由
- 出来上がったダイジェストには決して署名しない。 コンピューターが送ってきた 32 バイトのダイジェストは、ユーザーが一度も見ていないトランザクションのハッシュかもしれません。デバイスは、自分が解析して表示したバイト列からダイジェストを作らなければなりません。同じ理由で、生のメッセージに署名するためのコマンドはちょうど 32 バイトの入力を拒否します。トランザクションのダイジェストをメッセージとして紛れ込ませることができないようにするためです。
- 受取人は省略せずに全体を表示する。 省略されたアドレスの先頭と末尾に一致するよう、よく似たアドレスを作ることができるからです。
- ネットワークを表示する。 ジェネシスハッシュが、署名がどのチェーンで有効かを決めるため、ユーザーはそのトランザクションがどのネットワーク向けかを確認できます(devnet、testnet、mainnet)。
最初に対応するもの
仕様は、デバイスがまず 3 つのトランザクションタイプをサポートすることを推奨しています。SendZBC(支払い)、TransferToken(トークンの転送。トークンの発行 を参照)、ApprovalEscrow(エスクロー付きの支払いの承認)です。