in platform/consensus/ordering/pbft/commitment.cpp [238:277]
int Commitment::ProcessPrepareMsg(std::unique_ptr<Context> context,
std::unique_ptr<Request> request) {
if (context == nullptr || context->signature.signature().empty()) {
LOG(ERROR) << "user request doesn't contain signature, reject";
return -2;
}
if (request->is_recovery()) {
return message_manager_->AddConsensusMsg(context->signature,
std::move(request));
}
//global_stats_->IncPrepare();
std::unique_ptr<Request> commit_request = resdb::NewRequest(
Request::TYPE_COMMIT, *request, config_.GetSelfInfo().id());
commit_request->mutable_data_signature()->Clear();
// Add request to message_manager.
// If it has received enough same requests(2f+1), broadcast the commit
// message.
uint64_t seq_ = request->seq();
CollectorResultCode ret =
message_manager_->AddConsensusMsg(context->signature, std::move(request));
if (ret == CollectorResultCode::STATE_CHANGED) {
if (message_manager_->GetHighestPreparedSeq() < seq_) {
message_manager_->SetHighestPreparedSeq(seq_);
}
// If need qc, sign the data
if (need_qc_ && verifier_) {
auto signature_or = verifier_->SignMessage(commit_request->hash());
if (!signature_or.ok()) {
LOG(ERROR) << "Sign message fail";
return -2;
}
*commit_request->mutable_data_signature() = *signature_or;
// LOG(ERROR) << "sign hash"
// << commit_request->data_signature().DebugString();
}
global_stats_->RecordStateTime("prepare");
replica_communicator_->BroadCast(*commit_request);
}
return ret == CollectorResultCode::INVALID ? -2 : 0;
}