rust: rust-bitcoin と BDK (3)
2025/09/18
前回の続き。
SegWit V1
昨日は SegWit V0 の P2WPKH だった。今日は SegWit V1 の P2TR(key path)である。
コードはほとんど同じになるかと思ったのだが、そうでもなかった。
V0 の書き方を変更すればあわせられそうな感じはする。
P2TR がどうなるかわからないときに実装されてちょっと思ってのと違うようになったとか?
想像しても仕方ない。
senders_keys()
- keypair を返すようになった。V0 でも witness stack で pubkey がいるのだからそうしておけばよかったと思う。
receivers_address()
Address::from_str()
から"アドレス".parse::<Address<_>>()
になった。- Bech32 と書いてあるけど P2TR だから Bech32m だよね?
Address::from_str()
でもできたのでお好みで?- struct Address に BIP350 が載っているのでさすがに Bech32m はダメということはないと思う。
dummy_unspent_transaction_output()
- Verification trait は secp256k1 の方だ
internal_key
を引数に取っているが、これは pubkey の方なんだな。確かに BIP341 も “internal key” は pubkey なのだけどinternal_pubkey
でもあるのだ。BIP の方が紛らわしくしているな。- 署名できる prevouts を作りたいというだけなので深く考えなくて良いだろう
main()
- さすがにいろいろ違う。
- タプルで値を返すことができると便利だな。。C言語だと引数に全部展開するか構造体作るかのどちらかでちょっとわずらわしい。
- taproot_key_spend_signature_hash() は p2wpkh_signature_hash() と違って prevouts を引数に取る。
- Prevouts::All は Variants だそうだが、Variants ってなんだっけ?
- enum らしい(ChatGPT)。
SIGHASH_ALL
的な、input は全部対象にするという All のようだ。
- enum らしい(ChatGPT)。
- Prevouts::All は Variants だそうだが、Variants ってなんだっけ?
- sighash と sig を求めるのに 10行程度で済むのか。。。
ライブラリががんばっているというのもあるだろうが、ステップ数が少ないというだけでずいぶんと楽だと感じた。
まあ、一から書けといわれたら書けないけど、それは他の言語でも同じだからよいのだ。
writer: hiro99ma