上篇介绍了交易过程中用到的数据结构,这一篇 介绍下交易的原理,关于交易的代码细节方面还没有看的特别明白,只写写交易的原理吧,代码级别的放到下一篇中。一个交易要被创建,广播出去,然后进行验证。上篇写到了,交易的数据结构,其实交易建立的过程就是在填充这样的数据结构。 以A给B转账说明整个过程,假如A已经获得了B的地址:
(1)A要查看自己的CWalletTx ,所谓自己的WalletTx 是指,out是指向自己的Tx,也即out 的scriptPubkey中的地址是自己的公钥生成的
(2) 然后在所有的这样的out中选择value大于或是几个之和大于转账金额的out
(3)根据选择的Out所在的Tx开始创建创建交易
根据B的地址生成的scriptPubkey和转账的金额,生成Txout,填充到vout的第一个元素中
如果选择的out的金额大于转账的金额,此时会有找零情况的发生。此种情况发生时,需要再生成一个Txout,该Txout的值为找零,scriptPubkey则是根据自己的地址生成的。然后将该Txout填充到下一个Txout中。
(4)根据在(3)所有选择的out来创建Txin,对于每一个out,使用out所在的Tx的hash,和位于Tx的index作为参数构建Txin,将该Txin添加到Vin中,
(5) 对每一个out都构建完Txin之后,需要生成Txin的scriptSig,由于每一个out的scriptPubkey(即锁定脚本) 是由自己的地址构成的,所以此时的解锁脚本可以由自己的私钥来生成签名。
由于交易费用是由交易的大小决定的,所以当交易创建好后,需要验证加上交易费用之后是否超过提供的金额,如果超过了,那么把添加交易费用后的金额作为需要转账的金额,重新开始计算。
网友评论