ウォレット
HDウォレット
(ここに階層の図を入れる)
BIP32 は鍵導出について、BIP-44 は各階層(path)の用途を決めている。
m / purpose' / coin_type' / account' / change / address_index
「ウォレットを作る」としたときに 12単語や 24単語のニモニック(場合によってはパスフレーズも)を記録するが、
それだけだとこの階層では最初の m
だけしか決まらない。
purpose'
が P2TR(86’) や P2WPKH(84’) などを決めているので、これも記録しておかないと面倒だ(数種類なので全部試せば良いのだが、それが面倒だと思う)。
coin_type'
は “Bitcoin mainnet” や “Bitcoin testnet”(regtest などもたぶん含む)、おそらく Ethereum なども使っているんじゃ無かったか。
account'
はおそらく切り替えて使いたい場合、change
は 0
が受信アドレス(公開用)、1
がお釣りアドレス(内部用)。
address_index
はアドレスを作るごとに増やしていく値。
ウォレットに紐付く UTXO を探す場合、address_index
をインクリメントさせながら調べていく。
32 bit あるので全部の空間を調べることはできない。
アドレスを作ったけど受信しなかったということもあるので、
デフォルトでは UTXO が見つからないアドレスが 20個続いた場合は探索を打ち切る(gap limit)。
あくまでデフォルトなので、20個調べたら必ず打ち切る、というものではない。
seed
seed は 128~512 bits の乱数である。
BIP-32 では 256 bit を推奨していたが今もそうなのかは未確認。
master key と chain code
Key=”Bitcoin seed”、Data=seed で HMAC-SHA512 計算をした値を I
とし、それを半分に割って IL
、IR
とする(左半分と右半分)。
左半分が master secret key、右半分が master chain code である。
IL
が 0 と等しいか n
以上だと NG。
拡張鍵
extended key はこう。
- extended private key は前半 256 bit が private key で後半 256 bit が chain code
- extended public key は前半 256 bit がその public key で後半 256 bit が chain code
シリアライズ
プレフィクス
- P2PKH?:
xprv
,xpub
(BIP-32) - P2WPKH-nested-in-P2SH:
yprv
,ypub
(BIP-49) - P2WPKH:
zprv
,zpub
(BIP-84) - P2TR(single key):
xprv
,xpub
(BIP-86)
参考
- 開発日記
Output Descriptors
under construction…
参考
- 開発日記
関連ページ