初始化阶段

创建一个空的 unspentTXs 切片,用来存储所有未花费的交易。

创建一个空的 spentTXOs 映射,存储已花费的交易输出(以 txID 和输出索引的方式标记已花费的输出)。

迭代器获取

获取区块链的迭代器:
调用 bc.Iterator() 获取一个迭代器 bci,用于遍历区块链中的每一个区块。

区块遍历过程

区块获取

使用 bci.Next() 获取下一个区块 block。

如果区块的 PrevBlockHash 长度为零,表示遍历到了区块链的头部,停止遍历。

交易遍历

对每个区块中的所有交易(block.Transactions),执行以下步骤:

  1. 获取交易的 txID,并将其转为十六进制字符串。

输出检查

对当前交易的每个输出(tx.Vout),执行以下步骤:

  1. 如果该输出已经在 spentTXOs 中标记为已花费,跳过该输出(继续检查下一个输出)
  2. 检查当前输出是否能被 address 解锁(out.CanBeUnlockedWith(address))
  3. 如果可以解锁,则将当前交易添加到 unspentTXs 中

输入处理

如果当前交易不是一个 coinbase 交易(即它不是系统奖励的交易),则继续遍历交易的输入(tx.Vin)。

对每个输入,检查其是否能用 address 解锁(in.CanUnlockOutputWith(address)):

  • 如果能解锁,说明该输入花费了某个输出
  • 根据输入的 Txid 和 Vout,标记该输出为已花费,添加到 spentTXOs 中

遍历终止

重复上述步骤直到遍历所有区块:
如果区块的 PrevBlockHash 长度为零,说明已经遍历到链头,退出遍历。

结果返回

返回 unspentTXs,其中包含了所有与特定地址相关且未被花费的交易。