年前一直想寫有關(guān)交易是如何被區(qū)塊鏈?zhǔn)侨绾伪粍?chuàng)建的昙衅,一個交易的創(chuàng)建都經(jīng)過了那些步驟和驗證操作扬霜,但是總是被各種原因被擱淺,加班太嚴(yán)重了而涉,有時候難得的休息時間著瓶,都不想開電腦。這次一定要把自己看到的交易的流程寫下來啼县,畢竟之前也研究了好長時間的交易模塊材原。
流程圖先不畫了,畢竟涉及的函數(shù)調(diào)用比較多季眷,畫起來也比較繁瑣余蟹,看到那個函數(shù)被調(diào)用,再著重說下是怎么原理子刮,自己的水平確實有限的威酒,分析的也不一定都是正確的窑睁,在這里只做個因子,關(guān)于交易的其他知識葵孤,歡迎一起探討担钮。共同進(jìn)步,好了廢話不多尤仍,開整箫津。(我研究的是底層代碼,上層的估計差別也是不大的)
萬里長征第一步:UniValue sendtoaddress(const UniValue& params, bool fHelp)這個函數(shù)就是把你自己的token發(fā)送給別人宰啦,這個人rpc的調(diào)用前提是需要別人把打幣地址先給你苏遥。主要的三個參數(shù)打幣地址 打幣金額 打幣的標(biāo)記 剩下的是可選參數(shù)。
LOCK2(cs_main, pwalletMain->cs_wallet);互斥鎖赡模,保證錢包只能被一個線程調(diào)用田炭。
CBitcoinAddress address(params[0].get_str());CBitcoinAddress 是token的地址類,這個追進(jìn)去就可以到是繼承?class CBitcoinAddress : public CBase58Data漓柑,運(yùn)用的是base58編碼诫肠。這行代碼就可以把你傳進(jìn)去的字符串地址解析成字符了地址了。
CAmount nAmount = AmountFromValue(params[1]);把你傳進(jìn)的金額進(jìn)行解析欺缘,token是一聰為單位的,所用要進(jìn)行轉(zhuǎn)換挤安。
在下面就是一些調(diào)用參數(shù)的判斷谚殊,參數(shù)個數(shù)的要求等,包塊后面的可選參數(shù)等的設(shè)置
EnsureWalletIsUnlocked();確保錢包是未鎖定狀態(tài)蛤铜。一旦有別的線程正在訪問嫩絮,立即報錯,并退出围肥。
確定錢包沒有被其他線程訪問的話剿干,就調(diào)用SendMoney(address.Get(), nAmount, fSubtractFeeFromAmount, wtx, fUseInstantSend, fUsePrivateSend);進(jìn)行打幣。其中第一個參數(shù)就是token的地址穆刻,第二個就是需要打幣的金額置尔,此時單位已經(jīng)轉(zhuǎn)換成聰了,fSubtractFeeFromAmount一個bool類型的變量氢伟,證明交易費是從給你打幣的金額中扣除榜轿,wtx就是此次需要創(chuàng)建的交易了,后面的兩個參數(shù)就是即時支付標(biāo)志和私密發(fā)送的標(biāo)志朵锣。
return wtx.GetHash().GetHex();最后拿到txid的十六進(jìn)制形式谬盐。自此第一步分析完。