区块链迭代器
根据区块的前哈希值遍历区块链
区块链迭代器demo
定义:
type lterator struct {
db *bolt.DB //存储区块链的键值数据库
currentHash []byte //存储当前区块哈希值的游标
}
//定义迭代器
func (bc *BlockChain) NewIterator() *lterator {
it := lterator{
db:bc.db,
currentHash:bc.tail,
}
return &it
}
获取下一个区块,这里区块链是存储在bolt
键值数据库中:
- 返回当前所指的区块
- 向左移动游标
func (it *lterator) Next() (block *Block) {
//读取
err := it.db.View(func(tx *bolt.Tx) error {
//读取bucket
bucket := tx.Bucket([]byte(bucketBlock))
if bucket == nil {
return errors.New("error")
}
blockTmpInfo := bucket.Get(it.currentHash)
block = Deserialize(blockTmpInfo)
//游标左移动
it.currentHash = block.PrevHash
return nil
})
if err != nil {
fmt.Println("iterator next err:", err)
return nil
}
return
}
测试:
//调用迭代器,输出blockChain
it := bc.NewIterator()
for {
//调用Next方法,获取区块,游标左移
block := it.Next()
//退出条件
if block.PrevHash == nil {
fmt.Println("区块链遍历结束!")
break
}
}