Bitcoin-Core-Development

為什麼在創世塊中 scriptSig 是這樣格式化的(函式 CreateGenesisBlock 內部)

  • July 15, 2020

我正在探索static CBlock CreateGenesisBlock里面的函式src/chainparams.cpp,我正在研究 Satoshi 創建它的 scriptSig 的方式:

txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << std::vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));

CScript正在使用以下輸入構造 CScript 類的對象:

486604799 Nonce

CScriptNum(4)是否是 extraNonce

pszTimestamp只是一個字元串“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”;

為什麼scriptSig格式是這樣的,不應該scriptSig包含整個交易的簽名(不僅僅是它的一小部分)和簽署交易的人的公鑰?

coinbase 交易的scriptSig領域是特殊的。它根本不需要任何簽名,因為沒有花費任何硬幣。該輸入所代表的產生新硬幣的能力是協議所固有的——每個區塊都被允許產生一定數量的固定數量的硬幣。要求在其上簽名將是浪費且毫無意義的。我們應該期望使用哪個密鑰進行簽名?礦工在設計上沒有身份,因為它是未經許可的。

相反,該欄位僅包含礦工選擇的任意數據。當標頭中的隨機數溢出時,它可以用作“額外隨機數”。BIP34 使用它來儲存塊高度。它可以進一步用於儲存消息——這就是這裡發生的事情。

至於為什麼中本聰選擇了那個特定的結構,恐怕你得問他了。

另請注意,創世塊是由協議硬編碼的,因此沒有適用於它的真正規則。它可以被宣佈為任何東西。

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