Terminology
Taproot中的控制塊是什麼?
Taproot上下文中“控制塊”的定義是什麼?
它在 Bitcoin Core repo 和BIP 341中的standard.cpp中被引用。
使用 Taproot 輸出有兩種可能的方式:
- 通過密鑰路徑:只需提供一個 BIP340 簽名,使用輸出中的公鑰對支出交易進行簽名。
- 通過腳本路徑:顯示輸出實際上是經過調整的密鑰,通過顯示原始和調整,並顯示此調整送出到腳本葉。這就是控制塊發揮作用的地方。
當通過腳本路徑消費時,簽名者必須提供一些數據來驗證他們的消費:
- 公開的劇本。
- 滿足該腳本所需的輸入(簽名和它可能需要的任何其他數據)。
- 葉版本(目前,始終為 0xc0,如 BIP342 中所指定)。
- 內部密鑰(調整前的公鑰)
- 用於證明調整送出到顯示的腳本和葉版本(#1 和 #2)的 Merkle 路徑。
- 指示輸出鍵是否被否定的符號位(這是啟用批量驗證所必需的)。
調整本身沒有透露。它由驗證者根據顯示的腳本、葉子版本和內部密鑰重新計算。然後驗證使用該調整調整內部密鑰與輸出中的公鑰匹配。
這給我們帶來了一個問題,即所有這些資訊是如何在支出輸入的見證堆棧中編碼的:
首先,腳本的所有輸入都被使用(上面的#2)
作為倒數第二個項目,揭示的腳本(上面的#1)
作為最後一項,控制塊,它包含所有其他資訊:
- 它的第一個字節儲存葉子版本(#3)(前 7 位)和符號位(#6)(下位)。
- 接下來的 32 個字節儲存內部公鑰(#4)的(僅 X 座標,因為只有 x 密鑰)
- 之後的每個 32 字節塊編碼 Merkle 路徑 (#5) 的一個組件,該路徑將葉連接到根(然後是調整),以自下而上的方向進行。