年前一直想寫有關(guān)交易是如何被區(qū)塊鏈是如何被創(chuàng)建的,一個交易的創(chuàng)建都經(jīng)過了那些步驟和驗證操作,但是總是被各種原因被擱淺,加班太嚴重了,有時候難得的休息時間,都不想開電腦。這次一定要把自己看到的交易的流程寫下來,畢竟之前也研究了好長時間的交易模塊。
流程圖先不畫了,畢竟涉及的函數(shù)調(diào)用比較多,畫起來也比較繁瑣,看到那個函數(shù)被調(diào)用,再著重說下是怎么原理,自己的水平確實有限的,分析的也不一定都是正確的,在這里只做個因子,關(guān)于交易的其他知識,歡迎一起探討。共同進步,好了廢話不多,開整。(我研究的是底層代碼,上層的估計差別也是不大的)
萬里長征第一步:UniValue sendtoaddress(const UniValue& params, bool fHelp)這個函數(shù)就是把你自己的token發(fā)送給別人,這個人rpc的調(diào)用前提是需要別人把打幣地址先給你。主要的三個參數(shù)打幣地址 打幣金額 打幣的標記 剩下的是可選參數(shù)。

LOCK2(cs_main, pwalletMain->cs_wallet);互斥鎖,保證錢包只能被一個線程調(diào)用。
CBitcoinAddress address(params[0].get_str());CBitcoinAddress 是token的地址類,這個追進去就可以到是繼承?class CBitcoinAddress : public CBase58Data,運用的是base58編碼。這行代碼就可以把你傳進去的字符串地址解析成字符了地址了。
CAmount nAmount = AmountFromValue(params[1]);把你傳進的金額進行解析,token是一聰為單位的,所用要進行轉(zhuǎn)換。
在下面就是一些調(diào)用參數(shù)的判斷,參數(shù)個數(shù)的要求等,包塊后面的可選參數(shù)等的設(shè)置

EnsureWalletIsUnlocked();確保錢包是未鎖定狀態(tài)。一旦有別的線程正在訪問,立即報錯,并退出。
確定錢包沒有被其他線程訪問的話,就調(diào)用SendMoney(address.Get(), nAmount, fSubtractFeeFromAmount, wtx, fUseInstantSend, fUsePrivateSend);進行打幣。其中第一個參數(shù)就是token的地址,第二個就是需要打幣的金額,此時單位已經(jīng)轉(zhuǎn)換成聰了,fSubtractFeeFromAmount一個bool類型的變量,證明交易費是從給你打幣的金額中扣除,wtx就是此次需要創(chuàng)建的交易了,后面的兩個參數(shù)就是即時支付標志和私密發(fā)送的標志。
return wtx.GetHash().GetHex();最后拿到txid的十六進制形式。自此第一步分析完。