hiro99ma blog

何か技術的なこと

#

2025/01/17

はじめに

parity

tweak private key の計算で公開鍵の Y座標が奇数かどうかで処理が変わるところがある。
libsecp256k1 では公開鍵の Y座標を直接扱うことができないのでシリアライズして判定するしかなさそうだという話を一昨日くらいに書いた。

script path の control block で 1バイト目が 0xc0 + parity bit となっていて、この parity bit も公開鍵の Y座標が関係したビットだった。
libsecp256k1 を grep するのに “odd” とか “y coodinate” では見ていたが “parity” は調べていなかった。
pk_parity がポインタでの引数になっている場合は戻り値で受け取れそうだ(こういうの)。

おお、やるじゃないかと思ったが、pk_parity の説明文は even/odd ではなく “negation” と書いてある。
BIP-341 の parity の説明だとなんだかわからない。。。。

First, we define taproot_tweak_pubkey for 32-byte BIP340 public key arrays. The function returns a bit indicating the tweaked public key’s Y coordinate as well as the public key byte array. The parity bit will be required for spending the output with a script path.

ただ parity に関係する公開鍵は「tweak public key」と書いてあるし、script path で必要と書いてあるので tweak private key などでは使えなさそうだ。
ヘッダファイルも include/secp256k1_extrakeys.h にあるこれらの関数にしか pk_parity がないので tweak 関係だけだろう。

残念だ。

試作中

script path をまったく確認しないとあとあと公開しそうなので、今のうちにやっておくことにした。
ライブラリに仕立てたりせず、もう計算の確認だけだ。

こちらのデータを使う。

locking script はこんな感じで 1つしかスクリプトが無い。
merkle tree も簡単だ。 TapBranch の計算は確認できないが、ぜいたくを言ってはいけない。

20 6d4ddc0e47d2e8f82cbe2fc2d0d749e7bd3338112cecdc76d8f831ae6620dbe0
OP_CHECKSIG

merkle root を求める実装はブロックデータを作る試作をしたときに作っていたので、それに当てはめればよかった。
TapLeaf の計算は TapTweak と同じなので、キーワードとメッセージを変更するだけだ。
一昨日くらいに scriptPubKey のデータを管理するときに script形式のデータ長をデータの先頭に含めるかどうかでゴニョゴニョ書いたが、こういう witness program でもないのにスクリプトのデータ長を含まないパターンがあるとなるとちょっと悩む。 データ長が入っているなら取り除けば良いだけなのだが、どちらの方が使うことが多いかで決めるくらいしかやりようがないか。

merkle root の計算までは一致した。
なので tweak public key の計算もうまく行くとは思うが、前回作った関数が public key を引数に取るようになっているので改造がいる。
現状のまま public key を受け取るか、internal public key を受け取るように変更するか。 internal private key から生成するなら考えなくて良いのだが、今回使っているサンプルは internal public key からの提供になっているのだ。
internal private/public key と tweak で管理した方がよいのかな? tweak private/public key もセットで?
わからんな。

ただ、みんな型名で xonly みたいな呼び方にしている理由は分かった。
tweak って付けると internal pubkey を表すのに不適切な型になってしまうのだね(tweak_pubkey_tという名前を付けていた私)。。。

ひとまず、internal public key と leaf script(leftだけ)から、tweak, tweak public key, scriptPubKey, アドレスまでは計算が一致した。
ここら辺は key path で作っていた内容からコピーして作ったりパラメータを追加するなどで対応できた。

明日は署名できるとうれしい。

< Top page