比特币源码分析之二:交易
交易(Tx)
在源码中的结构体为CTransaction(transaction.h),主要包含一些字段
nVersion 代表了一个交易的版本号(当前是固定值2)
vin 是一个代表交易输入的集合(数组),对应的结构是CTxIn
vout 是一个代表交易输出的集合(数组),对应的结构是CTxOut
nLockTime 一个代表锁定时间的变量,这个变量会被用来复杂类型的交易,为了减少理解难度前期先不关注
为了理解方便,简化一下结构,一个交易就是包含一组输入和一组输出的集合
输入(TxIn)
在源码中的结构体为CTxIn(transaction.h)主要字段如下
Prevout 一个指向输入对应输出的索引(钱从哪里来),由tx的hash和对应tx中vout的index组成
scriptSig 输入脚本,和输出脚本结合完成交易,输入脚本可以理解为一把钥匙,表明了这个输入可以解开它对应的输出锁的脚本
nSequence 和tx中的nLockTime一起来完成一些复杂类型的交易,后续系列一起介绍,当前暂时不关注
scriptWitness 比特币交易的升级版本,后续系列单独介绍,只需要知道是比特币因为一个漏洞的升级版本,原始版本中不存在,所以暂时不影响理解
简化为 一个代表输入对应输出的索引和一把解开对应输出的钥匙脚本
输出(TxOut)
在源码中的结构体为CTxOut (transaction.h)主要字段如下
nValue 代表花费多少
scriptPubKey 输出脚本,对应TxIn的scriptSig ,表明要花这笔钱需要满足哪些条件的脚本,而TxIn的scriptSig是用来满足这个条件的,也就是一把锁
交易费用(Fee)
这是一个虚拟的概念,交易费,这个是支撑比特币可以正常运转的一个重要设计
一笔交易的Fee是所有的输入减去所有的输出剩余的比特币
下图表示了交易体系
图中TxB引用了TxA的输入,并且提供了能解开TxA输出脚本锁的钥匙(也就是拥有可以证明自己是Rich的私钥)
而上图中的Fee是1个比特币(3-2),这个比特币会给矿工(矿工挖矿会在专门的一篇中介绍)
注意:输入和输出都是一个数组,上图为了介绍简单只画了一个
下一篇会介绍输入和输出脚本是怎么协同工作的