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

weixin_34249678發表於2018-03-16

被一個程式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變數儲存著所有的可用的交易和交易的位置

8798574-8a86581abb41a160.png

物件vCoins儲存著所有的可以作用交易輸出的交易資訊。下面介紹AvailableCoins();函式。

8798574-acc3382d67f91f27.png

預設coinControl是false,直接跳過。否則就是迴圈遍歷進行填充,setCoinsRet.insert(make_pair(out.tx, out.i));

8798574-d8dd6bafea38daac.png

這個預設傳入的token的型別就是ALL_COINS。所以這個也是跳過的。和上面一樣,這些都是對幣的選擇的。

8798574-884aeeaf779119d0.png

setPresetCoins儲存的就是預設值。coinControl預設就是NULL;所以沒有複製操作。

std::vector vPresetInputs;沒有進行初始化所以裡面是沒有值的。所以下面的迴圈也沒有進入。

8798574-e7cee8ca2f096d8c.png
8798574-31bf6ad83c45f754.png

迴圈遍歷,如果之前存在預設值物件裡面有的的話,進行刪除。如果沒有就跳過。

再把預設值物件含有的進行賦值給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;

這個函式的作用是就是拿到你所有的交易裡可以使用的交易輸出。

8798574-46a7494178fa89cb.png

先對物件進行清空操作。

8798574-02674f6f866c0feb.png

然後開始對錢包裡面的交易進行遍歷。沒找到一個交易,就對該交易進行檢查。

因為錢包鎖定的幣的型別不一樣,所以要找到可以使用的幣的型別。

如果找到了,先判斷是否是已花費的,是否是自己的,是否存在可以使用的金額,如果是可以使用的要存入進vCoins物件中去。

選幣環節到此結束,下節介紹如何進行簽名。

相關文章