btc: Output Descriptors (2)
2025/02/25
はじめに
昨日の最後に書いたが、Rust のライブラリをちょっと動かそうとしただけなのだ。
そこに descriptor wallet のことが書いてあったので調べてみたのだ。
少し分かるようになったかと思って Rust のコードを見たのだが、うん、わからんね。
BDK の descriptor wallet のところだけわかりたい
見ていたサンプルコードはこちら。
50行にも満たないが、これで testnet のウォレットをスキャンしているようだ。
知りたいのは最初のところだけ。
比較できるようにインデントをそろえた。
let descriptor: &str = "tr([12071a7c/86'/1'/0']tpubDCaLkqfh67Qr7ZuRrUNrCYQ54sMjHfsJ4yQSGb3aBr1yqt3yXpamRBUwnGSnyNnxQYu7rqeBiPfw3mjBcFNX4ky2vhjj9bDrGstkfUbLB9T/0/*)#z3x5097m";
let change_descriptor: &str = "tr([12071a7c/86'/1'/0']tpubDCaLkqfh67Qr7ZuRrUNrCYQ54sMjHfsJ4yQSGb3aBr1yqt3yXpamRBUwnGSnyNnxQYu7rqeBiPfw3mjBcFNX4ky2vhjj9bDrGstkfUbLB9T/1/*)#n9r4jswr";
アドレスの本体(?)とお釣りなので、違いは m/86'/1'/0'/X/Y
の X だけだ。
m / purpose' / coin_type' / account' / change / address_index
purpose は BIP-86 ということで P2TR。
testnet なので coin_type=1 だ。
最後の方はチェックサムだろう。
そういうのはなんとなく分かるのだが、最初の 12071a7c
はなんだ。m
じゃないのか。
BIP-380 の Test Vectors の “Extended public key with derivation and children” が一番近いかな。
頭の部分が “key origin” で Extended Public Key が続き、key origin の続きと最後に *
がくる、と。
“key origin” には m / purpose' / coin_type' / account'
まであるから、残りの change
があり、最後の address_index
が *
になるのか。
- key origin - Key Expressions
[]
で囲む- fingerprint(4byte HEX(8文字16進数))
- Serialization format - BIP32
- master key の場合は
00000000
- pubkey を HASH160 の先頭 4バイト
- なのだけど、master key ではない場合ってなんだ?
m/X/Y
みたいなm
より下ってことかしら。
- 0個以上の
/NUM
かNUMh
ということは change
も key origin に入れてしまってよいのかな?
それとも慣例的にそうなっているとか。
しかしまあなんというか、公開鍵が入れられるわ、WIF が入れられるわ、Extended な Key が入れられるわ、なかなか大変だ。
昨日は tr()
だけ知りたかったので BIP-386 しか見なかったけど、KEY
は BIP-380 の方に書いてあって、x-only な pubkey は tr()
だけだから特別に書いてあったのだな。
おわりに
descriptor wallet の記述を見ても慌てないくらいにはなったかな。
おまけ
Mutinynet
最初に載せた BDK のサンプルコードだが、結果は出力されるものの testnet で検索しても出てこない。
tpub
だから testnet か signet のはずなんだが。
一応 testnet4 も見てみたが該当無し。
いろいろやってみたけど TXID すら出てこないとなると何か大元が違う?
よく見るとブロックチェーンを見に行くサイトが "https://mutinynet.com/api"
という知らないところだった。
Esplora だから blockstream.info か mempool.space だろうと思い込んでいた。
サイトを見に行くと mempool.space っぽい見た目だ。。。がブロック高が testnet3 でも 4 でも signet でもない。
ネットで検索すると、Mutinynet という独自 signet ということだった。
signet は独自でカスタマイズできるテスト用のチェーンである。
特に説明を付けない場合は Global Signet というか、Bitcoin Core にデフォルトで使われている signet のことを指している。
自分で signet を立てること自体はそこまで難しくないので、regtest よりももうちょっと広い範囲でテストしたいときにあると便利だ。
が、難しくないといっても面倒なので Global Signet をそのまま使ったりする。
Mutinynet は独自 signet でブロック生成が約30秒ごとに行われる。
テストなのでもうちょっと時間が早く進んでくれた方が助かる、というときに使うとよさそうだ。