比特币数据库中只有交易,没用地方存储账户余额

每个交易都要以以前的交易为基础,而不是以特定字段记录余额为基础,而是一切都在交易记录中

我们的钱零散的分布在不同的交易中。如果想要知道某个地址的余额,需要遍历整个账本,把所有属于地址的钱统计累加。

比特币找零机制

比特币是防篡改的,当转账时候需要把上币张三的钱全部花掉,扣除转给李四的钱,余额转给自己,类似于现实生活中的找零机制。

比特币的交易形式 

1、普通交易(找零)
2、多对一(凑零钱付款)
3、一对多(代发工资)
4、多对多(大额支付加找零)

交易输出(output)如何产生

输出产生流程

张三给李四转账时,比特币系统会生成一个output,这个output里面包括:
1、转的金额,例如100
2、一个锁定脚本,使用李四的公钥哈希对转账金额1btc进行锁定 (钱被李四的公钥哈希加密了,只有李四才能解开)

需要注意
公钥哈希加密而不是用转账地址,地址可以推出来公钥哈希(见地址生成规则

交易输入(input)
与output对应的是input结构,每一个input都源自一个output,在李四对王五进行转账时,系统会创建input,为了定位这笔钱的来源,这个input结构会包含以下内容:
1、在哪一笔交易中,转账交易ID hash
2、所引用交易的output,所以需要一个output索引int
3、定位到了这个output,如何证明能支配,需要张三签名(解锁脚本,包括签名和自己的公钥)

注意:
1、不用关心解锁脚本原理,只需要记得这个能解开用我的公钥加密的比特币
2、挖矿奖励不需要引用任何output,相当于有一个特殊的input

解锁流程

锁定的过程理解为一个函数,输入的参数是收款人的公钥哈希,里面有锁定的逻辑

未消费输出(UTXO)

文件夹内blocks存放区块链数据,chainstate存放UTXO的数据,因此转账时无须遍历整个区块链

UTXO示例

使用比特币客户端校验测试

先发起一笔一对多个地址的转账交易
gettransaction 交易哈希
decoderawtransaction 解码上面的hex编码 查看交易vin vout

vin:input
1、引用交易ID
2、应用output的索引

vout:output
1、转账金额
2、锁定脚本(先用地址模拟)