//确认交易
SendConfirmationDialogconfirmationDialog(tr("Confirm send coins"),
questionString.arg(formatted.join("<br />")),SEND_CONFIRM_DELAY, this);
confirmationDialog.exec();
QMessageBox::StandardButton retval =(QMessageBox::StandardButton)confirmationDialog.result();
if(retval != QMessageBox::Yes)
{
fNewRecipientAllowed = true;
return;
}
其中SendConfirmationDialog是一个类,用于确认是否发送比特币,如何返回的不是yes,则直接退出
//发送交易
// now send the prepared transaction
WalletModel::SendCoinsReturn sendStatus =model->sendCoins(currentTransaction);
SendCoinsReturn是一个结构体。其定义如下:
// Return status record for SendCoins, contains error id + information
struct SendCoinsReturn
{
SendCoinsReturn(StatusCode _status = OK, QString _reasonCommitFailed ="")
: status(_status),
reasonCommitFailed(_reasonCommitFailed)
{
}
StatusCode status;
QString reasonCommitFailed;
};
从注释可以看出该结构体用于返回发送币的状态信息,返回的信息记录在变量sendStatus上。
//处理交易时返回来的状态信息
// process sendStatus and on error generatemessage shown to user
processSendCoinsReturn(sendStatus);
其中函数processSendCoinsReturn是处理状态信息
其函数定义如下:
voidSendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn&sendCoinsReturn, const QString &msgArg)
{
QPair msgParams;
// Default to a warning message, overrideif error message is needed
msgParams.second =CClientUIInterface::MSG_WARNING;
// This comment is specific toSendCoinsDialog usage of WalletModel::SendCoinsReturn.
// WalletModel::TransactionCommitFailed isused only in WalletModel::sendCoins()
// all others are used only inWalletModel::prepareTransaction()
//
switch(sendCoinsReturn.status)
{
case WalletModel::InvalidAddress: //无效地址
msgParams.first = tr("Therecipient address is not valid. Please recheck.");
break;
case WalletModel::InvalidAmount: //无效的数额
msgParams.first = tr("The amountto pay must be larger than 0.");
break;
case WalletModel::AmountExceedsBalance: //发送数额超过了余额
msgParams.first = tr("The amountexceeds your balance.");
break;
case WalletModel::AmountWithFeeExceedsBalance: //包括交易费在内的总额超过了余额
msgParams.first = tr("The totalexceeds your balance when the %1 transaction fee isincluded.").arg(msgArg);
break;
case WalletModel::DuplicateAddress: //发现了双重地址,每个uxto之能有一个地址
msgParams.first = tr("Duplicateaddress found: addresses should only be used once each.");
break;
caseWalletModel::TransactionCreationFailed: //交易创建失败
msgParams.first = tr("Transactioncreation failed!");
msgParams.second = CClientUIInterface::MSG_ERROR;
break;
case WalletModel::TransactionCommitFailed: //交易确认失败
msgParams.first = tr("Thetransaction was rejected with the following reason:%1").arg(sendCoinsReturn.reasonCommitFailed);
msgParams.second = CClientUIInterface::MSG_ERROR;
break;
case WalletModel::AbsurdFee: //交易费超过交易额的1%就会被认为是荒谬的过高的交易费而被拒绝
msgParams.first = tr("A fee higherthan %1 is considered an absurdly highfee.").arg(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(),maxTxFee));
break;
caseWalletModel::PaymentRequestExpired: //交易请求过期
msgParams.first = tr("Paymentrequest expired.");
msgParams.second =CClientUIInterface::MSG_ERROR;
break;
// included to prevent a compiler warning.
case WalletModel::OK:
default:
return;
}
Q_EMIT message(tr("Send Coins"),msgParams.first, msgParams.second);
}
if (sendStatus.status == WalletModel::OK)
{
accept();
CoinControlDialog::coinControl->UnSelectAll();
coinControlUpdateLabels();
}
fNewRecipientAllowed = true;
当交易状态返回的是WalletModel::OK,进行
至此:on_sendButton_clicked函数分析完毕。
区块链研习社比特币源码研读班 electroman
QYB地址:QVR2eUwbx43YMkWjbaAQCYdoDmpC1ohnRk
网友评论