比特币中,TXI关联TXO的逻辑和经典的“先有鸡还是先有蛋”的问题是一样的。比特币是先有蛋(TXO)后有鸡(TXI),TXO先于TXI出现。
当blockchain的首个block(即genesis block)被挖到后,会生成一个coinbase交易。coinbase交易是一种特殊的交易,该TXI不会引用任何TXO,而会直接生成一个TXO,这是作为奖励给矿工的。
Blockchain以genesis block开头,该block生成blockchain中第一个TXO。由于之前没有任何交易,因此该TXI不会与任何TXO关联。
下面创建一个coinbase交易:
func NewCoinbaseTX(to, data string) *Transaction {
if data == "" {
data = fmt.Sprintf("Reward to '%s'", to)
}
txin := TXInput{[]byte{}, -1, data}
txout := TXOutput{subsidy, to}
tx := Transaction{nil, []TXInput{txin}, []TXOutput{txout}}
tx.SetID()
return &tx
}
coinbase仅有一个TXI,该TXI的Txid为空,Vout设置为-1,同时ScriptSig中存储的不是脚本,而仅仅是一个普通字符串。
比特币中,第一个coinbase交易包含如下信息“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks”
Subsidy是挖矿的奖励值,比特币中,该奖励值是基于总block数量计算得到的。挖出genesis奖励50BTC,每挖出210000个block,奖励值减半。我们的实现中,该奖励值是一个常量。