交易是如何被建立和打包的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物件中去。
選幣環節到此結束,下節介紹如何進行簽名。