Taproot

如果你用奇怪的 y 座標調整公鑰會發生什麼?

  • October 10, 2022

從 BIP341 開始,這個範常式式碼展示瞭如何調整 x-only pubkey:

def taproot_tweak_pubkey(pubkey, h):
   t = int_from_bytes(tagged_hash("TapTweak", pubkey + h))
   if t >= SECP256K1_ORDER:
       raise ValueError
   Q = point_add(lift_x(int_from_bytes(pubkey)), point_mul(G, t))
   return 0 if has_even_y(Q) else 1, bytes_from_int(x(Q))

(該函式lift_x將返回一個具有偶數 y 座標的點 (x, y)。)

我的問題是:如果你有一個密鑰產生了一個帶有奇數 y 座標的 pubkey,例如,然後簡單03af455f4989d122e9185f8c351dbaecd13adca3eef8a9d38ef8ffed6867e342e3地忽略第一個字節(03``af455f4989d122e9185f8c351dbaecd13adca3eef8a9d38ef8ffed6867e342e3``taproot_tweak_pubkey

您仍然可以通過鍵路徑和腳本路徑花費輸出嗎?如果是這樣,怎麼辦?

還有一個類似的問題:如果您實際上使用帶有奇數 y 座標的公鑰進行點加法,會發生什麼情況,例如:

Q = point_add(P_with_odd_y, point_mul(G, t))

在這種情況下,輸出是否仍然可以使用(來自鍵路徑或腳本路徑)?

My question is: what would happen if you had a secret key that produced a pubkey with an odd y-coordinate, eg 03af455f4989d122e9185f8c351dbaecd13adca3eef8a9d38ef8ffed6867e342e3, but then simply ignore the first byte (03) and passed in af455f4989d122e9185f8c351dbaecd13adca3eef8a9d38ef8ffed6867e342e3 to the taproot_tweak_pubkey function and sent funds to the結果調整了公鑰?

BIP340是比特幣 Schnorr 公鑰和 Schnorr 簽名的規範。secp256k1 曲線上的每個有效 x 座標都有兩個可能的 y 座標,因此每個密鑰都會產生兩個可能的 Schnorr pubkey(兩個可能的 y 座標)。BIP340選擇偶數的 y 座標作為有效的 BIP340 公鑰,奇數的 y 座標定義為無效的 BIP340 公鑰。這是 BIP340 最終確定時的設計選擇,但現在該設計選擇在網路上處於活動狀態,您必須遵循它來生成將通過 BIP340 簽名驗證算法的有效 BIP340 簽名。每個執行 Taproot 規則的全節點將只接受遵循 BIP340 規則的 Schnorr 簽名。如果您不遵循它們,您將產生無效的 BIP340 簽名,並且您將無法從該輸出中花費。

理論上,您可以在本地儲存 x 座標或奇數 y 座標,並且仍然能夠從中恢復,但是任何鏈上的內容(在 UTXO 中編碼的公鑰,未來嘗試從該 UTXO 中花費)都必須遵循 BIP340 規則。

您仍然可以通過鍵路徑和腳本路徑花費輸出嗎?如果是這樣,怎麼辦?

不,如果您必須生成簽名並且不遵循 BIP340 簽名算法的先決條件,您將不會生成有效的 BIP340 簽名。

還有一個類似的問題:如果您實際上使用帶有奇數 y 座標的公鑰進行點加法,會發生什麼情況,例如:

Q = point_add(P_with_odd_y, point_mul(G, t)) 在這種情況下,輸出是否仍然可以使用(來自鍵路徑或腳本路徑)?

一樣的答案。如果您沒有按照 BIP341 規則的規定和 BIP341 驗證規則所期望的那樣執行 Taproot 調整,那麼您將來從該輸出中花費的任何嘗試都將失敗。這些本質上都是共識規則,需要遵循和執行以防止網路分裂。

引用自:https://bitcoin.stackexchange.com/questions/115503