diff --git a/adnl/adnl-ext-client.hpp b/adnl/adnl-ext-client.hpp index 13339725..1dd7d2ba 100644 --- a/adnl/adnl-ext-client.hpp +++ b/adnl/adnl-ext-client.hpp @@ -43,7 +43,10 @@ class AdnlOutboundConnection : public AdnlExtConnection { public: AdnlOutboundConnection(td::SocketFd fd, std::unique_ptr callback, AdnlNodeIdFull dst, td::actor::ActorId ext_client) - : AdnlExtConnection(std::move(fd), std::move(callback), true), dst_(std::move(dst)), ext_client_(ext_client) { + : AdnlExtConnection(std::move(fd), std::move(callback), true) + , dst_(std::move(dst)) + , local_id_(privkeys::Ed25519::random()) + , ext_client_(ext_client) { } AdnlOutboundConnection(td::SocketFd fd, std::unique_ptr callback, AdnlNodeIdFull dst, PrivateKey local_id, td::actor::ActorId ext_client) diff --git a/tl/generate/scheme/ton_api.tl b/tl/generate/scheme/ton_api.tl index 178b70a7..5b272f26 100644 --- a/tl/generate/scheme/ton_api.tl +++ b/tl/generate/scheme/ton_api.tl @@ -816,11 +816,12 @@ engine.validator.getCollatorOptionsJson = engine.validator.JsonConfig; engine.validator.getAdnlStats all:Bool = adnl.Stats; engine.validator.getActorTextStats = engine.validator.TextStats; -engine.validator.addCollator adnl_id:int256 shard:tonNode.shardId = engine.validator.Success; engine.validator.addShard shard:tonNode.shardId = engine.validator.Success; -engine.validator.delCollator adnl_id:int256 shard:tonNode.shardId = engine.validator.Success; engine.validator.delShard shard:tonNode.shardId = engine.validator.Success; +engine.validator.addCollator adnl_id:int256 shard:tonNode.shardId = engine.validator.Success; +engine.validator.delCollator adnl_id:int256 shard:tonNode.shardId = engine.validator.Success; + engine.validator.collatorNodeSetWhitelistedValidator adnl_id:int256 add:Bool = engine.validator.Success; engine.validator.collatorNodeSetWhitelistEnabled enabled:Bool = engine.validator.Success; engine.validator.showCollatorNodeWhitelist = engine.validator.CollatorNodeWhitelist; diff --git a/tl/generate/scheme/tonlib_api.tl b/tl/generate/scheme/tonlib_api.tl index 5110d6ec..31ca6fd4 100644 --- a/tl/generate/scheme/tonlib_api.tl +++ b/tl/generate/scheme/tonlib_api.tl @@ -53,7 +53,7 @@ ton.blockIdExt workchain:int32 shard:int64 seqno:int32 root_hash:bytes file_hash extraCurrency id:int32 amount:int64 = ExtraCurrency; raw.fullAccountState balance:int64 extra_currencies:vector code:bytes data:bytes last_transaction_id:internal.transactionId block_id:ton.blockIdExt frozen_hash:bytes sync_utime:int53 = raw.FullAccountState; -raw.message source:accountAddress destination:accountAddress value:int64 extra_currencies:vector fwd_fee:int64 ihr_fee:int64 created_lt:int64 body_hash:bytes msg_data:msg.Data = raw.Message; +raw.message hash:bytes source:accountAddress destination:accountAddress value:int64 extra_currencies:vector fwd_fee:int64 ihr_fee:int64 created_lt:int64 body_hash:bytes msg_data:msg.Data = raw.Message; raw.transaction address:accountAddress utime:int53 data:bytes transaction_id:internal.transactionId fee:int64 storage_fee:int64 other_fee:int64 in_msg:raw.message out_msgs:vector = raw.Transaction; raw.transactions transactions:vector previous_transaction_id:internal.transactionId = raw.Transactions; diff --git a/tl/generate/scheme/tonlib_api.tlo b/tl/generate/scheme/tonlib_api.tlo index 70c08459..10b9ed8d 100644 Binary files a/tl/generate/scheme/tonlib_api.tlo and b/tl/generate/scheme/tonlib_api.tlo differ diff --git a/tonlib/tonlib/TonlibClient.cpp b/tonlib/tonlib/TonlibClient.cpp index 19d5f0d0..b9ff4899 100644 --- a/tonlib/tonlib/TonlibClient.cpp +++ b/tonlib/tonlib/TonlibClient.cpp @@ -3032,6 +3032,7 @@ struct ToRawTransactions { } auto body_cell = vm::CellBuilder().append_cellslice(*body).finalize(); auto body_hash = body_cell->get_hash().as_slice().str(); + auto msg_hash = cell->get_hash().as_slice().str(); td::Ref init_state_cell; auto& init_state_cs = message.init.write(); @@ -3101,6 +3102,7 @@ struct ToRawTransactions { auto created_lt = static_cast(msg_info.created_lt); return tonlib_api::make_object( + msg_hash, tonlib_api::make_object(src), tonlib_api::make_object(std::move(dest)), balance, std::move(extra_currencies), fwd_fee, ihr_fee, created_lt, std::move(body_hash), @@ -3113,6 +3115,7 @@ struct ToRawTransactions { } TRY_RESULT(dest, to_std_address(msg_info.dest)); return tonlib_api::make_object( + msg_hash, tonlib_api::make_object(), tonlib_api::make_object(std::move(dest)), 0, std::vector>{}, 0, 0, 0, std::move(body_hash), @@ -3126,6 +3129,7 @@ struct ToRawTransactions { TRY_RESULT(src, to_std_address(msg_info.src)); auto created_lt = static_cast(msg_info.created_lt); return tonlib_api::make_object( + msg_hash, tonlib_api::make_object(src), tonlib_api::make_object(), 0, std::vector>{}, 0, 0, created_lt, std::move(body_hash), diff --git a/validator-engine-console/validator-engine-console-query.cpp b/validator-engine-console/validator-engine-console-query.cpp index cdc831d6..625b6932 100644 --- a/validator-engine-console/validator-engine-console-query.cpp +++ b/validator-engine-console/validator-engine-console-query.cpp @@ -1500,6 +1500,46 @@ td::Status GetAdnlStatsQuery::receive(td::BufferSlice data) { return td::Status::OK(); } +td::Status AddShardQuery::run() { + TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); + TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token()); + return td::Status::OK(); +} + +td::Status AddShardQuery::send() { + auto b = ton::create_serialize_tl_object( + ton::create_tl_shard_id(ton::ShardIdFull(wc_, shard_))); + td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise()); + return td::Status::OK(); +} + +td::Status AddShardQuery::receive(td::BufferSlice data) { + TRY_RESULT_PREFIX(f, ton::fetch_tl_object(data.as_slice(), true), + "received incorrect answer: "); + td::TerminalIO::out() << "successfully added shard\n"; + return td::Status::OK(); +} + +td::Status DelShardQuery::run() { + TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); + TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token()); + return td::Status::OK(); +} + +td::Status DelShardQuery::send() { + auto b = ton::create_serialize_tl_object( + ton::create_tl_shard_id(ton::ShardIdFull(wc_, shard_))); + td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise()); + return td::Status::OK(); +} + +td::Status DelShardQuery::receive(td::BufferSlice data) { + TRY_RESULT_PREFIX(f, ton::fetch_tl_object(data.as_slice(), true), + "received incorrect answer: "); + td::TerminalIO::out() << "successfully removed shard\n"; + return td::Status::OK(); +} + td::Status AddCollatorQuery::run() { TRY_RESULT_ASSIGN(adnl_id_, tokenizer_.get_token()); TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); @@ -1521,26 +1561,6 @@ td::Status AddCollatorQuery::receive(td::BufferSlice data) { return td::Status::OK(); } -td::Status AddShardQuery::run() { - TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); - TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token()); - return td::Status::OK(); -} - -td::Status AddShardQuery::send() { - auto b = ton::create_serialize_tl_object( - ton::create_tl_shard_id(ton::ShardIdFull(wc_, shard_))); - td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise()); - return td::Status::OK(); -} - -td::Status AddShardQuery::receive(td::BufferSlice data) { - TRY_RESULT_PREFIX(f, ton::fetch_tl_object(data.as_slice(), true), - "received incorrect answer: "); - td::TerminalIO::out() << "successfully added shard\n"; - return td::Status::OK(); -} - td::Status DelCollatorQuery::run() { TRY_RESULT_ASSIGN(adnl_id_, tokenizer_.get_token()); TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); @@ -1562,26 +1582,6 @@ td::Status DelCollatorQuery::receive(td::BufferSlice data) { return td::Status::OK(); } -td::Status DelShardQuery::run() { - TRY_RESULT_ASSIGN(wc_, tokenizer_.get_token()); - TRY_RESULT_ASSIGN(shard_, tokenizer_.get_token()); - return td::Status::OK(); -} - -td::Status DelShardQuery::send() { - auto b = ton::create_serialize_tl_object( - ton::create_tl_shard_id(ton::ShardIdFull(wc_, shard_))); - td::actor::send_closure(console_, &ValidatorEngineConsole::envelope_send_query, std::move(b), create_promise()); - return td::Status::OK(); -} - -td::Status DelShardQuery::receive(td::BufferSlice data) { - TRY_RESULT_PREFIX(f, ton::fetch_tl_object(data.as_slice(), true), - "received incorrect answer: "); - td::TerminalIO::out() << "successfully removed shard\n"; - return td::Status::OK(); -} - td::Status CollatorNodeAddWhitelistedValidatorQuery::run() { TRY_RESULT_ASSIGN(adnl_id_, tokenizer_.get_token()); TRY_STATUS(tokenizer_.check_endl()); diff --git a/validator-engine-console/validator-engine-console-query.h b/validator-engine-console/validator-engine-console-query.h index 2d59c29b..f9ae0713 100644 --- a/validator-engine-console/validator-engine-console-query.h +++ b/validator-engine-console/validator-engine-console-query.h @@ -1363,6 +1363,52 @@ class GetAdnlStatsQuery : public Query { bool all_ = false; }; +class AddShardQuery : public Query { + public: + AddShardQuery(td::actor::ActorId console, Tokenizer tokenizer) + : Query(console, std::move(tokenizer)) { + } + td::Status run() override; + td::Status send() override; + td::Status receive(td::BufferSlice data) override; + static std::string get_name() { + return "addshard"; + } + static std::string get_help() { + return "addshard \tstart monitoring shard"; + } + std::string name() const override { + return get_name(); + } + + private: + td::int32 wc_; + td::int64 shard_; +}; + +class DelShardQuery : public Query { + public: + DelShardQuery(td::actor::ActorId console, Tokenizer tokenizer) + : Query(console, std::move(tokenizer)) { + } + td::Status run() override; + td::Status send() override; + td::Status receive(td::BufferSlice data) override; + static std::string get_name() { + return "delshard"; + } + static std::string get_help() { + return "delshard \tstop monitoring shard"; + } + std::string name() const override { + return get_name(); + } + + private: + td::int32 wc_; + td::int64 shard_; +}; + class AddCollatorQuery : public Query { public: AddCollatorQuery(td::actor::ActorId console, Tokenizer tokenizer) @@ -1387,29 +1433,6 @@ class AddCollatorQuery : public Query { td::int64 shard_; }; -class AddShardQuery : public Query { - public: - AddShardQuery(td::actor::ActorId console, Tokenizer tokenizer) - : Query(console, std::move(tokenizer)) { - } - td::Status run() override; - td::Status send() override; - td::Status receive(td::BufferSlice data) override; - static std::string get_name() { - return "addshard"; - } - static std::string get_help() { - return "addshard \tstart monitoring shard"; - } - std::string name() const override { - return get_name(); - } - - private: - td::int32 wc_; - td::int64 shard_; -}; - class DelCollatorQuery : public Query { public: DelCollatorQuery(td::actor::ActorId console, Tokenizer tokenizer) @@ -1434,29 +1457,6 @@ class DelCollatorQuery : public Query { td::int64 shard_; }; -class DelShardQuery : public Query { - public: - DelShardQuery(td::actor::ActorId console, Tokenizer tokenizer) - : Query(console, std::move(tokenizer)) { - } - td::Status run() override; - td::Status send() override; - td::Status receive(td::BufferSlice data) override; - static std::string get_name() { - return "delshard"; - } - static std::string get_help() { - return "delshard \tstop monitoring shard"; - } - std::string name() const override { - return get_name(); - } - - private: - td::int32 wc_; - td::int64 shard_; -}; - class CollatorNodeAddWhitelistedValidatorQuery : public Query { public: CollatorNodeAddWhitelistedValidatorQuery(td::actor::ActorId console, Tokenizer tokenizer) diff --git a/validator-engine-console/validator-engine-console.cpp b/validator-engine-console/validator-engine-console.cpp index 67e93211..3d69bce0 100644 --- a/validator-engine-console/validator-engine-console.cpp +++ b/validator-engine-console/validator-engine-console.cpp @@ -153,9 +153,9 @@ void ValidatorEngineConsole::run() { add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); - add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); + add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); add_query_runner(std::make_unique>()); diff --git a/validator-engine/validator-engine.cpp b/validator-engine/validator-engine.cpp index 16aabde5..3b9715b3 100644 --- a/validator-engine/validator-engine.cpp +++ b/validator-engine/validator-engine.cpp @@ -4221,6 +4221,74 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_getAdnlSt }); } +void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_addShard &query, + td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, + td::Promise promise) { + if (!(perm & ValidatorEnginePermissions::vep_modify)) { + promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized"))); + return; + } + if (!started_) { + promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started"))); + return; + } + + auto shard = ton::create_shard_id(query.shard_); + auto R = config_.config_add_shard(shard); + if (R.is_error()) { + promise.set_value(create_control_query_error(R.move_as_error())); + return; + } + set_shard_check_function(); + if (!validator_manager_.empty()) { + td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, + validator_options_); + } + write_config([promise = std::move(promise)](td::Result R) mutable { + if (R.is_error()) { + promise.set_value(create_control_query_error(R.move_as_error())); + } else { + promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); + } + }); +} + +void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_delShard &query, + td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, + td::Promise promise) { + if (!(perm & ValidatorEnginePermissions::vep_modify)) { + promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized"))); + return; + } + if (!started_) { + promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started"))); + return; + } + + auto shard = ton::create_shard_id(query.shard_); + auto R = config_.config_del_shard(shard); + if (R.is_error()) { + promise.set_value(create_control_query_error(R.move_as_error())); + return; + } + if (!R.move_as_ok()) { + promise.set_value(create_control_query_error(td::Status::Error("No such shard"))); + return; + } + set_shard_check_function(); + if (!validator_manager_.empty()) { + td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, + validator_options_); + } + write_config([promise = std::move(promise)](td::Result R) mutable { + if (R.is_error()) { + promise.set_value(create_control_query_error(R.move_as_error())); + } else { + promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); + } + }); +} + void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_setCollatorsList &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise) { if (!(perm & ValidatorEnginePermissions::vep_modify)) { @@ -4357,38 +4425,6 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_addCollat }); } -void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_addShard &query, - td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, - td::Promise promise) { - if (!(perm & ValidatorEnginePermissions::vep_modify)) { - promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized"))); - return; - } - if (!started_) { - promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started"))); - return; - } - - auto shard = ton::create_shard_id(query.shard_); - auto R = config_.config_add_shard(shard); - if (R.is_error()) { - promise.set_value(create_control_query_error(R.move_as_error())); - return; - } - set_shard_check_function(); - if (!validator_manager_.empty()) { - td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, - validator_options_); - } - write_config([promise = std::move(promise)](td::Result R) mutable { - if (R.is_error()) { - promise.set_value(create_control_query_error(R.move_as_error())); - } else { - promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); - } - }); -} - void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_delCollator &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise) { @@ -4434,42 +4470,6 @@ void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_delCollat }); } -void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_delShard &query, - td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, - td::Promise promise) { - if (!(perm & ValidatorEnginePermissions::vep_modify)) { - promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::error, "not authorized"))); - return; - } - if (!started_) { - promise.set_value(create_control_query_error(td::Status::Error(ton::ErrorCode::notready, "not started"))); - return; - } - - auto shard = ton::create_shard_id(query.shard_); - auto R = config_.config_del_shard(shard); - if (R.is_error()) { - promise.set_value(create_control_query_error(R.move_as_error())); - return; - } - if (!R.move_as_ok()) { - promise.set_value(create_control_query_error(td::Status::Error("No such shard"))); - return; - } - set_shard_check_function(); - if (!validator_manager_.empty()) { - td::actor::send_closure(validator_manager_, &ton::validator::ValidatorManagerInterface::update_options, - validator_options_); - } - write_config([promise = std::move(promise)](td::Result R) mutable { - if (R.is_error()) { - promise.set_value(create_control_query_error(R.move_as_error())); - } else { - promise.set_value(ton::serialize_tl_object(ton::create_tl_object(), true)); - } - }); -} - void ValidatorEngine::run_control_query(ton::ton_api::engine_validator_signOverlayMemberCertificate &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise) { diff --git a/validator-engine/validator-engine.hpp b/validator-engine/validator-engine.hpp index 827ba4b3..8dd9b1f3 100644 --- a/validator-engine/validator-engine.hpp +++ b/validator-engine/validator-engine.hpp @@ -511,14 +511,14 @@ class ValidatorEngine : public td::actor::Actor { ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); void run_control_query(ton::ton_api::engine_validator_getActorTextStats &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); - void run_control_query(ton::ton_api::engine_validator_addCollator &query, td::BufferSlice data, - ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); void run_control_query(ton::ton_api::engine_validator_addShard &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); - void run_control_query(ton::ton_api::engine_validator_delCollator &query, td::BufferSlice data, - ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); void run_control_query(ton::ton_api::engine_validator_delShard &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); + void run_control_query(ton::ton_api::engine_validator_addCollator &query, td::BufferSlice data, + ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); + void run_control_query(ton::ton_api::engine_validator_delCollator &query, td::BufferSlice data, + ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); void run_control_query(ton::ton_api::engine_validator_getPerfTimerStats &query, td::BufferSlice data, ton::PublicKeyHash src, td::uint32 perm, td::Promise promise); void run_control_query(ton::ton_api::engine_validator_getShardOutQueueSize &query, td::BufferSlice data, diff --git a/validator/full-node.cpp b/validator/full-node.cpp index d927eef2..0278c9ae 100644 --- a/validator/full-node.cpp +++ b/validator/full-node.cpp @@ -21,6 +21,7 @@ #include "td/actor/MultiPromise.h" #include "full-node.h" #include "common/delay.h" +#include "td/utils/Random.h" #include "ton/ton-tl.hpp" namespace ton { diff --git a/validator/manager.cpp b/validator/manager.cpp index 4c8e6ecc..d4ea6810 100644 --- a/validator/manager.cpp +++ b/validator/manager.cpp @@ -531,6 +531,10 @@ void ValidatorManagerImpl::new_block_candidate(BlockIdExt block_id, td::BufferSl VLOG(VALIDATOR_DEBUG) << "dropping block candidate broadcast: not monitoring shard"; return; } + if (!need_monitor(block_id.shard_full())) { + VLOG(VALIDATOR_DEBUG) << "dropping block candidate broadcast: not monitoring shard"; + return; + } add_cached_block_candidate(ReceivedBlock{block_id, std::move(data)}); }