交易是如何被建立和打包的1
年前一直想寫有關交易是如何被區塊鏈是如何被建立的,一個交易的建立都經過了那些步驟和驗證操作,但是總是被各種原因被擱淺,加班太嚴重了,有時候難得的休息時間,都不想開電腦。這次一定要把自己看到的交易的流程寫下來,畢竟之前也研究了好長時間的交易模組。
流程圖先不畫了,畢竟涉及的函式呼叫比較多,畫起來也比較繁瑣,看到那個函式被呼叫,再著重說下是怎麼原理,自己的水平確實有限的,分析的也不一定都是正確的,在這裡只做個因子,關於交易的其他知識,歡迎一起探討。共同進步,好了廢話不多,開整。(我研究的是底層程式碼,上層的估計差別也是不大的)
萬里長征第一步:UniValue sendtoaddress(const UniValue& params, bool fHelp)這個函式就是把你自己的token傳送給別人,這個人rpc的呼叫前提是需要別人把打幣地址先給你。主要的三個引數打幣地址 打幣金額 打幣的標記 剩下的是可選引數。
LOCK2(cs_main, pwalletMain->cs_wallet);互斥鎖,保證錢包只能被一個執行緒呼叫。
CBitcoinAddress address(params[0].get_str());CBitcoinAddress 是token的地址類,這個追進去就可以到是繼承 class CBitcoinAddress : public CBase58Data,運用的是base58編碼。這行程式碼就可以把你傳進去的字串地址解析成字元了地址了。
CAmount nAmount = AmountFromValue(params[1]);把你傳進的金額進行解析,token是一聰為單位的,所用要進行轉換。
在下面就是一些呼叫引數的判斷,引數個數的要求等,包塊後面的可選引數等的設定
EnsureWalletIsUnlocked();確保錢包是未鎖定狀態。一旦有別的執行緒正在訪問,立即報錯,並退出。
確定錢包沒有被其他執行緒訪問的話,就呼叫SendMoney(address.Get(), nAmount, fSubtractFeeFromAmount, wtx, fUseInstantSend, fUsePrivateSend);進行打幣。其中第一個引數就是token的地址,第二個就是需要打幣的金額,此時單位已經轉換成聰了,fSubtractFeeFromAmount一個bool型別的變數,證明交易費是從給你打幣的金額中扣除,wtx就是此次需要建立的交易了,後面的兩個引數就是即時支付標誌和私密傳送的標誌。
return wtx.GetHash().GetHex();最後拿到txid的十六進位制形式。自此第一步分析完。