区块链UTXO集源码分析
资源
前提
在未实现UTXO集之前,假设系统需要查询某个钱包地址的余额,系统需要遍历区块链的所有区块,当区块链非常长时,这种做法的成本太高了。
UTXO集是未花费交易输出的集合,它存储区块链中所有未花费交易输出。在实现UTXO集后,系统只需要遍历UTXO集就可以得到某个钱包地址的余额(或者其他操作)。
它的结构体如下:
// UTXOSet represents UTXO set
type UTXOSet struct {
Blockchain *Blockchain
}
可以看到,UTXOSet的结构体中有一个区块链的指针,实际上我们需要通过这个区块链的指针来获得数据库连接(因为UTXO集合的内容是存储在数据库中的)。
源码分析
Reindex
下面是UTXOSet的Reindex方法,该方法将为区块链中所有的未花费交易输出建立Key-Value的索引。(其中,Key是交易的ID,Value是该交易ID下未花费交易输出的集合)
func (u UTXOSet) Reindex() {
db := u.Blockchain.db
bucketName := []byte(utxoBucket)
err := db.Update(func(tx *bolt.Tx) error {
err := tx.DeleteBucket(bucketName)
_, err = tx.CreateBucket(bucketName)
})
UTXO := u.Blockchain.FindUTXO()
err = db.Update(func(tx *bolt.Tx) error {
b := tx.Bucket(bucketName)
for txID, outs := range UTXO {
key, err := hex.DecodeString(txID)
err = b.Put(key, outs