Mining-Theory

關於 Coinbase 交易結構的一些疑問?

  • August 21, 2021

我試圖了解 coinbase 交易的結構。我嘗試了一些來源,但我仍然對只有 1 個輸出的結構有一些疑問。這是我所知道的,疑問以**?** :

[PARAMETER]                  [SIZE]   [ENDIANNESS] [ALLOWED VALUES]

- version                      - 4 Bytes   - LE  - 01000000 
- input count                  - 1 Bytes   - xx  - 01 
- prev tx                      - 32 Bytes  - xx  - 0000000000...0000
- prev out n                   - 4 Bytes   - xx  - ffffffff (outpoint index or fake index)
- coinbase script length (LCS) - <?> Bytes - <?> - <what is value range of LCS i.e. min and max Bytes?>
- coinbase script              - LCS Bytes : 
                                               1 Bytes       - xx - 03 (Size of Block Height in next 3 Bytes)
                                               3 Bytes       - LE - __ (Valid Block Height in LE for Block being mined)
                                               [LCS-4 Bytes] - xx - xx (ANY binary string is Valid. ANY STRING!!!!)

- sequence                     - 4 Bytes   - xx  - ffffffff
- output count                 - 1 Bytes   - xx  - 01
- value                        - <?> Bytes - LE  - __ (mining reward + transaction fee of all other included transactions in Satoshi)

- script length (SL)           - 1 Bytes   - xx  - (what is value range of SL i.e. min and max bytes, or is it fixed size?)
- pubkey script                - SL Bytes  - <?> - __ (What is this?! Is it the wallet address or the public key or something else - of the person who recieves the funds in 'value'?)
- locktime                     - 4 Bytes   - xx  - 00000000


Notation:

LE    - Little Endian.
BE    - Big Endian.
xx    - Endianness doesn't matter.
__    - User input.
<..?> - Unclear.'''

Q1: Can someone please address the doubts marked by ? and validate if rest of the structure is correct?

Q2: Does coinbase script have any additional structure, rules or constraints that I missed including here (other than above) that can make the transaction invalid?

這些是我目前所知道的對 coinbase 交易的要求。

交易的結構與其他交易一樣,但並非所有欄位都具有相同的含義。

  • 版本:32 位 LE 整數。對於普通事務,版本號只能是 1 或 2(相對時間鎖語義,參見 BIP 68)。對於 coinbase 交易,它沒有任何意義,可以是任何東西。

  • 交易輸入:對於正常交易,指的是一組未花費的先前正在花費的交易輸出。對於 coinbase 交易,它不同,必須恰好有 1 個輸入,並且必須具有特定值。

    • Prevout 雜湊:必須為 0000…000

    • Prevout 索引:必須為 0xffffffff

    • scriptSig:對於正常(非隔離見證,見 BIP141)交易,包含證明該交易是由前一個被花費的代幣持有者授權的證明。對於 coinbase 交易,它具有不同的語義。相反,它必須:

      • 從推塊高度開始(在 BIP34 中指定)
      • 後跟任意數據(通常稱為 extraNonce)
      • 整個 scriptSig 必須正好在 2 到 100 個字節之間(此規則早於 BIP34,因此它的下限 2 現在被塊高度推送已經大於該值的事實所取代)。
    • nSequence:對於普通交易,此欄位影響 BIP125 RBF 語義和相對鎖定時間語義 (BIP 68),但這些不適用於 coinbase 交易。可以是任何東西。

  • 交易輸出:確定該交易創建了哪些 UTXO。普通交易和 coinbase 交易的語義相同。特別是,它可以包含任意數量的輸出。通常,它將包含一個或多個輸出,將開采的硬幣(補貼+區塊中其他交易的 tx 費用)提供給礦工,以及一些用於各種目的的虛擬 0 值輸出(其中之一是隔離見證承諾,如果這是segwit 塊,參見 BIP141)。

  • nLockTime:這具有絕對鎖定時間語義(說明交易何時生效),適用於普通交易和 coinbase 交易。

所以直接回答你的問題:

- version                      - 4 Bytes   - LE  - 01000000 

事實上,它可以是任何 4 字節的值。

- input count                  - 1 Bytes   - xx  - 01 
- prev tx                      - 32 Bytes  - xx  - 0000000000...0000
- prev out n                   - 4 Bytes   - xx  - ffffffff (outpoint index or fake index)

正確的。

- coinbase script length (LCS) - <?> Bytes - <?> - <what is value range of LCS i.e. min and max Bytes?>
- coinbase script              - LCS Bytes : 
                                               1 Bytes       - xx - 03 (Size of Block Height in next 3 Bytes)
                                               3 Bytes       - LE - __ (Valid Block Height in LE for Block being mined)
                                               [LCS-4 Bytes] - xx - xx (ANY binary string is Valid. ANY STRING!!!!)

coinbase scriptSig 被編碼為 1 字節編碼腳本的長度,加上腳本本身。該腳本必須在 2 到 100 個字節之間。由於 BIP34,腳本必須以推動塊高度開始。對於目前的高度範圍(65536 到 16777215),這是一個 0x03 表示一個 3 字節的推送,後跟 3 個字節編碼 LE 中的塊高度。之後,最多可以有 96 個其他字節,它們的內容確實無關緊要。

- sequence                     - 4 Bytes   - xx  - ffffffff

這可以是任何東西。

- output count                 - 1 Bytes   - xx  - 01
- value                        - <?> Bytes - LE  - __ (mining reward + transaction fee of all other included transactions in Satoshi)

正確的。實際上,您可以有多個輸出(並且它們的值總和必須與補貼 + tx 費用相匹配),但是 1 可以正常工作。如果要創建隔離見證塊(參見 BIP141),還需要有另一個具有特定結構的零值輸出;有關詳細資訊,請參閱 BIP。

- script length (SL)           - 1 Bytes   - xx  - (what is value range of SL i.e. min and max bytes, or is it fixed size?)
- pubkey script                - SL Bytes  - <?> - __ (What is this?! Is it the wallet address or the public key or something else - of the person who recieves the funds in 'value'?)

這是你想獲得挖礦獎勵的地址對應的scriptPubKey。有許多軟體庫可以為您將地址解碼為腳本,並在此站點上提供解釋它的答案。

- locktime                     - 4 Bytes   - xx  - 00000000

不是嚴格要求的,因為還有其他允許的值,但它們必須導致“最終”交易,這取決於區塊的高度和時間戳。在此處選擇 00000000 將始終有效。

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