六.转账交易
创世区块创建完毕之后,按照我们的正常思路,是继续创建新的区块,并加入至区块链中,没错,这确实是学习路线,但是我们首先来了解一个区块是如何生成的,转账交易 ===>打包交易 ===>工作量证明 ===>生成区块
在上文,我们提到了钱包地址这个概念,我们一般可以简单将钱包地址理解为一个银行账户,那么交易也就可以理解为是地址与地址之间的转账过程。
因为这部分内容非常重要,设置可以说交易就是比特币原理的核心,所以,为了保证大家对概念有充分的了解,本章节的理论描述部分此处摘录liuchengxu中关于对交易的翻译。
1.概念
交易(transaction)是比特币的核心所在,而区块链唯一的目的,也正是为了能够安全可靠地存储交易。在区块链中,交易一旦被创建,就没有任何人能够再去修改或是删除它。今天,我们将会开始实现交易。不过,由于交易是很大的话题,我会把它分为两部分来讲:在今天这个部分,我们会实现交易的基本框架。在第二部分,我们会继续讨论它的一些细节。
由于比特币采用的是 UTXO 模型,并非账户模型,并不直接存在“余额”这个概念,余额需要通过遍历整个交易历史得来。
关于UTXO模型,这在比特币中也是非常重要的概念模型,务必数量掌握。
点击此处查看相关的交易信息
图 交易记录
图 输入脚本
关于转账交易涉及到的内容非常多,由于时间原因,目前可能无法做到非常全面的讲解,姑且将自己梳理好能够解释清楚的地方分享出来,由于比特币世界中的交易规则会更加复杂化,所以,希望大家能够通过本章节的阅读,在一定程度上对某些概念有一些初步或者稍微深刻的理解,那么本章节的目的也就达到了,更深的分析笔者将会在后期的工作中根据实际的工作场景进行优化并做相关记录。
2.结构体定义
其实再转账交易这个功能里面,涉及了本文所有的结构体对象,由于区块与区块链对象等在上文已经有所提及,这里先列出跟转账交易关系最为密切的一些结构体。
2.1 交易Transaction
TxID: 交易ID,一般通过对交易进行哈希后得到
Vins: 交易输入数组
Vouts:交易输出数组
2.2 交易输入TxInput
TxID: 交易ID,表示该TxInput引用的TxOutput所在的交易ID
Vout:下标,表示该TxInput引用的TxOutput在交易中的位置
Signature:数字签名,用于对引用的TxOutput交易的解锁
PublicKey: 钱包的公钥,原始公钥
2.3 交易输出TxOutput
Value: 金额,转账/找零金额
PubKeyHash:输出脚本,此处为公钥哈希,用于锁定该笔交易输出
2.4 未花费交易输出UTXO
UTXO:Unspent Transaction output
TxID: 该TxOutput所在的交易id
Index:该TxOutput 的下标
Output:TxOutput对象
2.5 未花费交易输出集合 UTXOSet
定义一个常量用于标识存入数据库中的Bucket表名
3.转账交易流程
单笔转账
多笔转账
这部分内容理解起来有些难度,所以我做了一张图,希望能够帮助大家能够理顺思路,这样在后面的学习以及代码理解上面会稍微容易一些。
本图介绍了从创世区块后的三次转账过程,分别产生了三个区块,为了让读者有更直观的了解,我又将该图做成了动态图的方式供大家参考,通过该图,希望大家能够大致对转账交易有个印象。
动态图演示了新区块中的输入交易引用的是哪个区块中的交易输出,从而实现了区块链每次转账的金额都有据可依,也从另外一个角度展示了比特币中UTXO的概念模型。
4.代码分析
由于代码量巨大,为了让整个过程的理解更加流程,我改变前面几篇文章的思路,从执行命令的代码块进行一步一步的代码分析,希望能将自己的思路理顺,从而可以更好得引导读者朋友。
同样,因为很多概念性的东西,我不准备在文章里面啰嗦,如果感觉阅读难度比较大,建议先仔细阅读这篇文章
https://github.com/liuchengxu/blockchain-tutorial
然后再回头来看我的这篇文章,会事半功倍
4.1 获取blockchain对象
判断存储区块的DB文件是否存在,如果存在,直接从数据库Bucket中读取"l"对应Hash值,将db对象与获取到hash值赋值给需要返回的区块链对象,如果DB文件不存在,说明创世区块并未创建,没有区块链对象,直接退出程序。
4.2 生成区块
获取到区块链对象之后,我们调用MineNewBlock方法进行区块的创建
4.2.1 新建交易
在以上的代码中,涉及到几个比较重要的方法,其中一个NewSimpleTransaction用于创建交易并打包,这里对代码进行了简单梳理,由于内容实在太多,在文章末尾我会将github的源代码地址贴出,供大家查看。
(1) 创建该交易的TxInput
(2) 创建该交易的TxOutput
(3) 创建交易
NewSimpleTransaction
FindSpentableUTXOs
FindUnpackeSpentableUTXO
caculate
(4) 设置签名
SignTransaction
Sign
TrimmedCopy
4.2.2 验证交易
4.2.3 创建CoinBase交易
在每个区块中创建一个CoinBase交易作为奖励机制。
4.2.4 新建区块
4.2.5 持久化存储
4.3 更新UTXO集
删除本次交易产生的input对应的utxo
添加本次交易产生的新utxo
5.代码共享
由于转账交易这一块的内容代码量特别大,脑图跟交易流程图我也是花费了大量的时间进行整理,但是要一项一项进行代码分析,时间成本还是太大了,所以,将github的代码共享给大家,可以照着文章思路与思维导图中的路线进行适当的分析,https://github.com/DiaboFong/MyPublicChain
领取专属 10元无门槛券
私享最新 技术干货