hiro99ma blog

Something technical

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* になるのか。

ということは 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秒ごとに行われる。
テストなのでもうちょっと時間が早く進んでくれた方が助かる、というときに使うとよさそうだ。


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage