diff --git a/tl/generate/scheme/ton_api.tl b/tl/generate/scheme/ton_api.tl index bdcf0a296..3ddb69490 100644 --- a/tl/generate/scheme/ton_api.tl +++ b/tl/generate/scheme/ton_api.tl @@ -923,16 +923,17 @@ validatorStats.blockLimitsStatus validatorStats.extMsgsStats ext_msgs_total:int ext_msgs_filtered:int ext_msgs_accepted:int ext_msgs_rejected:int = validatorStats.ExtMsgsStats; -validatorStats.collatedBlock flags:# +validatorStats.collatedBlock block_id:tonNode.blockIdExt collated_data_hash:int256 cc_seqno:int collated_at:double bytes:int collated_data_bytes:int attempt:int - collator_node_id:flags.0?int256 validator_id:flags.1?int256 + self:int256 is_validator:Bool total_time:double work_time:double cpu_work_time:double time_stats:string block_limits:validatorStats.blockLimitsStatus ext_msgs_stats:validatorStats.extMsgsStats = validatorSession.stats.CollatedBlock; validatorStats.validatedBlock block_id:tonNode.blockIdExt collated_data_hash:int256 validated_at:double + self:int256 valid:Bool comment:string bytes:int collated_data_bytes:int total_time:double work_time:double cpu_work_time:double = validatorStats.ValidatedBlock; @@ -940,13 +941,13 @@ validatorStats.validatedBlock validatorStats.newValidatorGroup.node id:int256 weight:long = validatorStats.newValidatorGroup.Node; validatorStats.newValidatorGroup session_id:int256 shard:tonNode.shardId cc_seqno:int last_key_block_seqno:int started_at:double - self_idx:int nodes:(vector validatorStats.newValidatorGroup.node) = validatorStats.NewValidatorGroup; + self_idx:int self:int256 nodes:(vector validatorStats.newValidatorGroup.node) = validatorStats.NewValidatorGroup; validatorStats.endValidatorGroup.node id:int256 catchain_blocks:int = validatorStats.endValidatorGroup.Node; -validatorStats.endValidatorGroup session_id:int256 timestamp:double +validatorStats.endValidatorGroup session_id:int256 timestamp:double self:int256 nodes:(vector validatorStats.endValidatorGroup.node) = validatorStats.EndValidatorGroup; -validatorStats.collatorNodeResponse collator_node_id:int256 validator_id:int256 timestamp:double +validatorStats.collatorNodeResponse self:int256 validator_id:int256 timestamp:double block_id:tonNode.blockIdExt original_block_id:tonNode.blockIdExt collated_data_hash:int256 = validatorStats.CollatorNodeResponse; diff --git a/tl/generate/scheme/ton_api.tlo b/tl/generate/scheme/ton_api.tlo index f091213cf..9522bf9a6 100644 Binary files a/tl/generate/scheme/ton_api.tlo and b/tl/generate/scheme/ton_api.tlo differ diff --git a/validator-session/validator-session-types.h b/validator-session/validator-session-types.h index 59b2141aa..a2a3ebc1f 100644 --- a/validator-session/validator-session-types.h +++ b/validator-session/validator-session-types.h @@ -222,6 +222,7 @@ struct NewValidatorGroupStats { BlockSeqno last_key_block_seqno = 0; double started_at = -1.0; td::uint32 self_idx = 0; + PublicKeyHash self = PublicKeyHash::zero(); std::vector nodes; tl_object_ptr tl() const { @@ -232,7 +233,7 @@ struct NewValidatorGroupStats { } return create_tl_object(session_id, create_tl_shard_id(shard), cc_seqno, last_key_block_seqno, started_at, self_idx, - std::move(nodes_arr)); + self.bits256_value(), std::move(nodes_arr)); } }; @@ -244,6 +245,7 @@ struct EndValidatorGroupStats { ValidatorSessionId session_id = ValidatorSessionId::zero(); double timestamp = -1.0; + PublicKeyHash self = PublicKeyHash::zero(); std::vector nodes; tl_object_ptr tl() const { @@ -252,7 +254,8 @@ struct EndValidatorGroupStats { nodes_arr.push_back(create_tl_object(node.id.bits256_value(), node.catchain_blocks)); } - return create_tl_object(session_id, timestamp, std::move(nodes_arr)); + return create_tl_object(session_id, timestamp, self.bits256_value(), + std::move(nodes_arr)); } }; diff --git a/validator-session/validator-session.cpp b/validator-session/validator-session.cpp index 5cc31a7ba..e18dd1eb5 100644 --- a/validator-session/validator-session.cpp +++ b/validator-session/validator-session.cpp @@ -1036,7 +1036,7 @@ void ValidatorSessionImpl::get_end_stats(td::Promise pro promise.set_error(td::Status::Error(ErrorCode::notready, "not started")); return; } - EndValidatorGroupStats stats{.session_id = unique_hash_, .timestamp = td::Clocks::system()}; + EndValidatorGroupStats stats{.session_id = unique_hash_, .timestamp = td::Clocks::system(), .self = local_id()}; stats.nodes.resize(description().get_total_nodes()); for (size_t i = 0; i < stats.nodes.size(); ++i) { stats.nodes[i].id = description().get_source_id(i); diff --git a/validator/collator-node.cpp b/validator/collator-node.cpp index cbab8b795..ff84456bd 100644 --- a/validator/collator-node.cpp +++ b/validator/collator-node.cpp @@ -396,8 +396,8 @@ void CollatorNode::receive_query(adnl::AdnlNodeIdShort src, td::BufferSlice data TRY_RESULT_PROMISE(new_promise, block, std::move(R)); CollatorNodeResponseStats stats; - stats.collator_node_id = local_id.bits256_value(); - stats.validator_id = creator.as_bits256(); + stats.self = local_id.pubkey_hash(); + stats.validator_id = PublicKey(pubkeys::Ed25519(creator)).compute_short_id(); stats.original_block_id = block.id; stats.collated_data_hash = block.collated_file_hash; diff --git a/validator/fabric.h b/validator/fabric.h index d2e9b4735..86868f766 100644 --- a/validator/fabric.h +++ b/validator/fabric.h @@ -82,7 +82,7 @@ void run_check_proof_query(BlockIdExt id, td::Ref proof, td::actor::Actor void run_check_proof_link_query(BlockIdExt id, td::Ref proof, td::actor::ActorId manager, td::Timestamp timeout, td::Promise promise); void run_validate_query(ShardIdFull shard, BlockIdExt min_masterchain_block_id, std::vector prev, - BlockCandidate candidate, td::Ref validator_set, + BlockCandidate candidate, td::Ref validator_set, PublicKeyHash local_validator_id, td::actor::ActorId manager, td::Timestamp timeout, td::Promise promise, unsigned mode = 0); void run_collate_query(ShardIdFull shard, const BlockIdExt& min_masterchain_block_id, std::vector prev, diff --git a/validator/impl/collator.cpp b/validator/impl/collator.cpp index 94d98ac59..bc8e0ef53 100644 --- a/validator/impl/collator.cpp +++ b/validator/impl/collator.cpp @@ -5936,8 +5936,9 @@ bool Collator::create_block_candidate() { stats_.actual_bytes = block_candidate->data.size(); stats_.actual_collated_data_bytes = block_candidate->collated_data.size(); stats_.attempt = attempt_idx_; - stats_.collator_node_id = collator_node_id_.bits256_value(); - stats_.validator_id = created_by_.as_bits256(); + stats_.is_validator = !(mode_ & CollateMode::from_collator_node); + stats_.self = stats_.is_validator ? PublicKey(pubkeys::Ed25519(created_by_)).compute_short_id() + : collator_node_id_.pubkey_hash(); stats_.estimated_bytes = block_limit_status_->estimate_block_size(); stats_.gas = block_limit_status_->gas_used; stats_.lt_delta = block_limit_status_->cur_lt - block_limit_status_->limits.start_lt; diff --git a/validator/impl/fabric.cpp b/validator/impl/fabric.cpp index d1555edc5..ae341a5cb 100644 --- a/validator/impl/fabric.cpp +++ b/validator/impl/fabric.cpp @@ -192,8 +192,8 @@ void run_check_proof_link_query(BlockIdExt id, td::Ref proof, td::act .release(); } -void run_validate_query(ShardIdFull shard, BlockIdExt min_masterchain_block_id, - std::vector prev, BlockCandidate candidate, td::Ref validator_set, +void run_validate_query(ShardIdFull shard, BlockIdExt min_masterchain_block_id, std::vector prev, + BlockCandidate candidate, td::Ref validator_set, PublicKeyHash local_validator_id, td::actor::ActorId manager, td::Timestamp timeout, td::Promise promise, unsigned mode) { BlockSeqno seqno = 0; @@ -207,8 +207,8 @@ void run_validate_query(ShardIdFull shard, BlockIdExt min_masterchain_block_id, td::actor::create_actor(PSTRING() << (is_fake ? "fakevalidate" : "validateblock") << shard.to_str() << ":" << (seqno + 1) << "#" << idx.fetch_add(1), shard, min_masterchain_block_id, std::move(prev), std::move(candidate), - std::move(validator_set), std::move(manager), timeout, std::move(promise), - mode) + std::move(validator_set), local_validator_id, std::move(manager), timeout, + std::move(promise), mode) .release(); } diff --git a/validator/impl/validate-query.cpp b/validator/impl/validate-query.cpp index 92b32b75c..b38d2f37d 100644 --- a/validator/impl/validate-query.cpp +++ b/validator/impl/validate-query.cpp @@ -67,16 +67,17 @@ std::string ErrorCtx::as_string() const { * @param promise The Promise to return the ValidateCandidateResult to. * @param mode +1 - fake mode */ -ValidateQuery::ValidateQuery(ShardIdFull shard, BlockIdExt min_masterchain_block_id, - std::vector prev, BlockCandidate candidate, Ref validator_set, - td::actor::ActorId manager, td::Timestamp timeout, - td::Promise promise, unsigned mode) +ValidateQuery::ValidateQuery(ShardIdFull shard, BlockIdExt min_masterchain_block_id, std::vector prev, + BlockCandidate candidate, Ref validator_set, + PublicKeyHash local_validator_id, td::actor::ActorId manager, + td::Timestamp timeout, td::Promise promise, unsigned mode) : shard_(shard) , id_(candidate.id) , min_mc_block_id(min_masterchain_block_id) , prev_blocks(std::move(prev)) , block_candidate(std::move(candidate)) , validator_set_(std::move(validator_set)) + , local_validator_id_(local_validator_id) , manager(manager) , timeout(timeout) , main_promise(std::move(promise)) @@ -7062,6 +7063,7 @@ void ValidateQuery::record_stats(bool valid, std::string error_message) { stats.block_id = id_; stats.collated_data_hash = block_candidate.collated_file_hash; stats.validated_at = td::Clocks::system(); + stats.self = local_validator_id_; stats.valid = valid; if (valid) { stats.comment = (PSTRING() << "OK ts=" << now_); diff --git a/validator/impl/validate-query.hpp b/validator/impl/validate-query.hpp index 328a9e1eb..05a397c85 100644 --- a/validator/impl/validate-query.hpp +++ b/validator/impl/validate-query.hpp @@ -118,7 +118,7 @@ class ValidateQuery : public td::actor::Actor { public: ValidateQuery(ShardIdFull shard, BlockIdExt min_masterchain_block_id, std::vector prev, - BlockCandidate candidate, td::Ref validator_set, + BlockCandidate candidate, td::Ref validator_set, PublicKeyHash local_validator_id, td::actor::ActorId manager, td::Timestamp timeout, td::Promise promise, unsigned mode = 0); @@ -132,6 +132,7 @@ class ValidateQuery : public td::actor::Actor { std::vector> prev_states; BlockCandidate block_candidate; td::Ref validator_set_; + PublicKeyHash local_validator_id_ = PublicKeyHash::zero(); td::actor::ActorId manager; td::Timestamp timeout; td::Promise main_promise; diff --git a/validator/interfaces/validator-manager.h b/validator/interfaces/validator-manager.h index 59f114b33..6c31fe22f 100644 --- a/validator/interfaces/validator-manager.h +++ b/validator/interfaces/validator-manager.h @@ -62,8 +62,8 @@ struct CollationStats { double collated_at = -1.0; td::uint32 actual_bytes = 0, actual_collated_data_bytes = 0; int attempt = 0; - td::Bits256 collator_node_id = td::Bits256::zero(); - td::Bits256 validator_id = td::Bits256::zero(); + PublicKeyHash self = PublicKeyHash::zero(); + bool is_validator = false; td::uint32 estimated_bytes = 0, gas = 0, lt_delta = 0, estimated_collated_data_bytes = 0; int cat_bytes = 0, cat_gas = 0, cat_lt_delta = 0, cat_collated_data_bytes = 0; std::string limits_log; @@ -75,11 +75,9 @@ struct CollationStats { std::string time_stats; tl_object_ptr tl() const { - int flags = (collator_node_id.is_zero() ? 0 : ton_api::validatorStats_collatedBlock::Flags::COLLATOR_NODE_ID_MASK) | - (validator_id.is_zero() ? 0 : ton_api::validatorStats_collatedBlock::Flags::VALIDATOR_ID_MASK); return create_tl_object( - flags, create_tl_block_id(block_id), collated_data_hash, cc_seqno, collated_at, actual_bytes, - actual_collated_data_bytes, attempt, collator_node_id, validator_id, total_time, work_time, cpu_work_time, + create_tl_block_id(block_id), collated_data_hash, cc_seqno, collated_at, actual_bytes, + actual_collated_data_bytes, attempt, self.bits256_value(), is_validator, total_time, work_time, cpu_work_time, time_stats, create_tl_object(estimated_bytes, gas, lt_delta, estimated_collated_data_bytes, cat_bytes, cat_gas, @@ -93,6 +91,7 @@ struct ValidationStats { BlockIdExt block_id; td::Bits256 collated_data_hash = td::Bits256::zero(); double validated_at = -1.0; + PublicKeyHash self = PublicKeyHash::zero(); bool valid = false; std::string comment; td::uint32 actual_bytes = 0, actual_collated_data_bytes = 0; @@ -100,22 +99,23 @@ struct ValidationStats { tl_object_ptr tl() const { return create_tl_object( - create_tl_block_id(block_id), collated_data_hash, validated_at, valid, comment, actual_bytes, - actual_collated_data_bytes, total_time, work_time, cpu_work_time); + create_tl_block_id(block_id), collated_data_hash, validated_at, self.bits256_value(), valid, comment, + actual_bytes, actual_collated_data_bytes, total_time, work_time, cpu_work_time); } }; struct CollatorNodeResponseStats { - td::Bits256 collator_node_id = td::Bits256::zero(); - td::Bits256 validator_id = td::Bits256::zero(); + PublicKeyHash self = PublicKeyHash::zero(); + PublicKeyHash validator_id = PublicKeyHash::zero(); double timestamp = -1.0; BlockIdExt block_id, original_block_id; td::Bits256 collated_data_hash = td::Bits256::zero(); tl_object_ptr tl() const { return create_tl_object( - collator_node_id, validator_id, timestamp, create_tl_block_id(block_id), create_tl_block_id(original_block_id), - collated_data_hash);; + self.bits256_value(), validator_id.bits256_value(), timestamp, create_tl_block_id(block_id), + create_tl_block_id(original_block_id), collated_data_hash); + ; } }; diff --git a/validator/manager-disk.cpp b/validator/manager-disk.cpp index 5ebe54678..4bbd48540 100644 --- a/validator/manager-disk.cpp +++ b/validator/manager-disk.cpp @@ -153,7 +153,7 @@ void ValidatorManagerImpl::validate_fake(BlockCandidate candidate, std::vector prev, BlockIdExt min_masterch .shard = shard_, .cc_seqno = validator_set_->get_catchain_seqno(), .last_key_block_seqno = last_key_block_seqno_, - .started_at = td::Clocks::system()}; + .started_at = td::Clocks::system(), + .self = local_id_}; td::uint32 idx = 0; for (const auto &node : validator_set_->export_vector()) { PublicKeyHash id = ValidatorFullId{node.key}.compute_short_id();