in platform/consensus/ordering/pbft/commitment.cpp [67:155]
int Commitment::ProcessNewRequest(std::unique_ptr<Context> context,
std::unique_ptr<Request> user_request) {
if (context == nullptr || context->signature.signature().empty()) {
LOG(ERROR) << "user request doesn't contain signature, reject";
return -2;
}
if (uint64_t seq =
duplicate_manager_->CheckIfExecuted(user_request->hash())) {
LOG(ERROR) << "This request is already executed with seq: " << seq;
user_request->set_seq(seq);
message_manager_->SendResponse(std::move(user_request));
return -2;
}
if (config_.GetSelfInfo().id() != message_manager_->GetCurrentPrimary()) {
// LOG(ERROR) << "current node is not primary. primary:"
// << message_manager_->GetCurrentPrimary()
// << " seq:" << user_request->seq()
// << " hash:" << user_request->hash();
LOG(INFO) << "NOT PRIMARY, Primary is "
<< message_manager_->GetCurrentPrimary();
replica_communicator_->SendMessage(*user_request,
message_manager_->GetCurrentPrimary());
{
std::lock_guard<std::mutex> lk(rc_mutex_);
request_complained_.push(
std::make_pair(std::move(context), std::move(user_request)));
}
return -3;
}
/*
if(SignatureVerifier::CalculateHash(user_request->data()) !=
user_request->hash()){ LOG(ERROR) << "the hash and data of the user request
don't match, reject"; return -2;
}
*/
// check signatures
bool valid = verifier_->VerifyMessage(user_request->data(),
user_request->data_signature());
if (!valid) {
LOG(ERROR) << "request is not valid:"
<< user_request->data_signature().DebugString();
LOG(ERROR) << " msg:" << user_request->data().size();
return -2;
}
if (pre_verify_func_ && !pre_verify_func_(*user_request)) {
LOG(ERROR) << " check by the user func fail";
return -2;
}
global_stats_->IncClientRequest();
if (duplicate_manager_->CheckAndAddProposed(user_request->hash())) {
return -2;
}
auto seq = message_manager_->AssignNextSeq();
// Artificially make the primary stop proposing new trasactions.
if (!seq.ok()) {
duplicate_manager_->EraseProposed(user_request->hash());
global_stats_->SeqFail();
Request request;
request.set_type(Request::TYPE_RESPONSE);
request.set_sender_id(config_.GetSelfInfo().id());
request.set_proxy_id(user_request->proxy_id());
request.set_ret(-2);
request.set_hash(user_request->hash());
replica_communicator_->SendMessage(request, request.proxy_id());
return -2;
}
global_stats_->RecordStateTime("request");
user_request->set_type(Request::TYPE_PRE_PREPARE);
user_request->set_current_view(message_manager_->GetCurrentView());
user_request->set_seq(*seq);
user_request->set_sender_id(config_.GetSelfInfo().id());
user_request->set_primary_id(config_.GetSelfInfo().id());
replica_communicator_->BroadCast(*user_request);
return 0;
}