交易是如何被建立和打包的3
遠端伺服器連線不上了,趁著這機會,繼續寫。
CreateTransaction(vecSend, wtxNew, reservekey, nFeeRequired, nChangePosRet,strError, NULL, true, fUsePrivateSend ? ONLY_DENOMINATED : ALL_COINS, fUseInstantSend))
上面已經對這些引數進行了分析。我們直接進入看這個函式。
CAmount nFeePay = fUseInstantSend ? CTxLockRequest().GetMinFee() : 0;//特有的即時交易的設定標誌,預設是false
對向量物件vecSend進行遍歷操作,計算出要傳送給對方的token總和。
交易事務物件和錢包進行繫結。
txNew.nLockTime = chainActive.Height();// 交易的鎖定時間戳和當前區塊高度有關。
這兩個斷言證明交易的時間戳和區塊的高階和關係,以及它的閾值範圍,在原始碼transaction.h檔案中看。
上面關於接受人和時間戳賦值完畢之後,就要對錢包裡面的utxo進行遍歷以獲取到足夠的金額來填充vin(交易輸入)
進行while死迴圈來組建交易所需要的變數值,切記一次有可能不會成功的。當交易費充足的時候就會break出死迴圈。
先對交易物件txNew中的vin和vout進行清空。然後遍歷接收人向量vecSend中關於接收人的資料,組成vout(交易輸出)
最後對vout進行是不是灰塵交易費的判斷,vout必須是未花費狀態的。最後就是交易物件的棧中儲存,這樣用於接收方的vout就建立好了。
選擇錢包裡面可以使用的幣。ps:就是到錢包裡面去找,成熟的,可以使用的幣。SelectCoins();下次分析。
對掃描出來的幣進行幣齡的計算。越早的幣,幣齡越久。
const CAmount nChange = nValueIn - nValueToSelect;這一步很關鍵,如果這個nChange大於就必須要有找零。否則返回就是幣剛好,沒有找零了。
基本上和步驟就是
1.呼叫預置類物件拿到一個公鑰
2.由公鑰拿到公鑰雜湊也就是地址。
3.由地址構建鎖定指令碼
newTxOut = CTxOut(nChange, scriptChange);由建構函式進行vout的構造建立
這樣找零的鎖定指令碼也構造完畢了。
剩下判斷是否是灰塵的就說了。
這樣由上面的選幣環節,我們就可以知道哪些時刻用的交易輸出。然後就用它們填充進vin.vin填充完畢後要把vin物件賦值給交易物件txNew的vin。
這一段是對你之前選好的交易輸入進行簽名認證,即證明這錢是你的。不是別人的。關於是如何簽名的,下節介紹。這個建立交易的函式很長一定要寫完。
驗證過了之後,要對交易進行序列化,判斷交易的大小。
交易序列化後大小滿足之後,然後是交易的設定,不允許傳送沒有交易費的交易。
交易費滿足了,直接break,否則就是continue.繼續上面步驟重複操作。知道滿足為止。
到此建立交易分析完畢。