Script
如果腳本無效,創世塊如何包含任意數據?
的COINBASE交易包含此劇本:04FFF001D010454626326262626262626262626262626262626262626262626262626262626262626262626262626262632726262626262626262627262626263262626262626262626263626269626562626626626262662662222066622220662220622066。
它將“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”的文本推入堆棧。
我聽說scriptsig 是無效的,除非堆棧中只有一個條目並且該條目是'1’。所以這個腳本是無效的。
這就是為什麼人們說創世塊中產生的硬幣是不可消費的嗎?
有四個原因(每個單獨就足夠了):
- 根據定義,創世塊是有效的。它永遠不會被驗證。根據定義,它只是鏈的第一個塊,其他所有塊都必須建立在它之上。換句話說:驗證高度為 0 的塊的規則是“它必須匹配創世塊的雜湊”,而不是任何其他正常的有效性規則。
- 您所指的腳本是 coinbase 交易的輸入。即使創世區塊根據定義無效,或者如果這發生在另一個區塊中,coinbase 輸入腳本也不會實際執行。它們僅用於允許礦工將額外的 nonce 資訊插入塊中,以及(自 2012 年以來)BIP34 幣基高度規則。
- 您所指的規則(執行後生成的堆棧必須只包含一個元素)只是一個策略規則(即違反它的交易不會被現代比特幣核心節點中繼),但這並不是一個共識規則,每個節點和礦工必須服從。該規則在某個時候被提議為共識規則(在 BIP62 中,但從未被採用,然後被撤回)。在 BIP342(taproot 腳本執行)中,這個規則實際上是一個共識規則,但你指的情況並不是這樣的花費。
- 您所指的策略規則僅適用於執行輸入(解鎖,scriptSig)和輸出(鎖定,scriptPubKey)腳本後的最終堆棧。腳本執行首先執行輸入腳本,然後執行在相同初始堆棧上花費的 UTXO 的輸出腳本。該規則僅與兩次執行後的最終狀態有關,而不僅僅是在輸入腳本之後,因此此策略規則不適用。在 coinbase 輸入的情況下,甚至沒有輸出腳本,因此它甚至無法應用。
創世幣庫交易輸出不可花費的原因與上述所有無關,因為它是關於它的輸出,而不是它的輸入。原因是初始軟體從未(有意或無意地)將創世塊添加到其內部數據庫中,因此無法檢索其輸出以用於支出。如今,Bitcoin Core 中的程式碼設計完全不同,但保留了沒有可使用創世塊輸出的行為,因為替代方案將是硬分叉。相反,在今天的軟體中,它只是一個硬編碼的例外:不能使用特定的輸出。