交易是如何被创建和打包的4

Posted alfredzky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交易是如何被创建和打包的4相关的知识,希望对你有一定的参考价值。

被一个程序bug困扰了好久,今天终于解决了,原来是当时的一个变量写错了。

现在接着上次没有写完的东西继续写。SelectCoins();分析一下这个函数,这个函数是用来让你从自己的钱包选择可用的token的,选出后用一个变量进行存储的。先来看下函数原型:

bool SelectCoins(const CAmount& nTargetValue, std::set<std::pair<const CWalletTx,unsigned int>> &setCoinsRet, CAmount& nValueRet, const CCoinControl *coinControl = NULL, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend = true) const;

nTargetValue变量就是你要寻找的临界值,你要给接收方发送的数量。

setCoinsRet变量存储着所有的可用的交易和交易的位置

技术分享图片
 

对象vCoins存储着所有的可以作用交易输出的交易信息。下面介绍AvailableCoins();函数。

技术分享图片
 

默认coinControl是false,直接跳过。否则就是循环遍历进行填充,setCoinsRet.insert(make_pair(out.tx, out.i));

技术分享图片
 

这个默认传入的token的类型就是ALL_COINS。所以这个也是跳过的。和上面一样,这些都是对币的选择的。

技术分享图片
 

setPresetCoins存储的就是预设值。coinControl默认就是NULL;所以没有复制操作。

std::vector vPresetInputs;没有进行初始化所以里面是没有值的。所以下面的循环也没有进入。

技术分享图片
 
技术分享图片
 

循环遍历,如果之前存在预设值对象里面有的的话,进行删除。如果没有就跳过。

再把预设值对象含有的进行赋值给vCoins对象里面。

nValueRet对象存储着所有的你自己的可用的币的总量。这个值可能会大于你给接收方的币,最少也要等于它。

现在来看下AvailableCoins()函数。将所有的可以输出记性填充到vCoins对象里面,原型如下:

void AvailableCoins(std::vector& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl = NULL, bool fIncludeZeroValue=false, AvailableCoinsType nCoinType=ALL_COINS, bool fUseInstantSend = false) const;

这个函数的作用是就是拿到你所有的交易里可以使用的交易输出。

技术分享图片
 

先对对象进行清空操作。

技术分享图片
 

然后开始对钱包里面的交易进行遍历。没找到一个交易,就对该交易进行检查。

因为钱包锁定的币的类型不一样,所以要找到可以使用的币的类型。

如果找到了,先判断是否是已花费的,是否是自己的,是否存在可以使用的金额,如果是可以使用的要存入进vCoins对象中去。

选币环节到此结束,下节介绍如何进行签名。









以上是关于交易是如何被创建和打包的4的主要内容,如果未能解决你的问题,请参考以下文章

交易是如何被创建和打包的1

交易是如何被创建和打包的7

交易是如何被创建和打包的3

交易是如何被创建和打包的2

交易是如何被创建和打包的6

从0到1简易区块链开发手册V0.4-实现转账交易的思路分析