比特币代码分析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 钱包发送

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