比特币使用UTXO模型做为交易底层数据结构,UTXO 是 Unspent Transaction Output 的缩写,也就是未被使用的交易输出。本质上,就是只记录交易本身,而不记录交易的结果。比特币使用前后链接的区块(可以简单的理解为交易组成的集合)记录所有交易,每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。当之前的 UTXO 出现在后续交易的输入时,就表示这个 UTXO 已经花费掉了,不再是 UTXO 了。如果从第一个区块开始逐步计算所有比特币地址中的余额,就可以计算出不同时间的各个比特币账户的余额了。下面将结合比特币钱包源码0.1.0对比特币中的交易做详细说明。
1 数据结构及相关定义 1.1 区块交易会被打包到区块中,打包成功的区块会被序列化到本地文件中,区块定义如下(只给出了主要类成员):
1 class CBlock 2 { 3 public: 4 // header 5 int nVersion; // 版本 6 uint256 hashPrevBlock; // 上一个块哈希值 7 uint256 hashMerkleRoot; // MerkleRoot哈希值 8 unsigned int nTime; // 时间戳 9 unsigned int nBits; // 块目标值 10 unsigned int nNonce; // nonce值 11 12 // network and disk 13 vector<CTransaction> vtx; // 交易 14 ... 15 }