用語集 / アドレスと鍵
BIP-49の導出
- BIP-49の導出とは?
- BIP-49の導出では、ネストされたSegWitのアカウントをm/49'/0'/0'という専用のブランチに配置するため、それらを読み取れないウォレットは誤った残高ではなく何も表示しません。
BIP-49で規定されています。
BIP-49は、鍵ツリーの最初の強化レベル49'を、アドレスがP2SHの中にP2WPKHを包んだ形になるアカウント用に確保しています。これは2016年5月19日に割り当てられ、のちに独自の拡張鍵のバージョンバイトを獲得しました。ypubには0x049d7cb2、yprvには0x049d7878です。ウォレットがypubで始まるアカウント鍵をエクスポートする場合、復元時にたどるべきブランチはそこです。
仕組み
BIP-49は2つの問いを決着させます。BIP-32のツリーのうち、包まれたSegWitの鍵を保持するのはどのブランチか、そしてそのブランチ上の鍵からアドレスをどう構築するかです。
このブランチは、BIP-44がすでに使っていた5階層のテンプレートm / purpose' / coin_type' / account' / change / address_indexを借用し、数字をちょうど1つ変えます。purposeは44'ではなく49'になります。coin type、account、chain、indexは、BIP-44が与えた意味をそのまま保ちます。
アドレス側の作業は機械的です。圧縮された公開鍵をハッシュ化し、その20バイトの結果を22バイトのredeem scriptで包み、次にそのスクリプトをハッシュ化して、アウトプットがコミットする値を得ます。仕様はこの2つの部分をscriptSig: 0x160014{20-byte-key-hash}とscriptPubKey: 0xA914{20-byte-script-hash}87と書いています。
興味深いのは、作者が却下した選択肢です。Weiglは2つのアプローチを挙げています。すでに持っているアカウントを維持し、同じ公開鍵から包まれたSegWitのアドレスをぶら下げるか、新しいpurposeの下に専用のアカウントを発行するかです。前者は何か問題が起きるまでは使いやすいもので、そして問題が起きたとき、仕様の言葉を借りれば、そのアカウントは"might show up but also it might miss some UTXOs"(表示されるかもしれないが、一部のUTXOを見逃すかもしれない)という状態になります。BIP-49が専用のアカウントを選んだのは、まさにその選択肢が"fails in a more visible way"(より目に見える形で失敗する)からです。空の画面は、もっともらしい誤った数字よりも優れたエラーメッセージです。
シリアライズも最終的に同じ扱いを受けました。このブランチの拡張公開鍵はバージョンバイト0x049d7cb2を使い、base58でエンコードするとypubというプレフィックスになり、yprvには0x049d7878、テストネットではupubとuprvになります。
どこで見られるか
BIP-49は、xpubではなくypubで始まる拡張鍵として、またウォレットがネイティブのアカウントの隣に並べる包まれたSegWitのアカウントとして現れます。当サイトが3.7と評価するMyceliumは、ネイティブと包まれたSegWitのアカウントを1つのアプリで扱っており、この2つの方式はSLIP-0132がzpubとypubの下に登録しています。
ypubというプレフィックスは後付けであり、その経緯は今も見て取れます。2014年にpurposeレベルを発明したBIP-43は、実装者に対して、すべてのpurposeで0x0488B21Eとxpubのプレフィックスを維持するよう指示しました。BIP-49は当初その形で出荷され、バージョンバイトを適切に登録するために2018年2月8日に作られたSLIP-0132は、その結果を率直に説明しています。プレフィックスが変わらなかったことで"unsustainable user confusion"(持続不可能なユーザーの混乱)が生じたのは、ユーザーがxpubがどのブランチのものかを覚えておくか、受け取る側のツールが両方のアドレス空間をスキャンするかしなければならなかったからです。プレフィックスは手がかりであって、保証ではありません。拡張鍵をブロックエクスプローラーに貼り付けて、ウォレットが3で始まるアドレスを表示しているのに、ツールが1で始まるアドレスを導出する場合、手元にあるのは古いプレフィックスをまとったBIP-49の鍵であり、ツールにパスを手動で伝える必要があります。
仕様には、ツールの確認に値するテストネットのテストベクターがあります。abandonという語句を11回繰り返したあとにaboutを続けたフレーズ、アカウントルートm/49'/1'/0'、最初の受取アドレス2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2です。
BIP-49の導出vsネストされたSegWit
BIP-49の導出は鍵に関する規則であり、ネストされたSegWitはチェーンが見るパターンです。両者は通常一緒に用いられますが、どちらかがどちらかを含意するわけではありません。アウトプットがネストされたSegWitなのは、それがコミットするスクリプトによるものであり、その中に鍵を生成したパスを記録するものは何もありません。ウォレットは、インポートした秘密鍵からそれを構築することも、BIP-49が却下したアプローチ、つまりすでにBIP-44のアカウントにある公開鍵から2つ目のP2SHアドレスを導出する方法から構築することもできます。したがって、保有しているビットコインが3で始まるアドレスにあると分かっても、どこから復元すべきかは分かりません。だからこそ、アカウントのパスはシードのバックアップと並べてメモに書いておくべきものです。