区块链余额查询流程
初始化阶段
创建一个空的 unspentTXs 切片,用来存储所有未花费的交易。
创建一个空的 spentTXOs 映射,存储已花费的交易输出(以 txID 和输出索引的方式标记已花费的输出)。
迭代器获取
获取区块链的迭代器:
调用 bc.Iterator() 获取一个迭代器 bci,用于遍历区块链中的每一个区块。
区块遍历过程
区块获取
使用 bci.Next() 获取下一个区块 block。
如果区块的 PrevBlockHash 长度为零,表示遍历到了区块链的头部,停止遍历。
交易遍历
对每个区块中的所有交易(block.Transactions),执行以下步骤:
- 获取交易的 txID,并将其转为十六进制字符串。
输出检查
对当前交易的每个输出(tx.Vout),执行以下步骤:
- 如果该输出已经在 spentTXOs 中标记为已花费,跳过该输出(继续检查下一个输出)
- 检查当前输出是否能被 address 解锁(out.CanBeUnlockedWith(address))
- 如果可以解锁,则将当前交易添加到 unspentTXs 中
输入处理
如果当前交易不是一个 coinbase 交易(即它不是系统奖励的交易),则继续遍历交易的输入(tx.Vin)。
对每个输入,检查其是否能用 address 解锁(in.CanUnlockOutputWith(address)):
- 如果能解锁,说明该输入花费了某个输出
- 根据输入的 Txid 和 Vout,标记该输出为已花费,添加到 spentTXOs 中
遍历终止
重复上述步骤直到遍历所有区块:
如果区块的 PrevBlockHash 长度为零,说明已经遍历到链头,退出遍历。
结果返回
返回 unspentTXs,其中包含了所有与特定地址相关且未被花费的交易。
评论