比特幣代碼分析6 錢包發送

BITCoin錢包如下:
比特幣代碼分析6 錢包發送

比特幣發送邏輯如下:
比特幣代碼分析6 錢包發送

整個過程可以分爲上面幾個步驟。下面分別進行說明。
當用戶發送比特幣到某一個地址時,比特幣客戶端會調用SendMoney()方法。該方法包含三個參數:
scriptPubKey包含腳本代碼OP_DUP OP_HASH160 <收款人地址160位哈希> OP_EQUALVERIFY OP_CHECKSIG。
nValue表示將要轉賬的金額。該金額並未包含交易費nTrasactionFee。
wtxNew是一個CWalletTx類的本地變量。該變量目前的值爲空,之後會包含若干CMerkleTX類對象。該類由CTransaction衍生而來,並且添加了若干方法。我們暫時先不管具體細節,僅將其看作CTransaction類。
1.當點擊Send按鈕之後,會調用ui.cpp中的函數 
CSendDialog::OnButtonSend(wxCommandEvent& event) 
整個過程的發起是在 CSendDialog::OnButtonSend(wxCommandEvent& event)(基於0.1.5版本), 其中有一段函數:
// Parse bitcoin address
uint160 hash160;
bool fBitcoinAddress = AddressToHash160(strAddress, hash160);

if (fBitcoinAddress)
{
// Send to bitcoin address
CScript scriptPubKey;

scriptPubKey << OP_DUP << OP_HASH160 << hash160 << OP_EQUALVERIFY << OP_CHECKSIG;

if (!SendMoney(scriptPubKey, nValue, wtx))
return;
}

以知道此時scriptPubKey中的信息如下 
 比特幣代碼分析6 錢包發送

接着開始會調用main.cpp中的SendMoney()函數
1.開始調用main.cpp中的SendMoney()函數,所有的動作都可以看成是在SendMoney()中完成。
2.創建Transaction(), 這個函數的主要作用是找到可以用於支持coin, 在這個函數中,有兩個變量(vin與vout)和一個稅率fee需要注意。 先說一下稅率fee, BitCoin的交易是有稅率的,但是這個稅率的支付與用於支付的coin相關,因此,這裏它做了一個處理,首先把fee設置爲0,將需要支付的coin信息獲取出來,然後再調用GetMinFee(true)計算一次。
3. 另外兩個值就是vin與vout,支持信息都會保存在這裏。它是CTransaction的成員變量,其定義如下:
class CTransaction
{
public:
int nVersion;
vector<CTxIn> vin;
vector<CTxOut> vout;
int nLockTime;
}
對於vout的script信息比較容易找,它是在createTransaction()的時候,直接設置進去,其代碼如下:
// Fill vout[0] to the payee wtxNew.vout.push_back(CTxOut(nValueOut, scriptPubKey));
而vin的script就比較麻煩。在另外的文檔中進去解析。只需要瞭解到的是vin中的script信息是: 
scriptSigRet << vchSig << vchPubKey; 
對應的信息:
比特幣代碼分析6 錢包發送

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章