交易是如何被創建和打包的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.繼續上面步驟重復操作。知道滿足為止。
到此創建交易分析完畢。
交易是如何被創建和打包的3