Coinbase-Transaction
Coinbase 交易是否需要簽名?
我正在嘗試通過以下步驟建立一個用於挖礦的硬幣庫:
1-創建虛擬輸入和輸出。
2-將它們作為集合傳遞給 CreateRawTransaction/
3-取回一筆交易,根據coinbase結構填空欄位(特地設置Txout的Value為12.5比特幣)。
4-將事務序列化為十六進製字元串模式。
通過在 RegTest 模式下執行上述步驟,創建了一個新塊並將 50 個比特幣添加到錢包中,這似乎是正確的,但據我所知,應該簽署交易,Coinbase 是否被排除在簽名程序之外?以及為什麼要向帳戶中添加 50 個比特幣,而不是我具體設置為 12.5 個比特幣的金額?
public async Task<string> BuildCoinbaseTransaction(string MinerAddress, uint Height) { string coinTxSerialized = string.Empty; scriptData = Tools.RandomNumbers(rEngine); string pubKey = await GetPublicKey(MinerAddress); string scriptPubKey = CreateCoinbaseScript(pubKey); List<object> txi = new List<object> { new CoinIn { TxId = "0".PadLeft(64, '0'), Index = 0x0 } }; List<object> txo = new List<object> { new Dictionary<string, double> { { MinerAddress, 0.00 } } }; RPCResult<string> rpcResult = await cmd.CreateRawTransactionAsync(txi, txo); if (rpcResult.Error == null) { TotalReward = Math.Min(RewardCoins + CollectedFee, MaxCoinbaseValue); string rawCoinbase = rpcResult.Result; string decodedTx = await cmd.DecodeRawTransaction_CommandAsync(rawCoinbase); RPCResult<string> Transaction jsonTx= JsonConvert.DeserializeObject<RPCResult<string>>(decodedTx); Transaction coinTx = jsonTx.Result; coinTx.Height = BuildHeight(Height); coinTx.TxIn.FirstOrDefault().Coinbase = scriptData; coinTx.TxIn.FirstOrDefault().Sequence = 0xFFFFFFFF; coinTx.TxOut.FirstOrDefault().Value = TotalReward; coinTx.TxOut.FirstOrDefault().ScriptPubKey.Assembely = scriptPubKey; coinTx.Hex = coinTx.ToString(); coinTxSerialized = coinTx.Hex; return coinTxSerialized; }//if }//BuildCoinbaseTransaction
coinbase 交易由礦工/礦池運營商建構,不是可以廣播到記憶體池的交易。
coinbase 的輸出量嚴格按照區塊高度,從 50 BTC 開始,在 regtest 模式下每 150 個區塊減半。當您在 regtest 模式下創建一個新區塊時,它會自動生成一個 coinbase 交易,並將輸出支出到您指定的 coinbase 錢包。
coinbase的輸入腳本有[blockheight(4B)]和附加數據,總共最大100B。
輸入:
- 以前的 TX 雜湊:
00..00
- 以前的輸出索引:
max_value(ff..ff)
- 輸入腳本:
[blockheight (4B)] [additional arbitrary data]
輸入沒有簽名,因為它沒有從 UTXO 中花費。除了送出到具有有效 POW 的標頭之外,沒有其他鎖定條件。