被一个程序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对象中去。
选币环节到此结束,下节介绍如何进行签名。