1. 程式人生 > >交易是如何被創建和打包的3

交易是如何被創建和打包的3

coin ons 默認 min 使用 遠程 遠程服務器 是你 驗證過

遠程服務器連接不上了,趁著這機會,繼續寫。

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