源碼參考
https://github.com/huangzhenshi/BuildBitCoinSystemGo/tree/master/blockchain_learn/chapter4
交易
- FindSpendableOutputs窃躲,找到屬于該用戶沒有被花掉的output數(shù)組始锚,這個(gè)output并不是這個(gè)用戶的所有的output加缘,只是該用戶的足夠滿足這筆交易金額的未花費(fèi)output
- 如果這個(gè)output數(shù)組的余額正好等于amout觅廓,那么就沒有找零,如果大于轉(zhuǎn)賬amout,則會(huì)系統(tǒng)產(chǎn)生一筆找零
- 如果該用戶所有的output的金額都小于轉(zhuǎn)賬金額提完,則拋出一個(gè)Panic,交易失敗
func NewUTXOTransaction(from, to string, amount int, bc *Blockchain) *Transaction {
var inputs []TXInput
var outputs []TXOutput
// 找到足夠的未花費(fèi)輸出
// validOutputs是一個(gè)非常巧妙的map丘侠,key為包含該用戶未花費(fèi)的入賬條交易的交易ID徒欣,value是一個(gè)int的數(shù)組,表示該交易的Vout的下標(biāo)
// value是一個(gè)該交易的Vout數(shù)組中的有效下標(biāo)(歸屬于該用戶的TXOutput)
acc, validOutputs := bc.FindSpendableOutputs(from, amount)
//這個(gè)用戶擁有的全部余額都不足蜗字,交易失敗
if acc < amount {
log.Panic("ERROR: Not enough funds")
}
//遍歷結(jié)果集
for txid, outs := range validOutputs {
txID, err := hex.DecodeString(txid)
if err != nil {
log.Panic(err)
}
for _, out := range outs {
input := TXInput{txID, out, from}
inputs = append(inputs, input)
}
}
outputs = append(outputs, TXOutput{amount, to})
// 如果 UTXO 總數(shù)超過所需打肝,則產(chǎn)生找零
if acc > amount {
outputs = append(outputs, TXOutput{acc - amount, from})
}
tx := Transaction{nil, inputs, outputs}
tx.SetID()
return &tx
}