今天介紹下交易創(chuàng)建構(gòu)建完畢后笨鸡,是如何提交的,為何要提交交易啊终?提交到哪里镜豹?
wtxNew就是已經(jīng)構(gòu)建好的交易對象,不懂的可以參照CreateTransaction()函數(shù),reserverkey對象蓝牲,是一個從密鑰池中預(yù)值趟脂,通過它可以從預(yù)值的密鑰池中取出一個公鑰。接著看主體例衍。
首先是一個互斥鎖昔期,無論何種條件下已卸,錢包只能被一個進(jìn)程或者線程訪問,保證錢包里面的數(shù)據(jù)是唯一的硼一。然后是一個日志的打印累澡,把自己創(chuàng)建好的交易進(jìn)行一個打印輸出,具體格式可以參照ToString()般贼,這個函數(shù)就是把交易對象里面的數(shù)據(jù)以字符串格式進(jìn)行打印輸出到日志里面愧哟。
接著就是申請錢包數(shù)據(jù)對象指針,fFileBacked在初始化的時候默認(rèn)是true哼蛆,在構(gòu)造函數(shù)里是可以看到的蕊梧。如果它為false,對象為NULL腮介。
接著就是KeepKey();這個函數(shù)就能保證密鑰對只能被使用一次肥矢,因為每次它都是在變換的。這個類面有一個索引的變量叠洗,默認(rèn)值是-1甘改,是不停的在變換的。
AddToWallet();把交易對象和錢包進(jìn)行交互灭抑。錢包里面要記錄這筆交易的信息十艾。
首先拿到交易的哈希值。fFromLoadWallet默認(rèn)傳進(jìn)來的就是false腾节;所以這個條件直接略過疟羹。
互斥鎖,不解釋禀倔。mapWallet一個地圖對象std::map<uint256,CWalletTx> mapWallet;該對象用于存儲每一筆交易對象和該筆交易的id,目的自然是為以后的遍歷参淫。先把本次創(chuàng)建的交易對象和哈希值送入該對象中存儲救湖。創(chuàng)建一個迭代器用于接收創(chuàng)建是否成功。并和錢包進(jìn)行綁定涎才。
如果插入成功鞋既,開始對交易對象的一些字段變量進(jìn)行賦值操作。包括時間和索引耍铜,并把交易進(jìn)行排序插入到wtxOrdered對象中邑闺。
typedef boost::unordered_map <uints256,CBlockIndex*,BlockHasher>BlockMap;
如果這筆交易的哈希值不為空,則繼續(xù)進(jìn)入if語句進(jìn)行判斷棕兼。有上面的對象可知陡舅,把交易ID和塊索引進(jìn)行綁定。繼續(xù)往下進(jìn)行伴挚“醒埽看for循環(huán)灾炭。
CAccountingEntry *const pacentry = (*it).second.second;這樣交易就和賬戶關(guān)聯(lián)到一起了。
接上上的if,如果哈希值為NULL,則調(diào)用AddToSpends();這是一個重載函數(shù)颅眶,有兩個蜈出。我的理解就是存儲一些廢棄的哈希值或者哈希值為NULL的。
接著就是一些判斷涛酗。fInsertedNew表示交易插入的返回铡原,如果是false,在這里就要進(jìn)行判斷操作了。
首先是不是同一個交易商叹,哈希值是否是NULL或者是被遺棄哈希值燕刻,索引的判斷等。
接著往下沈自,打印進(jìn)日志文件酌儒,刷新進(jìn)磁盤等。然后就是重新進(jìn)行錢包余額的計算等枯途。剩下的就是命令行的判斷的那個忌怎。交易和錢包的交互的部分就介紹完畢了。
接著回到交易的提交部分酪夷。
遍歷該筆交易的vin,和錢包進(jìn)行交互榴啸,記錄自己花費(fèi)的過的交易的id。
搞完一切后晚岭,對錢包數(shù)據(jù)庫指針進(jìn)行刪除操作鸥印。
如果廣播那個對象fBroadcastTransactions為true,則要對交易進(jìn)行廣播坦报。
首先把交易接收進(jìn)交易池库说,然后就是交易的中繼。終于寫完了片择,下一部分就是交易池的接收操作了灌诅。