交易流程图如下;
在交易(3)中我们分析到Entry是否有效,并在交易(4)中,详细分析了针对dust的处理。下面我们继续分析交易流程
在确认交易Entry有效以后,会进行钱包是否上锁的检查。
1 检查钱包是否有锁
//检查钱包是否有锁?
fNewRecipientAllowed = false;
WalletModel::UnlockContextctx(model->requestUnlock()); //从model中读取钱包状态
if(!ctx.isValid()) //如果没锁,则退出函数
{
// Unlock wallet was cancelled
fNewRecipientAllowed = true; //设置新的容器允许标志
return;
}
代码很简单,从model中提取钱包状态,如果未检查到锁,则置fNewRecipientAllowed为true,然后退出函数
WalletModel是类,是qt可视代码和btc钱包之间的接口,定义在walletmodel.h中。
UnlockContext也是一个类,用于未上锁的钱包的资源管理
// RAI object for unlocking wallet,returned by requestUnlock()
class UnlockContext
注释中RAI是个笔误,应该是RAII,一种资源管理技术,RAII简单的说,是为了防止诸如内存泄露、资源泄露等情况产生的一种编程技巧
我们看看fNewRecipientAllowed标志位是什么意思!
在代码中搜索fNewRecipientAllowed,可以发现其他几处也设置位了true
分别是:
//如果钱包状态不是ok,则设置位true,并退出函数
if(prepareStatus.status != WalletModel::OK) {
fNewRecipientAllowed = true;
return;
}
//如果消息窗口不是yes,则设置位true,并退出函数
if(retval != QMessageBox::Yes)
{
fNewRecipientAllowed = true;
return;
}
还有一个就是在void SendCoinsDialog::on_sendButton_clicked()函数的最后,
fNewRecipientAllowed= true;
从上面的代码分析,当停止交易或者交易完成以后,将这个变量置位true
2 为交易费做准备
//为得到交易费准备交易
// prepare transaction for getting txFee earlier
WalletModelTransaction currentTransaction(recipients);
WalletModel::SendCoinsReturn prepareStatus;
WalletModelTransaction是类,定义在walletmodeltransaction.h中。是用于钱包交易的数据模型。
WalletModelTransaction currentTransaction(recipients) 将交易recipients传入到参数currentTransaction中
WalletModel上面介绍过了。
SendCoinsReturn :返回发送币以后的状态记录,包括错误id信息。
WalletModel::SendCoinsReturn
prepareStatus; 就是定义一个参数,用于保存交易发送以后的状态信息。
本文由【区块链研习社】优质内容计划支持,更多关于区块链的深度好文,请点击[区块链研习社](http://www.jianshu.com/c/b17f09dc2831)
区块链研习社比特币源码研读班 electroman
有QYB的伙伴们,打赏点呗!
QYB地址:QVR2eUwbx43YMkWjbaAQCYdoDmpC1ohnRk
网友评论