From 13eeee9b2e0e508882dd9faadef1fb1d1bb324b0 Mon Sep 17 00:00:00 2001 From: Stan Bondi Date: Mon, 11 Dec 2023 14:42:19 +0400 Subject: [PATCH] feat!: libp2p --- .license.ignore | 2 +- Cargo.lock | 2184 ++++++++++++++--- Cargo.toml | 14 +- .../tari_dan_app_utilities/Cargo.toml | 9 +- .../src/base_layer_scanner.rs | 30 +- .../tari_dan_app_utilities/src/config.rs | 107 + .../tari_dan_app_utilities/src/keypair.rs | 257 ++ .../tari_dan_app_utilities/src/lib.rs | 3 + .../tari_dan_app_utilities/src/seed_peer.rs | 63 + .../implementation/initializer.rs | 5 +- .../implementation/manager.rs | 26 +- .../implementation/service.rs | 10 +- applications/tari_dan_wallet_cli/Cargo.toml | 2 +- .../src/command/account.rs | 2 +- applications/tari_indexer/Cargo.toml | 14 +- applications/tari_indexer/src/bootstrap.rs | 107 +- applications/tari_indexer/src/cli.rs | 28 + .../tari_indexer/src/comms/broadcast.rs | 168 -- .../tari_indexer/src/comms/deserialize.rs | 122 - .../tari_indexer/src/comms/destination.rs | 42 - .../tari_indexer/src/comms/initializer.rs | 298 --- applications/tari_indexer/src/config.rs | 14 +- .../tari_indexer/src/dry_run/error.rs | 2 +- .../tari_indexer/src/dry_run/processor.rs | 53 +- .../tari_indexer/src/json_rpc/error.rs | 26 + .../tari_indexer/src/json_rpc/handlers.rs | 241 +- applications/tari_indexer/src/json_rpc/mod.rs | 1 + .../tari_indexer/src/json_rpc/server.rs | 2 +- applications/tari_indexer/src/lib.rs | 20 +- .../tari_indexer/src/substate_manager.rs | 8 +- .../src/transaction_manager/mod.rs | 4 +- .../src/routes/VN/Components/Connections.tsx | 83 +- .../src/routes/VN/Components/Info.tsx | 8 +- .../src/utils/interfaces.tsx | 4 +- applications/tari_validator_node/Cargo.toml | 14 +- .../tari_validator_node/src/bootstrap.rs | 191 +- applications/tari_validator_node/src/cli.rs | 36 + .../src/comms/broadcast.rs | 203 -- .../src/comms/deserialize.rs | 177 -- .../src/comms/destination.rs | 40 - .../src/comms/initializer.rs | 332 --- .../tari_validator_node/src/comms/logger.rs | 93 - .../tari_validator_node/src/config.rs | 30 +- .../tari_validator_node/src/consensus/mod.rs | 34 +- .../src/consensus/signature_service.rs | 20 +- .../tari_validator_node/src/consensus/spec.rs | 6 +- .../src/consensus/state_manager.rs | 2 +- .../tari_validator_node/src/dan_node.rs | 128 +- .../src/dry_run_transaction_processor.rs | 26 +- .../src/grpc/base_layer_wallet/client.rs | 14 +- .../src/json_rpc/handlers.rs | 296 +-- .../src/json_rpc/server.rs | 4 +- applications/tari_validator_node/src/lib.rs | 28 +- .../tari_validator_node/src/p2p/logging.rs | 35 + .../tari_validator_node/src/p2p/mod.rs | 1 + .../tari_validator_node/src/p2p/rpc/mod.rs | 16 +- .../src/p2p/rpc/service_impl.rs | 60 +- .../src/p2p/rpc/sync_task.rs | 33 +- .../src/p2p/services/mempool/error.rs | 5 +- .../src/p2p/services/mempool/gossip.rs | 268 +- .../src/p2p/services/mempool/initializer.rs | 18 +- .../src/p2p/services/mempool/service.rs | 49 +- .../mempool/validators/before/epoch_range.rs | 11 +- .../validators/before/template_exists.rs | 11 +- .../dispatcher.rs | 37 +- .../error.rs | 6 +- .../inbound.rs | 33 +- .../{messaging => message_dispatcher}/mod.rs | 60 +- .../services/message_dispatcher/outbound.rs | 172 ++ .../src/p2p/services/messaging/outbound.rs | 137 -- .../src/p2p/services/mod.rs | 6 +- .../tari_validator_node/src/registration.rs | 29 +- .../src/substate_resolver.rs | 23 +- .../src/virtual_substate.rs | 17 +- .../tari_validator_node_cli/Cargo.toml | 2 +- .../src/command/debug.rs | 60 - .../src/command/mod.rs | 4 - .../tari_validator_node_cli/src/command/vn.rs | 2 +- .../src/key_manager.rs | 7 +- .../tari_validator_node_cli/src/main.rs | 1 - .../src/routes/VN/Components/Connections.tsx | 121 +- .../src/routes/VN/Components/Info.tsx | 26 +- .../src/routes/VN/Components/helpers.tsx | 32 +- .../src/utils/interfaces.tsx | 11 +- clients/base_node_client/Cargo.toml | 1 - clients/tari_indexer_client/Cargo.toml | 2 +- clients/tari_indexer_client/src/types.rs | 25 +- clients/validator_node_client/Cargo.toml | 3 +- clients/validator_node_client/src/lib.rs | 51 +- clients/validator_node_client/src/types.rs | 54 +- dan_layer/common_types/Cargo.toml | 8 +- dan_layer/common_types/src/committee.rs | 62 +- dan_layer/common_types/src/lib.rs | 5 +- .../common_types/src/node_addressable.rs | 31 +- dan_layer/common_types/src/peer_address.rs | 97 + .../common_types/src/validator_metadata.rs | 5 +- dan_layer/comms_rpc_state_sync/Cargo.toml | 2 +- dan_layer/comms_rpc_state_sync/src/error.rs | 2 +- dan_layer/comms_rpc_state_sync/src/lib.rs | 10 +- dan_layer/comms_rpc_state_sync/src/manager.rs | 51 +- dan_layer/consensus/src/block_validations.rs | 14 +- dan_layer/consensus/src/hotstuff/common.rs | 8 +- dan_layer/consensus/src/hotstuff/error.rs | 4 +- dan_layer/consensus/src/hotstuff/mod.rs | 1 - .../src/hotstuff/on_inbound_message.rs | 68 +- .../src/hotstuff/on_next_sync_view.rs | 4 +- .../consensus/src/hotstuff/on_propose.rs | 11 +- .../on_ready_to_vote_on_local_block.rs | 34 +- .../hotstuff/on_receive_foreign_proposal.rs | 39 +- .../src/hotstuff/on_receive_local_proposal.rs | 23 +- .../src/hotstuff/on_receive_new_view.rs | 12 +- ..._receive_request_missing_foreign_blocks.rs | 66 - ...on_receive_request_missing_transactions.rs | 4 +- .../consensus/src/hotstuff/on_receive_vote.rs | 4 +- .../consensus/src/hotstuff/on_sync_request.rs | 4 +- dan_layer/consensus/src/hotstuff/proposer.rs | 4 +- .../consensus/src/hotstuff/vote_receiver.rs | 63 +- dan_layer/consensus/src/hotstuff/worker.rs | 32 +- dan_layer/consensus/src/messages/message.rs | 32 +- dan_layer/consensus/src/messages/mod.rs | 3 - dan_layer/consensus/src/messages/new_view.rs | 6 +- dan_layer/consensus/src/messages/proposal.rs | 4 +- .../request_missing_foreign_blocks.rs | 12 - dan_layer/consensus/src/messages/sync.rs | 10 +- dan_layer/consensus/src/messages/vote.rs | 8 +- .../consensus/src/traits/leader_strategy.rs | 26 +- dan_layer/consensus/src/traits/mod.rs | 6 +- .../consensus/src/traits/signing_service.rs | 19 +- .../consensus/src/traits/state_manager.rs | 2 +- .../consensus_tests/src/support/address.rs | 23 +- .../src/support/epoch_manager.rs | 56 +- .../consensus_tests/src/support/harness.rs | 27 +- .../consensus_tests/src/support/network.rs | 29 +- .../src/support/signing_service.rs | 17 +- dan_layer/consensus_tests/src/support/spec.rs | 2 +- .../src/support/state_manager.rs | 2 +- .../src/support/validator/builder.rs | 18 +- .../src/support/validator/instance.rs | 6 +- .../engine/tests/templates/buggy/Cargo.toml | 2 - dan_layer/epoch_manager/Cargo.toml | 11 +- .../base_layer/base_layer_epoch_manager.rs | 128 +- .../src/base_layer/epoch_manager_service.rs | 32 +- .../epoch_manager/src/base_layer/handle.rs | 45 +- .../src/base_layer/initializer.rs | 7 +- .../epoch_manager/src/base_layer/types.rs | 34 +- dan_layer/epoch_manager/src/traits.rs | 32 +- dan_layer/indexer_lib/src/substate_scanner.rs | 20 +- dan_layer/p2p/Cargo.toml | 5 - dan_layer/p2p/src/lib.rs | 6 - dan_layer/p2p/src/message.rs | 54 +- dan_layer/p2p/src/outbound_service.rs | 24 +- dan_layer/p2p/src/peer_service.rs | 93 - dan_layer/state_store_sqlite/Cargo.toml | 1 + .../up.sql | 10 - dan_layer/state_store_sqlite/src/reader.rs | 80 +- dan_layer/state_store_sqlite/src/schema.rs | 11 - .../src/sql_models/block.rs | 32 +- .../src/sql_models/bookkeeping.rs | 4 +- .../src/sql_models/quorum_certificate.rs | 3 +- .../state_store_sqlite/src/sql_models/vote.rs | 4 +- dan_layer/state_store_sqlite/src/writer.rs | 34 +- .../storage/src/consensus_models/block.rs | 131 +- .../storage/src/consensus_models/high_qc.rs | 7 +- .../src/consensus_models/last_proposed.rs | 5 +- .../src/consensus_models/last_sent_vote.rs | 12 +- .../src/consensus_models/leaf_block.rs | 2 +- .../src/consensus_models/locked_block.rs | 2 +- .../consensus_models/quorum_certificate.rs | 40 +- .../storage/src/consensus_models/substate.rs | 28 +- .../src/consensus_models/validated_block.rs | 29 +- .../storage/src/consensus_models/vote.rs | 16 +- .../src/consensus_models/vote_signature.rs | 13 +- .../storage/src/global/backend_adapter.rs | 23 +- .../src/global/models/validator_node.rs | 7 +- .../storage/src/global/validator_node_db.rs | 35 +- dan_layer/storage/src/state_store/mod.rs | 59 +- .../down.sql | 1 + .../up.sql | 3 + dan_layer/storage_sqlite/src/error.rs | 12 + .../src/global/backend_adapter.rs | 106 +- dan_layer/storage_sqlite/src/global/mod.rs | 1 + .../storage_sqlite/src/global/models/mod.rs | 1 + .../src/global/models/validator_node.rs | 13 +- dan_layer/storage_sqlite/src/global/schema.rs | 17 +- .../src/global/serialization.rs | 24 + .../storage_sqlite/src/sqlite_db_factory.rs | 17 +- dan_layer/storage_sqlite/tests/global_db.rs | 28 +- .../templates/account_nfts/Cargo.toml | 1 - dan_layer/template_lib/Cargo.toml | 6 + .../src/support/crypto.rs | 3 +- .../templates/faucet/Cargo.lock | 8 +- dan_layer/validator_node_rpc/Cargo.toml | 13 +- dan_layer/validator_node_rpc/build.rs | 2 +- .../validator_node_rpc/proto/consensus.proto | 7 - .../validator_node_rpc/proto/network.proto | 9 +- dan_layer/validator_node_rpc/src/client.rs | 120 +- .../src/conversions/common.rs | 11 +- .../src/conversions/consensus.rs | 97 +- .../src/conversions/network.rs | 141 +- .../validator_node_rpc/src/conversions/rpc.rs | 13 +- .../src/conversions/transaction.rs | 2 +- dan_layer/validator_node_rpc/src/error.rs | 15 +- dan_layer/validator_node_rpc/src/lib.rs | 1 - .../validator_node_rpc/src/rpc_service.rs | 27 +- dan_layer/wallet/sdk/src/apis/transaction.rs | 7 +- .../sdk/src/models/wallet_transaction.rs | 4 +- dan_layer/wallet/sdk/src/storage.rs | 11 +- .../storage_sqlite/src/models/transaction.rs | 3 +- dan_layer/wallet/storage_sqlite/src/reader.rs | 9 +- dan_layer/wallet/storage_sqlite/src/writer.rs | 2 +- igor/config/config.toml | 1112 +++++++++ igor/config/indexer/log4rs.yml | 150 ++ igor/data/indexer/global_storage.sqlite | Bin 0 -> 57344 bytes igor/indexer_id.json | 2 + integration_tests/Cargo.toml | 7 +- integration_tests/src/base_node.rs | 12 +- integration_tests/src/indexer.rs | 19 +- integration_tests/src/lib.rs | 66 +- integration_tests/src/miner.rs | 66 +- .../src/templates/basic_nft/Cargo.toml | 1 - .../src/templates/counter/Cargo.toml | 3 - .../src/templates/faucet/Cargo.toml | 2 - integration_tests/src/validator_node.rs | 23 +- integration_tests/src/wallet.rs | 2 +- integration_tests/tests/cucumber.rs | 8 +- integration_tests/tests/steps/base_node.rs | 8 +- integration_tests/tests/steps/indexer.rs | 21 +- .../tests/steps/validator_node.rs | 21 +- networking/core/Cargo.toml | 20 + networking/core/src/config.rs | 26 + networking/core/src/connection.rs | 24 + networking/core/src/error.rs | 88 + networking/core/src/event.rs | 13 + networking/core/src/global_ip.rs | 120 + networking/core/src/handle.rs | 408 +++ networking/core/src/lib.rs | 80 + networking/core/src/notify.rs | 33 + networking/core/src/peer.rs | 44 + networking/core/src/relay_state.rs | 85 + networking/core/src/spawn.rs | 44 + networking/core/src/worker.rs | 898 +++++++ networking/libp2p-messaging/Cargo.toml | 17 + networking/libp2p-messaging/src/behaviour.rs | 297 +++ networking/libp2p-messaging/src/codec/mod.rs | 28 + .../libp2p-messaging/src/codec/prost.rs | 78 + networking/libp2p-messaging/src/config.rs | 21 + networking/libp2p-messaging/src/error.rs | 36 + networking/libp2p-messaging/src/event.rs | 36 + networking/libp2p-messaging/src/handler.rs | 331 +++ networking/libp2p-messaging/src/lib.rs | 19 + networking/libp2p-messaging/src/message.rs | 13 + networking/libp2p-messaging/src/stream.rs | 80 + networking/libp2p-substream/Cargo.toml | 11 + networking/libp2p-substream/src/behaviour.rs | 321 +++ networking/libp2p-substream/src/config.rs | 5 + networking/libp2p-substream/src/error.rs | 31 + networking/libp2p-substream/src/event.rs | 31 + networking/libp2p-substream/src/handler.rs | 281 +++ networking/libp2p-substream/src/lib.rs | 16 + networking/libp2p-substream/src/notify.rs | 23 + networking/libp2p-substream/src/stream.rs | 76 + networking/proto_builder/Cargo.toml | 10 + networking/proto_builder/src/lib.rs | 213 ++ networking/rpc_framework/Cargo.toml | 32 + networking/rpc_framework/build.rs | 12 + networking/rpc_framework/proto/rpc.proto | 59 + networking/rpc_framework/src/body.rs | 301 +++ .../rpc_framework/src/bounded_executor.rs | 163 ++ .../rpc_framework/src/client/metrics.rs | 129 + networking/rpc_framework/src/client/mod.rs | 1033 ++++++++ networking/rpc_framework/src/client/pool.rs | 276 +++ networking/rpc_framework/src/client/tests.rs | 205 ++ networking/rpc_framework/src/either.rs | 97 + networking/rpc_framework/src/error.rs | 166 ++ networking/rpc_framework/src/event.rs | 35 + networking/rpc_framework/src/framing.rs | 22 + networking/rpc_framework/src/handshake.rs | 155 ++ networking/rpc_framework/src/lib.rs | 126 + networking/rpc_framework/src/message.rs | 280 +++ networking/rpc_framework/src/not_found.rs | 69 + networking/rpc_framework/src/notify.rs | 8 + networking/rpc_framework/src/optional.rs | 7 + networking/rpc_framework/src/proto.rs | 6 + .../rpc_framework/src/server/chunking.rs | 268 ++ .../rpc_framework/src/server/early_close.rs | 118 + networking/rpc_framework/src/server/error.rs | 98 + networking/rpc_framework/src/server/handle.rs | 61 + .../rpc_framework/src/server/metrics.rs | 113 + networking/rpc_framework/src/server/mock.rs | 285 +++ networking/rpc_framework/src/server/mod.rs | 890 +++++++ networking/rpc_framework/src/server/router.rs | 315 +++ networking/rpc_framework/src/status.rs | 313 +++ .../rpc_framework/src/test/client_pool.rs | 174 ++ .../src/test/comms_integration.rs | 92 + .../src/test/greeting_service.rs | 476 ++++ .../rpc_framework/src/test/handshake.rs | 71 + networking/rpc_framework/src/test/mock.rs | 183 ++ .../rpc_framework/src/test}/mod.rs | 15 +- networking/rpc_framework/src/test/smoke.rs | 585 +++++ networking/rpc_macros/Cargo.toml | 27 + networking/rpc_macros/src/expand.rs | 317 +++ networking/rpc_macros/src/generator.rs | 263 ++ networking/rpc_macros/src/lib.rs | 79 + .../rpc_macros/src/macros.rs | 16 +- networking/rpc_macros/src/method_info.rs | 30 + networking/rpc_macros/src/options.rs | 98 + networking/rpc_macros/tests/macro.rs | 175 ++ .../sqlite_message_logger}/Cargo.toml | 2 +- .../sqlite_message_logger}/README.md | 0 .../sqlite_message_logger}/diesel.toml | 0 .../migrations/.gitkeep | 0 .../2022-10-20-121212_create_table/down.sql | 0 .../2022-10-20-121212_create_table/up.sql | 2 +- .../2022-10-20-121213_create_inbound/down.sql | 0 .../2022-10-20-121213_create_inbound/up.sql | 2 +- .../sqlite_message_logger}/src/lib.rs | 2 +- .../sqlite_message_logger}/src/schema.rs | 4 +- .../src/sqlite_message_log.rs | 29 +- networking/swarm/Cargo.toml | 16 + networking/swarm/src/behaviour.rs | 172 ++ networking/swarm/src/codec/mod.rs | 27 + networking/swarm/src/codec/prost.rs | 76 + networking/swarm/src/config.rs | 35 + networking/swarm/src/error.rs | 16 + networking/swarm/src/lib.rs | 20 + networking/swarm/src/network.rs | 36 + networking/swarm/src/protocol_version.rs | 168 ++ 327 files changed, 19139 insertions(+), 4945 deletions(-) create mode 100644 applications/tari_dan_app_utilities/src/config.rs create mode 100644 applications/tari_dan_app_utilities/src/keypair.rs create mode 100644 applications/tari_dan_app_utilities/src/seed_peer.rs delete mode 100644 applications/tari_indexer/src/comms/broadcast.rs delete mode 100644 applications/tari_indexer/src/comms/deserialize.rs delete mode 100644 applications/tari_indexer/src/comms/destination.rs delete mode 100644 applications/tari_indexer/src/comms/initializer.rs create mode 100644 applications/tari_indexer/src/json_rpc/error.rs delete mode 100644 applications/tari_validator_node/src/comms/broadcast.rs delete mode 100644 applications/tari_validator_node/src/comms/deserialize.rs delete mode 100644 applications/tari_validator_node/src/comms/destination.rs delete mode 100644 applications/tari_validator_node/src/comms/initializer.rs delete mode 100644 applications/tari_validator_node/src/comms/logger.rs create mode 100644 applications/tari_validator_node/src/p2p/logging.rs rename applications/tari_validator_node/src/p2p/services/{messaging => message_dispatcher}/dispatcher.rs (70%) rename applications/tari_validator_node/src/p2p/services/{messaging => message_dispatcher}/error.rs (65%) rename applications/tari_validator_node/src/p2p/services/{messaging => message_dispatcher}/inbound.rs (65%) rename applications/tari_validator_node/src/p2p/services/{messaging => message_dispatcher}/mod.rs (62%) create mode 100644 applications/tari_validator_node/src/p2p/services/message_dispatcher/outbound.rs delete mode 100644 applications/tari_validator_node/src/p2p/services/messaging/outbound.rs delete mode 100644 applications/tari_validator_node_cli/src/command/debug.rs create mode 100644 dan_layer/common_types/src/peer_address.rs delete mode 100644 dan_layer/consensus/src/hotstuff/on_receive_request_missing_foreign_blocks.rs delete mode 100644 dan_layer/consensus/src/messages/request_missing_foreign_blocks.rs delete mode 100644 dan_layer/p2p/src/peer_service.rs create mode 100644 dan_layer/storage_sqlite/global_db_migrations/2023-11-28-050541_add_address_to_validator_nodes/down.sql create mode 100644 dan_layer/storage_sqlite/global_db_migrations/2023-11-28-050541_add_address_to_validator_nodes/up.sql create mode 100644 dan_layer/storage_sqlite/src/global/serialization.rs create mode 100644 igor/config/config.toml create mode 100644 igor/config/indexer/log4rs.yml create mode 100644 igor/data/indexer/global_storage.sqlite create mode 100644 igor/indexer_id.json create mode 100644 networking/core/Cargo.toml create mode 100644 networking/core/src/config.rs create mode 100644 networking/core/src/connection.rs create mode 100644 networking/core/src/error.rs create mode 100644 networking/core/src/event.rs create mode 100644 networking/core/src/global_ip.rs create mode 100644 networking/core/src/handle.rs create mode 100644 networking/core/src/lib.rs create mode 100644 networking/core/src/notify.rs create mode 100644 networking/core/src/peer.rs create mode 100644 networking/core/src/relay_state.rs create mode 100644 networking/core/src/spawn.rs create mode 100644 networking/core/src/worker.rs create mode 100644 networking/libp2p-messaging/Cargo.toml create mode 100644 networking/libp2p-messaging/src/behaviour.rs create mode 100644 networking/libp2p-messaging/src/codec/mod.rs create mode 100644 networking/libp2p-messaging/src/codec/prost.rs create mode 100644 networking/libp2p-messaging/src/config.rs create mode 100644 networking/libp2p-messaging/src/error.rs create mode 100644 networking/libp2p-messaging/src/event.rs create mode 100644 networking/libp2p-messaging/src/handler.rs create mode 100644 networking/libp2p-messaging/src/lib.rs create mode 100644 networking/libp2p-messaging/src/message.rs create mode 100644 networking/libp2p-messaging/src/stream.rs create mode 100644 networking/libp2p-substream/Cargo.toml create mode 100644 networking/libp2p-substream/src/behaviour.rs create mode 100644 networking/libp2p-substream/src/config.rs create mode 100644 networking/libp2p-substream/src/error.rs create mode 100644 networking/libp2p-substream/src/event.rs create mode 100644 networking/libp2p-substream/src/handler.rs create mode 100644 networking/libp2p-substream/src/lib.rs create mode 100644 networking/libp2p-substream/src/notify.rs create mode 100644 networking/libp2p-substream/src/stream.rs create mode 100644 networking/proto_builder/Cargo.toml create mode 100644 networking/proto_builder/src/lib.rs create mode 100644 networking/rpc_framework/Cargo.toml create mode 100644 networking/rpc_framework/build.rs create mode 100644 networking/rpc_framework/proto/rpc.proto create mode 100644 networking/rpc_framework/src/body.rs create mode 100644 networking/rpc_framework/src/bounded_executor.rs create mode 100644 networking/rpc_framework/src/client/metrics.rs create mode 100644 networking/rpc_framework/src/client/mod.rs create mode 100644 networking/rpc_framework/src/client/pool.rs create mode 100644 networking/rpc_framework/src/client/tests.rs create mode 100644 networking/rpc_framework/src/either.rs create mode 100644 networking/rpc_framework/src/error.rs create mode 100644 networking/rpc_framework/src/event.rs create mode 100644 networking/rpc_framework/src/framing.rs create mode 100644 networking/rpc_framework/src/handshake.rs create mode 100644 networking/rpc_framework/src/lib.rs create mode 100644 networking/rpc_framework/src/message.rs create mode 100644 networking/rpc_framework/src/not_found.rs create mode 100644 networking/rpc_framework/src/notify.rs create mode 100644 networking/rpc_framework/src/optional.rs create mode 100644 networking/rpc_framework/src/proto.rs create mode 100644 networking/rpc_framework/src/server/chunking.rs create mode 100644 networking/rpc_framework/src/server/early_close.rs create mode 100644 networking/rpc_framework/src/server/error.rs create mode 100644 networking/rpc_framework/src/server/handle.rs create mode 100644 networking/rpc_framework/src/server/metrics.rs create mode 100644 networking/rpc_framework/src/server/mock.rs create mode 100644 networking/rpc_framework/src/server/mod.rs create mode 100644 networking/rpc_framework/src/server/router.rs create mode 100644 networking/rpc_framework/src/status.rs create mode 100644 networking/rpc_framework/src/test/client_pool.rs create mode 100644 networking/rpc_framework/src/test/comms_integration.rs create mode 100644 networking/rpc_framework/src/test/greeting_service.rs create mode 100644 networking/rpc_framework/src/test/handshake.rs create mode 100644 networking/rpc_framework/src/test/mock.rs rename {applications/tari_indexer/src/comms => networking/rpc_framework/src/test}/mod.rs (87%) create mode 100644 networking/rpc_framework/src/test/smoke.rs create mode 100644 networking/rpc_macros/Cargo.toml create mode 100644 networking/rpc_macros/src/expand.rs create mode 100644 networking/rpc_macros/src/generator.rs create mode 100644 networking/rpc_macros/src/lib.rs rename applications/tari_validator_node/src/comms/mod.rs => networking/rpc_macros/src/macros.rs (86%) create mode 100644 networking/rpc_macros/src/method_info.rs create mode 100644 networking/rpc_macros/src/options.rs create mode 100644 networking/rpc_macros/tests/macro.rs rename {comms/tari_comms_logging => networking/sqlite_message_logger}/Cargo.toml (94%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/README.md (100%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/diesel.toml (100%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/migrations/.gitkeep (100%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/migrations/2022-10-20-121212_create_table/down.sql (100%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/migrations/2022-10-20-121212_create_table/up.sql (90%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/migrations/2022-10-20-121213_create_inbound/down.sql (100%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/migrations/2022-10-20-121213_create_inbound/up.sql (90%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/src/lib.rs (74%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/src/schema.rs (88%) rename {comms/tari_comms_logging => networking/sqlite_message_logger}/src/sqlite_message_log.rs (92%) create mode 100644 networking/swarm/Cargo.toml create mode 100644 networking/swarm/src/behaviour.rs create mode 100644 networking/swarm/src/codec/mod.rs create mode 100644 networking/swarm/src/codec/prost.rs create mode 100644 networking/swarm/src/config.rs create mode 100644 networking/swarm/src/error.rs create mode 100644 networking/swarm/src/lib.rs create mode 100644 networking/swarm/src/network.rs create mode 100644 networking/swarm/src/protocol_version.rs diff --git a/.license.ignore b/.license.ignore index 630116341..d4cc847e2 100644 --- a/.license.ignore +++ b/.license.ignore @@ -2,7 +2,7 @@ ./LICENSE ./applications/tari_indexer/src/substate_storage_sqlite/schema.rs ./buildtools/vagrant/Vagrantfile -./comms/tari_comms_logging/src/schema.rs +./networking/sqlite_message_logger/src/schema.rs ./dan_layer/storage_sqlite/src/global/schema.rs ./dan_layer/state_store_sqlite/src/schema.rs ./dan_layer/wallet/storage_sqlite/src/schema.rs diff --git a/Cargo.lock b/Cargo.lock index 85042a695..39aa2054a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,7 +18,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.28.0", + "gimli 0.28.1", ] [[package]] @@ -129,6 +129,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "alloy-rlp" version = "0.3.3" @@ -157,9 +163,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" dependencies = [ "anstyle", "anstyle-parse", @@ -177,30 +183,30 @@ checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -445,12 +451,12 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener 3.1.0", + "event-listener 4.0.0", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -458,30 +464,30 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5ea910c42e5ab19012bab31f53cb4d63d54c3a27730f9a833a88efcf4bb52d" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 3.1.1", + "async-lock 3.2.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.0.1", + "futures-lite 2.1.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.3.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" +checksum = "9b4353121d5644cdf2beb5726ab752e79a8db1ebb52031770ec47db31d245526" dependencies = [ - "async-channel 1.9.0", + "async-channel 2.1.1", "async-executor", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io 2.2.1", + "async-lock 3.2.0", "blocking", - "futures-lite 1.13.0", + "futures-lite 2.1.0", "once_cell", ] @@ -597,22 +603,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" +checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" dependencies = [ - "async-lock 3.1.1", + "async-lock 3.2.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.1.0", "parking", - "polling 3.3.0", - "rustix 0.38.25", + "polling 3.3.1", + "rustix 0.38.28", "slab", "tracing", - "waker-fn", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -626,11 +631,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b9c7fe787d3b25cc0f804a1a8401790f0c5bc395beb5a64dc77d8de079105" +checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ - "event-listener 3.1.0", + "event-listener 4.0.0", "event-listener-strategy", "pin-project-lite", ] @@ -657,7 +662,7 @@ dependencies = [ "cfg-if", "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.25", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -667,13 +672,13 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.0", + "async-io 2.2.1", "async-lock 2.8.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.25", + "rustix 0.38.28", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -725,7 +730,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -742,16 +747,33 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] -name = "atomic-polyfill" -version = "1.0.3" +name = "asynchronous-codec" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +checksum = "4057f2c32adbb2fc158e22fb38433c8e9bbf76b75a4732c7c0cbaf695fb65568" dependencies = [ - "critical-section", + "bytes 1.5.0", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "asynchronous-codec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" +dependencies = [ + "bytes 1.5.0", + "futures-sink", + "futures-util", + "memchr", + "pin-project-lite", ] [[package]] @@ -760,6 +782,17 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "attohttpc" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9a9bf8b79a749ee0b911b91b671cc2b6c670bdbc7e3dfd537576ddc94bb2a2" +dependencies = [ + "http", + "log", + "url", +] + [[package]] name = "atty" version = "0.2.14" @@ -871,6 +904,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + [[package]] name = "base16ct" version = "0.2.0" @@ -1064,12 +1103,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.0", - "async-lock 3.1.1", + "async-channel 2.1.1", + "async-lock 3.2.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.1.0", "piper", "tracing", ] @@ -1135,6 +1174,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "tinyvec", +] + [[package]] name = "bstr" version = "1.8.0" @@ -1556,9 +1604,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -1566,9 +1614,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -1599,7 +1647,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -1642,18 +1690,18 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] [[package]] name = "config" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" +checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" dependencies = [ "async-trait", "json5 0.4.1", @@ -1689,7 +1737,7 @@ dependencies = [ "tari_engine_types", "tari_epoch_manager", "tari_mmr", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_state_store_sqlite", "tari_transaction", "thiserror", @@ -1768,9 +1816,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -1778,9 +1826,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core2" @@ -1835,7 +1883,7 @@ dependencies = [ "gimli 0.26.2", "log", "regalloc", - "smallvec", + "smallvec 1.11.2", "target-lexicon", ] @@ -1868,7 +1916,7 @@ checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" dependencies = [ "cranelift-codegen", "log", - "smallvec", + "smallvec 1.11.2", "target-lexicon", ] @@ -1977,7 +2025,7 @@ dependencies = [ "crossterm_winapi 0.9.1", "futures-core", "libc", - "mio 0.8.9", + "mio 0.8.10", "parking_lot 0.12.1", "signal-hook", "signal-hook-mio", @@ -1993,7 +2041,7 @@ dependencies = [ "bitflags 1.3.2", "crossterm_winapi 0.9.1", "libc", - "mio 0.8.9", + "mio 0.8.10", "parking_lot 0.12.1", "signal-hook", "signal-hook-mio", @@ -2074,7 +2122,7 @@ dependencies = [ "anyhow", "async-trait", "atty", - "clap 4.4.8", + "clap 4.4.11", "console", "cucumber-codegen", "cucumber-expressions", @@ -2143,9 +2191,9 @@ dependencies = [ [[package]] name = "curl-sys" -version = "0.4.68+curl-8.4.0" +version = "0.4.70+curl-8.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4a0d18d88360e374b16b2273c832b5e57258ffc1d4aa4f96b108e0738d5752f" +checksum = "3c0333d8849afe78a4c8102a429a446bfdd055832af071945520e835ae2d841e" dependencies = [ "cc", "libc", @@ -2195,7 +2243,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2254,7 +2302,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2276,7 +2324,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2286,7 +2334,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core 0.9.9", @@ -2294,9 +2342,29 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "data-encoding-macro" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] [[package]] name = "decimal-rs" @@ -2334,9 +2402,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ "powerfmt", "serde", @@ -2450,7 +2518,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2470,7 +2538,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2559,7 +2627,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2580,6 +2648,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "669a445ee724c5c69b1b06fe0b63e70a1c84bc9bb7d9696cd4f4e3ec45050408" +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + [[package]] name = "ecdsa" version = "0.16.9" @@ -2612,6 +2686,7 @@ checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ "curve25519-dalek 4.1.1", "ed25519", + "rand_core 0.6.4", "serde", "sha2", "subtle", @@ -2687,6 +2762,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "enum-as-inner" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.40", +] + [[package]] name = "enum-iterator" version = "0.7.0" @@ -2725,7 +2812,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2749,12 +2836,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2793,13 +2880,24 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "event-listener-strategy" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 3.1.0", + "event-listener 4.0.0", "pin-project-lite", ] @@ -2861,7 +2959,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" dependencies = [ "cfg-if", - "rustix 0.38.25", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -2947,9 +3045,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -2991,6 +3089,16 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-bounded" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e2774cc104e198ef3d3e1ff4ab40f86fa3245d6cb6a3a46174f21463cee173" +dependencies = [ + "futures-timer", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.29" @@ -3016,6 +3124,7 @@ dependencies = [ "futures-core", "futures-task", "futures-util", + "num_cpus", ] [[package]] @@ -3041,14 +3150,13 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" dependencies = [ "fastrand 2.0.1", "futures-core", "futures-io", - "memchr", "parking", "pin-project-lite", ] @@ -3061,7 +3169,17 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", +] + +[[package]] +name = "futures-rustls" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd3cf68c183738046838e300353e4716c674dc5e56890de4826801a6622a28" +dependencies = [ + "futures-io", + "rustls 0.21.10", ] [[package]] @@ -3076,6 +3194,23 @@ version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +[[package]] +name = "futures-ticker" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9763058047f713632a52e916cc7f6a4b3fc6e9fc1ff8c5b1dc49e5a89041682e" +dependencies = [ + "futures 0.3.29", + "futures-timer", + "instant", +] + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" + [[package]] name = "futures-util" version = "0.3.29" @@ -3178,9 +3313,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "git2" @@ -3203,15 +3338,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", "bstr", - "fnv", "log", - "regex", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] @@ -3316,9 +3451,13 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash 0.8.6", + "allocator-api2", +] [[package]] name = "hdrhistogram" @@ -3402,6 +3541,58 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + +[[package]] +name = "hickory-proto" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091a6fbccf4860009355e3efc52ff4acf37a63489aad7435372d44ceeb6fbbcf" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner 0.6.0", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.4.0", + "ipnet", + "once_cell", + "rand", + "socket2 0.5.5", + "thiserror", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35b8f021164e6a984c9030023544c57789c51760065cd510572fedcfb04164e8" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "lru-cache", + "once_cell", + "parking_lot 0.12.1", + "rand", + "resolv-conf", + "smallvec 1.11.2", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "hkdf" version = "0.12.3" @@ -3429,6 +3620,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + [[package]] name = "http" version = "0.2.11" @@ -3442,9 +3644,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes 1.5.0", "http", @@ -3622,55 +3824,112 @@ dependencies = [ ] [[package]] -name = "ignore" -version = "0.4.20" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "image" -version = "0.23.14" +name = "if-addrs" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-iter", - "num-rational", - "num-traits", + "libc", + "windows-sys 0.48.0", ] [[package]] -name = "impl-codec" -version = "0.6.0" +name = "if-watch" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" dependencies = [ - "parity-scale-codec", + "async-io 2.2.1", + "core-foundation", + "fnv", + "futures 0.3.29", + "if-addrs", + "ipnet", + "log", + "rtnetlink", + "system-configuration", + "tokio", + "windows 0.51.1", ] [[package]] -name = "impl-serde" -version = "0.4.0" +name = "igd-next" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +checksum = "57e065e90a518ab5fedf79aa1e4b784e10f8e484a834f6bda85c42633a2cb7af" dependencies = [ - "serde", -] - -[[package]] + "async-trait", + "attohttpc", + "bytes 1.5.0", + "futures 0.3.29", + "http", + "hyper", + "log", + "rand", + "tokio", + "url", + "xmltree", +] + +[[package]] +name = "ignore" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.3", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.23.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] name = "impl-trait-for-tuples" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3718,7 +3977,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", ] [[package]] @@ -3766,9 +4025,9 @@ dependencies = [ "base64 0.21.5", "config", "cucumber", - "futures 0.3.29", "httpmock", "indexmap 1.9.3", + "libp2p", "log", "log4rs 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "minotari_app_grpc", @@ -3786,17 +4045,18 @@ dependencies = [ "tari_common_types", "tari_comms", "tari_comms_dht", + "tari_core", "tari_crypto", + "tari_dan_app_utilities", "tari_dan_common_types", "tari_dan_engine", "tari_dan_storage", "tari_dan_wallet_daemon", - "tari_dan_wallet_sdk", "tari_engine_types", "tari_indexer", "tari_indexer_client", "tari_p2p", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_template_builtin", "tari_template_lib", "tari_transaction", @@ -3855,6 +4115,18 @@ dependencies = [ "libc", ] +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.5", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -3868,7 +4140,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi 0.3.3", - "rustix 0.38.25", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -3928,9 +4200,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jfs" @@ -3956,9 +4228,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -4093,9 +4365,9 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] name = "libgit2-sys" @@ -4144,6 +4416,536 @@ dependencies = [ "libc", ] +[[package]] +name = "libp2p" +version = "0.53.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681fb3f183edfbedd7a57d32ebe5dcdc0b9f94061185acf3c30249349cc6fc99" +dependencies = [ + "bytes 1.5.0", + "either", + "futures 0.3.29", + "futures-timer", + "getrandom 0.2.11", + "instant", + "libp2p-allow-block-list", + "libp2p-autonat", + "libp2p-connection-limits", + "libp2p-core", + "libp2p-dcutr", + "libp2p-dns", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-mdns", + "libp2p-metrics", + "libp2p-noise", + "libp2p-ping", + "libp2p-quic", + "libp2p-relay", + "libp2p-swarm", + "libp2p-tcp", + "libp2p-upnp", + "libp2p-yamux", + "multiaddr 0.18.1", + "pin-project 1.1.3", + "rw-stream-sink", + "thiserror", +] + +[[package]] +name = "libp2p-allow-block-list" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "107b238b794cb83ab53b74ad5dcf7cca3200899b72fe662840cfb52f5b0a32e6" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-autonat" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d95151726170e41b591735bf95c42b888fe4aa14f65216a9fbf0edcc04510586" +dependencies = [ + "async-trait", + "asynchronous-codec 0.6.2", + "futures 0.3.29", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-request-response", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec 0.2.0", + "rand", + "tracing", +] + +[[package]] +name = "libp2p-connection-limits" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7cd50a78ccfada14de94cbacd3ce4b0138157f376870f13d3a8422cd075b4fd" +dependencies = [ + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "void", +] + +[[package]] +name = "libp2p-core" +version = "0.41.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8130a8269e65a2554d55131c770bdf4bcd94d2b8d4efb24ca23699be65066c05" +dependencies = [ + "either", + "fnv", + "futures 0.3.29", + "futures-timer", + "instant", + "libp2p-identity", + "multiaddr 0.18.1", + "multihash 0.19.1", + "multistream-select", + "once_cell", + "parking_lot 0.12.1", + "pin-project 1.1.3", + "quick-protobuf", + "rand", + "rw-stream-sink", + "smallvec 1.11.2", + "thiserror", + "tracing", + "unsigned-varint 0.8.0", + "void", +] + +[[package]] +name = "libp2p-dcutr" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f7bb7fa2b9e6cad9c30a6f67e3ff5c1e4b658c62b6375e35861a85f9c97bf3" +dependencies = [ + "asynchronous-codec 0.6.2", + "either", + "futures 0.3.29", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "lru 0.11.1", + "quick-protobuf", + "quick-protobuf-codec 0.2.0", + "thiserror", + "tracing", + "void", +] + +[[package]] +name = "libp2p-dns" +version = "0.41.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d17cbcf7160ff35c3e8e560de4a068fe9d6cb777ea72840e48eb76ff9576c4b6" +dependencies = [ + "async-trait", + "futures 0.3.29", + "hickory-resolver", + "libp2p-core", + "libp2p-identity", + "parking_lot 0.12.1", + "smallvec 1.11.2", + "tracing", +] + +[[package]] +name = "libp2p-gossipsub" +version = "0.46.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d665144a616dadebdc5fff186b1233488cdcd8bfb1223218ff084b6d052c94f7" +dependencies = [ + "asynchronous-codec 0.7.0", + "base64 0.21.5", + "byteorder", + "bytes 1.5.0", + "either", + "fnv", + "futures 0.3.29", + "futures-ticker", + "getrandom 0.2.11", + "hex_fmt", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "prometheus-client", + "quick-protobuf", + "quick-protobuf-codec 0.3.1", + "rand", + "regex", + "sha2", + "smallvec 1.11.2", + "tracing", + "void", +] + +[[package]] +name = "libp2p-identify" +version = "0.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20499a945d2f0221fdc6269b3848892c0f370d2ee3e19c7f65a29d8f860f6126" +dependencies = [ + "asynchronous-codec 0.7.0", + "either", + "futures 0.3.29", + "futures-bounded", + "futures-timer", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "lru 0.12.1", + "quick-protobuf", + "quick-protobuf-codec 0.3.1", + "smallvec 1.11.2", + "thiserror", + "tracing", + "void", +] + +[[package]] +name = "libp2p-identity" +version = "0.2.8" +source = "git+https://github.com/sdbondi/rust-libp2p.git?rev=ae1c06a9615a0ac020e459904ec984a6ab253678#ae1c06a9615a0ac020e459904ec984a6ab253678" +dependencies = [ + "bs58 0.5.0", + "ed25519-dalek", + "hkdf", + "multihash 0.19.1", + "quick-protobuf", + "rand", + "serde", + "sha2", + "tari_crypto", + "thiserror", + "tracing", + "zeroize", +] + +[[package]] +name = "libp2p-kad" +version = "0.45.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc5767727d062c4eac74dd812c998f0e488008e82cce9c33b463d38423f9ad2" +dependencies = [ + "arrayvec", + "asynchronous-codec 0.7.0", + "bytes 1.5.0", + "either", + "fnv", + "futures 0.3.29", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec 0.3.1", + "rand", + "sha2", + "smallvec 1.11.2", + "thiserror", + "tracing", + "uint", + "void", +] + +[[package]] +name = "libp2p-mdns" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49007d9a339b3e1d7eeebc4d67c05dbf23d300b7d091193ec2d3f26802d7faf2" +dependencies = [ + "data-encoding", + "futures 0.3.29", + "hickory-proto", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand", + "smallvec 1.11.2", + "socket2 0.5.5", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-messaging" +version = "0.1.0" +dependencies = [ + "async-trait", + "futures-bounded", + "libp2p", + "prost 0.12.3", + "smallvec 2.0.0-alpha.1", + "tracing", +] + +[[package]] +name = "libp2p-metrics" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdac91ae4f291046a3b2660c039a2830c931f84df2ee227989af92f7692d3357" +dependencies = [ + "futures 0.3.29", + "instant", + "libp2p-core", + "libp2p-dcutr", + "libp2p-gossipsub", + "libp2p-identify", + "libp2p-identity", + "libp2p-kad", + "libp2p-ping", + "libp2p-relay", + "libp2p-swarm", + "pin-project 1.1.3", + "prometheus-client", +] + +[[package]] +name = "libp2p-noise" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecd0545ce077f6ea5434bcb76e8d0fe942693b4380aaad0d34a358c2bd05793" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes 1.5.0", + "curve25519-dalek 4.1.1", + "futures 0.3.29", + "libp2p-core", + "libp2p-identity", + "multiaddr 0.18.1", + "multihash 0.19.1", + "once_cell", + "quick-protobuf", + "rand", + "sha2", + "snow", + "static_assertions", + "thiserror", + "tracing", + "x25519-dalek", + "zeroize", +] + +[[package]] +name = "libp2p-ping" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b94ee41bd8c294194fe608851e45eb98de26fe79bc7913838cbffbfe8c7ce2" +dependencies = [ + "either", + "futures 0.3.29", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand", + "tracing", + "void", +] + +[[package]] +name = "libp2p-quic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0375cdfee57b47b313ef1f0fdb625b78aed770d33a40cf1c294a371ff5e6666" +dependencies = [ + "bytes 1.5.0", + "futures 0.3.29", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-identity", + "libp2p-tls", + "parking_lot 0.12.1", + "quinn", + "rand", + "ring 0.16.20", + "rustls 0.21.10", + "socket2 0.5.5", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-relay" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0aadb213ffc8e1a6f2b9c48dcf0fc07bf370f2ea4db7981813d45e50671c8d9d" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes 1.5.0", + "either", + "futures 0.3.29", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "quick-protobuf", + "quick-protobuf-codec 0.3.1", + "rand", + "static_assertions", + "thiserror", + "tracing", + "void", +] + +[[package]] +name = "libp2p-request-response" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12823250fe0c45bdddea6eefa2be9a609aff1283ff4e1d8a294fdbb89572f6f" +dependencies = [ + "async-trait", + "futures 0.3.29", + "futures-bounded", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm", + "rand", + "smallvec 1.11.2", + "tracing", + "void", +] + +[[package]] +name = "libp2p-substream" +version = "0.1.0" +dependencies = [ + "libp2p", + "smallvec 1.11.2", + "tracing", +] + +[[package]] +name = "libp2p-swarm" +version = "0.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e92532fc3c4fb292ae30c371815c9b10103718777726ea5497abc268a4761866" +dependencies = [ + "either", + "fnv", + "futures 0.3.29", + "futures-timer", + "instant", + "libp2p-core", + "libp2p-identity", + "libp2p-swarm-derive", + "multistream-select", + "once_cell", + "rand", + "smallvec 1.11.2", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-swarm-derive" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b644268b4acfdaa6a6100b31226ee7a36d96ab4c43287d113bfd2308607d8b6f" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.40", +] + +[[package]] +name = "libp2p-tcp" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2460fc2748919adff99ecbc1aab296e4579e41f374fb164149bd2c9e529d4c" +dependencies = [ + "futures 0.3.29", + "futures-timer", + "if-watch", + "libc", + "libp2p-core", + "libp2p-identity", + "socket2 0.5.5", + "tokio", + "tracing", +] + +[[package]] +name = "libp2p-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ce7e3c2e7569d685d08ec795157981722ff96e9e9f9eae75df3c29d02b07a5" +dependencies = [ + "futures 0.3.29", + "futures-rustls", + "libp2p-core", + "libp2p-identity", + "rcgen", + "ring 0.16.20", + "rustls 0.21.10", + "rustls-webpki", + "thiserror", + "x509-parser", + "yasna", +] + +[[package]] +name = "libp2p-upnp" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "963eb8a174f828f6a51927999a9ab5e45dfa9aa2aa5fed99aa65f79de6229464" +dependencies = [ + "futures 0.3.29", + "futures-timer", + "igd-next", + "libp2p-core", + "libp2p-swarm", + "tokio", + "tracing", + "void", +] + +[[package]] +name = "libp2p-yamux" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200cbe50349a44760927d50b431d77bed79b9c0a3959de1af8d24a63434b71e5" +dependencies = [ + "either", + "futures 0.3.29", + "libp2p-core", + "thiserror", + "tracing", + "yamux 0.12.1", + "yamux 0.13.1", +] + [[package]] name = "libredox" version = "0.0.1" @@ -4192,9 +4994,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "liquid" @@ -4235,7 +5037,7 @@ checksum = "fc2fb41a9bb4257a3803154bdf7e2df7d45197d1941c9b1a90ad815231630721" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4362,6 +5164,33 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "lru" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a83fb7698b3643a0e34f9ae6f2e8f0178c0fd42f8b59d493aa271ff3a5bf21" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "lru" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2994eeba8ed550fd9b47a0b38f0242bc3344e496483c6180b69139cc2fa5d1d7" +dependencies = [ + "hashbrown 0.14.3", +] + +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "mach" version = "0.3.2" @@ -4371,6 +5200,12 @@ dependencies = [ "libc", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "matchers" version = "0.1.0" @@ -4476,7 +5311,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4526,7 +5361,7 @@ dependencies = [ "crossbeam-utils", "dashmap", "skeptic", - "smallvec", + "smallvec 1.11.2", "tagptr", "triomphe", ] @@ -4548,8 +5383,8 @@ dependencies = [ [[package]] name = "minotari_app_grpc" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "argon2", "base64 0.13.1", @@ -4574,8 +5409,8 @@ dependencies = [ [[package]] name = "minotari_app_utilities" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "clap 3.2.25", "futures 0.3.29", @@ -4594,8 +5429,8 @@ dependencies = [ [[package]] name = "minotari_console_wallet" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "bitflags 2.4.1", "blake2", @@ -4633,7 +5468,7 @@ dependencies = [ "tari_key_manager", "tari_p2p", "tari_script", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_utilities", "thiserror", "tokio", @@ -4648,8 +5483,8 @@ dependencies = [ [[package]] name = "minotari_node" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "async-trait", @@ -4681,10 +5516,10 @@ dependencies = [ "tari_core", "tari_crypto", "tari_features", - "tari_metrics", + "tari_metrics 0.1.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_p2p", "tari_service_framework", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_storage", "tari_utilities", "thiserror", @@ -4695,15 +5530,15 @@ dependencies = [ [[package]] name = "minotari_node_grpc_client" version = "0.1.0" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "minotari_app_grpc", ] [[package]] name = "minotari_wallet" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "argon2", "async-trait", @@ -4740,7 +5575,7 @@ dependencies = [ "tari_p2p", "tari_script", "tari_service_framework", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_utilities", "tempfile", "thiserror", @@ -4752,7 +5587,7 @@ dependencies = [ [[package]] name = "minotari_wallet_grpc_client" version = "0.1.0" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "minotari_app_grpc", "tari_common_types", @@ -4775,9 +5610,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", @@ -4842,17 +5677,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" dependencies = [ "arrayref", - "bs58", + "bs58 0.4.0", + "byteorder", + "data-encoding", + "multihash 0.16.3", + "percent-encoding", + "serde", + "static_assertions", + "unsigned-varint 0.7.2", + "url", +] + +[[package]] +name = "multiaddr" +version = "0.18.1" +source = "git+https://github.com/sdbondi/rust-libp2p.git?rev=ae1c06a9615a0ac020e459904ec984a6ab253678#ae1c06a9615a0ac020e459904ec984a6ab253678" +dependencies = [ + "arrayref", "byteorder", "data-encoding", - "multihash", + "libp2p-identity", + "multibase", + "multihash 0.19.1", "percent-encoding", "serde", "static_assertions", - "unsigned-varint", + "unsigned-varint 0.7.2", "url", ] +[[package]] +name = "multibase" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" +dependencies = [ + "base-x", + "data-encoding", + "data-encoding-macro", +] + [[package]] name = "multihash" version = "0.16.3" @@ -4861,7 +5725,17 @@ checksum = "1c346cf9999c631f002d8f977c4eaeaa0e6386f16007202308d0b3757522c2cc" dependencies = [ "core2", "multihash-derive", - "unsigned-varint", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "multihash" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +dependencies = [ + "core2", + "unsigned-varint 0.7.2", ] [[package]] @@ -4884,6 +5758,20 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" +[[package]] +name = "multistream-select" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0df8e5eec2298a62b326ee4f0d7fe1a6b90a09dfcf9df37b38f947a8c42f19" +dependencies = [ + "bytes 1.5.0", + "futures 0.3.29", + "log", + "pin-project 1.1.3", + "smallvec 1.11.2", + "unsigned-varint 0.7.2", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -4902,6 +5790,72 @@ dependencies = [ "tempfile", ] +[[package]] +name = "netlink-packet-core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +dependencies = [ + "anyhow", + "byteorder", + "libc", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-route" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +dependencies = [ + "anyhow", + "bitflags 1.3.2", + "byteorder", + "libc", + "netlink-packet-core", + "netlink-packet-utils", +] + +[[package]] +name = "netlink-packet-utils" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" +dependencies = [ + "anyhow", + "byteorder", + "paste", + "thiserror", +] + +[[package]] +name = "netlink-proto" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +dependencies = [ + "bytes 1.5.0", + "futures 0.3.29", + "log", + "netlink-packet-core", + "netlink-sys", + "thiserror", + "tokio", +] + +[[package]] +name = "netlink-sys" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6471bf08e7ac0135876a9581bf3217ef0333c191c128d34878079f42ee150411" +dependencies = [ + "bytes 1.5.0", + "futures 0.3.29", + "libc", + "log", + "tokio", +] + [[package]] name = "new_debug_unreachable" version = "1.0.4" @@ -4920,7 +5874,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" dependencies = [ - "smallvec", + "smallvec 1.11.2", ] [[package]] @@ -4936,6 +5890,17 @@ dependencies = [ "memoffset 0.6.5", ] +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "nix" version = "0.26.4" @@ -5010,7 +5975,7 @@ dependencies = [ "num-traits", "rand", "serde", - "smallvec", + "smallvec 1.11.2", "zeroize", ] @@ -5033,7 +5998,7 @@ checksum = "cfb77679af88f8b125209d354a202862602672222e7f2313fdd6dc349bad4712" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5130,12 +6095,12 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" dependencies = [ - "atomic-polyfill", "critical-section", + "portable-atomic", ] [[package]] @@ -5146,9 +6111,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -5167,7 +6132,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5178,9 +6143,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -5239,9 +6204,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec", @@ -5253,11 +6218,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate 1.1.3", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 1.0.109", @@ -5300,7 +6265,7 @@ dependencies = [ "instant", "libc", "redox_syscall 0.2.16", - "smallvec", + "smallvec 1.11.2", "winapi", ] @@ -5313,7 +6278,7 @@ dependencies = [ "cfg-if", "libc", "redox_syscall 0.4.1", - "smallvec", + "smallvec 1.11.2", "windows-targets 0.48.5", ] @@ -5403,9 +6368,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" @@ -5438,7 +6403,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5507,7 +6472,7 @@ dependencies = [ "sha2", "sha3", "signature", - "smallvec", + "smallvec 1.11.2", "thiserror", "twofish", "x25519-dalek", @@ -5560,7 +6525,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5637,16 +6602,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.25", + "rustix 0.38.28", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5695,6 +6660,12 @@ dependencies = [ "universal-hash 0.5.1", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "powerfmt" version = "0.2.0" @@ -5713,6 +6684,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn 2.0.40", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -5753,6 +6734,15 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "toml_edit 0.20.7", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -5779,9 +6769,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -5801,6 +6791,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "prometheus-client" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "510c4f1c9d81d556458f94c98f857748130ea9737bbd6053da497503b26ea63c" +dependencies = [ + "dtoa", + "itoa", + "parking_lot 0.12.1", + "prometheus-client-derive-encode", +] + +[[package]] +name = "prometheus-client-derive-encode" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.40", +] + [[package]] name = "proptest" version = "1.4.0" @@ -5837,6 +6850,16 @@ dependencies = [ "prost-derive 0.11.9", ] +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes 1.5.0", + "prost-derive 0.12.3", +] + [[package]] name = "prost-build" version = "0.9.0" @@ -5857,6 +6880,28 @@ dependencies = [ "which", ] +[[package]] +name = "prost-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +dependencies = [ + "bytes 1.5.0", + "heck 0.4.1", + "itertools 0.11.0", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost 0.12.3", + "prost-types 0.12.3", + "regex", + "syn 2.0.40", + "tempfile", + "which", +] + [[package]] name = "prost-derive" version = "0.9.0" @@ -5883,6 +6928,19 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.40", +] + [[package]] name = "prost-types" version = "0.9.0" @@ -5902,6 +6960,23 @@ dependencies = [ "prost 0.11.9", ] +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost 0.12.3", +] + +[[package]] +name = "proto_builder" +version = "0.1.0" +dependencies = [ + "prost-build 0.12.3", + "sha2", +] + [[package]] name = "protobuf" version = "2.28.0" @@ -5950,18 +7025,107 @@ dependencies = [ ] [[package]] -name = "quick-error" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" - -[[package]] -name = "quick-xml" -version = "0.31.0" +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-protobuf" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d6da84cc204722a989e01ba2f6e1e276e190f22263d0cb6ce8526fcdb0d2e1f" +dependencies = [ + "byteorder", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ededb1cd78531627244d51dd0c7139fbe736c7d57af0092a76f0ffb2f56e98" +dependencies = [ + "asynchronous-codec 0.6.2", + "bytes 1.5.0", + "quick-protobuf", + "thiserror", + "unsigned-varint 0.7.2", +] + +[[package]] +name = "quick-protobuf-codec" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0580ab32b169745d7a39db2ba969226ca16738931be152a3209b409de2474" +dependencies = [ + "asynchronous-codec 0.7.0", + "bytes 1.5.0", + "quick-protobuf", + "thiserror", + "unsigned-varint 0.8.0", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" +dependencies = [ + "bytes 1.5.0", + "futures-io", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.21.10", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" +dependencies = [ + "bytes 1.5.0", + "rand", + "ring 0.16.20", + "rustc-hash", + "rustls 0.21.10", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ - "memchr", + "bytes 1.5.0", + "libc", + "socket2 0.5.5", + "tracing", + "windows-sys 0.48.0", ] [[package]] @@ -6123,13 +7287,13 @@ dependencies = [ [[package]] name = "reflink-copy" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248fbed6f59e99c8ef6c6ecadc9b09c6e93713b8f921d73e41d6ed6017bf0624" +checksum = "7c509b49b989bce68439387eb469cbe301c6cfb08e28612ddc3a179bd7b0a012" dependencies = [ "cfg-if", - "rustix 0.38.25", - "windows", + "rustix 0.38.28", + "windows 0.52.0", ] [[package]] @@ -6140,7 +7304,7 @@ checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" dependencies = [ "log", "rustc-hash", - "smallvec", + "smallvec 1.11.2", ] [[package]] @@ -6246,6 +7410,16 @@ dependencies = [ "winreg", ] +[[package]] +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +dependencies = [ + "hostname", + "quick-error 1.2.3", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -6273,9 +7447,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.5" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", "getrandom 0.2.11", @@ -6355,9 +7529,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.4" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3211b01eea83d80687da9eef70e39d65144a3894866a5153a2723e425a157f" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ "const-oid", "digest 0.10.7", @@ -6384,6 +7558,21 @@ dependencies = [ "webrtc-util", ] +[[package]] +name = "rtnetlink" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +dependencies = [ + "futures 0.3.29", + "log", + "netlink-packet-route", + "netlink-proto", + "nix 0.24.3", + "thiserror", + "tokio", +] + [[package]] name = "rtp" version = "0.9.0" @@ -6498,15 +7687,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ "bitflags 2.4.1", "errno", "libc", - "linux-raw-sys 0.4.11", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.12", + "windows-sys 0.52.0", ] [[package]] @@ -6523,12 +7712,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.9" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629648aced5775d558af50b2b4c7b02983a04b312126d45eeead26e7caa498b9" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.5", + "ring 0.17.7", "rustls-webpki", "sct", ] @@ -6557,7 +7746,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -6584,7 +7773,7 @@ dependencies = [ "nix 0.23.2", "radix_trie", "scopeguard", - "smallvec", + "smallvec 1.11.2", "unicode-segmentation", "unicode-width", "utf8parse", @@ -6601,11 +7790,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rw-stream-sink" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8c9026ff5d2f23da5e45bbc283f156383001bfb09c4e44256d02c1a685fe9a1" +dependencies = [ + "futures 0.3.29", + "pin-project 1.1.3", + "static_assertions", +] + [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "safemem" @@ -6658,7 +7858,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -6813,7 +8013,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -6855,7 +8055,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -6904,7 +8104,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -7002,7 +8202,7 @@ checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" dependencies = [ "libc", "mio 0.7.14", - "mio 0.8.9", + "mio 0.8.10", "signal-hook", ] @@ -7096,6 +8296,12 @@ version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +[[package]] +name = "smallvec" +version = "2.0.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af12b8880f45a593fc99ac6d0a066f762861ea6822a6a6790fa1363d70a8089" + [[package]] name = "smawk" version = "0.3.2" @@ -7144,6 +8350,7 @@ dependencies = [ "chacha20poly1305 0.9.1", "curve25519-dalek 4.1.1", "rand_core 0.6.4", + "ring 0.16.20", "rustc_version 0.4.0", "sha2", "subtle", @@ -7183,14 +8390,26 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", ] +[[package]] +name = "sqlite_message_logger" +version = "0.2.0" +dependencies = [ + "chrono", + "diesel", + "diesel_migrations", + "log", + "serde", + "serde_json", +] + [[package]] name = "ssri" version = "9.2.0" @@ -7364,9 +8583,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" dependencies = [ "proc-macro2", "quote", @@ -7493,7 +8712,6 @@ dependencies = [ "tari_common_types", "tari_core", "tari_dan_common_types", - "tari_engine_types", "tari_utilities", "thiserror", "tonic 0.6.2", @@ -7534,8 +8752,8 @@ dependencies = [ [[package]] name = "tari_common" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "blake2", @@ -7544,9 +8762,9 @@ dependencies = [ "git2", "log", "log4rs 1.2.0 (git+https://github.com/tari-project/log4rs.git)", - "multiaddr", + "multiaddr 0.14.0", "path-clean", - "prost-build", + "prost-build 0.9.0", "serde", "serde_json", "serde_yaml 0.9.27", @@ -7561,8 +8779,8 @@ dependencies = [ [[package]] name = "tari_common_sqlite" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "diesel", "diesel_migrations", @@ -7575,8 +8793,8 @@ dependencies = [ [[package]] name = "tari_common_types" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "base64 0.21.5", "blake2", @@ -7597,8 +8815,8 @@ dependencies = [ [[package]] name = "tari_comms" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "async-trait", @@ -7615,7 +8833,7 @@ dependencies = [ "lmdb-zero", "log", "log-mdc", - "multiaddr", + "multiaddr 0.14.0", "nom", "once_cell", "pin-project 1.1.3", @@ -7627,8 +8845,8 @@ dependencies = [ "snow", "tari_common", "tari_crypto", - "tari_metrics", - "tari_shutdown", + "tari_metrics 0.1.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_storage", "tari_utilities", "thiserror", @@ -7637,14 +8855,14 @@ dependencies = [ "tokio-util 0.6.10", "tower", "tracing", - "yamux", + "yamux 0.10.2", "zeroize", ] [[package]] name = "tari_comms_dht" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "bitflags 2.4.1", @@ -7667,7 +8885,7 @@ dependencies = [ "tari_comms", "tari_comms_rpc_macros", "tari_crypto", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_storage", "tari_utilities", "thiserror", @@ -7676,22 +8894,10 @@ dependencies = [ "zeroize", ] -[[package]] -name = "tari_comms_logging" -version = "0.2.0" -dependencies = [ - "chrono", - "diesel", - "diesel_migrations", - "log", - "serde", - "serde_json", -] - [[package]] name = "tari_comms_rpc_macros" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "proc-macro2", "quote", @@ -7706,11 +8912,11 @@ dependencies = [ "async-trait", "futures 0.3.29", "log", - "tari_comms", "tari_consensus", "tari_dan_common_types", "tari_dan_storage", "tari_epoch_manager", + "tari_rpc_framework", "tari_transaction", "tari_validator_node_rpc", "thiserror", @@ -7729,7 +8935,7 @@ dependencies = [ "tari_dan_storage", "tari_epoch_manager", "tari_mmr", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_transaction", "thiserror", "tokio", @@ -7737,8 +8943,8 @@ dependencies = [ [[package]] name = "tari_contacts" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "chrono", "diesel", @@ -7759,7 +8965,7 @@ dependencies = [ "tari_crypto", "tari_p2p", "tari_service_framework", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_utilities", "thiserror", "tokio", @@ -7769,8 +8975,8 @@ dependencies = [ [[package]] name = "tari_core" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "async-trait", "bincode 1.3.3", @@ -7818,7 +9024,7 @@ dependencies = [ "tari_p2p", "tari_script", "tari_service_framework", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_storage", "tari_test_utils", "tari_utilities", @@ -7861,15 +9067,20 @@ dependencies = [ "chrono", "dashmap", "futures 0.3.29", + "json5 0.4.1", + "libp2p-identity", "log", "mini-moka", - "prost 0.9.0", + "multiaddr 0.18.1", + "prost 0.12.3", + "rand", "reqwest", "serde", "serde_json", "std-semaphore", "tari_base_node_client", "tari_bor", + "tari_common", "tari_common_types", "tari_core", "tari_crypto", @@ -7880,7 +9091,8 @@ dependencies = [ "tari_engine_types", "tari_epoch_manager", "tari_indexer_lib", - "tari_shutdown", + "tari_networking", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_state_store_sqlite", "tari_template_builtin", "tari_template_lib", @@ -7896,8 +9108,9 @@ name = "tari_dan_common_types" version = "0.2.0" dependencies = [ "blake2", + "libp2p-identity", "newtype-ops", - "prost 0.9.0", + "prost 0.12.3", "prost-types 0.9.0", "rand", "ruint", @@ -7947,7 +9160,6 @@ version = "0.50.0-pre.0" dependencies = [ "async-trait", "serde", - "tari_comms", "tari_consensus", "tari_dan_common_types", "tari_transaction", @@ -8013,7 +9225,7 @@ dependencies = [ "base64 0.20.0", "clap 3.2.25", "log", - "multiaddr", + "multiaddr 0.18.1", "reqwest", "serde_json", "tari_bor", @@ -8063,7 +9275,7 @@ dependencies = [ "tari_dan_wallet_storage_sqlite", "tari_engine_types", "tari_indexer_client", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_template_builtin", "tari_template_lib", "tari_transaction", @@ -8160,22 +9372,20 @@ dependencies = [ "log", "tari_base_node_client", "tari_common_types", - "tari_comms", "tari_core", - "tari_crypto", "tari_dan_common_types", "tari_dan_storage", "tari_dan_storage_sqlite", "tari_mmr", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "thiserror", "tokio", ] [[package]] name = "tari_features" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" [[package]] name = "tari_indexer" @@ -8191,14 +9401,12 @@ dependencies = [ "config", "diesel", "diesel_migrations", - "futures 0.3.29", "include_dir", - "lmdb-zero", + "libp2p", "log", "log4rs 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess", "minotari_app_utilities", - "prost 0.9.0", "reqwest", "serde", "serde_json", @@ -8206,8 +9414,6 @@ dependencies = [ "tari_bor", "tari_common", "tari_common_types", - "tari_comms", - "tari_comms_logging", "tari_crypto", "tari_dan_app_utilities", "tari_dan_common_types", @@ -8219,19 +9425,16 @@ dependencies = [ "tari_epoch_manager", "tari_indexer_client", "tari_indexer_lib", - "tari_p2p", - "tari_shutdown", + "tari_networking", + "tari_rpc_framework", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_state_store_sqlite", - "tari_storage", "tari_template_lib", "tari_transaction", "tari_validator_node_rpc", "thiserror", "tokio", - "tonic 0.6.2", - "tower", "tower-http", - "tower-layer", ] [[package]] @@ -8239,7 +9442,7 @@ name = "tari_indexer_client" version = "0.2.0" dependencies = [ "anyhow", - "multiaddr", + "multiaddr 0.18.1", "reqwest", "serde", "serde_json", @@ -8272,8 +9475,8 @@ dependencies = [ [[package]] name = "tari_key_manager" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "argon2", "async-trait", @@ -8306,7 +9509,7 @@ dependencies = [ [[package]] name = "tari_metrics" version = "0.1.0" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "futures 0.3.29", @@ -8319,10 +9522,20 @@ dependencies = [ "warp", ] +[[package]] +name = "tari_metrics" +version = "0.1.0" +source = "git+https://github.com/sdbondi/tari.git?rev=e45751090dce2eeac208883fa13865591bdafb46#e45751090dce2eeac208883fa13865591bdafb46" +dependencies = [ + "once_cell", + "prometheus", + "thiserror", +] + [[package]] name = "tari_mmr" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "borsh", "digest 0.10.7", @@ -8334,10 +9547,27 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tari_networking" +version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "libp2p", + "log", + "rand", + "tari_crypto", + "tari_rpc_framework", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", + "tari_swarm", + "thiserror", + "tokio", +] + [[package]] name = "tari_p2p" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "fs2", @@ -8356,7 +9586,7 @@ dependencies = [ "tari_comms_dht", "tari_crypto", "tari_service_framework", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_storage", "tari_utilities", "thiserror", @@ -8367,6 +9597,40 @@ dependencies = [ "webpki", ] +[[package]] +name = "tari_rpc_framework" +version = "0.1.0" +dependencies = [ + "async-trait", + "bitflags 2.4.1", + "bytes 1.5.0", + "futures 0.3.29", + "libp2p", + "libp2p-substream", + "log", + "once_cell", + "pin-project 1.1.3", + "prost 0.12.3", + "prost-build 0.12.3", + "proto_builder", + "tari_metrics 0.1.0 (git+https://github.com/sdbondi/tari.git?rev=e45751090dce2eeac208883fa13865591bdafb46)", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/sdbondi/tari.git?rev=e45751090dce2eeac208883fa13865591bdafb46)", + "thiserror", + "tokio", + "tokio-util 0.7.10", + "tower", + "tracing", +] + +[[package]] +name = "tari_rpc_macros" +version = "0.53.0-dan.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "tari_scaffolder" version = "0.2.0" @@ -8380,7 +9644,7 @@ dependencies = [ [[package]] name = "tari_script" version = "0.12.0" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "blake2", "borsh", @@ -8396,14 +9660,14 @@ dependencies = [ [[package]] name = "tari_service_framework" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "anyhow", "async-trait", "futures 0.3.29", "log", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "thiserror", "tokio", "tower-service", @@ -8411,8 +9675,16 @@ dependencies = [ [[package]] name = "tari_shutdown" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" +dependencies = [ + "futures 0.3.29", +] + +[[package]] +name = "tari_shutdown" +version = "0.53.0-dan.0" +source = "git+https://github.com/sdbondi/tari.git?rev=e45751090dce2eeac208883fa13865591bdafb46#e45751090dce2eeac208883fa13865591bdafb46" dependencies = [ "futures 0.3.29", ] @@ -8425,7 +9697,7 @@ dependencies = [ "axum", "axum-jrpc", "chrono", - "clap 4.4.8", + "clap 4.4.11", "dirs", "jsonwebtoken", "log", @@ -8434,7 +9706,7 @@ dependencies = [ "tari_common", "tari_dan_common_types", "tari_dan_wallet_sdk", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tokio", "tower-http", "webrtc", @@ -8457,14 +9729,15 @@ dependencies = [ "tari_dan_common_types", "tari_dan_storage", "tari_transaction", + "tari_utilities", "thiserror", "time", ] [[package]] name = "tari_storage" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "bincode 1.3.3", "lmdb-zero", @@ -8473,6 +9746,18 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tari_swarm" +version = "0.1.0" +dependencies = [ + "async-trait", + "libp2p", + "libp2p-messaging", + "libp2p-substream", + "thiserror", + "tokio", +] + [[package]] name = "tari_template_abi" version = "0.2.0" @@ -8536,13 +9821,13 @@ dependencies = [ [[package]] name = "tari_test_utils" -version = "0.52.0-dan.6" -source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#520b433813c035cc8fce5a507cbd4365c67e9c7f" +version = "0.53.0-dan.0" +source = "git+https://github.com/tari-project/tari.git?branch=feature-dan2#9a871656e4ce1464d54107a4e3fc52181ed13e02" dependencies = [ "futures 0.3.29", "rand", "tari_comms", - "tari_shutdown", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tempfile", "tokio", ] @@ -8608,25 +9893,24 @@ dependencies = [ "include_dir", "indexmap 2.1.0", "json5 0.2.8", + "libp2p", "libsqlite3-sys", - "lmdb-zero", "log", "log4rs 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess", "minotari_app_grpc", "minotari_app_utilities", "minotari_wallet_grpc_client", - "prost 0.9.0", + "prost 0.12.3", "rand", "reqwest", "serde", "serde_json", + "sqlite_message_logger", "tari_base_node_client", "tari_bor", "tari_common", "tari_common_types", - "tari_comms", - "tari_comms_logging", "tari_comms_rpc_state_sync", "tari_consensus", "tari_core", @@ -8640,10 +9924,10 @@ dependencies = [ "tari_engine_types", "tari_epoch_manager", "tari_indexer_lib", - "tari_p2p", - "tari_shutdown", + "tari_networking", + "tari_rpc_framework", + "tari_shutdown 0.53.0-dan.0 (git+https://github.com/tari-project/tari.git?branch=feature-dan2)", "tari_state_store_sqlite", - "tari_storage", "tari_template_lib", "tari_transaction", "tari_validator_node_client", @@ -8652,9 +9936,7 @@ dependencies = [ "time", "tokio", "tonic 0.6.2", - "tower", "tower-http", - "tower-layer", ] [[package]] @@ -8667,7 +9949,7 @@ dependencies = [ "dirs", "jfs", "log", - "multiaddr", + "multiaddr 0.18.1", "reqwest", "serde", "serde_json", @@ -8691,12 +9973,11 @@ dependencies = [ name = "tari_validator_node_client" version = "0.2.0" dependencies = [ - "multiaddr", + "multiaddr 0.18.1", "reqwest", "serde", "serde_json", "tari_common_types", - "tari_comms_logging", "tari_dan_common_types", "tari_dan_storage", "tari_engine_types", @@ -8710,21 +9991,22 @@ version = "0.50.0-pre.0" dependencies = [ "anyhow", "async-trait", - "chrono", "log", - "prost 0.9.0", + "prost 0.12.3", + "prost-build 0.12.3", + "proto_builder", "serde", "tari_bor", - "tari_common", "tari_common_types", - "tari_comms", - "tari_comms_rpc_macros", "tari_consensus", "tari_crypto", "tari_dan_common_types", "tari_dan_p2p", "tari_dan_storage", "tari_engine_types", + "tari_networking", + "tari_rpc_framework", + "tari_rpc_macros", "tari_template_lib", "tari_transaction", "thiserror", @@ -8757,7 +10039,7 @@ dependencies = [ "cfg-if", "fastrand 2.0.1", "redox_syscall 0.4.1", - "rustix 0.38.25", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -8787,7 +10069,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.25", + "rustix 0.38.28", "windows-sys 0.48.0", ] @@ -8828,7 +10110,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -8906,14 +10188,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" dependencies = [ "backtrace", "bytes 1.5.0", "libc", - "mio 0.8.9", + "mio 0.8.10", "num_cpus", "parking_lot 0.12.1", "pin-project-lite", @@ -8942,7 +10224,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -9038,7 +10320,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -9063,6 +10345,17 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + [[package]] name = "tonic" version = "0.6.2" @@ -9129,7 +10422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" dependencies = [ "proc-macro2", - "prost-build", + "prost-build 0.9.0", "quote", "syn 1.0.109", ] @@ -9206,7 +10499,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -9251,7 +10544,7 @@ dependencies = [ "anyhow", "bincode 2.0.0-rc.3", "bytes 0.4.12", - "clap 4.4.8", + "clap 4.4.11", "once_cell", "rand", "rayon", @@ -9267,7 +10560,7 @@ name = "transaction_submitter" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.4.8", + "clap 4.4.11", "tari_validator_node_client", "tokio", "transaction_generator", @@ -9275,9 +10568,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" [[package]] name = "trust-dns-client" @@ -9311,7 +10604,7 @@ dependencies = [ "async-trait", "cfg-if", "data-encoding", - "enum-as-inner", + "enum-as-inner 0.4.0", "futures-channel", "futures-io", "futures-util", @@ -9323,7 +10616,7 @@ dependencies = [ "ring 0.16.20", "rustls 0.20.9", "rustls-pemfile 0.3.0", - "smallvec", + "smallvec 1.11.2", "thiserror", "tinyvec", "tokio", @@ -9334,9 +10627,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tui" @@ -9459,9 +10752,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -9542,6 +10835,16 @@ name = "unsigned-varint" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6889a77d49f1f013504cec6bf97a2c730394adedaeb1deb5ea08949a50541105" +dependencies = [ + "asynchronous-codec 0.6.2", + "bytes 1.5.0", +] + +[[package]] +name = "unsigned-varint" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" [[package]] name = "untrusted" @@ -9557,12 +10860,12 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.4.0", + "idna 0.5.0", "percent-encoding", ] @@ -9626,6 +10929,12 @@ version = "0.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "vte" version = "0.11.1" @@ -9723,9 +11032,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -9733,24 +11042,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -9760,9 +11069,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9770,28 +11079,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "wasm-encoder" -version = "0.38.0" +version = "0.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b09bc5df933a3dabbdb72ae4b6b71be8ae07f58774d5aa41bd20adcd41a235a" +checksum = "0ad2b51884de9c7f4fe2fd1043fccb8dcad4b1e29558146ee57a144d15779f3f" dependencies = [ "leb128", ] @@ -9847,7 +11156,7 @@ dependencies = [ "rkyv", "serde", "serde_bytes", - "smallvec", + "smallvec 1.11.2", "target-lexicon", "thiserror", "wasmer-types", @@ -9867,7 +11176,7 @@ dependencies = [ "loupe", "more-asserts", "rayon", - "smallvec", + "smallvec 1.11.2", "target-lexicon", "tracing", "wasmer-compiler", @@ -10047,9 +11356,9 @@ checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wast" -version = "69.0.0" +version = "69.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa51b5ad1391943d1bfad537e50f28fe938199ee76b115be6bae83802cd5185" +checksum = "c1ee37317321afde358e4d7593745942c48d6d17e0e6e943704de9bbee121e7a" dependencies = [ "leb128", "memchr", @@ -10059,18 +11368,18 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.81" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a4c2488d058326466e086a43f5d4ea448241a8d0975e3eb0642c0828be1eb3" +checksum = "aeb338ee8dee4d4cd05e6426683f21c5087dc7cfc8903e839ccf48d43332da3c" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -10082,7 +11391,7 @@ version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.17.5", + "ring 0.17.7", "untrusted 0.9.0", ] @@ -10106,7 +11415,7 @@ dependencies = [ "ring 0.16.20", "rtcp", "rtp", - "rustls 0.21.9", + "rustls 0.21.10", "sdp", "serde", "serde_json", @@ -10166,7 +11475,7 @@ dependencies = [ "rand_core 0.6.4", "rcgen", "ring 0.16.20", - "rustls 0.21.9", + "rustls 0.21.10", "sec1", "serde", "sha1", @@ -10299,9 +11608,15 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.25", + "rustix 0.38.28", ] +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + [[package]] name = "winapi" version = "0.3.9" @@ -10333,6 +11648,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.52.0" @@ -10392,6 +11717,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -10595,9 +11929,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" dependencies = [ "memchr", ] @@ -10651,6 +11985,21 @@ dependencies = [ "time", ] +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "xmltree" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d8a75eaf6557bb84a65ace8609883db44a29951042ada9b393151532e41fcb" +dependencies = [ + "xml-rs", +] + [[package]] name = "xxhash-rust" version = "0.8.7" @@ -10680,6 +12029,37 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "yamux" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed0164ae619f2dc144909a9f082187ebb5893693d8c0196e8085283ccd4b776" +dependencies = [ + "futures 0.3.29", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "pin-project 1.1.3", + "rand", + "static_assertions", +] + +[[package]] +name = "yamux" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1d0148b89300047e72994bee99ecdabd15a9166a7b70c8b8c37c314dcc9002" +dependencies = [ + "futures 0.3.29", + "instant", + "log", + "nohash-hasher", + "parking_lot 0.12.1", + "pin-project 1.1.3", + "rand", + "static_assertions", +] + [[package]] name = "yasna" version = "0.5.2" @@ -10691,22 +12071,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.26" +version = "0.7.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.26" +version = "0.7.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -10726,7 +12106,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -10740,7 +12120,7 @@ dependencies = [ "itertools 0.10.5", "js-sys", "lazy_static", - "quick-error", + "quick-error 2.0.1", "regex", "time", ] diff --git a/Cargo.toml b/Cargo.toml index f3a53cf15..e1a782e93 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,12 @@ members = [ "dan_layer/wallet/sdk", "dan_layer/wallet/storage_sqlite", "integration_tests", - + "networking/core", + "networking/swarm", + "networking/rpc_framework", + "networking/rpc_macros", + "networking/libp2p-substream", + "networking/sqlite_message_logger", "utilities/transaction_generator", "utilities/transaction_submitter", ] @@ -49,8 +54,12 @@ panic = 'abort' overflow-checks = true [patch.crates-io] -# Temporarily lock pgp to commit (master branch at time of writing) because the currently release crate locks zeroize to =1.3 +# Temporarily lock pgp to commit (master branch at time of writing) because the currently released crate locks zeroize to =1.3 liblmdb-sys = { git = "https://github.com/tari-project/lmdb-rs", tag = "0.7.6-tari.1" } +# Use Tari's libp2p fork that adds support for Schnorr-Ristretto +multiaddr = { git = "https://github.com/sdbondi/rust-libp2p.git", rev = "ae1c06a9615a0ac020e459904ec984a6ab253678" } +#libp2p = { git = "https://github.com/sdbondi/rust-libp2p.git", rev = "ae1c06a9615a0ac020e459904ec984a6ab253678" } +libp2p-identity = { git = "https://github.com/sdbondi/rust-libp2p.git", rev = "ae1c06a9615a0ac020e459904ec984a6ab253678" } # Make a copy of this code, uncomment and replace account and my-branch with the name of your fork and the branch you want to temporarily use #[patch."https://github.com/tari-project/tari.git"] @@ -74,4 +83,3 @@ liblmdb-sys = { git = "https://github.com/tari-project/lmdb-rs", tag = "0.7.6-ta #minotari_console_wallet = { git = "https://github.com/account/tari.git", branch = "my-branch" } #tari_service_framework = { git = "https://github.com/account/tari.git", branch = "my-branch" } #tari_comms_dht = { git = "https://github.com/account/tari.git", branch = "my-branch" } - diff --git a/applications/tari_dan_app_utilities/Cargo.toml b/applications/tari_dan_app_utilities/Cargo.toml index 663eff6c0..7213e3f4f 100644 --- a/applications/tari_dan_app_utilities/Cargo.toml +++ b/applications/tari_dan_app_utilities/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" license = "BSD-3-Clause" [dependencies] +tari_common = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_common_types = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_core = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2", default-features = false, features = [ "transactions", @@ -13,6 +14,9 @@ tari_core = { git = "https://github.com/tari-project/tari.git", branch = "featur tari_crypto = "0.19" tari_shutdown = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } +multiaddr = "0.18" +libp2p-identity = "0.2.8" + tari_dan_common_types = { path = "../../dan_layer/common_types" } tari_state_store_sqlite = { path = "../../dan_layer/state_store_sqlite" } tari_dan_engine = { path = "../../dan_layer/engine" } @@ -29,6 +33,7 @@ tari_transaction = { path = "../../dan_layer/transaction" } tari_validator_node_client = { path = "../../clients/validator_node_client" } tari_bor = { path = "../../dan_layer/tari_bor" } tari_indexer_lib = { path = "../../dan_layer/indexer_lib" } +tari_networking = { path = "../../networking/core" } anyhow = "1.0.53" async-trait = "0.1.74" @@ -38,13 +43,15 @@ chrono = "0.4.22" futures = { version = "^0.3.1" } log = { version = "0.4.8", features = ["std"] } mini-moka = "0.10.0" +json5 = "0.4.1" dashmap = "5.5.0" std-semaphore = "0.1.0" -prost = "0.9" +prost = "0.12" reqwest = "0.11.11" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "^1.0.20" +rand = "0.8.5" tokio = { version = "1.10", features = [ "macros", "time", diff --git a/applications/tari_dan_app_utilities/src/base_layer_scanner.rs b/applications/tari_dan_app_utilities/src/base_layer_scanner.rs index d57c759a6..8a5700627 100644 --- a/applications/tari_dan_app_utilities/src/base_layer_scanner.rs +++ b/applications/tari_dan_app_utilities/src/base_layer_scanner.rs @@ -29,7 +29,7 @@ use tari_base_node_client::{ BaseNodeClient, BaseNodeClientError, }; -use tari_common_types::types::{Commitment, FixedHash, FixedHashSizeError, PublicKey}; +use tari_common_types::types::{Commitment, FixedHash, FixedHashSizeError}; use tari_core::transactions::transaction_components::{ CodeTemplateRegistration, SideChainFeature, @@ -37,7 +37,7 @@ use tari_core::transactions::transaction_components::{ ValidatorNodeRegistration, }; use tari_crypto::tari_utilities::ByteArray; -use tari_dan_common_types::{optional::Optional, Epoch, NodeHeight}; +use tari_dan_common_types::{optional::Optional, Epoch, NodeAddressable, NodeHeight}; use tari_dan_storage::{ consensus_models::{Block, SubstateRecord}, global::{GlobalDb, MetadataKey}, @@ -62,14 +62,14 @@ use crate::{ const LOG_TARGET: &str = "tari::dan::base_layer_scanner"; -pub fn spawn( - global_db: GlobalDb, +pub fn spawn( + global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, - epoch_manager: EpochManagerHandle, + epoch_manager: EpochManagerHandle, template_manager: TemplateManagerHandle, shutdown: ShutdownSignal, consensus_constants: ConsensusConstants, - shard_store: SqliteStateStore, + shard_store: SqliteStateStore, scan_base_layer: bool, base_layer_scanning_interval: Duration, ) -> JoinHandle> { @@ -91,32 +91,32 @@ pub fn spawn( }) } -pub struct BaseLayerScanner { - global_db: GlobalDb, +pub struct BaseLayerScanner { + global_db: GlobalDb>, last_scanned_height: u64, last_scanned_tip: Option, last_scanned_hash: Option, next_block_hash: Option, base_node_client: GrpcBaseNodeClient, - epoch_manager: EpochManagerHandle, + epoch_manager: EpochManagerHandle, template_manager: TemplateManagerHandle, shutdown: ShutdownSignal, consensus_constants: ConsensusConstants, - state_store: SqliteStateStore, + state_store: SqliteStateStore, scan_base_layer: bool, base_layer_scanning_interval: Duration, has_attempted_scan: bool, } -impl BaseLayerScanner { +impl BaseLayerScanner { pub fn new( - global_db: GlobalDb, + global_db: GlobalDb>, base_node_client: GrpcBaseNodeClient, - epoch_manager: EpochManagerHandle, + epoch_manager: EpochManagerHandle, template_manager: TemplateManagerHandle, shutdown: ShutdownSignal, consensus_constants: ConsensusConstants, - state_store: SqliteStateStore, + state_store: SqliteStateStore, scan_base_layer: bool, base_layer_scanning_interval: Duration, ) -> Self { @@ -374,7 +374,7 @@ impl BaseLayerScanner { }); self.state_store .with_write_tx(|tx| { - let genesis = Block::::genesis(); + let genesis = Block::genesis(); // TODO: This should be proposed in a block... SubstateRecord { diff --git a/applications/tari_dan_app_utilities/src/config.rs b/applications/tari_dan_app_utilities/src/config.rs new file mode 100644 index 000000000..459bfa369 --- /dev/null +++ b/applications/tari_dan_app_utilities/src/config.rs @@ -0,0 +1,107 @@ +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +use std::{fmt, fmt::Display, str::FromStr}; + +use anyhow::anyhow; +use tari_bor::{Deserialize, Serialize}; +use tari_common::{configuration::StringList, SubConfigPath}; + +#[derive(Clone, Debug, Serialize, Deserialize)] +// TODO: update configs +// #[serde(deny_unknown_fields)] +pub struct P2pConfig { + pub enable_mdns: bool, + pub listener_port: u16, + pub reachability_mode: ReachabilityMode, +} + +impl Default for P2pConfig { + fn default() -> Self { + Self { + enable_mdns: true, + listener_port: 0, + reachability_mode: ReachabilityMode::default(), + } + } +} + +#[derive(Debug, Clone, Copy, Default, serde::Serialize, serde::Deserialize)] +pub enum ReachabilityMode { + #[default] + Auto, + Private, +} + +impl From for tari_networking::ReachabilityMode { + fn from(mode: ReachabilityMode) -> Self { + match mode { + ReachabilityMode::Auto => tari_networking::ReachabilityMode::Auto, + ReachabilityMode::Private => tari_networking::ReachabilityMode::Private, + } + } +} + +impl FromStr for ReachabilityMode { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + match s.to_ascii_lowercase().as_str() { + "auto" => Ok(ReachabilityMode::Auto), + "private" => Ok(ReachabilityMode::Private), + _ => Err(anyhow!("Invalid reachability mode '{}'", s)), + } + } +} + +impl Display for ReachabilityMode { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ReachabilityMode::Auto => write!(f, "Auto"), + ReachabilityMode::Private => write!(f, "Private"), + } + } +} + +/// Peer seed configuration +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct PeerSeedsConfig { + pub override_from: Option, + /// Custom specified peer seed nodes + pub peer_seeds: StringList, + /// DNS seeds hosts. The DNS TXT records are queried from these hosts and the resulting peers added to the comms + /// peer list. + pub dns_seeds: StringList, + // TODO + // #[serde( + // deserialize_with = "deserialize_string_or_struct", + // serialize_with = "serialize_string" + // )] + // /// DNS name server to use for DNS seeds. + // pub dns_seeds_name_server: DnsNameServer, + // /// All DNS seed records must pass DNSSEC validation + // pub dns_seeds_use_dnssec: bool, +} + +impl SubConfigPath for PeerSeedsConfig { + fn main_key_prefix() -> &'static str { + "p2p.seeds" + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct RpcConfig { + pub max_simultaneous_sessions: usize, + pub max_sessions_per_client: usize, +} + +impl Default for RpcConfig { + fn default() -> Self { + Self { + // TODO: autofiller uses a lot of sessions, once session management is improved we can reduce these + max_simultaneous_sessions: 1000, + max_sessions_per_client: 100, + } + } +} diff --git a/applications/tari_dan_app_utilities/src/keypair.rs b/applications/tari_dan_app_utilities/src/keypair.rs new file mode 100644 index 000000000..f7ede760b --- /dev/null +++ b/applications/tari_dan_app_utilities/src/keypair.rs @@ -0,0 +1,257 @@ +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +use std::{fs, io, path::Path, sync::Arc}; + +use log::*; +use rand::{rngs::OsRng, CryptoRng, RngCore}; +use serde::{de::DeserializeOwned, Serialize}; +use tari_common::{ + configuration::bootstrap::prompt, + exit_codes::{ExitCode, ExitError}, +}; +use tari_common_types::types::{PrivateKey, PublicKey}; +use tari_crypto::keys::{PublicKey as _, SecretKey as _}; +use tari_dan_common_types::PeerAddress; + +const REQUIRED_IDENTITY_PERMS: u32 = 0o100600; +const LOG_TARGET: &str = "tari::identity"; + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +#[serde(transparent)] +pub struct RistrettoKeypair(Arc); + +impl RistrettoKeypair { + pub fn random(rng: &mut R) -> Self { + let secret_key = PrivateKey::random(rng); + Self::from_secret_key(secret_key) + } + + pub fn from_secret_key(secret_key: PrivateKey) -> Self { + let public_key = PublicKey::from_secret_key(&secret_key); + Self(Arc::new(KeyPairInner { secret_key, public_key })) + } + + pub fn secret_key(&self) -> &PrivateKey { + &self.0.secret_key + } + + pub fn public_key(&self) -> &PublicKey { + &self.0.public_key + } + + pub fn to_peer_address(&self) -> PeerAddress { + self.public_key().clone().into() + } +} + +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] +struct KeyPairInner { + secret_key: PrivateKey, + public_key: PublicKey, +} + +/// Loads the node identity, or creates a new one if create_id is true +/// +/// ## Parameters +/// - `identity_file` - Reference to file path +/// - `public_address` - Network address of the base node +/// - `create_id` - Only applies if the identity_file does not exist or is malformed. If true, a new identity will be +/// created, otherwise the user will be prompted to create a new ID +/// - `peer_features` - Enables features of the base node +/// +/// # Return +/// A NodeIdentity wrapped in an atomic reference counter on success, the exit code indicating the reason on failure +pub fn setup_keypair_prompt>(identity_file: P, create_id: bool) -> Result { + match load_keypair(&identity_file) { + Ok(id) => Ok(id), + Err(IdentityError::InvalidPermissions) => Err(ExitError::new( + ExitCode::ConfigError, + format!( + "{path} has incorrect permissions. You can update the identity file with the correct permissions \ + using 'chmod 600 {path}', or delete the identity file and a new one will be created on next start", + path = identity_file.as_ref().to_string_lossy() + ), + )), + Err(e) => { + if create_id { + warn!(target: LOG_TARGET, "Failed to load node identity: {}", e); + } else { + let prompt = prompt("Node identity does not exist.\nWould you like to to create one (Y/n)?"); + if !prompt { + error!( + target: LOG_TARGET, + "Node identity not found. {}. You can update the configuration file to point to a valid node \ + identity file, or re-run the node and create a new one.", + e + ); + return Err(ExitError::new( + ExitCode::ConfigError, + format!( + "Node identity information not found. {}. You can update the configuration file to point \ + to a valid node identity file, or re-run the node to create a new one", + e + ), + )); + }; + } + debug!(target: LOG_TARGET, "Existing node id not found. {}. Creating new ID", e); + + match create_new_keypair(&identity_file) { + Ok(id) => { + info!( + target: LOG_TARGET, + "New node identity [{}] with public key {} has been created at {}.", + id.to_peer_address(), + id.public_key(), + identity_file.as_ref().to_str().unwrap_or("?"), + ); + Ok(id) + }, + Err(e) => { + error!(target: LOG_TARGET, "Could not create new node id. {}.", e); + Err(ExitError::new( + ExitCode::ConfigError, + format!("Could not create new node id. {}.", e), + )) + }, + } + }, + } +} + +/// Tries to construct a node identity by loading the secret key and other metadata from disk and calculating the +/// missing fields from that information. +/// +/// ## Parameters +/// `path` - Reference to a path +/// +/// ## Returns +/// Result containing a NodeIdentity on success, string indicates the reason on failure +fn load_keypair>(path: P) -> Result { + check_identity_file(&path)?; + + let id_str = fs::read_to_string(path.as_ref())?; + let id = json5::from_str::(&id_str)?; + debug!( + "Node ID loaded with public key {} and Node id {}", + id.public_key(), + id.to_peer_address() + ); + Ok(id) +} + +/// Create a new node id and save it to disk +/// +/// ## Parameters +/// `path` - Reference to path to save the file +/// `public_addr` - Network address of the base node +/// `peer_features` - The features enabled for the base node +/// +/// ## Returns +/// Result containing the node identity, string will indicate reason on error +fn create_new_keypair>(path: P) -> Result { + let node_identity = RistrettoKeypair::random(&mut OsRng); + save_as_json(&path, &node_identity)?; + Ok(node_identity) +} + +/// Loads the node identity from json at the given path +/// +/// ## Parameters +/// `path` - Path to file from which to load the node identity +/// +/// ## Returns +/// Result containing an object on success, string will indicate reason on error +pub fn load_from_json, T: DeserializeOwned>(path: P) -> Result, IdentityError> { + if !path.as_ref().exists() { + return Ok(None); + } + + let contents = fs::read_to_string(path)?; + let object = json5::from_str(&contents)?; + Ok(Some(object)) +} + +/// Saves the identity as json at a given path with 0600 file permissions (UNIX-only), creating it if it does not +/// already exist. +/// +/// ## Parameters +/// `path` - Path to save the file +/// `object` - Data to be saved +/// +/// ## Returns +/// Result to check if successful or not, string will indicate reason on error +pub fn save_as_json, T: Serialize>(path: P, object: &T) -> Result<(), IdentityError> { + let json = json5::to_string(object)?; + if let Some(p) = path.as_ref().parent() { + if !p.exists() { + fs::create_dir_all(p)?; + } + } + let json_with_comment = format!( + "// This file is generated by the Minotari base node. Any changes will be overwritten.\n{}", + json + ); + fs::write(path.as_ref(), json_with_comment.as_bytes())?; + set_permissions(path, REQUIRED_IDENTITY_PERMS)?; + Ok(()) +} + +/// Check that the given path exists, is a file and has the correct file permissions (mac/linux only) +fn check_identity_file>(path: P) -> Result<(), IdentityError> { + if !path.as_ref().exists() { + return Err(IdentityError::NotFound); + } + + if !path.as_ref().metadata()?.is_file() { + return Err(IdentityError::NotFile); + } + + if !has_permissions(&path, REQUIRED_IDENTITY_PERMS)? { + return Err(IdentityError::InvalidPermissions); + } + Ok(()) +} + +#[cfg(target_family = "unix")] +fn set_permissions>(path: P, new_perms: u32) -> io::Result<()> { + use std::os::unix::fs::PermissionsExt; + let metadata = fs::metadata(&path)?; + let mut perms = metadata.permissions(); + perms.set_mode(new_perms); + fs::set_permissions(path, perms)?; + Ok(()) +} + +#[cfg(target_family = "windows")] +fn set_permissions>(_: P, _: u32) -> io::Result<()> { + // Windows permissions are very different and are not supported + Ok(()) +} + +#[cfg(target_family = "unix")] +fn has_permissions>(path: P, perms: u32) -> io::Result { + use std::os::unix::fs::PermissionsExt; + let metadata = fs::metadata(path)?; + Ok(metadata.permissions().mode() == perms) +} + +#[cfg(target_family = "windows")] +fn has_permissions>(_: P, _: u32) -> io::Result { + Ok(true) +} + +#[derive(Debug, thiserror::Error)] +pub enum IdentityError { + #[error("Identity file has invalid permissions")] + InvalidPermissions, + #[error("Identity file was not found")] + NotFound, + #[error("Path is not a file")] + NotFile, + #[error("Malformed identity file: {0}")] + JsonError(#[from] json5::Error), + #[error(transparent)] + Io(#[from] io::Error), +} diff --git a/applications/tari_dan_app_utilities/src/lib.rs b/applications/tari_dan_app_utilities/src/lib.rs index 4747c6ae3..fe03c738a 100644 --- a/applications/tari_dan_app_utilities/src/lib.rs +++ b/applications/tari_dan_app_utilities/src/lib.rs @@ -21,7 +21,10 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pub mod base_layer_scanner; +pub mod config; pub mod consensus_constants; +pub mod keypair; +pub mod seed_peer; pub mod substate_file_cache; pub mod template_manager; pub mod transaction_executor; diff --git a/applications/tari_dan_app_utilities/src/seed_peer.rs b/applications/tari_dan_app_utilities/src/seed_peer.rs new file mode 100644 index 000000000..69eb4eb0e --- /dev/null +++ b/applications/tari_dan_app_utilities/src/seed_peer.rs @@ -0,0 +1,63 @@ +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +use std::{fmt::Display, str::FromStr}; + +use anyhow::anyhow; +use libp2p_identity as identity; +use libp2p_identity::PeerId; +use multiaddr::Multiaddr; +use tari_crypto::{ristretto::RistrettoPublicKey, tari_utilities::hex::Hex}; + +/// Parsed information from a DNS seed record +#[derive(Debug, Clone)] +pub struct SeedPeer { + pub public_key: RistrettoPublicKey, + pub addresses: Vec, +} + +impl SeedPeer { + pub fn new(public_key: RistrettoPublicKey, addresses: Vec) -> Self { + Self { public_key, addresses } + } + + pub fn to_peer_id(&self) -> PeerId { + let pk = identity::PublicKey::from(identity::sr25519::PublicKey::from(self.public_key.clone())); + pk.to_peer_id() + } +} + +impl FromStr for SeedPeer { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let mut parts = s.split("::").map(|s| s.trim()); + let public_key = parts + .next() + .and_then(|s| RistrettoPublicKey::from_hex(s).ok()) + .ok_or_else(|| anyhow!("Invalid peer id string"))?; + let addresses = parts.map(Multiaddr::from_str).collect::, _>>()?; + if addresses.is_empty() || addresses.iter().any(|a| a.is_empty()) { + return Err(anyhow!("Empty or invalid address in seed peer string")); + } + Ok(SeedPeer { public_key, addresses }) + } +} + +impl Display for SeedPeer { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}::{}", + self.public_key, + self.addresses + .iter() + .map(|ma| ma.to_string()) + .collect::>() + .join("::") + ) + } +} diff --git a/applications/tari_dan_app_utilities/src/template_manager/implementation/initializer.rs b/applications/tari_dan_app_utilities/src/template_manager/implementation/initializer.rs index 3b7f5bc86..656b07daa 100644 --- a/applications/tari_dan_app_utilities/src/template_manager/implementation/initializer.rs +++ b/applications/tari_dan_app_utilities/src/template_manager/implementation/initializer.rs @@ -20,14 +20,15 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +use tari_dan_common_types::NodeAddressable; use tari_shutdown::ShutdownSignal; use tokio::{sync::mpsc, task::JoinHandle}; use super::{downloader::TemplateDownloadWorker, service::TemplateManagerService, TemplateManager}; use crate::template_manager::interface::TemplateManagerHandle; -pub fn spawn( - manager: TemplateManager, +pub fn spawn( + manager: TemplateManager, shutdown: ShutdownSignal, ) -> (TemplateManagerHandle, JoinHandle>) { let (tx_request, rx_request) = mpsc::channel(1); diff --git a/applications/tari_dan_app_utilities/src/template_manager/implementation/manager.rs b/applications/tari_dan_app_utilities/src/template_manager/implementation/manager.rs index a13992357..63eed26af 100644 --- a/applications/tari_dan_app_utilities/src/template_manager/implementation/manager.rs +++ b/applications/tari_dan_app_utilities/src/template_manager/implementation/manager.rs @@ -30,7 +30,7 @@ use std::{ use chrono::Utc; use log::*; use tari_core::transactions::transaction_components::TemplateType; -use tari_dan_common_types::{optional::Optional, services::template_provider::TemplateProvider}; +use tari_dan_common_types::{optional::Optional, services::template_provider::TemplateProvider, NodeAddressable}; use tari_dan_engine::{ flow::FlowFactory, function_definitions::FlowFunctionDefinition, @@ -53,18 +53,18 @@ const LOG_TARGET: &str = "tari::validator_node::template_manager"; const CONCURRENT_ACCESS_LIMIT: isize = 100; -#[derive(Debug, Clone)] -pub struct TemplateManager { - global_db: GlobalDb, +#[derive(Debug)] +pub struct TemplateManager { + global_db: GlobalDb>, config: TemplateConfig, builtin_templates: Arc>, cache: mini_moka::sync::Cache, cmap_semaphore: cmap_semaphore::ConcurrentMapSemaphore, } -impl TemplateManager { +impl TemplateManager { pub fn initialize( - global_db: GlobalDb, + global_db: GlobalDb>, config: TemplateConfig, ) -> Result { // load the builtin account templates @@ -237,7 +237,7 @@ impl TemplateManager { } } -impl TemplateProvider for TemplateManager { +impl TemplateProvider for TemplateManager { type Error = TemplateManagerError; type Template = LoadedTemplate; @@ -283,3 +283,15 @@ impl TemplateProvider for TemplateManager { Ok(Some(loaded)) } } + +impl Clone for TemplateManager { + fn clone(&self) -> Self { + Self { + global_db: self.global_db.clone(), + config: self.config.clone(), + builtin_templates: self.builtin_templates.clone(), + cache: self.cache.clone(), + cmap_semaphore: self.cmap_semaphore.clone(), + } + } +} diff --git a/applications/tari_dan_app_utilities/src/template_manager/implementation/service.rs b/applications/tari_dan_app_utilities/src/template_manager/implementation/service.rs index dfef0ed40..44def6ec9 100644 --- a/applications/tari_dan_app_utilities/src/template_manager/implementation/service.rs +++ b/applications/tari_dan_app_utilities/src/template_manager/implementation/service.rs @@ -25,7 +25,7 @@ use std::convert::TryFrom; use log::*; use tari_common_types::types::FixedHash; use tari_core::transactions::transaction_components::TemplateType; -use tari_dan_common_types::services::template_provider::TemplateProvider; +use tari_dan_common_types::{services::template_provider::TemplateProvider, NodeAddressable}; use tari_dan_engine::function_definitions::FlowFunctionDefinition; use tari_dan_storage::global::{DbTemplateType, DbTemplateUpdate, TemplateStatus}; use tari_engine_types::calculate_template_binary_hash; @@ -45,17 +45,17 @@ use crate::template_manager::interface::{TemplateManagerError, TemplateManagerRe const LOG_TARGET: &str = "tari::template_manager"; -pub struct TemplateManagerService { +pub struct TemplateManagerService { rx_request: Receiver, - manager: TemplateManager, + manager: TemplateManager, completed_downloads: mpsc::Receiver, download_queue: mpsc::Sender, } -impl TemplateManagerService { +impl TemplateManagerService { pub fn spawn( rx_request: Receiver, - manager: TemplateManager, + manager: TemplateManager, download_queue: mpsc::Sender, completed_downloads: mpsc::Receiver, shutdown: ShutdownSignal, diff --git a/applications/tari_dan_wallet_cli/Cargo.toml b/applications/tari_dan_wallet_cli/Cargo.toml index f440a9d1f..a9b071504 100644 --- a/applications/tari_dan_wallet_cli/Cargo.toml +++ b/applications/tari_dan_wallet_cli/Cargo.toml @@ -25,7 +25,7 @@ anyhow = "1.0.65" base64 = "0.20.0-alpha.1" clap = { version = "3.2.22", features = ["derive", "env"] } log = "0.4.17" -multiaddr = "0.14.0" +multiaddr = "0.18.0" reqwest = { version = "0.11.11", features = ["json"] } serde_json = "1.0" time = "0.3.15" diff --git a/applications/tari_dan_wallet_cli/src/command/account.rs b/applications/tari_dan_wallet_cli/src/command/account.rs index a5cb66865..5902cdfcc 100644 --- a/applications/tari_dan_wallet_cli/src/command/account.rs +++ b/applications/tari_dan_wallet_cli/src/command/account.rs @@ -31,8 +31,8 @@ use std::{ use anyhow::anyhow; use clap::{Args, Subcommand}; use serde_json as json; -use tari_dan_common_types::NodeAddressable; use tari_template_lib::models::Amount; +use tari_utilities::ByteArray; use tari_wallet_daemon_client::{ types::{ AccountInfo, diff --git a/applications/tari_indexer/Cargo.toml b/applications/tari_indexer/Cargo.toml index 8cea717a7..88beb6345 100644 --- a/applications/tari_indexer/Cargo.toml +++ b/applications/tari_indexer/Cargo.toml @@ -11,12 +11,8 @@ edition = "2021" minotari_app_utilities = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_common = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_common_types = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_comms = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_comms_logging = { path = "../../comms/tari_comms_logging" } tari_crypto = "0.19" -tari_p2p = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_shutdown = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_storage = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_bor = { path = "../../dan_layer/tari_bor" } tari_dan_app_utilities = { path = "../tari_dan_app_utilities" } @@ -35,6 +31,10 @@ tari_transaction = { path = "../../dan_layer/transaction" } tari_validator_node_rpc = { path = "../../dan_layer/validator_node_rpc" } tari_dan_p2p = { path = "../../dan_layer/p2p" } +tari_rpc_framework = { path = "../../networking/rpc_framework" } +tari_networking = { path = "../../networking/core" } +libp2p = "0.53.1" + anyhow = "1.0.53" async-trait = "0.1" axum = "0.6.0" @@ -48,9 +48,7 @@ diesel = { version = "2", default-features = false, features = [ "chrono", ] } diesel_migrations = "2" -futures = { version = "^0.3.1" } include_dir = "0.7.2" -lmdb-zero = "0.4.4" log = { version = "0.4.8", features = ["std"] } log4rs = { version = "1.1.1", features = [ "rolling_file_appender", @@ -58,7 +56,6 @@ log4rs = { version = "1.1.1", features = [ "size_trigger", "fixed_window_roller", ] } -prost = "0.9" reqwest = "0.11.11" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -69,9 +66,6 @@ tokio = { version = "1.10", features = [ "sync", "rt-multi-thread", ] } -tonic = "0.6.2" -tower = "0.4" -tower-layer = "0.3" tower-http = { version = "0.3.0", features = ["cors"] } mime_guess = "2.0.4" diff --git a/applications/tari_indexer/src/bootstrap.rs b/applications/tari_indexer/src/bootstrap.rs index 0269a5dc4..5ac1a587f 100644 --- a/applications/tari_indexer/src/bootstrap.rs +++ b/applications/tari_indexer/src/bootstrap.rs @@ -20,46 +20,44 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::{fs, io, sync::Arc}; +use std::{fs, io, str::FromStr}; -use minotari_app_utilities::{identity_management, identity_management::load_from_json}; +use libp2p::identity; +use minotari_app_utilities::identity_management; use tari_base_node_client::grpc::GrpcBaseNodeClient; use tari_common::{ configuration::bootstrap::{grpc_default_port, ApplicationType}, exit_codes::{ExitCode, ExitError}, }; -use tari_comms::{CommsNode, NodeIdentity}; +use tari_crypto::tari_utilities::ByteArray; use tari_dan_app_utilities::{ base_layer_scanner, consensus_constants::ConsensusConstants, + keypair::RistrettoKeypair, + seed_peer::SeedPeer, template_manager::{self, implementation::TemplateManager}, }; +use tari_dan_common_types::PeerAddress; use tari_dan_storage::global::GlobalDb; use tari_dan_storage_sqlite::global::SqliteGlobalDbAdapter; use tari_epoch_manager::base_layer::{EpochManagerConfig, EpochManagerHandle}; +use tari_networking::{NetworkingHandle, SwarmConfig}; use tari_shutdown::ShutdownSignal; use tari_state_store_sqlite::SqliteStateStore; -use tari_validator_node_rpc::client::TariCommsValidatorNodeClientFactory; +use tari_validator_node_rpc::{client::TariValidatorNodeRpcClientFactory, proto}; +use tokio::sync::mpsc; -use crate::{ - comms, - p2p::services::{comms_peer_provider::CommsPeerProvider, networking}, - substate_storage_sqlite::sqlite_substate_store_factory::SqliteSubstateStore, - ApplicationConfig, -}; +use crate::{substate_storage_sqlite::sqlite_substate_store_factory::SqliteSubstateStore, ApplicationConfig}; const _LOG_TARGET: &str = "tari_indexer::bootstrap"; pub async fn spawn_services( config: &ApplicationConfig, shutdown: ShutdownSignal, - node_identity: Arc, - global_db: GlobalDb, + keypair: RistrettoKeypair, + global_db: GlobalDb>, consensus_constants: ConsensusConstants, ) -> Result { - let mut p2p_config = config.indexer.p2p.clone(); - p2p_config.transport.tor.identity = - load_from_json(&config.indexer.tor_identity_file).map_err(|e| ExitError::new(ExitCode::ConfigError, e))?; ensure_directories_exist(config)?; // GRPC client connection to base node @@ -69,19 +67,53 @@ pub async fn spawn_services( format!("127.0.0.1:{port}") })); - // Initialize comms - let (comms, _) = comms::initialize(node_identity.clone(), config, shutdown.clone()).await?; + // Initialize networking + let (tx_messages, mut rx_messages) = mpsc::channel(100); + let identity = identity::Keypair::sr25519_from_bytes(keypair.secret_key().as_bytes().to_vec()).map_err(|e| { + ExitError::new( + ExitCode::ConfigError, + format!("Failed to create libp2p identity from secret bytes: {}", e), + ) + })?; + let seed_peers = config + .peer_seeds + .peer_seeds + .iter() + .map(|s| SeedPeer::from_str(s)) + .collect::>>()?; + let seed_peers = seed_peers + .into_iter() + .flat_map(|p| { + let peer_id = p.to_peer_id(); + p.addresses.into_iter().map(move |a| (peer_id, a)) + }) + .collect(); + let (networking, _) = tari_networking::spawn::( + identity, + tx_messages, + tari_networking::Config { + listener_port: config.indexer.p2p.listener_port, + swarm: SwarmConfig { + protocol_version: "/tari/devnet/0.0.1".try_into().unwrap(), + user_agent: "/tari/indexer/0.0.1".to_string(), + enable_mdns: config.indexer.p2p.enable_mdns, + ..Default::default() + }, + reachability_mode: config.indexer.p2p.reachability_mode.into(), + }, + seed_peers, + shutdown.clone(), + )?; + + // TODO: hack to consume messages if any are sent, we may use messaging later in the indexer or we should be able to + // disable the messaging and gossipsub protocols + tokio::spawn(async move { while rx_messages.recv().await.is_some() {} }); - networking::spawn( - comms.node_identity(), - CommsPeerProvider::new(comms.peer_manager()), - comms.connectivity(), - ); // Connect to substate db let substate_store = SqliteSubstateStore::try_create(config.indexer.state_db_path())?; // Epoch manager - let validator_node_client_factory = TariCommsValidatorNodeClientFactory::new(comms.connectivity()); + let validator_node_client_factory = TariValidatorNodeRpcClientFactory::new(networking.clone()); let (epoch_manager, _) = tari_epoch_manager::base_layer::spawn_service( EpochManagerConfig { base_layer_confirmations: consensus_constants.base_layer_confirmations, @@ -89,7 +121,7 @@ pub async fn spawn_services( }, global_db.clone(), base_node_client.clone(), - node_identity.public_key().clone(), + keypair.public_key().clone(), shutdown.clone(), ); @@ -115,15 +147,12 @@ pub async fn spawn_services( config.indexer.base_layer_scanning_interval, ); - let comms = comms::spawn_comms_using_transport(comms, p2p_config.transport.clone()) - .await - .map_err(|e| ExitError::new(ExitCode::ConfigError, format!("Could not spawn using transport: {}", e)))?; - // Save final node identity after comms has initialized. This is required because the public_address can be // changed by comms during initialization when using tor. - save_identities(config, &comms)?; + save_identities(config, &keypair)?; Ok(Services { - comms, + keypair, + networking, epoch_manager, validator_node_client_factory, substate_store, @@ -132,26 +161,22 @@ pub async fn spawn_services( } pub struct Services { - pub comms: CommsNode, - pub epoch_manager: EpochManagerHandle, - pub validator_node_client_factory: TariCommsValidatorNodeClientFactory, + pub keypair: RistrettoKeypair, + pub networking: NetworkingHandle, + pub epoch_manager: EpochManagerHandle, + pub validator_node_client_factory: TariValidatorNodeRpcClientFactory, pub substate_store: SqliteSubstateStore, - pub template_manager: TemplateManager, + pub template_manager: TemplateManager, } fn ensure_directories_exist(config: &ApplicationConfig) -> io::Result<()> { fs::create_dir_all(&config.indexer.data_dir)?; - fs::create_dir_all(&config.indexer.p2p.datastore_path)?; Ok(()) } -fn save_identities(config: &ApplicationConfig, comms: &CommsNode) -> Result<(), ExitError> { - identity_management::save_as_json(&config.indexer.identity_file, &*comms.node_identity()) +fn save_identities(config: &ApplicationConfig, identity: &RistrettoKeypair) -> Result<(), ExitError> { + identity_management::save_as_json(&config.indexer.identity_file, identity) .map_err(|e| ExitError::new(ExitCode::ConfigError, format!("Failed to save node identity: {}", e)))?; - if let Some(hs) = comms.hidden_service() { - identity_management::save_as_json(&config.indexer.tor_identity_file, hs.tor_identity()) - .map_err(|e| ExitError::new(ExitCode::ConfigError, format!("Failed to save tor identity: {}", e)))?; - } Ok(()) } diff --git a/applications/tari_indexer/src/cli.rs b/applications/tari_indexer/src/cli.rs index e162b73ef..e302c1de8 100644 --- a/applications/tari_indexer/src/cli.rs +++ b/applications/tari_indexer/src/cli.rs @@ -25,6 +25,7 @@ use std::net::SocketAddr; use clap::Parser; use minotari_app_utilities::common_cli_args::CommonCliArgs; use tari_common::configuration::{ConfigOverrideProvider, Network}; +use tari_dan_app_utilities::config::ReachabilityMode; use tari_engine_types::substate::SubstateAddress; #[derive(Parser, Debug)] @@ -44,6 +45,17 @@ pub struct Cli { #[clap(long, short = 'r', alias = "rpc-address")] pub json_rpc_address: Option, + // Networking + #[clap(long, short = 's')] + pub peer_seeds: Vec, + /// Port to listen on for p2p connections + #[clap(long)] + pub listener_port: Option, + /// Set the node to unreachable mode, the node will not act as a relay and will attempt relayed connections. + #[clap(long)] + pub reachability: Option, + #[clap(long)] + pub disable_mdns: bool, #[clap(long, env = "TARI_INDEXER_UI_CONNECT_ADDRESS")] pub ui_connect_address: Option, } @@ -65,12 +77,28 @@ impl ConfigOverrideProvider for Cli { if let Some(ref addr) = self.json_rpc_address { overrides.push(("indexer.json_rpc_address".to_string(), addr.to_string())); } + + if !self.peer_seeds.is_empty() { + overrides.push(("p2p.seeds.peer_seeds".to_string(), self.peer_seeds.join(","))); + } + if let Some(listener_port) = self.listener_port { + overrides.push(( + "validator_node.p2p.listener_port".to_string(), + listener_port.to_string(), + )); + } if let Some(seconds) = self.dan_layer_scanning_internal { overrides.push(("indexer.dan_layer_scanning_interval".to_string(), seconds.to_string())); } if let Some(ref ui_connect_address) = self.ui_connect_address { overrides.push(("indexer.ui_connect_address".to_string(), ui_connect_address.to_string())); } + if let Some(reachability) = self.reachability { + overrides.push(("indexer.p2p.reachability_mode".to_string(), reachability.to_string())); + } + if self.disable_mdns { + overrides.push(("indexer.p2p.enable_mdns".to_string(), "false".to_string())); + } overrides } } diff --git a/applications/tari_indexer/src/comms/broadcast.rs b/applications/tari_indexer/src/comms/broadcast.rs deleted file mode 100644 index 7d206660a..000000000 --- a/applications/tari_indexer/src/comms/broadcast.rs +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2023. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{ - future, - task::{Context, Poll}, -}; - -use futures::{stream, StreamExt}; -use log::warn; -use tari_comms::{ - connectivity::ConnectivityRequester, - message::OutboundMessage, - peer_manager::NodeId, - types::CommsPublicKey, - Bytes, -}; -use tari_comms_logging::SqliteMessageLog; -use tari_crypto::tari_utilities::ByteArray; -use tari_dan_p2p::DanMessage; -use tari_validator_node_rpc::proto; -use tonic::codegen::futures_core::future::BoxFuture; -use tower::{Service, ServiceExt}; - -use crate::comms::destination::Destination; - -const LOG_TARGET: &str = "tari::indexer::comms::messaging"; - -#[derive(Debug, Clone)] -pub struct DanBroadcast { - connectivity: ConnectivityRequester, - logger: SqliteMessageLog, -} - -impl DanBroadcast { - pub fn new(connectivity: ConnectivityRequester, logger: SqliteMessageLog) -> Self { - Self { connectivity, logger } - } -} - -impl tower_layer::Layer for DanBroadcast -where - S: Service + Sync + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Service = BroadcastService; - - fn layer(&self, next_service: S) -> Self::Service { - BroadcastService { - next_service, - connectivity: self.connectivity.clone(), - logger: self.logger.clone(), - } - } -} - -#[derive(Debug, Clone)] -pub struct BroadcastService { - connectivity: ConnectivityRequester, - logger: SqliteMessageLog, - next_service: S, -} - -impl Service<(Destination, DanMessage)> for BroadcastService -where - S: Service + Sync + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, (dest, msg): (Destination, DanMessage)) -> Self::Future { - let mut next_service = self.next_service.clone(); - let mut connectivity = self.connectivity.clone(); - let logger = self.logger.clone(); - - Box::pin(async move { - let message_tag = msg.get_message_tag(); - let type_str = msg.as_type_str(); - let bytes = encode_message(&proto::network::DanMessage::from(&msg)); - - log::debug!( - target: LOG_TARGET, - "📨 Tx: {} ({} bytes) to {}", - type_str, - bytes.len(), - dest - ); - let svc = next_service.ready().await?; - match dest { - Destination::Peer(pk) => { - logger.log_outbound_message("Peer", pk.as_bytes(), type_str, &message_tag, &msg); - svc.call(OutboundMessage::new(NodeId::from_public_key(&pk), bytes)) - .await?; - }, - Destination::Selected(pks) => { - let iter = pks.iter().map(NodeId::from_public_key).map(|n| { - logger.log_outbound_message("Selected", n.as_bytes(), type_str, &message_tag, &msg); - OutboundMessage::new(n, bytes.clone()) - }); - svc.call_all(stream::iter(iter)) - .unordered() - .filter_map(|result| future::ready(result.err())) - .for_each(|err| { - // TODO: this should return the error back to the service - log::warn!("Error when sending broadcast messages: {}", err); - future::ready(()) - }) - .await; - }, - Destination::Flood => { - let conns = connectivity.get_active_connections().await?; - if conns.is_empty() { - warn!(target: LOG_TARGET, "No active connections to flood to"); - } - let iter = conns.into_iter().map(|c| c.peer_node_id().clone()).map(|n| { - logger.log_outbound_message("Flood", n.as_bytes(), type_str, &message_tag, &msg); - OutboundMessage::new(n, bytes.clone()) - }); - svc.call_all(stream::iter(iter)) - .unordered() - .filter_map(|result| future::ready(result.err())) - .for_each(|err| { - // TODO: this should return the error back to the service - log::warn!("Error when sending broadcast messages: {}", err); - future::ready(()) - }) - .await; - }, - } - - Ok(()) - }) - } -} - -fn encode_message(msg: &T) -> Bytes { - let mut buf = Vec::with_capacity(msg.encoded_len()); - msg.encode(&mut buf).expect( - "prost::Message::encode documentation says it is infallible unless the buffer has insufficient capacity. This \ - buffer's capacity was set with encoded_len", - ); - buf.into() -} diff --git a/applications/tari_indexer/src/comms/deserialize.rs b/applications/tari_indexer/src/comms/deserialize.rs deleted file mode 100644 index e5fd97548..000000000 --- a/applications/tari_indexer/src/comms/deserialize.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2023. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{ - sync::Arc, - task::{Context, Poll}, -}; - -use futures::future::BoxFuture; -use prost::Message; -use tari_comms::{message::InboundMessage, types::CommsPublicKey, PeerManager}; -use tari_comms_logging::SqliteMessageLog; -use tari_crypto::tari_utilities::ByteArray; -use tari_dan_p2p::DanMessage; -use tari_validator_node_rpc::proto; -use tower::{Service, ServiceExt}; - -const LOG_TARGET: &str = "tari::indexer::comms::messaging"; - -#[derive(Debug, Clone)] -pub struct DanDeserialize { - peer_manager: Arc, - logger: SqliteMessageLog, -} - -impl DanDeserialize { - pub fn new(peer_manager: Arc, logger: SqliteMessageLog) -> Self { - Self { peer_manager, logger } - } -} - -impl tower_layer::Layer for DanDeserialize -where - S: Service<(CommsPublicKey, DanMessage), Response = (), Error = anyhow::Error> - + Send - + Clone - + 'static, - S::Future: Send + 'static, -{ - type Service = DanDeserializeService; - - fn layer(&self, next_service: S) -> Self::Service { - DanDeserializeService { - next_service, - logger: self.logger.clone(), - peer_manager: self.peer_manager.clone(), - } - } -} - -#[derive(Debug, Clone)] -pub struct DanDeserializeService { - next_service: S, - logger: SqliteMessageLog, - peer_manager: Arc, -} - -impl Service for DanDeserializeService -where - S: Service<(CommsPublicKey, DanMessage), Response = (), Error = anyhow::Error> - + Send - + Clone - + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, msg: InboundMessage) -> Self::Future { - let InboundMessage { - source_peer, mut body, .. - } = msg; - let next_service = self.next_service.clone(); - let peer_manager = self.peer_manager.clone(); - let logger = self.logger.clone(); - Box::pin(async move { - let body_len = body.len(); - let decoded_msg = proto::network::DanMessage::decode(&mut body)?; - let message_tag = decoded_msg.message_tag.clone(); - let msg = DanMessage::try_from(decoded_msg)?; - log::info!( - target: LOG_TARGET, - "📨 Rx: {} ({} bytes) from {}", - msg.as_type_str(), - body_len, - source_peer - ); - let peer = peer_manager - .find_by_node_id(&source_peer) - .await? - .ok_or_else(|| anyhow::anyhow!("Could not find peer with node id {}", source_peer))?; - logger.log_inbound_message(peer.public_key.as_bytes(), msg.as_type_str(), &message_tag, &msg); - let mut svc = next_service.ready_oneshot().await?; - svc.call((peer.public_key, msg)).await?; - Ok(()) - }) - } -} diff --git a/applications/tari_indexer/src/comms/destination.rs b/applications/tari_indexer/src/comms/destination.rs deleted file mode 100644 index a94991b19..000000000 --- a/applications/tari_indexer/src/comms/destination.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2023. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#![allow(dead_code)] - -use std::fmt::{Display, Formatter}; - -#[derive(Debug, Clone)] -pub enum Destination { - Peer(TAddr), - Selected(Vec), - Flood, -} - -impl Display for Destination { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - Self::Peer(addr) => write!(f, "Peer({})", addr), - Self::Selected(addrs) => write!(f, "Selected({})", addrs.len()), - Self::Flood => write!(f, "Flood"), - } - } -} diff --git a/applications/tari_indexer/src/comms/initializer.rs b/applications/tari_indexer/src/comms/initializer.rs deleted file mode 100644 index 6d52d2157..000000000 --- a/applications/tari_indexer/src/comms/initializer.rs +++ /dev/null @@ -1,298 +0,0 @@ -// Copyright 2023. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{str::FromStr, sync::Arc, time::Duration}; - -use anyhow::anyhow; -use lmdb_zero::open; -use log::*; -use tari_common::configuration::Network; -use tari_comms::{ - backoff::ConstantBackoff, - peer_manager::{Peer, PeerFeatures, PeerFlags}, - pipeline, - pipeline::SinkService, - protocol::{messaging::MessagingProtocolExtension, NodeNetworkInfo}, - tor, - transports::{predicate::FalsePredicate, MemoryTransport, SocksConfig, SocksTransport, TcpWithTorTransport}, - types::CommsPublicKey, - utils::cidr::parse_cidrs, - CommsBuilder, - CommsNode, - NodeIdentity, - PeerManager, - UnspawnedCommsNode, -}; -use tari_comms_logging::SqliteMessageLog; -use tari_dan_p2p::{DanMessage, TARI_DAN_MSG_PROTOCOL_ID}; -use tari_p2p::{ - initialization::CommsInitializationError, - peer_seeds::SeedPeer, - P2pConfig, - PeerSeedsConfig, - TorTransportConfig, - TransportConfig, - TransportType, - MAJOR_NETWORK_VERSION, - MINOR_NETWORK_VERSION, -}; -use tari_shutdown::ShutdownSignal; -use tari_storage::{ - lmdb_store::{LMDBBuilder, LMDBConfig}, - LMDBWrapper, -}; -use tokio::sync::{broadcast, mpsc}; -use tower::ServiceBuilder; - -use crate::ApplicationConfig; - -const LOG_TARGET: &str = "tari::dan::comms::initializer"; - -use crate::comms::{broadcast::DanBroadcast, deserialize::DanDeserialize, destination::Destination}; - -pub async fn initialize( - node_identity: Arc, - config: &ApplicationConfig, - shutdown_signal: ShutdownSignal, -) -> Result<(UnspawnedCommsNode, MessageChannel), anyhow::Error> { - debug!(target: LOG_TARGET, "Initializing DAN comms"); - let seed_peers = &config.peer_seeds; - let mut config = config.indexer.p2p.clone(); - - let mut comms_builder = CommsBuilder::new() - .with_shutdown_signal(shutdown_signal) - .with_node_identity(node_identity) - .with_node_info(NodeNetworkInfo { - major_version: MAJOR_NETWORK_VERSION, - minor_version: MINOR_NETWORK_VERSION, - network_byte: Network::Esmeralda.as_byte(), // TODO: DAN has its own network byte? - user_agent: config.user_agent.clone(), - }); - - if config.allow_test_addresses || config.dht.peer_validator_config.allow_test_addresses { - // The default is false, so ensure that both settings are true in this case - config.allow_test_addresses = true; - config.dht.peer_validator_config.allow_test_addresses = true; - comms_builder = comms_builder.allow_test_addresses(); - } - - let (comms, message_channel) = configure_comms(&config, comms_builder)?; - - // let node_identity = comms.node_identity(); - - // TODO: DNS seeds - // let peers = match Self::try_resolve_dns_seeds(&self.seed_config).await { - // Ok(peers) => peers, - // Err(err) => { - // warn!(target: LOG_TARGET, "Failed to resolve DNS seeds: {}", err); - // Vec::new() - // }, - // }; - // add_seed_peers(&peer_manager, &node_identity, peers).await?; - // - let peer_manager = comms.peer_manager(); - let node_identity = comms.node_identity(); - add_seed_peers(&peer_manager, &node_identity, seed_peers).await?; - - debug!(target: LOG_TARGET, "DAN comms Initialized"); - Ok((comms, message_channel)) -} - -pub type MessageChannel = ( - mpsc::Sender<(Destination, DanMessage)>, - mpsc::Receiver<(CommsPublicKey, DanMessage)>, -); - -fn configure_comms( - config: &P2pConfig, - builder: CommsBuilder, -) -> Result<(UnspawnedCommsNode, MessageChannel), anyhow::Error> { - let (inbound_tx, inbound_rx) = mpsc::channel(10); - let (outbound_tx, outbound_rx) = mpsc::channel(10); - // let file_lock = acquire_exclusive_file_lock(&config.datastore_path)?; - - let datastore = LMDBBuilder::new() - .set_path(&config.datastore_path) - .set_env_flags(open::NOLOCK) - .set_env_config(LMDBConfig::default()) - .set_max_number_of_databases(1) - .add_database(&config.peer_database_name, lmdb_zero::db::CREATE) - .build() - .unwrap(); - let peer_database = datastore.get_handle(&config.peer_database_name).unwrap(); - let peer_database = LMDBWrapper::new(Arc::new(peer_database)); - - let listener_liveness_allowlist_cidrs = - parse_cidrs(&config.listener_liveness_allowlist_cidrs).map_err(|e| anyhow!("{}", e))?; - - let builder = builder - .set_liveness_check(Some(Duration::from_secs(10))) - .with_listener_liveness_max_sessions(config.listener_liveness_max_sessions) - .with_listener_liveness_allowlist_cidrs(listener_liveness_allowlist_cidrs) - .with_dial_backoff(ConstantBackoff::new(Duration::from_millis(500))) - .with_peer_storage(peer_database, None); - // .with_peer_storage(peer_database, Some(file_lock)); - - let mut comms = match config.auxiliary_tcp_listener_address { - Some(ref addr) => builder.with_auxiliary_tcp_listener_address(addr.clone()).build()?, - None => builder.build()?, - }; - - // Hook up messaging middlewares (currently none) - let connectivity = comms.connectivity(); - let logger1 = SqliteMessageLog::new(&config.datastore_path); - let logger2 = logger1.clone(); - let messaging_pipeline = pipeline::Builder::new() - .with_outbound_pipeline(outbound_rx, move |sink| { - ServiceBuilder::new() - .layer(DanBroadcast::new(connectivity, logger1)) - .service(sink) - }) - .max_concurrent_inbound_tasks(3) - .max_concurrent_outbound_tasks(3) - .with_inbound_pipeline( - ServiceBuilder::new() - .layer(DanDeserialize::new(comms.peer_manager(), logger2)) - .service(SinkService::new(inbound_tx)), - ) - .build(); - - // TODO: messaging events should be optional - let (messaging_events_sender, _) = broadcast::channel(1); - comms = comms.add_protocol_extension(MessagingProtocolExtension::new( - TARI_DAN_MSG_PROTOCOL_ID.clone(), - messaging_events_sender, - messaging_pipeline, - )); - - Ok((comms, (outbound_tx, inbound_rx))) -} - -async fn add_seed_peers( - peer_manager: &PeerManager, - node_identity: &NodeIdentity, - config: &PeerSeedsConfig, -) -> Result<(), anyhow::Error> { - let peers = config - .peer_seeds - .iter() - .map(|s| SeedPeer::from_str(s).map(Peer::from)) - .collect::, _>>()?; - - for mut peer in peers { - if &peer.public_key == node_identity.public_key() { - continue; - } - peer.add_flags(PeerFlags::SEED); - peer.set_features(PeerFeatures::COMMUNICATION_NODE); - - // debug!(target: LOG_TARGET, "Adding seed peer [{}]", peer); - peer_manager.add_peer(peer).await?; - } - Ok(()) -} - -pub async fn spawn_comms_using_transport( - comms: UnspawnedCommsNode, - transport_config: TransportConfig, -) -> Result { - let comms = match transport_config.transport_type { - TransportType::Memory => { - debug!(target: LOG_TARGET, "Building in-memory comms stack"); - comms - .with_listener_address(transport_config.memory.listener_address.clone()) - .spawn_with_transport(MemoryTransport) - .await? - }, - TransportType::Tcp => { - let config = transport_config.tcp; - debug!( - target: LOG_TARGET, - "Building TCP comms stack{}", - config - .tor_socks_address - .as_ref() - .map(|_| " with Tor support") - .unwrap_or("") - ); - let mut transport = TcpWithTorTransport::new(); - if let Some(addr) = config.tor_socks_address { - transport.set_tor_socks_proxy(SocksConfig { - proxy_address: addr, - authentication: config.tor_socks_auth.into(), - proxy_bypass_predicate: Arc::new(FalsePredicate::new()), - }); - } - comms - .with_listener_address(config.listener_address) - .spawn_with_transport(transport) - .await? - }, - TransportType::Tor => { - let tor_config = transport_config.tor; - debug!(target: LOG_TARGET, "Building TOR comms stack ({:?})", tor_config); - let mut hidden_service_ctl = initialize_hidden_service(tor_config).await?; - // Set the listener address to be the address (usually local) to which tor will forward all traffic - let transport = hidden_service_ctl.initialize_transport().await?; - debug!(target: LOG_TARGET, "Comms and DHT configured"); - comms - .with_listener_address(hidden_service_ctl.proxied_address()) - .with_hidden_service_controller(hidden_service_ctl) - .spawn_with_transport(transport) - .await? - }, - TransportType::Socks5 => { - debug!(target: LOG_TARGET, "Building SOCKS5 comms stack"); - let transport = SocksTransport::new(transport_config.socks.into()); - comms - .with_listener_address(transport_config.tcp.listener_address) - .spawn_with_transport(transport) - .await? - }, - }; - - Ok(comms) -} - -async fn initialize_hidden_service( - mut config: TorTransportConfig, -) -> Result { - let mut builder = tor::HiddenServiceBuilder::new() - .with_hs_flags(tor::HsFlags::DETACH) - .with_port_mapping(config.to_port_mapping()?) - .with_socks_authentication(config.to_socks_auth()) - .with_control_server_auth(config.to_control_auth()?) - .with_socks_address_override(config.socks_address_override) - .with_control_server_address(config.control_address) - .with_bypass_proxy_addresses(config.proxy_bypass_addresses.into()); - - if config.proxy_bypass_for_outbound_tcp { - builder = builder.bypass_tor_for_tcp_addresses(); - } - - if let Some(identity) = config.identity.take() { - builder = builder.with_tor_identity(identity); - } - - let hidden_svc_ctl = builder.build()?; - Ok(hidden_svc_ctl) -} diff --git a/applications/tari_indexer/src/config.rs b/applications/tari_indexer/src/config.rs index bfeb0cc24..3bd42ae85 100644 --- a/applications/tari_indexer/src/config.rs +++ b/applications/tari_indexer/src/config.rs @@ -34,9 +34,11 @@ use tari_common::{ DefaultConfigLoader, SubConfigPath, }; -use tari_dan_app_utilities::template_manager::implementation::TemplateConfig; +use tari_dan_app_utilities::{ + config::{P2pConfig, PeerSeedsConfig}, + template_manager::implementation::TemplateConfig, +}; use tari_engine_types::substate::SubstateAddress; -use tari_p2p::{P2pConfig, PeerSeedsConfig}; #[derive(Debug, Clone)] pub struct ApplicationConfig { @@ -110,17 +112,11 @@ impl IndexerConfig { if !self.data_dir.is_absolute() { self.data_dir = base_path.as_ref().join(&self.data_dir); } - self.p2p.set_base_path(base_path); } } impl Default for IndexerConfig { fn default() -> Self { - let p2p = P2pConfig { - datastore_path: PathBuf::from("data/peer_db"), - ..Default::default() - }; - Self { override_from: None, identity_file: PathBuf::from("indexer_id.json"), @@ -128,7 +124,7 @@ impl Default for IndexerConfig { base_node_grpc_address: None, base_layer_scanning_interval: Duration::from_secs(10), data_dir: PathBuf::from("data/indexer"), - p2p, + p2p: P2pConfig::default(), json_rpc_address: Some("127.0.0.1:18300".parse().unwrap()), graphql_address: Some("127.0.0.1:18301".parse().unwrap()), http_ui_address: Some("127.0.0.1:15000".parse().unwrap()), diff --git a/applications/tari_indexer/src/dry_run/error.rs b/applications/tari_indexer/src/dry_run/error.rs index 6f7fdd493..1071fb669 100644 --- a/applications/tari_indexer/src/dry_run/error.rs +++ b/applications/tari_indexer/src/dry_run/error.rs @@ -20,12 +20,12 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use tari_comms::protocol::rpc::RpcStatus; use tari_dan_app_utilities::transaction_executor::TransactionProcessorError; use tari_dan_common_types::{Epoch, ShardId}; use tari_engine_types::substate::SubstateAddress; use tari_epoch_manager::EpochManagerError; use tari_indexer_lib::transaction_autofiller::TransactionAutofillerError; +use tari_rpc_framework::RpcStatus; use thiserror::Error; #[derive(Error, Debug)] diff --git a/applications/tari_indexer/src/dry_run/processor.rs b/applications/tari_indexer/src/dry_run/processor.rs index c7ea08de9..3a7a4ad90 100644 --- a/applications/tari_indexer/src/dry_run/processor.rs +++ b/applications/tari_indexer/src/dry_run/processor.rs @@ -23,12 +23,11 @@ use std::{collections::HashMap, sync::Arc}; use log::info; -use tari_comms::types::CommsPublicKey; use tari_dan_app_utilities::{ template_manager::implementation::TemplateManager, transaction_executor::{TariDanTransactionProcessor, TransactionExecutor}, }; -use tari_dan_common_types::{optional::IsNotFoundError, Epoch, ShardId}; +use tari_dan_common_types::{Epoch, PeerAddress, ShardId}; use tari_dan_engine::{ bootstrap_state, fees::FeeTable, @@ -40,40 +39,43 @@ use tari_engine_types::{ substate::{Substate, SubstateAddress}, virtual_substate::{VirtualSubstate, VirtualSubstateAddress}, }; -use tari_epoch_manager::EpochManagerReader; +use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; use tari_indexer_lib::{ substate_cache::SubstateCache, substate_scanner::SubstateScanner, transaction_autofiller::TransactionAutofiller, }; use tari_transaction::{SubstateRequirement, Transaction}; -use tari_validator_node_rpc::client::{SubstateResult, ValidatorNodeClientFactory, ValidatorNodeRpcClient}; +use tari_validator_node_rpc::client::{ + SubstateResult, + TariValidatorNodeRpcClientFactory, + ValidatorNodeClientFactory, + ValidatorNodeRpcClient, +}; use tokio::task; use crate::dry_run::error::DryRunTransactionProcessorError; const LOG_TARGET: &str = "tari::indexer::dry_run_transaction_processor"; -pub struct DryRunTransactionProcessor { - epoch_manager: TEpochManager, - client_provider: TClientFactory, - transaction_autofiller: TransactionAutofiller, - template_manager: TemplateManager, +pub struct DryRunTransactionProcessor { + epoch_manager: EpochManagerHandle, + client_provider: TariValidatorNodeRpcClientFactory, + transaction_autofiller: + TransactionAutofiller, TariValidatorNodeRpcClientFactory, TSubstateCache>, + template_manager: TemplateManager, } -impl - DryRunTransactionProcessor -where - TEpochManager: EpochManagerReader + 'static, - TClientFactory: ValidatorNodeClientFactory + 'static, - ::Error: IsNotFoundError, - TSubstateCache: SubstateCache + 'static, +impl DryRunTransactionProcessor +where TSubstateCache: SubstateCache + 'static { pub fn new( - epoch_manager: TEpochManager, - client_provider: TClientFactory, - substate_scanner: Arc>, - template_manager: TemplateManager, + epoch_manager: EpochManagerHandle, + client_provider: TariValidatorNodeRpcClientFactory, + substate_scanner: Arc< + SubstateScanner, TariValidatorNodeRpcClientFactory, TSubstateCache>, + >, + template_manager: TemplateManager, ) -> Self { let transaction_autofiller = TransactionAutofiller::new(substate_scanner); @@ -115,7 +117,10 @@ where Ok(result.into_result()) } - fn build_payload_processor(&self, transaction: &Transaction) -> TariDanTransactionProcessor { + fn build_payload_processor( + &self, + transaction: &Transaction, + ) -> TariDanTransactionProcessor> { // simulate fees if the transaction requires it let fee_table = if Self::transaction_includes_fees(transaction) { // TODO: should match the VN fee table, should the fee table values be a consensus constant? @@ -167,9 +172,9 @@ where let mut nexist_count = 0; let mut err_count = 0; - for vn_public_key in &committee { + for vn_addr in committee.addresses() { // build a client with the VN - let mut client = self.client_provider.create_client(vn_public_key); + let mut client = self.client_provider.create_client(vn_addr); match client.get_substate(shard_id).await { Ok(SubstateResult::Up { substate, address, .. }) => { @@ -199,7 +204,7 @@ where epoch, nexist_count, err_count, - committee_size: committee.members().len(), + committee_size: committee.members().count(), }) } diff --git a/applications/tari_indexer/src/json_rpc/error.rs b/applications/tari_indexer/src/json_rpc/error.rs new file mode 100644 index 000000000..fac4eb720 --- /dev/null +++ b/applications/tari_indexer/src/json_rpc/error.rs @@ -0,0 +1,26 @@ +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +use std::fmt::Display; + +use axum_jrpc::{ + error::{JsonRpcError, JsonRpcErrorReason}, + JsonRpcResponse, +}; + +const LOG_TARGET: &str = "tari::indexer::json_rpc"; + +pub fn internal_error(answer_id: i64) -> impl Fn(T) -> JsonRpcResponse { + move |err| { + let msg = if cfg!(debug_assertions) || option_env!("CI").is_some() { + err.to_string() + } else { + log::error!(target: LOG_TARGET, "🚨 Internal error: {}", err); + "Something went wrong".to_string() + }; + JsonRpcResponse::error( + answer_id, + JsonRpcError::new(JsonRpcErrorReason::InternalError, msg, serde_json::Value::Null), + ) + } +} diff --git a/applications/tari_indexer/src/json_rpc/handlers.rs b/applications/tari_indexer/src/json_rpc/handlers.rs index ac06acd5b..d21c36d84 100644 --- a/applications/tari_indexer/src/json_rpc/handlers.rs +++ b/applications/tari_indexer/src/json_rpc/handlers.rs @@ -28,46 +28,47 @@ use axum_jrpc::{ JsonRpcExtractor, JsonRpcResponse, }; +use libp2p::swarm::dial_opts::{DialOpts, PeerCondition}; use log::{error, warn}; -use serde::Serialize; use serde_json::{self as json, json, Value}; use tari_base_node_client::{grpc::GrpcBaseNodeClient, types::BaseLayerConsensusConstants, BaseNodeClient}; -use tari_comms::{ - multiaddr::Multiaddr, - peer_manager::{NodeId, PeerFeatures}, - types::CommsPublicKey, - CommsNode, - NodeIdentity, -}; -use tari_crypto::tari_utilities::hex::Hex; -use tari_dan_app_utilities::substate_file_cache::SubstateFileCache; -use tari_dan_common_types::{optional::Optional, Epoch}; +use tari_dan_app_utilities::{keypair::RistrettoKeypair, substate_file_cache::SubstateFileCache}; +use tari_dan_common_types::{optional::Optional, Epoch, PeerAddress}; use tari_dan_storage::consensus_models::Decision; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; -use tari_indexer_client::types::{ - AddAddressRequest, - AddPeerRequest, - AddPeerResponse, - DeleteAddressRequest, - GetEpochManagerStatsResponse, - GetIdentityResponse, - GetNonFungibleCountRequest, - GetNonFungiblesRequest, - GetNonFungiblesResponse, - GetRelatedTransactionsRequest, - GetRelatedTransactionsResponse, - GetSubstateRequest, - GetSubstateResponse, - GetTransactionResultRequest, - GetTransactionResultResponse, - IndexerTransactionFinalizedResult, - InspectSubstateRequest, - InspectSubstateResponse, - NonFungibleSubstate, - SubmitTransactionRequest, - SubmitTransactionResponse, +use tari_indexer_client::{ + types, + types::{ + AddAddressRequest, + AddPeerRequest, + AddPeerResponse, + ConnectionDirection, + DeleteAddressRequest, + GetConnectionsResponse, + GetEpochManagerStatsResponse, + GetIdentityResponse, + GetNonFungibleCountRequest, + GetNonFungiblesRequest, + GetNonFungiblesResponse, + GetRelatedTransactionsRequest, + GetRelatedTransactionsResponse, + GetSubstateRequest, + GetSubstateResponse, + GetTransactionResultRequest, + GetTransactionResultResponse, + IndexerTransactionFinalizedResult, + InspectSubstateRequest, + InspectSubstateResponse, + NonFungibleSubstate, + SubmitTransactionRequest, + SubmitTransactionResponse, + }, +}; +use tari_networking::{NetworkingHandle, NetworkingService}; +use tari_validator_node_rpc::{ + client::{SubstateResult, TariValidatorNodeRpcClientFactory, TransactionResultStatus}, + proto, }; -use tari_validator_node_rpc::client::{SubstateResult, TariCommsValidatorNodeClientFactory, TransactionResultStatus}; use super::json_encoding::{ encode_execute_result_into_json, @@ -77,36 +78,23 @@ use super::json_encoding::{ use crate::{ bootstrap::Services, dry_run::processor::DryRunTransactionProcessor, + json_rpc::error::internal_error, substate_manager::SubstateManager, transaction_manager::TransactionManager, }; const LOG_TARGET: &str = "tari::indexer::json_rpc::handlers"; -#[derive(Serialize, Debug)] -struct Connection { - node_id: NodeId, - public_key: CommsPublicKey, - address: Multiaddr, - direction: bool, - age: u64, -} - -#[derive(Serialize, Debug)] -struct GetConnectionsResponse { - connections: Vec, -} - pub struct JsonRpcHandlers { consensus_constants: BaseLayerConsensusConstants, - node_identity: Arc, - comms: CommsNode, + keypair: RistrettoKeypair, + networking: NetworkingHandle, base_node_client: GrpcBaseNodeClient, substate_manager: Arc, - epoch_manager: EpochManagerHandle, - transaction_manager: TransactionManager, - dry_run_transaction_processor: - DryRunTransactionProcessor, + epoch_manager: EpochManagerHandle, + transaction_manager: + TransactionManager, TariValidatorNodeRpcClientFactory, SubstateFileCache>, + dry_run_transaction_processor: DryRunTransactionProcessor, } impl JsonRpcHandlers { @@ -116,20 +104,16 @@ impl JsonRpcHandlers { base_node_client: GrpcBaseNodeClient, substate_manager: Arc, transaction_manager: TransactionManager< - EpochManagerHandle, - TariCommsValidatorNodeClientFactory, - SubstateFileCache, - >, - dry_run_transaction_processor: DryRunTransactionProcessor< - EpochManagerHandle, - TariCommsValidatorNodeClientFactory, + EpochManagerHandle, + TariValidatorNodeRpcClientFactory, SubstateFileCache, >, + dry_run_transaction_processor: DryRunTransactionProcessor, ) -> Self { Self { consensus_constants, - node_identity: services.comms.node_identity(), - comms: services.comms.clone(), + keypair: services.keypair.clone(), + networking: services.networking.clone(), base_node_client, substate_manager, epoch_manager: services.epoch_manager.clone(), @@ -156,12 +140,17 @@ impl JsonRpcHandlers { )) } - pub fn get_identity(&self, value: JsonRpcExtractor) -> JrpcResult { + pub async fn get_identity(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); + let info = self + .networking + .get_local_peer_info() + .await + .map_err(internal_error(answer_id))?; let response = GetIdentityResponse { - node_id: self.node_identity.node_id().to_hex(), - public_key: self.node_identity.public_key().clone(), - public_addresses: self.node_identity.public_addresses(), + peer_id: info.peer_id.to_string(), + public_key: self.keypair.public_key().clone(), + public_addresses: info.listen_addrs, }; Ok(JsonRpcResponse::success(answer_id, response)) @@ -188,32 +177,24 @@ impl JsonRpcHandlers { wait_for_dial, } = value.parse_params()?; - let connectivity = self.comms.connectivity(); - let peer_manager = self.comms.peer_manager(); - - let node_id = NodeId::from_public_key(&public_key); - - peer_manager - .add_or_update_online_peer( - &public_key, - node_id.clone(), - addresses, - PeerFeatures::COMMUNICATION_NODE, - &tari_comms::net_address::PeerAddressSource::Config, + let mut networking = self.networking.clone(); + let peer_id = networking + .add_peer(public_key, addresses.clone()) + .await + .map_err(internal_error(answer_id))?; + + let dial_wait = networking + .dial_peer( + DialOpts::peer_id(peer_id) + .addresses(addresses) + .condition(PeerCondition::Always) + .build(), ) .await - .map_err(|e| Self::internal_error(answer_id, format!("Could not update peer: {}", e)))?; + .map_err(internal_error(answer_id))?; + if wait_for_dial { - let _conn = connectivity - .dial_peer(node_id) - .await - .map_err(|e| Self::internal_error(answer_id, e.to_string()))?; - } else { - // Dial without waiting - connectivity - .request_many_dials(Some(node_id)) - .await - .map_err(|e| Self::internal_error(answer_id, e.to_string()))?; + dial_wait.await.map_err(internal_error(answer_id))?; } Ok(JsonRpcResponse::success(answer_id, AddPeerResponse {})) @@ -221,55 +202,45 @@ impl JsonRpcHandlers { pub async fn get_comms_stats(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); - match self.comms.connectivity().get_connectivity_status().await { - Ok(stats) => { - let response = json!({ "connection_status": format!("{:?}", stats) }); - Ok(JsonRpcResponse::success(answer_id, response)) - }, - Err(e) => { - warn!(target: LOG_TARGET, "Failed to get comms stats: {}", e); - Err(Self::internal_error( - answer_id, - format!("Failed to get comms stats: {}", e), - )) - }, - } + let peers = self + .networking + .clone() + .get_connected_peers() + .await + .map_err(internal_error(answer_id))?; + + let status = if peers.is_empty() { "Offline" } else { "Online" }; + let response = json!({ "connection_status": status }); + Ok(JsonRpcResponse::success(answer_id, response)) } pub async fn get_connections(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); - match self.comms.connectivity().get_active_connections().await { - Ok(active_connections) => { - let mut response = GetConnectionsResponse { connections: vec![] }; - let peer_manager = self.comms.peer_manager(); - for conn in active_connections { - let peer = peer_manager - .find_by_node_id(conn.peer_node_id()) - .await - .expect("Unexpected peer database error") - .expect("Peer not found"); - response.connections.push(Connection { - node_id: peer.node_id, - public_key: peer.public_key, - address: conn.address().clone(), - direction: conn.direction().is_inbound(), - age: conn.age().as_secs(), - }); - } - Ok(JsonRpcResponse::success(answer_id, response)) - }, - Err(e) => { - warn!(target: LOG_TARGET, "Failed to get connections: {}", e); - Err(JsonRpcResponse::error( - answer_id, - JsonRpcError::new( - JsonRpcErrorReason::InvalidParams, - "Something went wrong".to_string(), - json::Value::Null, - ), - )) - }, - } + let active_connections = self + .networking + .get_active_connections() + .await + .map_err(internal_error(answer_id))?; + + let connections = active_connections + .into_iter() + .map(|conn| types::Connection { + connection_id: conn.connection_id.to_string(), + peer_id: conn.peer_id.to_string(), + address: conn.endpoint.get_remote_address().clone(), + direction: if conn.endpoint.is_dialer() { + ConnectionDirection::Outbound + } else { + ConnectionDirection::Inbound + }, + age: conn.age(), + ping_latency: conn.ping_latency, + }) + .collect(); + + Ok(JsonRpcResponse::success(answer_id, GetConnectionsResponse { + connections, + })) } pub async fn get_substate(&self, value: JsonRpcExtractor) -> JrpcResult { diff --git a/applications/tari_indexer/src/json_rpc/mod.rs b/applications/tari_indexer/src/json_rpc/mod.rs index f05199a7d..71a670bc6 100644 --- a/applications/tari_indexer/src/json_rpc/mod.rs +++ b/applications/tari_indexer/src/json_rpc/mod.rs @@ -23,6 +23,7 @@ mod handlers; pub use handlers::JsonRpcHandlers; +mod error; mod json_encoding; mod server; diff --git a/applications/tari_indexer/src/json_rpc/server.rs b/applications/tari_indexer/src/json_rpc/server.rs index c58ee82ec..da6d2ad82 100644 --- a/applications/tari_indexer/src/json_rpc/server.rs +++ b/applications/tari_indexer/src/json_rpc/server.rs @@ -58,7 +58,7 @@ async fn handler(Extension(handlers): Extension>, value: Js debug!(target: LOG_TARGET, "🌐 JSON-RPC body: {:?}", value); match value.method.as_str() { "rpc.discover" => handlers.rpc_discover(value), - "get_identity" => handlers.get_identity(value), + "get_identity" => handlers.get_identity(value).await, "get_all_vns" => handlers.get_all_vns(value).await, "add_peer" => handlers.add_peer(value).await, "get_comms_stats" => handlers.get_comms_stats(value).await, diff --git a/applications/tari_indexer/src/lib.rs b/applications/tari_indexer/src/lib.rs index 5489d2dcd..b307f5c63 100644 --- a/applications/tari_indexer/src/lib.rs +++ b/applications/tari_indexer/src/lib.rs @@ -27,14 +27,12 @@ extern crate diesel_migrations; mod bootstrap; pub mod cli; -mod comms; pub mod config; mod dry_run; pub mod graphql; mod http_ui; mod json_rpc; -mod p2p; mod substate_manager; mod substate_storage_sqlite; mod transaction_manager; @@ -43,15 +41,17 @@ use std::{fs, sync::Arc}; use http_ui::server::run_http_ui_server; use log::*; -use minotari_app_utilities::identity_management::setup_node_identity; use substate_manager::SubstateManager; use tari_base_node_client::grpc::GrpcBaseNodeClient; use tari_common::{ configuration::bootstrap::{grpc_default_port, ApplicationType}, exit_codes::{ExitCode, ExitError}, }; -use tari_comms::peer_manager::PeerFeatures; -use tari_dan_app_utilities::{consensus_constants::ConsensusConstants, substate_file_cache::SubstateFileCache}; +use tari_dan_app_utilities::{ + consensus_constants::ConsensusConstants, + keypair::setup_keypair_prompt, + substate_file_cache::SubstateFileCache, +}; use tari_dan_storage::global::DbFactory; use tari_dan_storage_sqlite::SqliteDbFactory; use tari_indexer_lib::substate_scanner::SubstateScanner; @@ -68,15 +68,9 @@ use crate::{ }; const LOG_TARGET: &str = "tari::indexer::app"; -pub const DAN_PEER_FEATURES: PeerFeatures = PeerFeatures::COMMUNICATION_NODE; pub async fn run_indexer(config: ApplicationConfig, mut shutdown_signal: ShutdownSignal) -> Result<(), ExitError> { - let node_identity = setup_node_identity( - &config.indexer.identity_file, - config.indexer.p2p.public_addresses.to_vec(), - true, - DAN_PEER_FEATURES, - )?; + let keypair = setup_keypair_prompt(&config.indexer.identity_file, true)?; let db_factory = SqliteDbFactory::new(config.indexer.data_dir.clone()); db_factory @@ -90,7 +84,7 @@ pub async fn run_indexer(config: ApplicationConfig, mut shutdown_signal: Shutdow let services: Services = spawn_services( &config, shutdown_signal.clone(), - node_identity.clone(), + keypair.clone(), global_db, ConsensusConstants::devnet(), // TODO: change this eventually ) diff --git a/applications/tari_indexer/src/substate_manager.rs b/applications/tari_indexer/src/substate_manager.rs index 71692a3bb..a2861711f 100644 --- a/applications/tari_indexer/src/substate_manager.rs +++ b/applications/tari_indexer/src/substate_manager.rs @@ -28,6 +28,7 @@ use serde::{Deserialize, Serialize}; use tari_common_types::types::FixedHash; use tari_crypto::tari_utilities::message_format::MessageFormat; use tari_dan_app_utilities::substate_file_cache::SubstateFileCache; +use tari_dan_common_types::PeerAddress; use tari_engine_types::{ events::Event, substate::{Substate, SubstateAddress}, @@ -43,7 +44,7 @@ use tari_template_lib::{ prelude::{ComponentAddress, Metadata}, }; use tari_transaction::TransactionId; -use tari_validator_node_rpc::client::{SubstateResult, TariCommsValidatorNodeClientFactory}; +use tari_validator_node_rpc::client::{SubstateResult, TariValidatorNodeRpcClientFactory}; use crate::substate_storage_sqlite::{ models::{events::NewEvent, non_fungible_index::NewNonFungibleIndex, substate::NewSubstate}, @@ -80,14 +81,15 @@ pub struct EventResponse { } pub struct SubstateManager { - substate_scanner: Arc>, + substate_scanner: + Arc, TariValidatorNodeRpcClientFactory, SubstateFileCache>>, substate_store: SqliteSubstateStore, } impl SubstateManager { pub fn new( dan_layer_scanner: Arc< - SubstateScanner, + SubstateScanner, TariValidatorNodeRpcClientFactory, SubstateFileCache>, >, substate_store: SqliteSubstateStore, ) -> Self { diff --git a/applications/tari_indexer/src/transaction_manager/mod.rs b/applications/tari_indexer/src/transaction_manager/mod.rs index 7193347e4..fbfbd2c6e 100644 --- a/applications/tari_indexer/src/transaction_manager/mod.rs +++ b/applications/tari_indexer/src/transaction_manager/mod.rs @@ -168,7 +168,7 @@ where let mut all_members = HashSet::new(); for shard_id in shard_ids { let committee = self.epoch_manager.get_committee(epoch, shard_id).await?; - all_members.extend(committee); + all_members.extend(committee.into_addresses()); } let committee_size = all_members.len(); @@ -185,7 +185,7 @@ where Err(err) => { warn!( target: LOG_TARGET, - "Failed to call validator node '{}': {}", validator, err + "Failed to dial validator node '{}': {}", validator, err ); continue; }, diff --git a/applications/tari_indexer_web_ui/src/routes/VN/Components/Connections.tsx b/applications/tari_indexer_web_ui/src/routes/VN/Components/Connections.tsx index e2b50f60c..326853f02 100644 --- a/applications/tari_indexer_web_ui/src/routes/VN/Components/Connections.tsx +++ b/applications/tari_indexer_web_ui/src/routes/VN/Components/Connections.tsx @@ -22,7 +22,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { addPeer, getConnections } from '../../../utils/json_rpc'; -import { toHexString } from './helpers'; +import {shortenString, toHexString} from './helpers'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; @@ -38,13 +38,21 @@ import Button from '@mui/material/Button'; import { TextField } from '@mui/material'; import { Form } from 'react-router-dom'; import Fade from '@mui/material/Fade'; +import CopyToClipboard from "../../../Components/CopyToClipboard"; interface IConnection { + connection_id: number; address: string; - age: number; + age: Duration; direction: boolean; - node_id: number[]; - public_key: string; + peer_id: string; + ping_latency: Duration | null; + // public_key: string; +} + +interface Duration { + secs: number; + nanos: number; } const useInterval = (fn: () => Promise, ms: number) => { @@ -76,7 +84,9 @@ function Connections() { }; const onSubmitAddPeer = async () => { - await addPeer(formState.publicKey, [formState.address]); + await addPeer(formState.publicKey, + formState.address ? [formState.address] : [], + ); setFormState({ publicKey: '', address: '' }); setShowAddPeerDialog(false); }; @@ -139,31 +149,64 @@ function Connections() { + Peer id Address Age Direction - Node id - Public key + Latency - {connections.map( - ({ address, age, direction, node_id, public_key }) => ( - - {address} - {age} - - {direction ? 'Inbound' : 'Outbound'} - - {toHexString(node_id)} - {public_key} - - ) - )} + {connections && + connections.map( + ({ + connection_id, + address, + age, + direction, + peer_id, + ping_latency, + }) => ( + + + {peer_id ? shortenString(peer_id) : "--"} + + + {address} + {displayDuration(age)} + {direction} + + {ping_latency ? displayDuration(ping_latency) : "--"} + + + ), + )}
); } +function displayDuration(duration: Duration) { + if (duration.secs === 0) { + if (duration.nanos > 1000000) { + return `${(duration.nanos / 1000000).toFixed(2)}ms`; + } + if (duration.nanos > 1000) { + return `${(duration.nanos / 1000).toFixed(2)}µs`; + } + return `${duration.nanos / 1000}ns`; + } + if (duration.secs > 60 * 60) { + return `${(duration.secs / 60 / 60).toFixed(0)}h${( + duration.secs / 60 + ).toFixed(0)}m`; + } + if (duration.secs > 60) { + return `${(duration.secs / 60).toFixed(0)}m${(duration.secs % 60).toFixed( + 0, + )}s`; + } + return `${duration.secs}.${(duration.nanos / 1000000).toFixed(0)}s`; +} export default Connections; diff --git a/applications/tari_indexer_web_ui/src/routes/VN/Components/Info.tsx b/applications/tari_indexer_web_ui/src/routes/VN/Components/Info.tsx index e5a50772e..1733bc9ba 100644 --- a/applications/tari_indexer_web_ui/src/routes/VN/Components/Info.tsx +++ b/applications/tari_indexer_web_ui/src/routes/VN/Components/Info.tsx @@ -40,12 +40,12 @@ function Info({ - Node id - {identity.node_id} + Peer id + {identity.peer_id} - Public address - {identity.public_address} + Listen addresses + {identity.public_addresses?.join(", ")} Public key diff --git a/applications/tari_indexer_web_ui/src/utils/interfaces.tsx b/applications/tari_indexer_web_ui/src/utils/interfaces.tsx index 8b23b0e38..0cbd0ae3b 100644 --- a/applications/tari_indexer_web_ui/src/utils/interfaces.tsx +++ b/applications/tari_indexer_web_ui/src/utils/interfaces.tsx @@ -26,8 +26,8 @@ interface IEpoch { } interface IIdentity { - node_id: string; - public_address: string; + peer_id: string, + public_addresses: string[]; public_key: string; } diff --git a/applications/tari_validator_node/Cargo.toml b/applications/tari_validator_node/Cargo.toml index c100451af..38a104653 100644 --- a/applications/tari_validator_node/Cargo.toml +++ b/applications/tari_validator_node/Cargo.toml @@ -12,8 +12,6 @@ minotari_app_grpc = { git = "https://github.com/tari-project/tari.git", branch = minotari_app_utilities = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_common = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_common_types = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_comms = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_comms_logging = { path = "../../comms/tari_comms_logging" } tari_core = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2", default-features = false, features = [ "transactions", ] } @@ -26,9 +24,7 @@ tari_dan_engine = { path = "../../dan_layer/engine" } tari_dan_storage = { path = "../../dan_layer/storage" } tari_dan_storage_sqlite = { path = "../../dan_layer/storage_sqlite" } tari_engine_types = { path = "../../dan_layer/engine_types" } -tari_p2p = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_shutdown = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } -tari_storage = { git = "https://github.com/tari-project/tari.git", branch = "feature-dan2" } tari_template_lib = { path = "../../dan_layer/template_lib" } tari_transaction = { path = "../../dan_layer/transaction" } tari_validator_node_client = { path = "../../clients/validator_node_client" } @@ -43,6 +39,11 @@ tari_bor = { path = "../../dan_layer/tari_bor" } tari_consensus = { path = "../../dan_layer/consensus" } tari_state_store_sqlite = { path = "../../dan_layer/state_store_sqlite" } +tari_networking = { path = "../../networking/core" } +tari_rpc_framework = { path = "../../networking/rpc_framework" } +sqlite_message_logger = { path = "../../networking/sqlite_message_logger" } + +libp2p = "0.53.1" anyhow = "1.0.53" async-trait = "0.1.50" axum = "0.6.0" @@ -55,7 +56,6 @@ include_dir = "0.7.2" indexmap = "2.0.0" json5 = "0.2.2" libsqlite3-sys = { version = "0.25", features = ["bundled"] } -lmdb-zero = "0.4.4" log = { version = "0.4.8", features = ["std"] } log4rs = { version = "1.1.1", features = [ "rolling_file_appender", @@ -63,7 +63,7 @@ log4rs = { version = "1.1.1", features = [ "size_trigger", "fixed_window_roller", ] } -prost = "0.9" +prost = "0.12" rand = "0.8" reqwest = "0.11.11" serde = { version = "1.0", features = ["derive"] } @@ -77,9 +77,7 @@ tokio = { version = "1.10", features = [ "rt-multi-thread", ] } tonic = "0.6.2" -tower = "0.4" tower-http = { version = "0.3.0", features = ["cors"] } -tower-layer = "0.3" mime_guess = "2.0.4" [build-dependencies] diff --git a/applications/tari_validator_node/src/bootstrap.rs b/applications/tari_validator_node/src/bootstrap.rs index 06ec4be91..a621dbf17 100644 --- a/applications/tari_validator_node/src/bootstrap.rs +++ b/applications/tari_validator_node/src/bootstrap.rs @@ -20,30 +20,34 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::{fs, io, ops::DerefMut, sync::Arc}; +use std::{fs, io, ops::DerefMut, str::FromStr}; use anyhow::anyhow; use futures::{future, FutureExt}; +use libp2p::identity; use log::info; -use minotari_app_utilities::{identity_management, identity_management::load_from_json}; +use minotari_app_utilities::identity_management; use serde::Serialize; +use sqlite_message_logger::SqliteMessageLogger; use tari_base_node_client::grpc::GrpcBaseNodeClient; use tari_common::{ configuration::bootstrap::{grpc_default_port, ApplicationType}, exit_codes::{ExitCode, ExitError}, }; use tari_common_types::types::PublicKey; -use tari_comms::{protocol::rpc::RpcServer, types::CommsPublicKey, CommsNode, NodeIdentity, UnspawnedCommsNode}; use tari_core::transactions::transaction_components::ValidatorNodeSignature; +use tari_crypto::tari_utilities::ByteArray; use tari_dan_app_utilities::{ base_layer_scanner, consensus_constants::ConsensusConstants, + keypair::RistrettoKeypair, + seed_peer::SeedPeer, substate_file_cache::SubstateFileCache, template_manager, template_manager::{implementation::TemplateManager, interface::TemplateManagerHandle}, transaction_executor::TariDanTransactionProcessor, }; -use tari_dan_common_types::{Epoch, NodeAddressable, NodeHeight, ShardId}; +use tari_dan_common_types::{Epoch, NodeAddressable, NodeHeight, PeerAddress, ShardId}; use tari_dan_engine::fees::FeeTable; use tari_dan_storage::{ consensus_models::{Block, BlockId, ExecutedTransaction, ForeignReceiveCounters, SubstateRecord}, @@ -57,6 +61,8 @@ use tari_dan_storage_sqlite::global::SqliteGlobalDbAdapter; use tari_engine_types::{resource::Resource, substate::SubstateAddress}; use tari_epoch_manager::base_layer::{EpochManagerConfig, EpochManagerHandle}; use tari_indexer_lib::substate_scanner::SubstateScanner; +use tari_networking::{NetworkingHandle, SwarmConfig}; +use tari_rpc_framework::RpcServer; use tari_shutdown::ShutdownSignal; use tari_state_store_sqlite::SqliteStateStore; use tari_template_lib::{ @@ -68,20 +74,18 @@ use tari_template_lib::{ resource::TOKEN_SYMBOL, }; use tari_transaction::Transaction; -use tari_validator_node_rpc::client::TariCommsValidatorNodeClientFactory; +use tari_validator_node_rpc::{client::TariValidatorNodeRpcClientFactory, proto}; use tokio::{sync::mpsc, task::JoinHandle}; use crate::{ - comms, consensus, consensus::ConsensusHandle, dry_run_transaction_processor::DryRunTransactionProcessor, p2p::{ create_tari_validator_node_rpc_service, services::{ - comms_peer_provider::CommsPeerProvider, + mempool, mempool::{ - self, ClaimFeeTransactionValidator, EpochRangeValidator, FeeTransactionValidator, @@ -95,10 +99,7 @@ use crate::{ TransactionSignatureValidator, Validator, }, - messaging, - messaging::DanMessageReceivers, - networking, - networking::NetworkingHandle, + message_dispatcher, }, }, registration, @@ -114,14 +115,11 @@ const LOG_TARGET: &str = "tari::validator_node::bootstrap"; pub async fn spawn_services( config: &ApplicationConfig, shutdown: ShutdownSignal, - node_identity: Arc, - global_db: GlobalDb, + keypair: RistrettoKeypair, + global_db: GlobalDb>, consensus_constants: ConsensusConstants, ) -> Result { - let mut handles = Vec::with_capacity(3); - let mut p2p_config = config.validator_node.p2p.clone(); - p2p_config.transport.tor.identity = load_from_json(&config.validator_node.tor_identity_file) - .map_err(|e| ExitError::new(ExitCode::ConfigError, e))?; + let mut handles = Vec::with_capacity(8); ensure_directories_exist(config)?; @@ -132,35 +130,57 @@ pub async fn spawn_services( format!("127.0.0.1:{port}") })); - // Initialize comms - let (comms, message_channels) = comms::initialize(node_identity.clone(), config, shutdown.clone()).await?; + // Networking + let (message_senders, message_receivers) = message_dispatcher::new_messaging_channel(30); + let (tx_messages, rx_messages) = mpsc::channel(100); + let identity = identity::Keypair::sr25519_from_bytes(keypair.secret_key().as_bytes().to_vec()).map_err(|e| { + ExitError::new( + ExitCode::ConfigError, + format!("Failed to create libp2p identity from secret bytes: {}", e), + ) + })?; + let seed_peers = config + .peer_seeds + .peer_seeds + .iter() + .map(|s| SeedPeer::from_str(s)) + .collect::>>()?; + let seed_peers = seed_peers + .into_iter() + .flat_map(|p| { + let peer_id = p.to_peer_id(); + p.addresses.into_iter().map(move |a| (peer_id, a)) + }) + .collect(); + let (mut networking, join_handle) = tari_networking::spawn::( + identity, + tx_messages, + tari_networking::Config { + listener_port: config.validator_node.p2p.listener_port, + swarm: SwarmConfig { + protocol_version: "/tari/devnet/0.0.1".try_into().unwrap(), + user_agent: "/tari/validator/0.0.1".to_string(), + enable_mdns: config.validator_node.p2p.enable_mdns, + ..Default::default() + }, + reachability_mode: config.validator_node.p2p.reachability_mode.into(), + }, + seed_peers, + shutdown.clone(), + )?; + handles.push(join_handle); // Spawn messaging - let (message_senders, message_receivers) = messaging::new_messaging_channel(30); - let (outbound_messaging, join_handle) = messaging::spawn( - node_identity.public_key().clone(), - message_channels, - message_senders.clone(), - ); + let message_logger = SqliteMessageLogger::new(config.validator_node.data_dir.join("message_log.sqlite")); + let (outbound_messaging, join_handle) = + message_dispatcher::spawn(networking.clone(), rx_messages, message_senders, message_logger); handles.push(join_handle); - let DanMessageReceivers { + let message_dispatcher::DanMessageReceivers { rx_consensus_message, rx_new_transaction_message, - rx_network_announce, } = message_receivers; - // Networking - let peer_provider = CommsPeerProvider::new(comms.peer_manager()); - let (networking, join_handle) = networking::spawn( - rx_network_announce, - node_identity.clone(), - outbound_messaging.clone(), - peer_provider.clone(), - comms.connectivity(), - ); - handles.push(join_handle); - // Connect to shard db let state_store = SqliteStateStore::connect(&format!("sqlite://{}", config.validator_node.state_db_path().display()))?; @@ -176,13 +196,13 @@ pub async fn spawn_services( }, global_db.clone(), base_node_client.clone(), - node_identity.public_key().clone(), + keypair.public_key().clone(), shutdown.clone(), ); handles.push(join_handle); // Create registration file - create_registration_file(config, &epoch_manager, &node_identity).await?; + create_registration_file(config, &epoch_manager, &keypair).await?; // Template manager let template_manager = TemplateManager::initialize(global_db.clone(), config.validator_node.templates.clone())?; @@ -203,14 +223,14 @@ pub async fn spawn_services( }; let payload_processor = TariDanTransactionProcessor::new(template_manager.clone(), fee_table); - let validator_node_client_factory = TariCommsValidatorNodeClientFactory::new(comms.connectivity()); + let validator_node_client_factory = TariValidatorNodeRpcClientFactory::new(networking.clone()); // Consensus let (tx_executed_transaction, rx_executed_transaction) = mpsc::channel(10); let foreign_receive_counter = state_store.with_read_tx(|tx| ForeignReceiveCounters::get(tx))?; let (consensus_join_handle, consensus_handle, rx_consensus_to_mempool) = consensus::spawn( state_store.clone(), - node_identity.clone(), + keypair.clone(), epoch_manager.clone(), rx_executed_transaction, rx_consensus_message, @@ -245,7 +265,6 @@ pub async fn spawn_services( outbound_messaging, tx_executed_transaction, epoch_manager.clone(), - node_identity.clone(), payload_processor.clone(), substate_resolver.clone(), create_mempool_before_execute_validator( @@ -274,30 +293,21 @@ pub async fn spawn_services( ); handles.push(join_handle); - let comms = setup_p2p_rpc( + spawn_p2p_rpc( config, - comms, - peer_provider, + &mut networking, state_store.clone(), mempool.clone(), virtual_substate_manager, - ); - let comms = comms::spawn_comms_using_transport(comms, p2p_config.transport.clone()) - .await - .map_err(|e| { - ExitError::new( - ExitCode::NetworkError, - format!("Could not spawn using transport: {}", e), - ) - })?; - + ) + .await?; // Save final node identity after comms has initialized. This is required because the public_address can be // changed by comms during initialization when using tor. - save_identities(config, &comms)?; + save_identities(config, &keypair)?; // Auto-registration if config.validator_node.auto_register { - let handle = registration::spawn(config.clone(), node_identity.clone(), epoch_manager.clone(), shutdown); + let handle = registration::spawn(config.clone(), keypair.clone(), epoch_manager.clone(), shutdown); handles.push(handle); } else { info!(target: LOG_TARGET, "♽️ Node auto registration is disabled"); @@ -307,7 +317,7 @@ pub async fn spawn_services( DryRunTransactionProcessor::new(epoch_manager.clone(), payload_processor, substate_resolver); Ok(Services { - comms, + keypair, networking, mempool, epoch_manager, @@ -323,15 +333,15 @@ pub async fn spawn_services( async fn create_registration_file( config: &ApplicationConfig, - epoch_manager: &EpochManagerHandle, - node_identity: &NodeIdentity, + epoch_manager: &EpochManagerHandle, + keypair: &RistrettoKeypair, ) -> Result<(), anyhow::Error> { let fee_claim_public_key = config.validator_node.fee_claim_public_key.clone(); epoch_manager .set_fee_claim_public_key(fee_claim_public_key.clone()) .await?; - let signature = ValidatorNodeSignature::sign(node_identity.secret_key(), &fee_claim_public_key, b""); + let signature = ValidatorNodeSignature::sign(keypair.secret_key(), &fee_claim_public_key, b""); #[derive(Serialize)] struct ValidatorRegistrationFile { signature: ValidatorNodeSignature, @@ -340,7 +350,7 @@ async fn create_registration_file( } let registration = ValidatorRegistrationFile { signature, - public_key: node_identity.public_key().clone(), + public_key: keypair.public_key().clone(), claim_public_key: fee_claim_public_key, }; fs::write( @@ -351,34 +361,29 @@ async fn create_registration_file( Ok(()) } -fn save_identities(config: &ApplicationConfig, comms: &CommsNode) -> Result<(), ExitError> { - identity_management::save_as_json(&config.validator_node.identity_file, &*comms.node_identity()) +fn save_identities(config: &ApplicationConfig, keypair: &RistrettoKeypair) -> Result<(), ExitError> { + identity_management::save_as_json(&config.validator_node.identity_file, keypair) .map_err(|e| ExitError::new(ExitCode::ConfigError, format!("Failed to save node identity: {}", e)))?; - if let Some(hs) = comms.hidden_service() { - identity_management::save_as_json(&config.validator_node.tor_identity_file, hs.tor_identity()) - .map_err(|e| ExitError::new(ExitCode::ConfigError, format!("Failed to save tor identity: {}", e)))?; - } Ok(()) } fn ensure_directories_exist(config: &ApplicationConfig) -> io::Result<()> { fs::create_dir_all(&config.validator_node.data_dir)?; - fs::create_dir_all(&config.validator_node.p2p.datastore_path)?; Ok(()) } pub struct Services { - pub comms: CommsNode, - pub networking: NetworkingHandle, + pub keypair: RistrettoKeypair, + pub networking: NetworkingHandle, pub mempool: MempoolHandle, - pub epoch_manager: EpochManagerHandle, + pub epoch_manager: EpochManagerHandle, pub template_manager: TemplateManagerHandle, pub consensus_handle: ConsensusHandle, - pub global_db: GlobalDb, + pub global_db: GlobalDb>, pub dry_run_transaction_processor: DryRunTransactionProcessor, - pub validator_node_client_factory: TariCommsValidatorNodeClientFactory, - pub state_store: SqliteStateStore, + pub validator_node_client_factory: TariValidatorNodeRpcClientFactory, + pub state_store: SqliteStateStore, pub handles: Vec>>, } @@ -395,25 +400,29 @@ impl Services { } } -fn setup_p2p_rpc( +async fn spawn_p2p_rpc( config: &ApplicationConfig, - comms: UnspawnedCommsNode, - peer_provider: CommsPeerProvider, - shard_store_store: SqliteStateStore, + networking: &mut NetworkingHandle, + shard_store_store: SqliteStateStore, mempool: MempoolHandle, - virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, -) -> UnspawnedCommsNode { + virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, +) -> anyhow::Result<()> { let rpc_server = RpcServer::builder() - .with_maximum_simultaneous_sessions(config.validator_node.p2p.rpc_max_simultaneous_sessions) + .with_maximum_simultaneous_sessions(config.validator_node.rpc.max_simultaneous_sessions) + .with_maximum_sessions_per_client(config.validator_node.rpc.max_sessions_per_client) .finish() .add_service(create_tari_validator_node_rpc_service( - peer_provider, shard_store_store, mempool, virtual_substate_manager, )); - comms.add_protocol_extension(rpc_server) + let (notify_tx, notify_rx) = mpsc::unbounded_channel(); + networking + .add_protocol_notifier(rpc_server.all_protocols().iter().cloned(), notify_tx) + .await?; + tokio::spawn(rpc_server.serve(notify_rx)); + Ok(()) } // TODO: Figure out the best way to have the engine shard store mirror these bootstrapped states. @@ -423,7 +432,7 @@ where TTx::Target: StateStoreReadTransaction, TTx::Addr: NodeAddressable + Serialize, { - let genesis_block = Block::::genesis(); + let genesis_block = Block::genesis(); let address = SubstateAddress::Resource(PUBLIC_IDENTITY_RESOURCE_ADDRESS); let shard_id = ShardId::from_address(&address, 0); let mut metadata: Metadata = Default::default(); @@ -484,8 +493,8 @@ where fn create_mempool_before_execute_validator( config: &ValidatorNodeConfig, - template_manager: TemplateManager, - epoch_manager: EpochManagerHandle, + template_manager: TemplateManager, + epoch_manager: EpochManagerHandle, ) -> impl Validator { let mut validator = TransactionSignatureValidator .and_then(TemplateExistsValidator::new(template_manager)) @@ -502,8 +511,8 @@ fn create_mempool_before_execute_validator( validator } -fn create_mempool_after_execute_validator( - store: SqliteStateStore, +fn create_mempool_after_execute_validator( + store: SqliteStateStore, ) -> impl Validator { HasInvolvedShards::new() .and_then(InputRefsValidator::new()) diff --git a/applications/tari_validator_node/src/cli.rs b/applications/tari_validator_node/src/cli.rs index 0e5f599a0..35139a261 100644 --- a/applications/tari_validator_node/src/cli.rs +++ b/applications/tari_validator_node/src/cli.rs @@ -25,6 +25,7 @@ use std::net::SocketAddr; use clap::Parser; use minotari_app_utilities::common_cli_args::CommonCliArgs; use tari_common::configuration::{ConfigOverrideProvider, Network}; +use tari_dan_app_utilities::config::ReachabilityMode; #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] @@ -38,8 +39,19 @@ pub struct Cli { /// Bind address for JSON-rpc server #[clap(long, alias = "rpc-address")] pub json_rpc_address: Option, + #[clap(long, alias = "rpc-address")] + pub http_ui_address: Option, #[clap(long, env = "TARI_VN_UI_CONNECT_ADDRESS")] pub ui_connect_address: Option, + #[clap(long, short = 's')] + pub peer_seeds: Vec, + #[clap(long)] + pub listener_port: Option, + /// Set the node to unreachable mode, the node will not act as a relay and will attempt relayed connections. + #[clap(long)] + pub reachability: Option, + #[clap(long)] + pub disable_mdns: bool, /// A replacement of a template address with a local WASM file, in the format =. /// FOR DEBUGGING PURPOSES ONLY #[clap(long, short = 'd')] @@ -66,6 +78,30 @@ impl ConfigOverrideProvider for Cli { ui_connect_address.to_string(), )); } + if let Some(ref http_ui_address) = self.http_ui_address { + overrides.push(( + "validator_node.http_ui_address".to_string(), + http_ui_address.to_string(), + )); + } + if !self.peer_seeds.is_empty() { + overrides.push(("p2p.seeds.peer_seeds".to_string(), self.peer_seeds.join(","))); + } + if let Some(listener_port) = self.listener_port { + overrides.push(( + "validator_node.p2p.listener_port".to_string(), + listener_port.to_string(), + )); + } + if let Some(reachability) = self.reachability { + overrides.push(( + "validator_node.p2p.reachability_mode".to_string(), + reachability.to_string(), + )); + } + if self.disable_mdns { + overrides.push(("validator_node.p2p.enable_mdns".to_string(), "false".to_string())); + } overrides } } diff --git a/applications/tari_validator_node/src/comms/broadcast.rs b/applications/tari_validator_node/src/comms/broadcast.rs deleted file mode 100644 index 6e7ba7a2b..000000000 --- a/applications/tari_validator_node/src/comms/broadcast.rs +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2022. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{ - future, - task::{Context, Poll}, -}; - -use futures::{stream, StreamExt}; -use log::warn; -use tari_comms::{ - connectivity::ConnectivityRequester, - message::OutboundMessage, - peer_manager::NodeId, - types::CommsPublicKey, - Bytes, -}; -use tari_consensus::messages::HotstuffMessage; -use tari_dan_p2p::DanMessage; -use tari_validator_node_rpc::proto; -use tonic::codegen::futures_core::future::BoxFuture; -use tower::{Service, ServiceExt}; - -use crate::comms::destination::Destination; - -const LOG_TARGET: &str = "tari::validator_node::comms::messaging"; - -#[derive(Debug, Clone)] -pub struct DanBroadcast { - connectivity: ConnectivityRequester, -} - -impl DanBroadcast { - pub fn new(connectivity: ConnectivityRequester) -> Self { - Self { connectivity } - } -} - -impl tower_layer::Layer for DanBroadcast -where - S: Service + Sync + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Service = BroadcastService; - - fn layer(&self, next_service: S) -> Self::Service { - BroadcastService { - next_service, - connectivity: self.connectivity.clone(), - } - } -} - -#[derive(Debug, Clone)] -pub struct BroadcastService { - connectivity: ConnectivityRequester, - next_service: S, -} - -impl Service<(Destination, DanMessage)> for BroadcastService -where - S: Service + Sync + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, (dest, msg): (Destination, DanMessage)) -> Self::Future { - let bytes = encode_message(&proto::network::DanMessage::from(&msg)); - log::debug!( - target: LOG_TARGET, - "📨 Tx: {} ({} bytes) to {}", - msg, - bytes.len(), - dest - ); - Box::pin(send_to_dest( - self.connectivity.clone(), - dest, - bytes, - self.next_service.clone(), - )) - } -} - -impl Service<(Destination, HotstuffMessage)> for BroadcastService -where - S: Service + Sync + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, (dest, msg): (Destination, HotstuffMessage)) -> Self::Future { - let bytes = encode_message(&proto::consensus::HotStuffMessage::from(&msg)); - log::debug!( - target: LOG_TARGET, - "📨 Tx: {} ({} bytes) to {}", - msg, - bytes.len(), - dest - ); - Box::pin(send_to_dest( - self.connectivity.clone(), - dest, - bytes, - self.next_service.clone(), - )) - } -} - -async fn send_to_dest( - mut connectivity: ConnectivityRequester, - dest: Destination, - bytes: Bytes, - next_service: S, -) -> Result<(), anyhow::Error> -where - S: Service, -{ - let mut svc = next_service.ready_oneshot().await?; - match dest { - Destination::Peer(pk) => { - svc.call(OutboundMessage::new(NodeId::from_public_key(&pk), bytes)) - .await?; - }, - Destination::Selected(pks) => { - let iter = pks - .iter() - .map(NodeId::from_public_key) - .map(|n| OutboundMessage::new(n, bytes.clone())); - svc.call_all(stream::iter(iter)) - .unordered() - .filter_map(|result| future::ready(result.err())) - .for_each(|err| { - // TODO: this should return the error back to the service - warn!("Error when sending broadcast messages: {}", err); - future::ready(()) - }) - .await; - }, - Destination::Flood => { - let conns = connectivity.get_active_connections().await?; - if conns.is_empty() { - warn!(target: LOG_TARGET, "No active connections to flood to"); - } - let iter = conns - .into_iter() - .map(|c| c.peer_node_id().clone()) - .map(|n| OutboundMessage::new(n, bytes.clone())); - - svc.call_all(stream::iter(iter)) - .unordered() - .filter_map(|result| future::ready(result.err())) - .for_each(|err| { - // TODO: this should return the error back to the service - log::warn!("Error when sending broadcast messages: {}", err); - future::ready(()) - }) - .await; - }, - } - - Ok(()) -} - -fn encode_message(msg: &T) -> Bytes { - let mut buf = Vec::with_capacity(msg.encoded_len()); - msg.encode(&mut buf).expect( - "prost::Message::encode documentation says it is infallible unless the buffer has insufficient capacity. This \ - buffer's capacity was set with encoded_len", - ); - buf.into() -} diff --git a/applications/tari_validator_node/src/comms/deserialize.rs b/applications/tari_validator_node/src/comms/deserialize.rs deleted file mode 100644 index 97396ecb9..000000000 --- a/applications/tari_validator_node/src/comms/deserialize.rs +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright 2022. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{ - marker::PhantomData, - sync::Arc, - task::{Context, Poll}, -}; - -use futures::future::BoxFuture; -use prost::Message; -use tari_comms::{message::InboundMessage, types::CommsPublicKey, PeerManager}; -use tari_comms_logging::SqliteMessageLog; -use tari_consensus::messages::HotstuffMessage; -use tari_crypto::tari_utilities::ByteArray; -use tari_dan_p2p::DanMessage; -use tari_validator_node_rpc::proto; -use tower::{Service, ServiceExt}; - -const LOG_TARGET: &str = "tari::validator_node::comms::messaging"; - -#[derive(Debug, Clone)] -pub struct DanDeserialize { - peer_manager: Arc, - logger: SqliteMessageLog, - _msg: PhantomData, -} - -impl DanDeserialize { - pub fn new(peer_manager: Arc, logger: SqliteMessageLog) -> Self { - Self { - peer_manager, - logger, - _msg: PhantomData, - } - } -} - -impl tower_layer::Layer for DanDeserialize -where - S: Service<(CommsPublicKey, TMsg), Response = (), Error = anyhow::Error> + Send + Clone + 'static, - S::Future: Send + 'static, -{ - type Service = DanDeserializeService; - - fn layer(&self, next_service: S) -> Self::Service { - DanDeserializeService { - next_service, - logger: self.logger.clone(), - peer_manager: self.peer_manager.clone(), - _msg: PhantomData, - } - } -} - -#[derive(Debug, Clone)] -pub struct DanDeserializeService { - next_service: S, - logger: SqliteMessageLog, - peer_manager: Arc, - _msg: PhantomData, -} - -impl Service for DanDeserializeService> -where - S: Service<(CommsPublicKey, DanMessage), Response = (), Error = anyhow::Error> - + Send - + Clone - + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, msg: InboundMessage) -> Self::Future { - let InboundMessage { - source_peer, mut body, .. - } = msg; - let next_service = self.next_service.clone(); - let peer_manager = self.peer_manager.clone(); - let logger = self.logger.clone(); - Box::pin(async move { - let body_len = body.len(); - let decoded_msg = proto::network::DanMessage::decode(&mut body)?; - let message_tag = decoded_msg.message_tag.clone(); - let msg = DanMessage::try_from(decoded_msg)?; - let peer = peer_manager - .find_by_node_id(&source_peer) - .await? - .ok_or_else(|| anyhow::anyhow!("Could not find peer with node id {}", source_peer))?; - - log::info!( - target: LOG_TARGET, - "📨 Rx: {} ({} bytes) from {:15}", - msg.as_type_str(), - body_len, - peer.public_key - ); - - logger.log_inbound_message(peer.public_key.as_bytes(), msg.as_type_str(), &message_tag, &msg); - let mut svc = next_service.ready_oneshot().await?; - svc.call((peer.public_key, msg)).await?; - Ok(()) - }) - } -} - -impl Service for DanDeserializeService> -where - S: Service<(CommsPublicKey, HotstuffMessage), Response = (), Error = anyhow::Error> - + Send - + Clone - + 'static, - S::Future: Send + 'static, -{ - type Error = anyhow::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, msg: InboundMessage) -> Self::Future { - let InboundMessage { - source_peer, mut body, .. - } = msg; - let next_service = self.next_service.clone(); - let peer_manager = self.peer_manager.clone(); - let logger = self.logger.clone(); - Box::pin(async move { - let body_len = body.len(); - let decoded_msg = proto::consensus::HotStuffMessage::decode(&mut body)?; - let msg = HotstuffMessage::try_from(decoded_msg)?; - let peer = peer_manager - .find_by_node_id(&source_peer) - .await? - .ok_or_else(|| anyhow::anyhow!("Could not find peer with node id {}", source_peer))?; - log::info!( - target: LOG_TARGET, - "📨 Rx: {} ({} bytes) from {:15}", - msg, - body_len, - peer.public_key - ); - - logger.log_inbound_message(peer.public_key.as_bytes(), msg.as_type_str(), "", &msg); - let mut svc = next_service.ready_oneshot().await?; - svc.call((peer.public_key, msg)).await?; - Ok(()) - }) - } -} diff --git a/applications/tari_validator_node/src/comms/destination.rs b/applications/tari_validator_node/src/comms/destination.rs deleted file mode 100644 index fe659430c..000000000 --- a/applications/tari_validator_node/src/comms/destination.rs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2022. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::fmt::{Display, Formatter}; - -#[derive(Debug, Clone)] -pub enum Destination { - Peer(TAddr), - Selected(Vec), - Flood, -} - -impl Display for Destination { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - Self::Peer(addr) => write!(f, "Peer({})", addr), - Self::Selected(addrs) => write!(f, "Selected({})", addrs.len()), - Self::Flood => write!(f, "Flood"), - } - } -} diff --git a/applications/tari_validator_node/src/comms/initializer.rs b/applications/tari_validator_node/src/comms/initializer.rs deleted file mode 100644 index fcf27cc8a..000000000 --- a/applications/tari_validator_node/src/comms/initializer.rs +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2022. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use std::{str::FromStr, sync::Arc, time::Duration}; - -use anyhow::anyhow; -use lmdb_zero::open; -use log::*; -use tari_common::configuration::Network; -use tari_comms::{ - backoff::ConstantBackoff, - peer_manager::{Peer, PeerFeatures, PeerFlags}, - pipeline, - pipeline::SinkService, - protocol::{messaging::MessagingProtocolExtension, NodeNetworkInfo}, - tor, - transports::{predicate::FalsePredicate, MemoryTransport, SocksConfig, SocksTransport, TcpWithTorTransport}, - types::CommsPublicKey, - utils::cidr::parse_cidrs, - CommsBuilder, - CommsNode, - NodeIdentity, - PeerManager, - UnspawnedCommsNode, -}; -use tari_comms_logging::SqliteMessageLog; -use tari_consensus::messages::HotstuffMessage; -use tari_dan_p2p::{DanMessage, TARI_DAN_CONSENSUS_MSG_ID, TARI_DAN_MSG_PROTOCOL_ID}; -use tari_p2p::{ - initialization::CommsInitializationError, - peer_seeds::SeedPeer, - P2pConfig, - PeerSeedsConfig, - TorTransportConfig, - TransportConfig, - TransportType, - MAJOR_NETWORK_VERSION, - MINOR_NETWORK_VERSION, -}; -use tari_shutdown::ShutdownSignal; -use tari_storage::{ - lmdb_store::{LMDBBuilder, LMDBConfig}, - LMDBWrapper, -}; -use tokio::sync::{broadcast, mpsc}; -use tower::ServiceBuilder; - -const LOG_TARGET: &str = "tari::dan::comms::initializer"; - -use crate::{ - comms::{broadcast::DanBroadcast, deserialize::DanDeserialize, destination::Destination, logger::LoggerService}, - ApplicationConfig, -}; - -pub async fn initialize( - node_identity: Arc, - config: &ApplicationConfig, - shutdown_signal: ShutdownSignal, -) -> Result<(UnspawnedCommsNode, MessageChannels), anyhow::Error> { - debug!(target: LOG_TARGET, "Initializing DAN comms"); - let seed_peers = &config.peer_seeds; - let mut config = config.validator_node.p2p.clone(); - - let mut comms_builder = CommsBuilder::new() - .with_shutdown_signal(shutdown_signal) - .with_node_identity(node_identity) - .with_node_info(NodeNetworkInfo { - major_version: MAJOR_NETWORK_VERSION, - minor_version: MINOR_NETWORK_VERSION, - network_byte: Network::Esmeralda.as_byte(), // TODO: DAN has its own network byte? - user_agent: config.user_agent.clone(), - }); - - if config.allow_test_addresses || config.dht.peer_validator_config.allow_test_addresses { - // The default is false, so ensure that both settings are true in this case - config.allow_test_addresses = true; - config.dht.peer_validator_config.allow_test_addresses = true; - comms_builder = comms_builder.allow_test_addresses(); - } - - let (comms, message_channel) = configure_comms(&config, comms_builder)?; - - // let node_identity = comms.node_identity(); - - // TODO: DNS seeds - // let peers = match Self::try_resolve_dns_seeds(&self.seed_config).await { - // Ok(peers) => peers, - // Err(err) => { - // warn!(target: LOG_TARGET, "Failed to resolve DNS seeds: {}", err); - // Vec::new() - // }, - // }; - // add_seed_peers(&peer_manager, &node_identity, peers).await?; - // - let peer_manager = comms.peer_manager(); - let node_identity = comms.node_identity(); - add_seed_peers(&peer_manager, &node_identity, seed_peers).await?; - - debug!(target: LOG_TARGET, "DAN comms Initialized"); - Ok((comms, message_channel)) -} - -pub type MessageChannels = ( - mpsc::Sender<(Destination, DanMessage)>, - mpsc::Receiver<(CommsPublicKey, DanMessage)>, - mpsc::Sender<(Destination, HotstuffMessage)>, - mpsc::Receiver<(CommsPublicKey, HotstuffMessage)>, -); - -fn configure_comms( - config: &P2pConfig, - builder: CommsBuilder, -) -> Result<(UnspawnedCommsNode, MessageChannels), anyhow::Error> { - let datastore = LMDBBuilder::new() - .set_path(&config.datastore_path) - .set_env_flags(open::NOLOCK) - .set_env_config(LMDBConfig::default()) - .set_max_number_of_databases(1) - .add_database(&config.peer_database_name, lmdb_zero::db::CREATE) - .build() - .unwrap(); - let peer_database = datastore.get_handle(&config.peer_database_name).unwrap(); - let peer_database = LMDBWrapper::new(Arc::new(peer_database)); - - let listener_liveness_allowlist_cidrs = - parse_cidrs(&config.listener_liveness_allowlist_cidrs).map_err(|e| anyhow!("{}", e))?; - - let builder = builder - .set_liveness_check(Some(Duration::from_secs(10))) - .with_listener_liveness_max_sessions(config.listener_liveness_max_sessions) - .with_listener_liveness_allowlist_cidrs(listener_liveness_allowlist_cidrs) - .with_dial_backoff(ConstantBackoff::new(Duration::from_millis(500))) - .with_peer_storage(peer_database, None); - // .with_peer_storage(peer_database, Some(file_lock)); - - let mut comms = match config.auxiliary_tcp_listener_address { - Some(ref addr) => builder.with_auxiliary_tcp_listener_address(addr.clone()).build()?, - None => builder.build()?, - }; - - // Hook up messaging middlewares (currently none) - let (inbound_msg_tx, inbound_msg_rx) = mpsc::channel(10); - let (outbound_msg_tx, outbound_msg_rx) = mpsc::channel(10); - let connectivity = comms.connectivity(); - let logger = SqliteMessageLog::new(&config.datastore_path); - let dan_messaging_pipeline = pipeline::Builder::new() - .with_outbound_pipeline(outbound_msg_rx, { - let logger = logger.clone(); - move |sink| { - ServiceBuilder::new() - .layer(LoggerService::>::new(logger.clone())) - .layer(DanBroadcast::new(connectivity)) - .service(sink) - } - }) - .max_concurrent_inbound_tasks(3) - .max_concurrent_outbound_tasks(3) - .with_inbound_pipeline( - ServiceBuilder::new() - .layer(DanDeserialize::new(comms.peer_manager(), logger.clone())) - .service(SinkService::new(inbound_msg_tx)), - ) - .build(); - - // TODO: messaging events should be optional - let (messaging_events_sender, _) = broadcast::channel(1); - comms = comms.add_protocol_extension(MessagingProtocolExtension::new( - TARI_DAN_MSG_PROTOCOL_ID.clone(), - messaging_events_sender, - dan_messaging_pipeline, - )); - - let connectivity = comms.connectivity(); - let (inbound_hs_tx, inbound_hs_rx) = mpsc::channel(10); - let (outbound_hs_tx, outbound_hs_rx) = mpsc::channel(10); - let consensus_messaging_pipeline = pipeline::Builder::new() - .with_outbound_pipeline(outbound_hs_rx, { - let logger = logger.clone(); - move |sink| { - ServiceBuilder::new() - .layer(LoggerService::>::new(logger)) - .layer(DanBroadcast::new(connectivity)) - .service(sink) - } - }) - .max_concurrent_inbound_tasks(3) - .max_concurrent_outbound_tasks(3) - .with_inbound_pipeline( - ServiceBuilder::new() - .layer(DanDeserialize::new(comms.peer_manager(), logger)) - .service(SinkService::new(inbound_hs_tx)), - ) - .build(); - - let (messaging_events_sender, _) = broadcast::channel(1); - comms = comms.add_protocol_extension(MessagingProtocolExtension::new( - TARI_DAN_CONSENSUS_MSG_ID.clone(), - messaging_events_sender, - consensus_messaging_pipeline, - )); - - Ok((comms, (outbound_msg_tx, inbound_msg_rx, outbound_hs_tx, inbound_hs_rx))) -} - -async fn add_seed_peers( - peer_manager: &PeerManager, - node_identity: &NodeIdentity, - config: &PeerSeedsConfig, -) -> Result<(), anyhow::Error> { - let peers = config - .peer_seeds - .iter() - .map(|s| SeedPeer::from_str(s).map(Peer::from)) - .collect::, _>>()?; - - for mut peer in peers { - if &peer.public_key == node_identity.public_key() { - continue; - } - peer.add_flags(PeerFlags::SEED); - peer.set_features(PeerFeatures::COMMUNICATION_NODE); - - // debug!(target: LOG_TARGET, "Adding seed peer [{}]", peer); - peer_manager.add_peer(peer).await?; - } - Ok(()) -} - -pub async fn spawn_comms_using_transport( - comms: UnspawnedCommsNode, - transport_config: TransportConfig, -) -> Result { - let comms = match transport_config.transport_type { - TransportType::Memory => { - debug!(target: LOG_TARGET, "Building in-memory comms stack"); - comms - .with_listener_address(transport_config.memory.listener_address.clone()) - .spawn_with_transport(MemoryTransport) - .await? - }, - TransportType::Tcp => { - let config = transport_config.tcp; - debug!( - target: LOG_TARGET, - "Building TCP comms stack{}", - config - .tor_socks_address - .as_ref() - .map(|_| " with Tor support") - .unwrap_or("") - ); - let mut transport = TcpWithTorTransport::new(); - if let Some(addr) = config.tor_socks_address { - transport.set_tor_socks_proxy(SocksConfig { - proxy_address: addr, - authentication: config.tor_socks_auth.into(), - proxy_bypass_predicate: Arc::new(FalsePredicate::new()), - }); - } - comms - .with_listener_address(config.listener_address) - .spawn_with_transport(transport) - .await? - }, - TransportType::Tor => { - let tor_config = transport_config.tor; - debug!(target: LOG_TARGET, "Building TOR comms stack ({:?})", tor_config); - let mut hidden_service_ctl = initialize_hidden_service(tor_config).await?; - // Set the listener address to be the address (usually local) to which tor will forward all traffic - let transport = hidden_service_ctl.initialize_transport().await?; - debug!(target: LOG_TARGET, "Comms and DHT configured"); - comms - .with_listener_address(hidden_service_ctl.proxied_address()) - .with_hidden_service_controller(hidden_service_ctl) - .spawn_with_transport(transport) - .await? - }, - TransportType::Socks5 => { - debug!(target: LOG_TARGET, "Building SOCKS5 comms stack"); - let transport = SocksTransport::new(transport_config.socks.into()); - comms - .with_listener_address(transport_config.tcp.listener_address) - .spawn_with_transport(transport) - .await? - }, - }; - - Ok(comms) -} - -async fn initialize_hidden_service( - mut config: TorTransportConfig, -) -> Result { - let mut builder = tor::HiddenServiceBuilder::new() - .with_hs_flags(tor::HsFlags::DETACH) - .with_port_mapping(config.to_port_mapping()?) - .with_socks_authentication(config.to_socks_auth()) - .with_control_server_auth(config.to_control_auth()?) - .with_socks_address_override(config.socks_address_override) - .with_control_server_address(config.control_address) - .with_bypass_proxy_addresses(config.proxy_bypass_addresses.into()); - - if config.proxy_bypass_for_outbound_tcp { - builder = builder.bypass_tor_for_tcp_addresses(); - } - - if let Some(identity) = config.identity.take() { - builder = builder.with_tor_identity(identity); - } - - let hidden_svc_ctl = builder.build()?; - Ok(hidden_svc_ctl) -} diff --git a/applications/tari_validator_node/src/comms/logger.rs b/applications/tari_validator_node/src/comms/logger.rs deleted file mode 100644 index e6e89430e..000000000 --- a/applications/tari_validator_node/src/comms/logger.rs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2023 The Tari Project -// SPDX-License-Identifier: BSD-3-Clause - -use std::{ - fmt::Display, - marker::PhantomData, - task::{Context, Poll}, -}; - -use tari_comms::types::CommsPublicKey; -use tari_comms_logging::SqliteMessageLog; -use tari_crypto::tari_utilities::ByteArray; -use tonic::codegen::futures_core::future::BoxFuture; -use tower::{Service, ServiceExt}; - -use crate::comms::destination::Destination; - -#[derive(Debug, Clone)] -pub struct LoggerService { - logger: SqliteMessageLog, - _msg: PhantomData, -} - -impl LoggerService { - pub fn new(logger: SqliteMessageLog) -> Self { - Self { - logger, - _msg: PhantomData, - } - } -} - -impl tower_layer::Layer for LoggerService -where - S: Service<(Destination, TMsg), Response = ()> + Sync + Send + Clone + 'static, - S::Future: Send + 'static, - TMsg: serde::Serialize + Display + Send + Sync + 'static, -{ - type Service = LoggerServiceImpl; - - fn layer(&self, next_service: S) -> Self::Service { - LoggerServiceImpl { - next_service, - logger: self.logger.clone(), - } - } -} - -#[derive(Debug, Clone)] -pub struct LoggerServiceImpl { - logger: SqliteMessageLog, - next_service: S, -} - -impl Service<(Destination, TMsg)> for LoggerServiceImpl -where - S: Service<(Destination, TMsg), Response = ()> + Sync + Send + Clone + 'static, - S::Future: Send + 'static, - TMsg: serde::Serialize + Display + Send + Sync + 'static, -{ - type Error = S::Error; - type Future = BoxFuture<'static, Result>; - type Response = (); - - fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { - Poll::Ready(Ok(())) - } - - fn call(&mut self, (dest, msg): (Destination, TMsg)) -> Self::Future { - let next_service = self.next_service.clone(); - let logger = self.logger.clone(); - Box::pin(async move { - if logger.is_enabled() { - match &dest { - Destination::Peer(pk) => { - logger.log_outbound_message("Peer", pk.as_bytes(), "", "", &msg); - }, - Destination::Selected(pks) => { - for pk in pks { - logger.log_outbound_message("Selected", pk.as_bytes(), "", "", &msg); - } - }, - Destination::Flood => { - logger.log_outbound_message("Flood", b"", "", "", &msg); - }, - } - } - - let mut svc = next_service.ready_oneshot().await?; - svc.call((dest, msg)).await - }) - } -} diff --git a/applications/tari_validator_node/src/config.rs b/applications/tari_validator_node/src/config.rs index 3a56183f5..1089f2713 100644 --- a/applications/tari_validator_node/src/config.rs +++ b/applications/tari_validator_node/src/config.rs @@ -27,6 +27,7 @@ use std::{ }; use config::Config; +use libp2p::Multiaddr; use serde::{Deserialize, Serialize}; use tari_common::{ configuration::{serializers, CommonConfig, Network}, @@ -34,10 +35,11 @@ use tari_common::{ DefaultConfigLoader, SubConfigPath, }; -use tari_comms::multiaddr::Multiaddr; use tari_crypto::ristretto::RistrettoPublicKey; -use tari_dan_app_utilities::template_manager::implementation::TemplateConfig; -use tari_p2p::{P2pConfig, PeerSeedsConfig}; +use tari_dan_app_utilities::{ + config::{P2pConfig, PeerSeedsConfig, RpcConfig}, + template_manager::implementation::TemplateConfig, +}; #[derive(Debug, Clone)] pub struct ApplicationConfig { @@ -68,10 +70,8 @@ pub struct ValidatorNodeConfig { pub shard_key_file: PathBuf, /// A path to the file that stores your node identity and secret key pub identity_file: PathBuf, - /// A path to the file that stores the tor hidden service private key, if using the tor transport - pub tor_identity_file: PathBuf, - /// The node's publicly-accessible hostname - pub public_address: Option, + //// The node's publicly-accessible hostname + // pub public_address: Option, /// The Tari base node's GRPC address pub base_node_grpc_address: Option, /// The Tari console wallet's GRPC address @@ -85,6 +85,8 @@ pub struct ValidatorNodeConfig { pub data_dir: PathBuf, /// The p2p configuration settings pub p2p: P2pConfig, + /// P2P RPC configuration + pub rpc: RpcConfig, /// GRPC address of the validator node application pub grpc_address: Option, /// JSON-RPC address of the validator node application @@ -118,35 +120,25 @@ impl ValidatorNodeConfig { if !self.identity_file.is_absolute() { self.identity_file = base_path.as_ref().join(&self.identity_file); } - if !self.tor_identity_file.is_absolute() { - self.tor_identity_file = base_path.as_ref().join(&self.tor_identity_file); - } if !self.data_dir.is_absolute() { self.data_dir = base_path.as_ref().join(&self.data_dir); } - self.p2p.set_base_path(base_path); } } impl Default for ValidatorNodeConfig { fn default() -> Self { - let p2p = P2pConfig { - datastore_path: PathBuf::from("data/peer_db"), - ..Default::default() - }; - Self { override_from: None, shard_key_file: PathBuf::from("shard_key.json"), identity_file: PathBuf::from("validator_node_id.json"), - tor_identity_file: PathBuf::from("validator_node_tor_id.json"), - public_address: None, base_node_grpc_address: None, wallet_grpc_address: None, scan_base_layer: true, base_layer_scanning_interval: Duration::from_secs(10), data_dir: PathBuf::from("data/validator_node"), - p2p, + p2p: P2pConfig::default(), + rpc: RpcConfig::default(), grpc_address: Some("/ip4/127.0.0.1/tcp/18144".parse().unwrap()), json_rpc_address: Some("127.0.0.1:18200".parse().unwrap()), ui_connect_address: None, diff --git a/applications/tari_validator_node/src/consensus/mod.rs b/applications/tari_validator_node/src/consensus/mod.rs index 2d9c8004c..25d0511ff 100644 --- a/applications/tari_validator_node/src/consensus/mod.rs +++ b/applications/tari_validator_node/src/consensus/mod.rs @@ -1,10 +1,6 @@ // Copyright 2023 The Tari Project // SPDX-License-Identifier: BSD-3-Clause -use std::sync::Arc; - -use tari_common_types::types::PublicKey; -use tari_comms::{types::CommsPublicKey, NodeIdentity}; use tari_comms_rpc_state_sync::CommsRpcStateSyncManager; use tari_consensus::{ hotstuff::{ConsensusWorker, ConsensusWorkerContext, HotstuffWorker}, @@ -17,7 +13,7 @@ use tari_epoch_manager::base_layer::EpochManagerHandle; use tari_shutdown::ShutdownSignal; use tari_state_store_sqlite::SqliteStateStore; use tari_transaction::{Transaction, TransactionId}; -use tari_validator_node_rpc::client::TariCommsValidatorNodeClientFactory; +use tari_validator_node_rpc::client::TariValidatorNodeRpcClientFactory; use tokio::{ sync::{broadcast, mpsc, watch}, task::JoinHandle, @@ -31,7 +27,6 @@ use crate::{ state_manager::TariStateManager, }, event_subscription::EventSubscription, - p2p::services::messaging::OutboundMessaging, }; mod handle; @@ -41,15 +36,20 @@ mod spec; mod state_manager; pub use handle::*; +use sqlite_message_logger::SqliteMessageLogger; +use tari_dan_app_utilities::keypair::RistrettoKeypair; +use tari_dan_common_types::PeerAddress; + +use crate::p2p::services::message_dispatcher::OutboundMessaging; pub async fn spawn( - store: SqliteStateStore, - node_identity: Arc, - epoch_manager: EpochManagerHandle, + store: SqliteStateStore, + keypair: RistrettoKeypair, + epoch_manager: EpochManagerHandle, rx_new_transactions: mpsc::Receiver, - rx_hs_message: mpsc::Receiver<(CommsPublicKey, HotstuffMessage)>, - outbound_messaging: OutboundMessaging, - client_factory: TariCommsValidatorNodeClientFactory, + rx_hs_message: mpsc::Receiver<(PeerAddress, HotstuffMessage)>, + outbound_messaging: OutboundMessaging, + client_factory: TariValidatorNodeRpcClientFactory, foreign_receive_counter: ForeignReceiveCounters, shutdown_signal: ShutdownSignal, ) -> ( @@ -61,8 +61,8 @@ pub async fn spawn( let (tx_leader, rx_leader) = mpsc::channel(10); let (tx_mempool, rx_mempool) = mpsc::unbounded_channel(); - let validator_addr = node_identity.public_key().clone(); - let signing_service = TariSignatureService::new(node_identity); + let validator_addr = PeerAddress::from(keypair.public_key().clone()); + let signing_service = TariSignatureService::new(keypair); let leader_strategy = RoundRobinLeaderStrategy::new(); let transaction_pool = TransactionPool::new(); let state_manager = TariStateManager::new(); @@ -111,9 +111,9 @@ pub async fn spawn( } struct ConsensusMessageWorker { - rx_broadcast: mpsc::Receiver<(Committee, HotstuffMessage)>, - rx_leader: mpsc::Receiver<(CommsPublicKey, HotstuffMessage)>, - outbound_messaging: OutboundMessaging, + rx_broadcast: mpsc::Receiver<(Committee, HotstuffMessage)>, + rx_leader: mpsc::Receiver<(PeerAddress, HotstuffMessage)>, + outbound_messaging: OutboundMessaging, } impl ConsensusMessageWorker { diff --git a/applications/tari_validator_node/src/consensus/signature_service.rs b/applications/tari_validator_node/src/consensus/signature_service.rs index 0bdb804f5..87bcb2937 100644 --- a/applications/tari_validator_node/src/consensus/signature_service.rs +++ b/applications/tari_validator_node/src/consensus/signature_service.rs @@ -1,39 +1,37 @@ // Copyright 2023 The Tari Project // SPDX-License-Identifier: BSD-3-Clause -use std::sync::Arc; - use rand::rngs::OsRng; use tari_common_types::types::{FixedHash, PublicKey}; -use tari_comms::NodeIdentity; use tari_consensus::traits::{ValidatorSignatureService, VoteSignatureService}; +use tari_dan_app_utilities::keypair::RistrettoKeypair; use tari_dan_storage::consensus_models::{BlockId, QuorumDecision, ValidatorSchnorrSignature, ValidatorSignature}; #[derive(Debug, Clone)] pub struct TariSignatureService { - node_identity: Arc, + keypair: RistrettoKeypair, } impl TariSignatureService { - pub fn new(node_identity: Arc) -> Self { - Self { node_identity } + pub fn new(keypair: RistrettoKeypair) -> Self { + Self { keypair } } } -impl ValidatorSignatureService for TariSignatureService { +impl ValidatorSignatureService for TariSignatureService { fn sign>(&self, message: M) -> ValidatorSchnorrSignature { - ValidatorSchnorrSignature::sign(self.node_identity.secret_key(), message, &mut OsRng).unwrap() + ValidatorSchnorrSignature::sign(self.keypair.secret_key(), message, &mut OsRng).unwrap() } fn public_key(&self) -> &PublicKey { - self.node_identity.public_key() + self.keypair.public_key() } } -impl VoteSignatureService for TariSignatureService { +impl VoteSignatureService for TariSignatureService { fn verify( &self, - signature: &ValidatorSignature, + signature: &ValidatorSignature, leaf_hash: &FixedHash, block_id: &BlockId, decision: &QuorumDecision, diff --git a/applications/tari_validator_node/src/consensus/spec.rs b/applications/tari_validator_node/src/consensus/spec.rs index 4e4c1a51b..dda0f624f 100644 --- a/applications/tari_validator_node/src/consensus/spec.rs +++ b/applications/tari_validator_node/src/consensus/spec.rs @@ -1,9 +1,9 @@ // Copyright 2023 The Tari Project // SPDX-License-Identifier: BSD-3-Clause -use tari_comms::types::CommsPublicKey; use tari_comms_rpc_state_sync::CommsRpcStateSyncManager; use tari_consensus::traits::ConsensusSpec; +use tari_dan_common_types::PeerAddress; use tari_epoch_manager::base_layer::EpochManagerHandle; use tari_state_store_sqlite::SqliteStateStore; @@ -17,8 +17,8 @@ use crate::consensus::{ pub struct TariConsensusSpec; impl ConsensusSpec for TariConsensusSpec { - type Addr = CommsPublicKey; - type EpochManager = EpochManagerHandle; + type Addr = PeerAddress; + type EpochManager = EpochManagerHandle; type LeaderStrategy = RoundRobinLeaderStrategy; type StateManager = TariStateManager; type StateStore = SqliteStateStore; diff --git a/applications/tari_validator_node/src/consensus/state_manager.rs b/applications/tari_validator_node/src/consensus/state_manager.rs index d0deeffb7..97b810869 100644 --- a/applications/tari_validator_node/src/consensus/state_manager.rs +++ b/applications/tari_validator_node/src/consensus/state_manager.rs @@ -23,7 +23,7 @@ impl StateManager for TariStateManager { fn commit_transaction( &self, tx: &mut TStateStore::WriteTransaction<'_>, - block: &Block, + block: &Block, transaction: &ExecutedTransaction, local_committee_shard: &CommitteeShard, ) -> Result<(), Self::Error> { diff --git a/applications/tari_validator_node/src/dan_node.rs b/applications/tari_validator_node/src/dan_node.rs index 168d74700..c2ea956fb 100644 --- a/applications/tari_validator_node/src/dan_node.rs +++ b/applications/tari_validator_node/src/dan_node.rs @@ -20,17 +20,12 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::time::Duration; - use log::*; -use tari_comms::{connection_manager::LivenessStatus, connectivity::ConnectivityEvent, peer_manager::NodeId}; use tari_consensus::hotstuff::HotstuffEvent; use tari_dan_storage::{consensus_models::Block, StateStore}; -use tari_epoch_manager::{EpochManagerError, EpochManagerReader}; use tari_shutdown::ShutdownSignal; -use tokio::{time, time::MissedTickBehavior}; -use crate::{p2p::services::networking::NetworkingService, Services}; +use crate::Services; const LOG_TARGET: &str = "tari::validator_node::dan_node"; @@ -46,20 +41,9 @@ impl DanNode { pub async fn start(mut self, mut shutdown: ShutdownSignal) -> Result<(), anyhow::Error> { let mut hotstuff_events = self.services.consensus_handle.subscribe_to_hotstuff_events(); - let mut connectivity_events = self.services.comms.connectivity().get_event_subscription(); - - if let Err(err) = self.dial_local_shard_peers().await { - error!(target: LOG_TARGET, "Failed to dial local shard peers: {}", err); - } - - let status = self.services.comms.connectivity().get_connectivity_status().await?; - if status.is_online() { - self.services.networking.announce().await?; - } - - let mut current_inbound_status = self.services.comms.liveness_status(); - let mut tick = time::interval(Duration::from_secs(10)); - tick.set_missed_tick_behavior(MissedTickBehavior::Skip); + // if let Err(err) = self.dial_local_shard_peers().await { + // error!(target: LOG_TARGET, "Failed to dial local shard peers: {}", err); + // } loop { tokio::select! { @@ -68,14 +52,6 @@ impl DanNode { break; }, - Ok(event) = connectivity_events.recv() => { - if let ConnectivityEvent::ConnectivityStateOnline(_) = event { - // We're back online, announce - if let Err(err) = self.services.networking.announce().await { - error!(target: LOG_TARGET, "Failed to announce: {}", err); - } - } - }, Ok(event) = hotstuff_events.recv() => if let Err(err) = self.handle_hotstuff_event(event).await{ error!(target: LOG_TARGET, "Error handling hotstuff event: {}", err); @@ -86,19 +62,6 @@ impl DanNode { return Err(err); } - _ = tick.tick() => { - let status = self.services.comms.liveness_status() ; - match status { - LivenessStatus::Disabled | LivenessStatus::Checking => {}, - LivenessStatus::Unreachable => { warn!(target: LOG_TARGET, "🔌 Node is unreachable"); } - LivenessStatus::Live(t) => { - if !matches!(current_inbound_status, LivenessStatus::Live(_)) { - info!(target: LOG_TARGET, "⚡️ Node is reachable (ping {:.2?})", t); - } - } - } - current_inbound_status = status; - } } } @@ -136,47 +99,44 @@ impl DanNode { Ok(()) } - async fn dial_local_shard_peers(&mut self) -> Result<(), anyhow::Error> { - let epoch = self.services.epoch_manager.current_epoch().await?; - let res = self - .services - .epoch_manager - .get_validator_node(epoch, self.services.comms.node_identity().public_key()) - .await; - - let shard_id = match res { - Ok(vn) => vn.shard_key, - Err(EpochManagerError::ValidatorNodeNotRegistered { address, epoch }) => { - info!(target: LOG_TARGET, "Validator node {address} not registered for current epoch {epoch}"); - return Ok(()); - }, - Err(EpochManagerError::BaseLayerConsensusConstantsNotSet) => { - info!(target: LOG_TARGET, "Epoch manager has not synced with base layer yet"); - return Ok(()); - }, - Err(err) => { - return Err(err.into()); - }, - }; - - let local_shard_peers = self.services.epoch_manager.get_committee(epoch, shard_id).await?; - info!( - target: LOG_TARGET, - "Dialing {} local shard peers", - local_shard_peers.members.len() - ); - - self.services - .comms - .connectivity() - .request_many_dials( - local_shard_peers - .members - .into_iter() - .filter(|pk| pk != self.services.comms.node_identity().public_key()) - .map(|pk| NodeId::from_public_key(&pk)), - ) - .await?; - Ok(()) - } + // async fn dial_local_shard_peers(&mut self) -> Result<(), anyhow::Error> { + // let epoch = self.services.epoch_manager.current_epoch().await?; + // let res = self + // .services + // .epoch_manager + // .get_validator_node(epoch, &self.services.networking.local_peer_id().into()) + // .await; + // + // let shard_id = match res { + // Ok(vn) => vn.shard_key, + // Err(EpochManagerError::ValidatorNodeNotRegistered { address, epoch }) => { + // info!(target: LOG_TARGET, "Validator node {address} not registered for current epoch {epoch}"); + // return Ok(()); + // }, + // Err(EpochManagerError::BaseLayerConsensusConstantsNotSet) => { + // info!(target: LOG_TARGET, "Epoch manager has not synced with base layer yet"); + // return Ok(()); + // }, + // Err(err) => { + // return Err(err.into()); + // }, + // }; + // + // let local_shard_peers = self.services.epoch_manager.get_committee(epoch, shard_id).await?; + // info!( + // target: LOG_TARGET, + // "Dialing {} local shard peers", + // local_shard_peers.members.len() + // ); + // let local_peer_id = *self.services.networking.local_peer_id(); + // let local_shard_peers = local_shard_peers.addresses().filter(|addr| **addr != local_peer_id); + // + // for peer in local_shard_peers { + // if let Err(err) = self.services.networking.dial_peer(peer.to_peer_id()).await { + // debug!(target: LOG_TARGET, "Failed to dial peer: {}", err); + // } + // } + // + // Ok(()) + // } } diff --git a/applications/tari_validator_node/src/dry_run_transaction_processor.rs b/applications/tari_validator_node/src/dry_run_transaction_processor.rs index e4c302166..57c9c2142 100644 --- a/applications/tari_validator_node/src/dry_run_transaction_processor.rs +++ b/applications/tari_validator_node/src/dry_run_transaction_processor.rs @@ -21,13 +21,12 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use log::info; -use tari_common_types::types::PublicKey; -use tari_comms::protocol::rpc::RpcStatus; use tari_dan_app_utilities::{ substate_file_cache::SubstateFileCache, template_manager::implementation::TemplateManager, transaction_executor::{TariDanTransactionProcessor, TransactionExecutor, TransactionProcessorError}, }; +use tari_dan_common_types::PeerAddress; use tari_dan_engine::{ bootstrap_state, state_store::{memory::MemoryStateStore, AtomicDb, StateStoreError, StateWriter}, @@ -35,10 +34,11 @@ use tari_dan_engine::{ use tari_dan_storage::StorageError; use tari_engine_types::commit_result::ExecuteResult; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerError, EpochManagerReader}; +use tari_rpc_framework::RpcStatus; use tari_state_store_sqlite::SqliteStateStore; use tari_transaction::Transaction; use tari_validator_node_client::ValidatorNodeClientError; -use tari_validator_node_rpc::client::TariCommsValidatorNodeClientFactory; +use tari_validator_node_rpc::client::TariValidatorNodeRpcClientFactory; use thiserror::Error; use tokio::task; @@ -73,23 +73,23 @@ pub enum DryRunTransactionProcessorError { #[derive(Clone, Debug)] pub struct DryRunTransactionProcessor { substate_resolver: TariSubstateResolver< - SqliteStateStore, - EpochManagerHandle, - TariCommsValidatorNodeClientFactory, + SqliteStateStore, + EpochManagerHandle, + TariValidatorNodeRpcClientFactory, SubstateFileCache, >, - epoch_manager: EpochManagerHandle, - payload_processor: TariDanTransactionProcessor, + epoch_manager: EpochManagerHandle, + payload_processor: TariDanTransactionProcessor>, } impl DryRunTransactionProcessor { pub fn new( - epoch_manager: EpochManagerHandle, - payload_processor: TariDanTransactionProcessor, + epoch_manager: EpochManagerHandle, + payload_processor: TariDanTransactionProcessor>, substate_resolver: TariSubstateResolver< - SqliteStateStore, - EpochManagerHandle, - TariCommsValidatorNodeClientFactory, + SqliteStateStore, + EpochManagerHandle, + TariValidatorNodeRpcClientFactory, SubstateFileCache, >, ) -> Self { diff --git a/applications/tari_validator_node/src/grpc/base_layer_wallet/client.rs b/applications/tari_validator_node/src/grpc/base_layer_wallet/client.rs index 6f58a44bc..d6c908543 100644 --- a/applications/tari_validator_node/src/grpc/base_layer_wallet/client.rs +++ b/applications/tari_validator_node/src/grpc/base_layer_wallet/client.rs @@ -37,9 +37,9 @@ use minotari_app_grpc::tari_rpc::{ }; use minotari_wallet_grpc_client::Client as GrpcWallet; use tari_common_types::types::PublicKey; -use tari_comms::NodeIdentity; use tari_core::transactions::transaction_components::ValidatorNodeSignature; use tari_crypto::tari_utilities::ByteArray; +use tari_dan_app_utilities::keypair::RistrettoKeypair; use tari_validator_node_client::types::TemplateRegistrationRequest; use crate::{grpc::base_layer_wallet::WalletGrpcError, template_registration_signing::sign_template_registration}; @@ -78,13 +78,13 @@ impl GrpcWalletClient { pub async fn register_validator_node( &mut self, - node_identity: &NodeIdentity, + keypair: &RistrettoKeypair, fee_claim_public_key: &PublicKey, ) -> Result { let inner = self.connection().await?; - let signature = ValidatorNodeSignature::sign(node_identity.secret_key(), fee_claim_public_key, b""); + let signature = ValidatorNodeSignature::sign(keypair.secret_key(), fee_claim_public_key, b""); let request = RegisterValidatorNodeRequest { - validator_node_public_key: node_identity.public_key().to_vec(), + validator_node_public_key: keypair.public_key().to_vec(), validator_node_signature: Some(signature.signature().into()), validator_node_claim_public_key: fee_claim_public_key.to_vec(), fee_per_gram: 1, @@ -101,14 +101,14 @@ impl GrpcWalletClient { pub async fn register_template( &mut self, - node_identity: &NodeIdentity, + keypair: &RistrettoKeypair, data: TemplateRegistrationRequest, ) -> Result { let inner = self.connection().await?; - let signature = sign_template_registration(node_identity.secret_key(), data.binary_sha.to_vec()); + let signature = sign_template_registration(keypair.secret_key(), data.binary_sha.to_vec()); let request = CreateTemplateRegistrationRequest { template_registration: Some(TemplateRegistration { - author_public_key: node_identity.public_key().to_vec(), + author_public_key: keypair.public_key().to_vec(), author_signature: Some(signature.into()), template_name: data.template_name, template_version: data.template_version.into(), diff --git a/applications/tari_validator_node/src/json_rpc/handlers.rs b/applications/tari_validator_node/src/json_rpc/handlers.rs index df8353ef3..c4aceab20 100644 --- a/applications/tari_validator_node/src/json_rpc/handlers.rs +++ b/applications/tari_validator_node/src/json_rpc/handlers.rs @@ -20,8 +20,6 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::sync::Arc; - use axum_jrpc::{ error::{JsonRpcError, JsonRpcErrorReason}, JrpcResult, @@ -29,70 +27,67 @@ use axum_jrpc::{ JsonRpcResponse, }; use indexmap::IndexMap; +use libp2p::swarm::dial_opts::{DialOpts, PeerCondition}; use log::*; -use serde::Serialize; use serde_json::{self as json, json}; use tari_base_node_client::{grpc::GrpcBaseNodeClient, BaseNodeClient}; -use tari_common_types::types::PublicKey; -use tari_comms::{ - multiaddr::Multiaddr, - peer_manager::{NodeId, PeerFeatures}, - types::CommsPublicKey, - CommsNode, - NodeIdentity, -}; -use tari_comms_logging::SqliteMessageLog; -use tari_crypto::tari_utilities::hex::Hex; -use tari_dan_app_utilities::template_manager::interface::TemplateManagerHandle; -use tari_dan_common_types::{optional::Optional, ShardId}; +use tari_dan_app_utilities::{keypair::RistrettoKeypair, template_manager::interface::TemplateManagerHandle}; +use tari_dan_common_types::{optional::Optional, PeerAddress, ShardId}; use tari_dan_storage::{ consensus_models::{Block, ExecutedTransaction, LeafBlock, QuorumDecision, SubstateRecord, TransactionRecord}, Ordering, StateStore, }; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; +use tari_networking::{NetworkingHandle, NetworkingService}; use tari_state_store_sqlite::SqliteStateStore; -use tari_validator_node_client::types::{ - AddPeerRequest, - AddPeerResponse, - CommitteeShardInfo, - DryRunTransactionFinalizeResult, - GetBlockRequest, - GetBlockResponse, - GetBlocksCountResponse, - GetCommitteeRequest, - GetEpochManagerStatsResponse, - GetIdentityResponse, - GetNetworkCommitteeResponse, - GetRecentTransactionsResponse, - GetShardKey, - GetStateRequest, - GetStateResponse, - GetSubstateRequest, - GetSubstateResponse, - GetSubstatesByTransactionRequest, - GetSubstatesByTransactionResponse, - GetTemplateRequest, - GetTemplateResponse, - GetTemplatesRequest, - GetTemplatesResponse, - GetTransactionRequest, - GetTransactionResponse, - GetTransactionResultRequest, - GetTransactionResultResponse, - GetValidatorFeesRequest, - GetValidatorFeesResponse, - ListBlocksRequest, - ListBlocksResponse, - RegisterValidatorNodeRequest, - RegisterValidatorNodeResponse, - SubmitTransactionRequest, - SubmitTransactionResponse, - SubstateStatus, - TemplateMetadata, - TemplateRegistrationRequest, - TemplateRegistrationResponse, +use tari_validator_node_client::{ + types, + types::{ + AddPeerRequest, + AddPeerResponse, + CommitteeShardInfo, + ConnectionDirection, + DryRunTransactionFinalizeResult, + GetBlockRequest, + GetBlockResponse, + GetBlocksCountResponse, + GetCommitteeRequest, + GetConnectionsResponse, + GetEpochManagerStatsResponse, + GetIdentityResponse, + GetNetworkCommitteeResponse, + GetRecentTransactionsResponse, + GetShardKey, + GetStateRequest, + GetStateResponse, + GetSubstateRequest, + GetSubstateResponse, + GetSubstatesByTransactionRequest, + GetSubstatesByTransactionResponse, + GetTemplateRequest, + GetTemplateResponse, + GetTemplatesRequest, + GetTemplatesResponse, + GetTransactionRequest, + GetTransactionResponse, + GetTransactionResultRequest, + GetTransactionResultResponse, + GetValidatorFeesRequest, + GetValidatorFeesResponse, + ListBlocksRequest, + ListBlocksResponse, + RegisterValidatorNodeRequest, + RegisterValidatorNodeResponse, + SubmitTransactionRequest, + SubmitTransactionResponse, + SubstateStatus, + TemplateMetadata, + TemplateRegistrationRequest, + TemplateRegistrationResponse, + }, }; +use tari_validator_node_rpc::proto; use crate::{ dry_run_transaction_processor::DryRunTransactionProcessor, @@ -101,22 +96,20 @@ use crate::{ p2p::services::mempool::MempoolHandle, registration, Services, - ValidatorNodeConfig, }; const LOG_TARGET: &str = "tari::validator_node::json_rpc::handlers"; pub struct JsonRpcHandlers { - node_identity: Arc, + keypair: RistrettoKeypair, wallet_grpc_client: GrpcWalletClient, mempool: MempoolHandle, template_manager: TemplateManagerHandle, - epoch_manager: EpochManagerHandle, - comms: CommsNode, + epoch_manager: EpochManagerHandle, + networking: NetworkingHandle, base_node_client: GrpcBaseNodeClient, - state_store: SqliteStateStore, + state_store: SqliteStateStore, dry_run_transaction_processor: DryRunTransactionProcessor, - config: ValidatorNodeConfig, } impl JsonRpcHandlers { @@ -124,16 +117,14 @@ impl JsonRpcHandlers { wallet_grpc_client: GrpcWalletClient, base_node_client: GrpcBaseNodeClient, services: &Services, - config: ValidatorNodeConfig, ) -> Self { Self { - config, - node_identity: services.comms.node_identity(), + keypair: services.keypair.clone(), wallet_grpc_client, mempool: services.mempool.clone(), epoch_manager: services.epoch_manager.clone(), template_manager: services.template_manager.clone(), - comms: services.comms.clone(), + networking: services.networking.clone(), base_node_client, state_store: services.state_store.clone(), dry_run_transaction_processor: services.dry_run_transaction_processor.clone(), @@ -150,12 +141,20 @@ impl JsonRpcHandlers { } impl JsonRpcHandlers { - pub fn get_identity(&self, value: JsonRpcExtractor) -> JrpcResult { + pub async fn get_identity(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); + let info = self + .networking + .get_local_peer_info() + .await + .map_err(internal_error(answer_id))?; let response = GetIdentityResponse { - node_id: self.node_identity.node_id().to_hex(), - public_key: self.node_identity.public_key().clone(), - public_addresses: self.node_identity.public_addresses(), + peer_id: info.peer_id.to_string(), + public_key: self.keypair.public_key().clone(), + public_addresses: info.listen_addrs, + supported_protocols: info.protocols.into_iter().map(|p| p.to_string()).collect(), + protocol_version: info.protocol_version, + user_agent: info.agent_version, }; Ok(JsonRpcResponse::success(answer_id, response)) @@ -439,7 +438,7 @@ impl JsonRpcHandlers { .await .map_err(internal_error(answer_id))?; - let resp = registration::register(self.wallet_client(), &self.node_identity, &self.epoch_manager) + let resp = registration::register(self.wallet_client(), &self.keypair, &self.epoch_manager) .await .map_err(internal_error(answer_id))?; @@ -465,7 +464,7 @@ impl JsonRpcHandlers { let resp = self .wallet_client() - .register_template(&self.node_identity, data) + .register_template(&self.keypair, data) .await .map_err(internal_error(answer_id))?; @@ -529,35 +528,31 @@ impl JsonRpcHandlers { pub async fn get_connections(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); - if let Ok(active_connections) = self.comms.connectivity().get_active_connections().await { - let mut response = GetConnectionsResponse { connections: vec![] }; - let peer_manager = self.comms.peer_manager(); - for conn in active_connections { - let peer = peer_manager - .find_by_node_id(conn.peer_node_id()) - .await - .expect("Unexpected peer database error") - .expect("Peer not found"); - - response.connections.push(Connection { - node_id: peer.node_id, - public_key: peer.public_key, - address: conn.address().clone(), - direction: conn.direction().is_inbound(), - age: conn.age().as_secs(), - }); - } - Ok(JsonRpcResponse::success(answer_id, response)) - } else { - Err(JsonRpcResponse::error( - answer_id, - JsonRpcError::new( - JsonRpcErrorReason::InvalidParams, - "Something went wrong".to_string(), - json::Value::Null, - ), - )) - } + let active_connections = self + .networking + .get_active_connections() + .await + .map_err(internal_error(answer_id))?; + + let connections = active_connections + .into_iter() + .map(|conn| types::Connection { + connection_id: conn.connection_id.to_string(), + peer_id: conn.peer_id.to_string(), + address: conn.endpoint.get_remote_address().clone(), + direction: if conn.endpoint.is_dialer() { + ConnectionDirection::Outbound + } else { + ConnectionDirection::Inbound + }, + age: conn.age(), + ping_latency: conn.ping_latency, + }) + .collect(); + + Ok(JsonRpcResponse::success(answer_id, GetConnectionsResponse { + connections, + })) } pub async fn get_mempool_stats(&self, value: JsonRpcExtractor) -> JrpcResult { @@ -635,32 +630,24 @@ impl JsonRpcHandlers { wait_for_dial, } = value.parse_params()?; - let connectivity = self.comms.connectivity(); - let peer_manager = self.comms.peer_manager(); - - let node_id = NodeId::from_public_key(&public_key); + let mut networking = self.networking.clone(); + let peer_id = networking + .add_peer(public_key, addresses.clone()) + .await + .map_err(internal_error(answer_id))?; - peer_manager - .add_or_update_online_peer( - &public_key, - node_id.clone(), - addresses, - PeerFeatures::COMMUNICATION_NODE, - &tari_comms::net_address::PeerAddressSource::Config, + let dial_wait = networking + .dial_peer( + DialOpts::peer_id(peer_id) + .addresses(addresses) + .condition(PeerCondition::Always) + .build(), ) .await .map_err(internal_error(answer_id))?; + if wait_for_dial { - let _conn = connectivity - .dial_peer(node_id) - .await - .map_err(internal_error(answer_id))?; - } else { - // Dial without waiting - connectivity - .request_many_dials(Some(node_id)) - .await - .map_err(internal_error(answer_id))?; + dial_wait.await.map_err(internal_error(answer_id))?; } Ok(JsonRpcResponse::success(answer_id, AddPeerResponse {})) @@ -668,19 +655,16 @@ impl JsonRpcHandlers { pub async fn get_comms_stats(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); - if let Ok(stats) = self.comms.connectivity().get_connectivity_status().await { - let response = json!({ "connection_status": format!("{:?}", stats) }); - Ok(JsonRpcResponse::success(answer_id, response)) - } else { - Err(JsonRpcResponse::error( - answer_id, - JsonRpcError::new( - JsonRpcErrorReason::InvalidParams, - "Something went wrong".to_string(), - json::Value::Null, - ), - )) - } + let peers = self + .networking + .clone() + .get_connected_peers() + .await + .map_err(internal_error(answer_id))?; + + let status = if peers.is_empty() { "Offline" } else { "Online" }; + let response = json!({ "connection_status": status }); + Ok(JsonRpcResponse::success(answer_id, response)) } pub async fn get_shard_key(&self, value: JsonRpcExtractor) -> JrpcResult { @@ -789,40 +773,16 @@ impl JsonRpcHandlers { } } - pub async fn get_logged_messages(&self, value: JsonRpcExtractor) -> JrpcResult { - let answer_id = value.get_answer_id(); - let request = value.parse_params::()?; - let logger = SqliteMessageLog::new(&self.config.p2p.datastore_path); - let message_tag = request["message_tag"] - .as_str() - .map(ToString::to_string) - .ok_or_else(|| { - JsonRpcResponse::error( - answer_id, - JsonRpcError::new( - JsonRpcErrorReason::InvalidParams, - "message_tag is required".to_string(), - json::Value::Null, - ), - ) - })?; - let messages = logger.get_messages_by_tag(message_tag); - let response = json!({ "messages": messages }); - Ok(JsonRpcResponse::success(answer_id, response)) - } - pub async fn get_validator_fees(&self, value: JsonRpcExtractor) -> JrpcResult { let answer_id = value.get_answer_id(); let request = value.parse_params::()?; + let maybe_validator_addr = request.validator_public_key.as_ref(); + let blocks = self .state_store .with_read_tx(|tx| { - Block::get_any_with_epoch_range_for_validator( - tx, - request.epoch_range, - request.validator_public_key.as_ref(), - ) + Block::get_any_with_epoch_range_for_validator(tx, request.epoch_range, maybe_validator_addr) }) .map_err(internal_error(answer_id))?; @@ -835,17 +795,3 @@ impl JsonRpcHandlers { })) } } - -#[derive(Serialize, Debug)] -struct Connection { - node_id: NodeId, - public_key: CommsPublicKey, - address: Multiaddr, - direction: bool, - age: u64, -} - -#[derive(Serialize, Debug)] -struct GetConnectionsResponse { - connections: Vec, -} diff --git a/applications/tari_validator_node/src/json_rpc/server.rs b/applications/tari_validator_node/src/json_rpc/server.rs index 768a64b99..0de419577 100644 --- a/applications/tari_validator_node/src/json_rpc/server.rs +++ b/applications/tari_validator_node/src/json_rpc/server.rs @@ -76,7 +76,7 @@ async fn handler(Extension(handlers): Extension>, value: Js "get_templates" => handlers.get_templates(value).await, "register_template" => handlers.register_template(value).await, // Validator Node - "get_identity" => handlers.get_identity(value), + "get_identity" => handlers.get_identity(value).await, "register_validator_node" => handlers.register_validator_node(value).await, "get_mempool_stats" => handlers.get_mempool_stats(value).await, "get_epoch_manager_stats" => handlers.get_epoch_manager_stats(value).await, @@ -89,8 +89,6 @@ async fn handler(Extension(handlers): Extension>, value: Js "add_peer" => handlers.add_peer(value).await, "get_comms_stats" => handlers.get_comms_stats(value).await, "get_connections" => handlers.get_connections(value).await, - // Debug - "get_logged_messages" => handlers.get_logged_messages(value).await, method => Ok(value.method_not_found(method)), }; diff --git a/applications/tari_validator_node/src/lib.rs b/applications/tari_validator_node/src/lib.rs index be1109ca8..d693bf178 100644 --- a/applications/tari_validator_node/src/lib.rs +++ b/applications/tari_validator_node/src/lib.rs @@ -22,7 +22,6 @@ mod bootstrap; pub mod cli; -mod comms; mod config; mod consensus; mod dan_node; @@ -45,14 +44,13 @@ use std::{ }; use log::*; -use minotari_app_utilities::identity_management::setup_node_identity; use serde::{Deserialize, Serialize}; use tari_base_node_client::{grpc::GrpcBaseNodeClient, BaseNodeClientError}; use tari_common::{ configuration::bootstrap::{grpc_default_port, ApplicationType}, exit_codes::{ExitCode, ExitError}, }; -use tari_dan_app_utilities::consensus_constants::ConsensusConstants; +use tari_dan_app_utilities::{consensus_constants::ConsensusConstants, keypair::setup_keypair_prompt}; use tari_dan_common_types::ShardId; use tari_dan_storage::global::DbFactory; use tari_dan_storage_sqlite::SqliteDbFactory; @@ -66,7 +64,6 @@ use crate::{ grpc::base_layer_wallet::{GrpcWalletClient, WalletGrpcError}, http_ui::server::run_http_ui_server, json_rpc::{spawn_json_rpc, JsonRpcHandlers}, - p2p::services::networking::DAN_PEER_FEATURES, }; const LOG_TARGET: &str = "tari::validator_node::app"; @@ -98,11 +95,9 @@ pub struct ShardKey { } pub async fn run_validator_node(config: &ApplicationConfig, shutdown_signal: ShutdownSignal) -> Result<(), ExitError> { - let node_identity = setup_node_identity( + let keypair = setup_keypair_prompt( &config.validator_node.identity_file, - config.validator_node.public_address.iter().cloned().collect::>(), !config.validator_node.dont_create_id, - DAN_PEER_FEATURES, )?; let db_factory = SqliteDbFactory::new(config.validator_node.data_dir.clone()); @@ -115,34 +110,27 @@ pub async fn run_validator_node(config: &ApplicationConfig, shutdown_signal: Shu info!( target: LOG_TARGET, - "🚀 Node starting with pub key: {}", - node_identity.public_key(), - // node_identity - // .public_addresses() - // .first() - // .ok_or_else(|| ExitError::new(ExitCode::UnknownError, "public address not found for validator node"))? + "🚀 Node starting with pub key: {} and peer id {}", + keypair.public_key(),keypair.to_peer_address(), ); let (base_node_client, wallet_client) = create_base_layer_clients(config).await?; let services = spawn_services( config, shutdown_signal.clone(), - node_identity.clone(), + keypair.clone(), global_db, ConsensusConstants::devnet(), // TODO: change this eventually ) .await?; + let info = services.networking.get_local_peer_info().await.unwrap(); + info!(target: LOG_TARGET, "🚀 Node started: {}", info); // Run the JSON-RPC API let mut jrpc_address = config.validator_node.json_rpc_address; if let Some(jrpc_address) = jrpc_address.as_mut() { info!(target: LOG_TARGET, "🌐 Started JSON-RPC server on {}", jrpc_address); - let handlers = JsonRpcHandlers::new( - wallet_client, - base_node_client, - &services, - config.validator_node.clone(), - ); + let handlers = JsonRpcHandlers::new(wallet_client, base_node_client, &services); *jrpc_address = spawn_json_rpc(*jrpc_address, handlers)?; // Run the http ui if let Some(address) = config.validator_node.http_ui_address { diff --git a/applications/tari_validator_node/src/p2p/logging.rs b/applications/tari_validator_node/src/p2p/logging.rs new file mode 100644 index 000000000..8423cd4de --- /dev/null +++ b/applications/tari_validator_node/src/p2p/logging.rs @@ -0,0 +1,35 @@ +// Copyright 2023 The Tari Project +// SPDX-License-Identifier: BSD-3-Clause + +use serde::Serialize; +use sqlite_message_logger::SqliteMessageLogger; + +pub trait MessageLogger { + fn log_outbound_message( + &self, + destination_type: &str, + destination: &str, + message_type: &str, + message_tag: &str, + message: &T, + ); + + fn log_inbound_message(&self, source: &str, message_type: &str, message_tag: &str, message: &T); +} + +impl MessageLogger for SqliteMessageLogger { + fn log_outbound_message( + &self, + destination_type: &str, + destination: &str, + message_type: &str, + message_tag: &str, + message: &T, + ) { + self.log_outbound_message(destination_type, destination, message_type, message_tag, message) + } + + fn log_inbound_message(&self, source: &str, message_type: &str, message_tag: &str, message: &T) { + self.log_inbound_message(source, message_type, message_tag, message) + } +} diff --git a/applications/tari_validator_node/src/p2p/mod.rs b/applications/tari_validator_node/src/p2p/mod.rs index 94b7bb776..03a33eb54 100644 --- a/applications/tari_validator_node/src/p2p/mod.rs +++ b/applications/tari_validator_node/src/p2p/mod.rs @@ -23,4 +23,5 @@ mod rpc; pub use rpc::create_tari_validator_node_rpc_service; +mod logging; pub mod services; diff --git a/applications/tari_validator_node/src/p2p/rpc/mod.rs b/applications/tari_validator_node/src/p2p/rpc/mod.rs index 0afa457da..c99f5581e 100644 --- a/applications/tari_validator_node/src/p2p/rpc/mod.rs +++ b/applications/tari_validator_node/src/p2p/rpc/mod.rs @@ -24,25 +24,19 @@ mod service_impl; mod sync_task; pub use service_impl::ValidatorNodeRpcServiceImpl; -use tari_common_types::types::PublicKey; -use tari_dan_p2p::PeerProvider; +use tari_dan_common_types::PeerAddress; use tari_epoch_manager::base_layer::EpochManagerHandle; use tari_state_store_sqlite::SqliteStateStore; use tari_validator_node_rpc::rpc_service::ValidatorNodeRpcServer; use crate::{p2p::services::mempool::MempoolHandle, virtual_substate::VirtualSubstateManager}; -pub fn create_tari_validator_node_rpc_service( - peer_provider: TPeerProvider, - shard_store_store: SqliteStateStore, +pub fn create_tari_validator_node_rpc_service( + shard_store_store: SqliteStateStore, mempool: MempoolHandle, - virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, -) -> ValidatorNodeRpcServer> -where - TPeerProvider: PeerProvider + Clone + Send + Sync + 'static, -{ + virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, +) -> ValidatorNodeRpcServer { ValidatorNodeRpcServer::new(ValidatorNodeRpcServiceImpl::new( - peer_provider, shard_store_store, mempool, virtual_substate_manager, diff --git a/applications/tari_validator_node/src/p2p/rpc/service_impl.rs b/applications/tari_validator_node/src/p2p/rpc/service_impl.rs index c990b5d90..559cd735e 100644 --- a/applications/tari_validator_node/src/p2p/rpc/service_impl.rs +++ b/applications/tari_validator_node/src/p2p/rpc/service_impl.rs @@ -24,16 +24,14 @@ use std::convert::{TryFrom, TryInto}; use log::*; use tari_bor::{decode_exact, encode}; -use tari_common_types::types::PublicKey; -use tari_comms::protocol::rpc::{Request, Response, RpcStatus, Streaming}; -use tari_dan_common_types::{optional::Optional, NodeAddressable, ShardId}; -use tari_dan_p2p::PeerProvider; +use tari_dan_common_types::{optional::Optional, PeerAddress, ShardId}; use tari_dan_storage::{ consensus_models::{Block, BlockId, HighQc, LockedBlock, QuorumCertificate, SubstateRecord, TransactionRecord}, StateStore, }; use tari_engine_types::virtual_substate::VirtualSubstateAddress; use tari_epoch_manager::base_layer::EpochManagerHandle; +use tari_rpc_framework::{Request, Response, RpcStatus, Streaming}; use tari_state_store_sqlite::SqliteStateStore; use tari_transaction::{Transaction, TransactionId}; use tari_validator_node_rpc::{ @@ -61,22 +59,22 @@ use crate::{ const LOG_TARGET: &str = "tari::dan::p2p::rpc"; -pub struct ValidatorNodeRpcServiceImpl { - peer_provider: TPeerProvider, - shard_state_store: SqliteStateStore, +pub struct ValidatorNodeRpcServiceImpl { + shard_state_store: SqliteStateStore, mempool: MempoolHandle, - virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, + virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, } -impl ValidatorNodeRpcServiceImpl { +impl ValidatorNodeRpcServiceImpl { pub fn new( - peer_provider: TPeerProvider, - shard_state_store: SqliteStateStore, + shard_state_store: SqliteStateStore, mempool: MempoolHandle, - virtual_substate_manager: VirtualSubstateManager, EpochManagerHandle>, + virtual_substate_manager: VirtualSubstateManager< + SqliteStateStore, + EpochManagerHandle, + >, ) -> Self { Self { - peer_provider, shard_state_store, mempool, virtual_substate_manager, @@ -84,10 +82,8 @@ impl ValidatorNodeRpcServiceImpl { } } -#[tari_comms::async_trait] -impl ValidatorNodeRpcService for ValidatorNodeRpcServiceImpl -where TPeerProvider: PeerProvider + Clone + Send + Sync + 'static -{ +#[async_trait::async_trait] +impl ValidatorNodeRpcService for ValidatorNodeRpcServiceImpl { async fn submit_transaction( &self, request: Request, @@ -113,36 +109,6 @@ where TPeerProvider: PeerProvider + Clone + Send + Sync + 'static })) } - async fn get_peers( - &self, - _request: Request, - ) -> Result, RpcStatus> { - let (tx, rx) = mpsc::channel(100); - let peer_provider = self.peer_provider.clone(); - - task::spawn(async move { - let mut peer_iter = peer_provider.peers_for_current_epoch_iter().await; - while let Some(Ok(peer)) = peer_iter.next() { - if tx - .send(Ok(proto::rpc::GetPeersResponse { - identity: peer.identity.as_bytes().to_vec(), - claims: peer.claims.into_iter().map(Into::into).collect(), - })) - .await - .is_err() - { - debug!( - target: LOG_TARGET, - "Peer stream closed by client before completing. Aborting" - ); - break; - } - } - }); - - Ok(Streaming::new(rx)) - } - async fn get_substate(&self, req: Request) -> Result, RpcStatus> { let req = req.into_message(); diff --git a/applications/tari_validator_node/src/p2p/rpc/sync_task.rs b/applications/tari_validator_node/src/p2p/rpc/sync_task.rs index d229d81c4..b9f907fd3 100644 --- a/applications/tari_validator_node/src/p2p/rpc/sync_task.rs +++ b/applications/tari_validator_node/src/p2p/rpc/sync_task.rs @@ -4,13 +4,13 @@ use std::collections::HashSet; use log::*; -use tari_comms::protocol::rpc::RpcStatus; use tari_dan_storage::{ consensus_models::{Block, BlockId, LeafBlock, QuorumCertificate, SubstateUpdate, TransactionRecord}, StateStore, StateStoreReadTransaction, StorageError, }; +use tari_rpc_framework::RpcStatus; use tari_validator_node_rpc::proto::rpc::{ sync_blocks_response::SyncData, QuorumCertificates, @@ -23,24 +23,24 @@ const LOG_TARGET: &str = "tari::dan::rpc::sync_task"; const BLOCK_BUFFER_SIZE: usize = 15; -type BlockData = ( - Block, - Vec>, - Vec>, +type BlockData = ( + Block, + Vec, + Vec, Vec, ); -type BlockBuffer = Vec>; +type BlockBuffer = Vec; pub struct BlockSyncTask { store: TStateStore, - start_block: Block, + start_block: Block, sender: mpsc::Sender>, } impl BlockSyncTask { pub fn new( store: TStateStore, - start_block: Block, + start_block: Block, sender: mpsc::Sender>, ) -> Self { Self { @@ -106,11 +106,7 @@ impl BlockSyncTask { Ok(()) } - fn fetch_next_batch( - &self, - buffer: &mut BlockBuffer, - current_block_id: &BlockId, - ) -> Result { + fn fetch_next_batch(&self, buffer: &mut BlockBuffer, current_block_id: &BlockId) -> Result { self.store.with_read_tx(|tx| { let mut current_block_id = *current_block_id; loop { @@ -138,11 +134,7 @@ impl BlockSyncTask { }) } - fn fetch_last_blocks( - &self, - buffer: &mut BlockBuffer, - current_block_id: &BlockId, - ) -> Result<(), StorageError> { + fn fetch_last_blocks(&self, buffer: &mut BlockBuffer, current_block_id: &BlockId) -> Result<(), StorageError> { self.store.with_read_tx(|tx| { // TODO: if there are any transactions this will break the syncing node. let leaf_block = LeafBlock::get(tx)?; @@ -181,10 +173,7 @@ impl BlockSyncTask { Ok(()) } - async fn send_block_data( - &mut self, - (block, qcs, updates, transactions): BlockData, - ) -> Result<(), ()> { + async fn send_block_data(&mut self, (block, qcs, updates, transactions): BlockData) -> Result<(), ()> { self.send(Ok(SyncBlocksResponse { sync_data: Some(SyncData::Block((&block).into())), })) diff --git a/applications/tari_validator_node/src/p2p/services/mempool/error.rs b/applications/tari_validator_node/src/p2p/services/mempool/error.rs index b4ede73ac..91df6178b 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/error.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/error.rs @@ -8,12 +8,13 @@ use tari_dan_app_utilities::{ use tari_dan_common_types::Epoch; use tari_dan_storage::{consensus_models::TransactionPoolError, StorageError}; use tari_epoch_manager::EpochManagerError; +use tari_networking::NetworkingError; use tari_transaction::TransactionId; use tokio::sync::{mpsc, oneshot}; use crate::{ dry_run_transaction_processor::DryRunTransactionProcessorError, - p2p::services::{mempool::MempoolRequest, messaging::MessagingError}, + p2p::services::{mempool::MempoolRequest, message_dispatcher::MessagingError}, substate_resolver::SubstateResolverError, virtual_substate::VirtualSubstateError, }; @@ -65,6 +66,8 @@ pub enum MempoolError { NoInvolvedShards { transaction_id: TransactionId }, #[error("Invalid transaction signature")] InvalidSignature, + #[error("Network error: {0}")] + NetworkingError(#[from] NetworkingError), } impl From> for MempoolError { diff --git a/applications/tari_validator_node/src/p2p/services/mempool/gossip.rs b/applications/tari_validator_node/src/p2p/services/mempool/gossip.rs index feab7d9ff..00459f7f7 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/gossip.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/gossip.rs @@ -4,57 +4,76 @@ use std::collections::HashSet; use log::*; -use tari_comms::types::CommsPublicKey; -use tari_dan_common_types::{shard_bucket::ShardBucket, Epoch, ShardId}; +use sqlite_message_logger::SqliteMessageLogger; +use tari_dan_common_types::{shard_bucket::ShardBucket, Epoch, PeerAddress, ShardId}; use tari_dan_p2p::{DanMessage, OutboundService}; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; +use tari_networking::NetworkingService; -use crate::p2p::services::{mempool::MempoolError, messaging::OutboundMessaging}; +use crate::p2p::services::{mempool::MempoolError, message_dispatcher::OutboundMessaging}; const LOG_TARGET: &str = "tari::validator_node::mempool::gossip"; #[derive(Debug)] -pub(super) struct Gossip { - epoch_manager: EpochManagerHandle, - outbound: OutboundMessaging, - validator_public_key: CommsPublicKey, +pub(super) struct Gossip { + epoch_manager: EpochManagerHandle, + outbound: OutboundMessaging, + is_subscribed: Option, } -impl Gossip { +impl Gossip { pub fn new( - epoch_manager: EpochManagerHandle, - outbound: OutboundMessaging, - validator_public_key: CommsPublicKey, + epoch_manager: EpochManagerHandle, + outbound: OutboundMessaging, ) -> Self { Self { epoch_manager, outbound, - validator_public_key, + is_subscribed: None, } } - pub async fn forward_to_local_replicas( - &mut self, - epoch: Epoch, - msg: DanMessage, - ) -> Result<(), MempoolError> { - let committee = self.epoch_manager.get_local_committee(epoch).await?; + pub async fn subscribe(&mut self, epoch: Epoch) -> Result<(), MempoolError> { + let committee_shard = self.epoch_manager.get_local_committee_shard(epoch).await?; + match self.is_subscribed { + Some(b) if b == committee_shard.bucket() => { + return Ok(()); + }, + Some(_) => { + self.unsubscribe().await?; + }, + None => {}, + } + + self.outbound + .networking_mut() + .subscribe_topic(format!("transactions-{}", committee_shard.bucket())) + .await?; + self.is_subscribed = Some(committee_shard.bucket()); + Ok(()) + } - let Some(our_index) = committee.index_of(&self.validator_public_key) else { - error!(target: LOG_TARGET, "BUG: forward_to_local_replicas: get_local_committee returned committee that this node is not part of"); - return Ok(()); - }; + pub async fn unsubscribe(&mut self) -> Result<(), MempoolError> { + if let Some(b) = self.is_subscribed { + self.outbound + .networking_mut() + .unsubscribe_topic(format!("transactions-{}", b)) + .await?; + self.is_subscribed = None; + } + Ok(()) + } - let f = committee.max_failures(); + pub async fn forward_to_local_replicas(&mut self, epoch: Epoch, msg: DanMessage) -> Result<(), MempoolError> { + let committee = self.epoch_manager.get_local_committee_shard(epoch).await?; + let topic = format!("transactions-{}", committee.bucket()); debug!( target: LOG_TARGET, - "forward_to_local_replicas: {} member(s) selected", - f + 1, + "forward_to_local_replicas: topic: {}", topic, ); - let selected_members = committee.select_n_starting_from(f + 1, our_index + 1); - self.outbound.broadcast(selected_members, msg).await?; + self.outbound.publish_gossip(topic, msg).await?; Ok(()) } @@ -63,65 +82,82 @@ impl Gossip { &mut self, epoch: Epoch, shards: HashSet, - msg: DanMessage, + msg: DanMessage, exclude_bucket: Option, ) -> Result<(), MempoolError> { - let committees = self.epoch_manager.get_committees_by_shards(epoch, shards).await?; - let local_shard = self.epoch_manager.get_local_committee_shard(epoch).await?; - let local_committee = self.epoch_manager.get_local_committee(epoch).await?; - - if local_committee.is_empty() { - error!(target: LOG_TARGET, "BUG: forward_to_foreign_replicas: get_local_committee returned empty committee"); - return Ok(()); + let n = self.epoch_manager.get_num_committees(epoch).await?; + let buckets = shards + .into_iter() + .map(|s| s.to_committee_bucket(n)) + .filter(|b| exclude_bucket.as_ref() != Some(b)) + .collect::>(); + + for bucket in buckets { + let topic = format!("transactions-{}", bucket); + debug!( + target: LOG_TARGET, + "forward_to_foreign_replicas: topic: {}", topic, + ); + + self.outbound.publish_gossip(topic, msg.clone()).await?; } - let Some(our_index) = local_committee - .members() - .iter() - .position(|addr| addr == &self.validator_public_key) - else { - error!(target: LOG_TARGET, "BUG: forward_to_foreign_replicas: get_local_committee returned committee that this node is not part of"); - return Ok(()); - }; - - let mut selected_members = vec![]; - for (bucket, committee) in committees { - // Dont forward locally - if bucket == local_shard.bucket() { - continue; - } - if exclude_bucket.map(|b| b == bucket).unwrap_or(false) { - continue; - } - if committee.is_empty() { - error!( - target: LOG_TARGET, - "BUG: forward_to_foreign_replicas: get_committees_by_shards returned empty committee" - ); - continue; - } - let n = if local_committee.len() > committee.len() { - // Our local committee is bigger, so we send to a single node - 1 - } else { - // Our local committee is smaller, so we send to a portion of their nodes - committee.len() / local_committee.len() - }; - - selected_members.extend(committee.select_n_starting_from(n, our_index).cloned()); - } - - debug!( - target: LOG_TARGET, - "forward_to_foreign_replicas: {} member(s) selected", - selected_members.len(), - ); - - if selected_members.is_empty() { - return Ok(()); - } - - self.outbound.broadcast(selected_members.iter(), msg).await?; + // let committees = self.epoch_manager.get_committees_by_shards(epoch, shards).await?; + // let local_shard = self.epoch_manager.get_local_committee_shard(epoch).await?; + // let local_committee = self.epoch_manager.get_local_committee(epoch).await?; + // + // if local_committee.is_empty() { + // error!(target: LOG_TARGET, "BUG: forward_to_foreign_replicas: get_local_committee returned empty + // committee"); return Ok(()); + // } + // + // let Some(our_index) = local_committee + // .members() + // .position(|addr| addr == &self.validator_address) + // else { + // error!(target: LOG_TARGET, "BUG: forward_to_foreign_replicas: get_local_committee returned committee that + // this node is not part of"); return Ok(()); + // }; + // + // let mut selected_members = vec![]; + // for (bucket, committee) in committees { + // // Dont forward locally + // if bucket == local_shard.bucket() { + // continue; + // } + // if exclude_bucket.map(|b| b == bucket).unwrap_or(false) { + // continue; + // } + // if committee.is_empty() { + // error!( + // target: LOG_TARGET, + // "BUG: forward_to_foreign_replicas: get_committees_by_shards returned empty committee" + // ); + // continue; + // } + // let n = if local_committee.len() > committee.len() { + // // Our local committee is bigger, so we send to a single node + // 1 + // } else { + // // Our local committee is smaller, so we send to a portion of their nodes + // committee.len() / local_committee.len() + // }; + // + // selected_members.extend(committee.select_n_starting_from(n, our_index).cloned()); + // } + // + // debug!( + // target: LOG_TARGET, + // "forward_to_foreign_replicas: {} member(s) selected", + // selected_members.len(), + // ); + // + // if selected_members.is_empty() { + // return Ok(()); + // } + // + // // TODO: change this to use goissipsub + // self.outbound.broadcast(selected_members.iter(), msg).await?; Ok(()) } @@ -130,40 +166,42 @@ impl Gossip { &mut self, epoch: Epoch, shards: HashSet, - msg: DanMessage, + msg: DanMessage, ) -> Result<(), MempoolError> { - let committees = self.epoch_manager.get_committees_by_shards(epoch, shards).await?; - let local_shard = self.epoch_manager.get_local_committee_shard(epoch).await?; - - let mut selected_members = vec![]; - for (bucket, committee) in committees { - // Dont forward locally - if bucket == local_shard.bucket() { - continue; - } - if committee.is_empty() { - error!( - target: LOG_TARGET, - "BUG: gossip_to_foreign_replicas: get_committees_by_shards returned empty committee" - ); - continue; - } - let f = committee.max_failures(); - - selected_members.extend(committee.select_n_random(f + 1).cloned()); - } - - debug!( - target: LOG_TARGET, - "gossip_to_foreign_replicas: {} member(s) selected", - selected_members.len(), - ); - - if selected_members.is_empty() { - return Ok(()); - } - - self.outbound.broadcast(selected_members.iter(), msg).await?; + // let committees = self.epoch_manager.get_committees_by_shards(epoch, shards).await?; + // let local_shard = self.epoch_manager.get_local_committee_shard(epoch).await?; + // + // let mut selected_members = vec![]; + // for (bucket, committee) in committees { + // // Dont forward locally + // if bucket == local_shard.bucket() { + // continue; + // } + // if committee.is_empty() { + // error!( + // target: LOG_TARGET, + // "BUG: gossip_to_foreign_replicas: get_committees_by_shards returned empty committee" + // ); + // continue; + // } + // let f = committee.max_failures(); + // + // selected_members.extend(committee.select_n_random(f + 1).cloned()); + // } + // + // debug!( + // target: LOG_TARGET, + // "gossip_to_foreign_replicas: {} member(s) selected", + // selected_members.len(), + // ); + // + // if selected_members.is_empty() { + // return Ok(()); + // } + // + // self.outbound.broadcast(selected_members.iter(), msg).await?; + + self.forward_to_foreign_replicas(epoch, shards, msg, None).await?; Ok(()) } diff --git a/applications/tari_validator_node/src/p2p/services/mempool/initializer.rs b/applications/tari_validator_node/src/p2p/services/mempool/initializer.rs index 27840054d..912900996 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/initializer.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/initializer.rs @@ -20,11 +20,9 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::sync::Arc; - -use tari_common_types::types::PublicKey; -use tari_comms::{types::CommsPublicKey, NodeIdentity}; +use sqlite_message_logger::SqliteMessageLogger; use tari_dan_app_utilities::transaction_executor::{TransactionExecutor, TransactionProcessorError}; +use tari_dan_common_types::PeerAddress; use tari_dan_p2p::NewTransactionMessage; use tari_dan_storage::consensus_models::ExecutedTransaction; use tari_epoch_manager::base_layer::EpochManagerHandle; @@ -36,22 +34,21 @@ use crate::{ consensus::ConsensusHandle, p2p::services::{ mempool::{handle::MempoolHandle, service::MempoolService, MempoolError, SubstateResolver, Validator}, - messaging::OutboundMessaging, + message_dispatcher::OutboundMessaging, }, substate_resolver::SubstateResolverError, }; pub fn spawn( - new_transactions: mpsc::Receiver<(CommsPublicKey, NewTransactionMessage)>, - outbound: OutboundMessaging, + new_transactions: mpsc::Receiver<(PeerAddress, NewTransactionMessage)>, + outbound: OutboundMessaging, tx_executed_transactions: mpsc::Sender, - epoch_manager: EpochManagerHandle, - node_identity: Arc, + epoch_manager: EpochManagerHandle, transaction_executor: TExecutor, substate_resolver: TSubstateResolver, validator: TValidator, after_executed_validator: TExecutedValidator, - state_store: SqliteStateStore, + state_store: SqliteStateStore, rx_consensus_to_mempool: mpsc::UnboundedReceiver, consensus_handle: ConsensusHandle, ) -> (MempoolHandle, JoinHandle>) @@ -69,7 +66,6 @@ where outbound, tx_executed_transactions, epoch_manager, - node_identity, transaction_executor, substate_resolver, validator, diff --git a/applications/tari_validator_node/src/p2p/services/mempool/service.rs b/applications/tari_validator_node/src/p2p/services/mempool/service.rs index f919c8535..080b76a67 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/service.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/service.rs @@ -20,20 +20,19 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::{collections::HashSet, fmt::Display, iter, ops::DerefMut, sync::Arc}; +use std::{collections::HashSet, fmt::Display, iter, ops::DerefMut}; use futures::{future::BoxFuture, stream::FuturesUnordered, FutureExt, StreamExt}; use log::*; -use tari_common_types::types::PublicKey; -use tari_comms::{types::CommsPublicKey, NodeIdentity}; +use sqlite_message_logger::SqliteMessageLogger; use tari_dan_app_utilities::transaction_executor::{TransactionExecutor, TransactionProcessorError}; -use tari_dan_common_types::{optional::Optional, shard_bucket::ShardBucket, Epoch, ShardId}; +use tari_dan_common_types::{optional::Optional, shard_bucket::ShardBucket, Epoch, PeerAddress, ShardId}; use tari_dan_p2p::NewTransactionMessage; use tari_dan_storage::{ consensus_models::{ExecutedTransaction, SubstateRecord, TransactionPool, TransactionRecord}, StateStore, }; -use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; +use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerEvent, EpochManagerReader}; use tari_state_store_sqlite::SqliteStateStore; use tari_transaction::{Transaction, TransactionId}; use tokio::sync::{mpsc, oneshot}; @@ -49,7 +48,7 @@ use crate::{ traits::SubstateResolver, Validator, }, - messaging::OutboundMessaging, + message_dispatcher::OutboundMessaging, }, substate_resolver::SubstateResolverError, }; @@ -67,17 +66,17 @@ struct MempoolTransactionExecution { pub struct MempoolService { transactions: HashSet, pending_executions: FuturesUnordered>, - new_transactions: mpsc::Receiver<(CommsPublicKey, NewTransactionMessage)>, + new_transactions: mpsc::Receiver<(PeerAddress, NewTransactionMessage)>, mempool_requests: mpsc::Receiver, tx_executed_transactions: mpsc::Sender, - epoch_manager: EpochManagerHandle, + epoch_manager: EpochManagerHandle, before_execute_validator: TValidator, after_execute_validator: TExecutedValidator, transaction_executor: TExecutor, substate_resolver: TSubstateResolver, - state_store: SqliteStateStore, - transaction_pool: TransactionPool>, - gossip: Gossip, + state_store: SqliteStateStore, + transaction_pool: TransactionPool>, + gossip: Gossip, rx_consensus_to_mempool: mpsc::UnboundedReceiver, consensus_handle: ConsensusHandle, } @@ -90,24 +89,23 @@ where TExecutor: TransactionExecutor + Clone + Send + Sync + 'static, TSubstateResolver: SubstateResolver + Clone + Send + Sync + 'static, { - #[allow(clippy::too_many_arguments)] + // #[allow(clippy::too_many_arguments)] pub(super) fn new( - new_transactions: mpsc::Receiver<(CommsPublicKey, NewTransactionMessage)>, + new_transactions: mpsc::Receiver<(PeerAddress, NewTransactionMessage)>, mempool_requests: mpsc::Receiver, - outbound: OutboundMessaging, + outbound: OutboundMessaging, tx_executed_transactions: mpsc::Sender, - epoch_manager: EpochManagerHandle, - node_identity: Arc, + epoch_manager: EpochManagerHandle, transaction_executor: TExecutor, substate_resolver: TSubstateResolver, before_execute_validator: TValidator, after_execute_validator: TExecutedValidator, - state_store: SqliteStateStore, + state_store: SqliteStateStore, rx_consensus_to_mempool: mpsc::UnboundedReceiver, consensus_handle: ConsensusHandle, ) -> Self { Self { - gossip: Gossip::new(epoch_manager.clone(), outbound, node_identity.public_key().clone()), + gossip: Gossip::new(epoch_manager.clone(), outbound), transactions: Default::default(), pending_executions: FuturesUnordered::new(), new_transactions, @@ -126,6 +124,8 @@ where } pub async fn run(mut self) -> anyhow::Result<()> { + let mut events = self.epoch_manager.subscribe().await?; + loop { tokio::select! { Some(req) = self.mempool_requests.recv() => self.handle_request(req).await, @@ -144,6 +144,14 @@ where warn!(target: LOG_TARGET, "Mempool rejected transaction: {}", e); } } + Ok(event) = events.recv() => { + if let EpochManagerEvent::EpochChanged(epoch) = event { + if self.epoch_manager.is_this_validator_registered_for_epoch(epoch).await?{ + info!(target: LOG_TARGET, "Mempool service subscribing transaction messages for epoch {}", epoch); + self.gossip.subscribe(epoch).await?; + } + } + }, else => { info!(target: LOG_TARGET, "Mempool service shutting down"); @@ -151,6 +159,9 @@ where } } } + + self.gossip.unsubscribe().await?; + Ok(()) } @@ -203,7 +214,7 @@ where async fn handle_new_transaction_from_remote( &mut self, - from: CommsPublicKey, + from: PeerAddress, msg: NewTransactionMessage, ) -> Result<(), MempoolError> { let NewTransactionMessage { diff --git a/applications/tari_validator_node/src/p2p/services/mempool/validators/before/epoch_range.rs b/applications/tari_validator_node/src/p2p/services/mempool/validators/before/epoch_range.rs index 678479972..a1d72c33b 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/validators/before/epoch_range.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/validators/before/epoch_range.rs @@ -2,24 +2,25 @@ // SPDX-License-Identifier: BSD-3-Clause use async_trait::async_trait; +use tari_dan_common_types::NodeAddressable; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerReader}; use tari_transaction::Transaction; use crate::p2p::services::mempool::{MempoolError, Validator}; #[derive(Debug)] -pub struct EpochRangeValidator { - epoch_manager: EpochManagerHandle, +pub struct EpochRangeValidator { + epoch_manager: EpochManagerHandle, } -impl EpochRangeValidator { - pub fn new(epoch_manager: EpochManagerHandle) -> Self { +impl EpochRangeValidator { + pub fn new(epoch_manager: EpochManagerHandle) -> Self { Self { epoch_manager } } } #[async_trait] -impl Validator for EpochRangeValidator { +impl Validator for EpochRangeValidator { type Error = MempoolError; async fn validate(&self, transaction: &Transaction) -> Result<(), MempoolError> { diff --git a/applications/tari_validator_node/src/p2p/services/mempool/validators/before/template_exists.rs b/applications/tari_validator_node/src/p2p/services/mempool/validators/before/template_exists.rs index 2d086c0d5..11abd09c1 100644 --- a/applications/tari_validator_node/src/p2p/services/mempool/validators/before/template_exists.rs +++ b/applications/tari_validator_node/src/p2p/services/mempool/validators/before/template_exists.rs @@ -3,24 +3,25 @@ use async_trait::async_trait; use tari_dan_app_utilities::template_manager::{implementation::TemplateManager, interface::TemplateManagerError}; +use tari_dan_common_types::NodeAddressable; use tari_engine_types::instruction::Instruction; use tari_transaction::Transaction; use crate::p2p::services::mempool::{MempoolError, Validator}; #[derive(Debug)] -pub struct TemplateExistsValidator { - template_manager: TemplateManager, +pub struct TemplateExistsValidator { + template_manager: TemplateManager, } -impl TemplateExistsValidator { - pub(crate) fn new(template_manager: TemplateManager) -> Self { +impl TemplateExistsValidator { + pub(crate) fn new(template_manager: TemplateManager) -> Self { Self { template_manager } } } #[async_trait] -impl Validator for TemplateExistsValidator { +impl Validator for TemplateExistsValidator { type Error = MempoolError; async fn validate(&self, transaction: &Transaction) -> Result<(), MempoolError> { diff --git a/applications/tari_validator_node/src/p2p/services/messaging/dispatcher.rs b/applications/tari_validator_node/src/p2p/services/message_dispatcher/dispatcher.rs similarity index 70% rename from applications/tari_validator_node/src/p2p/services/messaging/dispatcher.rs rename to applications/tari_validator_node/src/p2p/services/message_dispatcher/dispatcher.rs index 74ac2e22b..0c870faca 100644 --- a/applications/tari_validator_node/src/p2p/services/messaging/dispatcher.rs +++ b/applications/tari_validator_node/src/p2p/services/message_dispatcher/dispatcher.rs @@ -21,24 +21,31 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use log::*; -use tari_comms::types::CommsPublicKey; +use tari_dan_common_types::PeerAddress; use tari_dan_p2p::{DanMessage, Message}; use tokio::task; -use crate::p2p::services::messaging::{DanMessageSenders, InboundMessaging}; +use super::{DanMessageSenders, InboundMessaging}; +use crate::p2p::logging::MessageLogger; const LOG_TARGET: &str = "tari::validator_node::p2p::services::message_dispatcher"; -pub struct MessageDispatcher { - inbound: InboundMessaging, - message_senders: DanMessageSenders, +pub struct MessageDispatcher { + inbound: InboundMessaging, + message_senders: DanMessageSenders, + msg_logger: TMsgLogger, } -impl MessageDispatcher { - pub fn new(inbound: InboundMessaging, message_senders: DanMessageSenders) -> Self { +impl MessageDispatcher { + pub fn new( + inbound: InboundMessaging, + message_senders: DanMessageSenders, + msg_logger: TMsgLogger, + ) -> Self { Self { inbound, message_senders, + msg_logger, } } @@ -47,7 +54,18 @@ impl MessageDispatcher { } pub async fn run(mut self) -> anyhow::Result<()> { - while let Some((from, msg)) = self.inbound.next_message().await { + while let Some(result) = self.inbound.next_message().await { + let (from, msg) = match result { + Ok(from_and_msg) => from_and_msg, + Err(err) => { + warn!(target: LOG_TARGET, "Inbound message error: {}", err); + continue; + }, + }; + + self.msg_logger + .log_inbound_message(&from.to_string(), &msg.to_type_str(), &msg.get_message_tag(), &msg); + match msg { Message::Consensus(msg) => self.message_senders.tx_consensus_message.send((from, msg)).await?, Message::Dan(DanMessage::NewTransaction(msg)) => { @@ -56,9 +74,6 @@ impl MessageDispatcher { .send((from, *msg)) .await? }, - Message::Dan(DanMessage::NetworkAnnounce(announce)) => { - self.message_senders.tx_network_announce.send((from, *announce)).await? - }, } } diff --git a/applications/tari_validator_node/src/p2p/services/messaging/error.rs b/applications/tari_validator_node/src/p2p/services/message_dispatcher/error.rs similarity index 65% rename from applications/tari_validator_node/src/p2p/services/messaging/error.rs rename to applications/tari_validator_node/src/p2p/services/message_dispatcher/error.rs index b399dcc1f..b12ea5db3 100644 --- a/applications/tari_validator_node/src/p2p/services/messaging/error.rs +++ b/applications/tari_validator_node/src/p2p/services/message_dispatcher/error.rs @@ -1,10 +1,12 @@ // Copyright 2022 The Tari Project // SPDX-License-Identifier: BSD-3-Clause +use tari_networking::NetworkingError; + #[derive(Debug, thiserror::Error)] pub enum MessagingError { #[error("Failed to send to loopback because channel was closed")] LoopbackSendFailed, - #[error("Failed to send to outbound messaging because the channel was closed")] - MessageSendFailed, + #[error("Networking error: {0}")] + NetworkingError(#[from] NetworkingError), } diff --git a/applications/tari_validator_node/src/p2p/services/messaging/inbound.rs b/applications/tari_validator_node/src/p2p/services/message_dispatcher/inbound.rs similarity index 65% rename from applications/tari_validator_node/src/p2p/services/messaging/inbound.rs rename to applications/tari_validator_node/src/p2p/services/message_dispatcher/inbound.rs index 5476189f0..c0405413f 100644 --- a/applications/tari_validator_node/src/p2p/services/messaging/inbound.rs +++ b/applications/tari_validator_node/src/p2p/services/message_dispatcher/inbound.rs @@ -20,41 +20,42 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use tari_consensus::messages::HotstuffMessage; -use tari_dan_p2p::{DanMessage, Message}; +use libp2p::PeerId; +use tari_dan_common_types::PeerAddress; +use tari_dan_p2p::Message; +use tari_validator_node_rpc::proto; use tokio::sync::mpsc; const _LOG_TARGET: &str = "tari::validator_node::p2p::services::messaging::inbound"; pub struct InboundMessaging { our_node_addr: TAddr, - inbound_messages: mpsc::Receiver<(TAddr, DanMessage)>, - inbound_consensus_messages: mpsc::Receiver<(TAddr, HotstuffMessage)>, - loopback_receiver: mpsc::Receiver>, + inbound_messages: mpsc::Receiver<(PeerId, proto::network::Message)>, + loopback_receiver: mpsc::Receiver, } -impl InboundMessaging { +impl InboundMessaging { pub fn new( - our_node_addr: TAddr, - inbound_messages: mpsc::Receiver<(TAddr, DanMessage)>, - inbound_consensus_messages: mpsc::Receiver<(TAddr, HotstuffMessage)>, - loopback_receiver: mpsc::Receiver>, + our_node_addr: PeerAddress, + inbound_messages: mpsc::Receiver<(PeerId, proto::network::Message)>, + loopback_receiver: mpsc::Receiver, ) -> Self { Self { our_node_addr, inbound_messages, - inbound_consensus_messages, loopback_receiver, } } - pub async fn next_message(&mut self) -> Option<(TAddr, Message)> { + pub async fn next_message(&mut self) -> Option> { tokio::select! { - // BIASED: messaging priority is loopback, consensus, then other + // BIASED: messaging priority is loopback, then other biased; - maybe_msg = self.loopback_receiver.recv() => maybe_msg.map(|msg| (self.our_node_addr.clone(), msg)), - maybe_msg = self.inbound_consensus_messages.recv() => maybe_msg.map(|(from, msg)| (from, Message::Consensus(msg))), - maybe_msg = self.inbound_messages.recv() => maybe_msg.map(|(from, msg)| (from, Message::Dan(msg))), + maybe_msg = self.loopback_receiver.recv() => maybe_msg.map(|msg| Ok((self.our_node_addr.clone(), msg))), + maybe_msg = self.inbound_messages.recv() => { + let (from, msg) = maybe_msg?; + Some( msg.try_into().map(|msg| (PeerAddress::from(from), msg))) + }, } } } diff --git a/applications/tari_validator_node/src/p2p/services/messaging/mod.rs b/applications/tari_validator_node/src/p2p/services/message_dispatcher/mod.rs similarity index 62% rename from applications/tari_validator_node/src/p2p/services/messaging/mod.rs rename to applications/tari_validator_node/src/p2p/services/message_dispatcher/mod.rs index b8dc617bc..c26c64139 100644 --- a/applications/tari_validator_node/src/p2p/services/messaging/mod.rs +++ b/applications/tari_validator_node/src/p2p/services/message_dispatcher/mod.rs @@ -21,7 +21,9 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mod dispatcher; + pub use dispatcher::MessageDispatcher; +use libp2p::PeerId; mod error; mod inbound; @@ -33,59 +35,59 @@ pub use outbound::OutboundMessaging; // ----------------------- // Messaging impl // ----------------------- -use tari_comms::types::CommsPublicKey; use tari_consensus::messages::HotstuffMessage; -use tari_dan_p2p::{NetworkAnnounce, NewTransactionMessage}; +use tari_dan_common_types::{NodeAddressable, PeerAddress}; +use tari_dan_p2p::NewTransactionMessage; +use tari_networking::{NetworkingHandle, NetworkingService}; +use tari_validator_node_rpc::proto; use tokio::{sync::mpsc, task::JoinHandle}; -use crate::comms::MessageChannels; +use crate::p2p::logging::MessageLogger; -pub fn spawn( - our_node_address: CommsPublicKey, - channels: MessageChannels, - message_senders: DanMessageSenders, -) -> (OutboundMessaging, JoinHandle>) { - let (outbound_msg_tx, inbound_msg_rx, outbound_hs_tx, inbound_hs_rx) = channels; +pub fn spawn( + network: NetworkingHandle, + rx_inbound_msg: mpsc::Receiver<(PeerId, proto::network::Message)>, + message_senders: DanMessageSenders, + msg_logger: TMsgLogger, +) -> ( + OutboundMessaging, + JoinHandle>, +) +where + TMsgLogger: MessageLogger + Clone + Send + 'static, +{ let (loopback_sender, loopback_receiver) = mpsc::channel(100); - let inbound = InboundMessaging::new( - our_node_address.clone(), - inbound_msg_rx, - inbound_hs_rx, - loopback_receiver, - ); - let outbound = OutboundMessaging::new(our_node_address, outbound_msg_tx, outbound_hs_tx, loopback_sender); - let dispatcher = MessageDispatcher::new(inbound, message_senders); + let inbound = InboundMessaging::new(network.local_peer_id().into(), rx_inbound_msg, loopback_receiver); + let outbound = OutboundMessaging::new(loopback_sender, network, msg_logger.clone()); + let dispatcher = MessageDispatcher::new(inbound, message_senders, msg_logger); let handle = dispatcher.spawn(); (outbound, handle) } #[derive(Debug, Clone)] -pub struct DanMessageSenders { - pub tx_consensus_message: mpsc::Sender<(CommsPublicKey, HotstuffMessage)>, - pub tx_new_transaction_message: mpsc::Sender<(CommsPublicKey, NewTransactionMessage)>, - pub tx_network_announce: mpsc::Sender<(CommsPublicKey, NetworkAnnounce)>, +pub struct DanMessageSenders { + pub tx_consensus_message: mpsc::Sender<(TAddr, HotstuffMessage)>, + pub tx_new_transaction_message: mpsc::Sender<(TAddr, NewTransactionMessage)>, } #[derive(Debug)] -pub struct DanMessageReceivers { - pub rx_consensus_message: mpsc::Receiver<(CommsPublicKey, HotstuffMessage)>, - pub rx_new_transaction_message: mpsc::Receiver<(CommsPublicKey, NewTransactionMessage)>, - pub rx_network_announce: mpsc::Receiver<(CommsPublicKey, NetworkAnnounce)>, +pub struct DanMessageReceivers { + pub rx_consensus_message: mpsc::Receiver<(TAddr, HotstuffMessage)>, + pub rx_new_transaction_message: mpsc::Receiver<(TAddr, NewTransactionMessage)>, } -pub fn new_messaging_channel(size: usize) -> (DanMessageSenders, DanMessageReceivers) { +pub fn new_messaging_channel( + size: usize, +) -> (DanMessageSenders, DanMessageReceivers) { let (tx_consensus_message, rx_consensus_message) = mpsc::channel(size); let (tx_new_transaction_message, rx_new_transaction_message) = mpsc::channel(size); - let (tx_network_announce, rx_network_announce) = mpsc::channel(size); let senders = DanMessageSenders { tx_consensus_message, tx_new_transaction_message, - tx_network_announce, }; let receivers = DanMessageReceivers { rx_consensus_message, rx_new_transaction_message, - rx_network_announce, }; (senders, receivers) diff --git a/applications/tari_validator_node/src/p2p/services/message_dispatcher/outbound.rs b/applications/tari_validator_node/src/p2p/services/message_dispatcher/outbound.rs new file mode 100644 index 000000000..e841eee4e --- /dev/null +++ b/applications/tari_validator_node/src/p2p/services/message_dispatcher/outbound.rs @@ -0,0 +1,172 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use async_trait::async_trait; +use libp2p::PeerId; +use tari_dan_common_types::PeerAddress; +use tari_dan_p2p::{Message, OutboundService}; +use tari_networking::{NetworkingHandle, NetworkingService}; +use tari_validator_node_rpc::proto; +use tokio::sync::mpsc; + +use crate::p2p::{logging::MessageLogger, services::message_dispatcher::MessagingError}; + +const _LOG_TARGET: &str = "tari::dan::messages::outbound::validator_node"; + +#[derive(Debug, Clone)] +pub struct OutboundMessaging { + our_node_addr: TAddr, + loopback_sender: mpsc::Sender, + networking: NetworkingHandle, + msg_logger: TMsgLogger, +} + +impl + Send, TMsgLogger: MessageLogger> OutboundMessaging { + pub fn new( + loopback_sender: mpsc::Sender, + networking: NetworkingHandle, + msg_logger: TMsgLogger, + ) -> Self { + Self { + our_node_addr: (*networking.local_peer_id()).into(), + loopback_sender, + networking, + msg_logger, + } + } + + pub fn networking_mut(&mut self) -> &mut NetworkingHandle { + &mut self.networking + } +} + +#[async_trait] +impl OutboundService for OutboundMessaging { + type Addr = PeerAddress; + type Error = MessagingError; + + async fn send_self + Send>(&mut self, message: T) -> Result<(), MessagingError> { + let message = message.into(); + self.msg_logger.log_outbound_message( + "self", + &self.our_node_addr.as_peer_id().to_string(), + &message.to_type_str(), + &message.get_message_tag(), + &message, + ); + self.loopback_sender + .send(message) + .await + .map_err(|_| MessagingError::LoopbackSendFailed)?; + return Ok(()); + } + + async fn send + Send>(&mut self, to: Self::Addr, message: T) -> Result<(), MessagingError> { + if to == self.our_node_addr { + return self.send_self(message).await; + } + + let msg = message.into(); + + self.msg_logger.log_outbound_message( + "send", + &to.to_string(), + &msg.to_type_str(), + &msg.get_message_tag(), + &msg, + ); + self.networking + .send_message(to.as_peer_id(), proto::network::Message::from(&msg)) + .await?; + + Ok(()) + } + + async fn broadcast<'a, I, T>(&mut self, committee: I, message: T) -> Result<(), MessagingError> + where + I: IntoIterator + Send, + T: Into + Send, + Self::Addr: 'a, + { + let message = message.into(); + + let (ours, theirs) = committee + .into_iter() + .partition::, _>(|x| **x == self.our_node_addr); + + if ours.is_empty() && theirs.is_empty() { + return Ok(()); + } + + // send it more than once to ourselves?? + for _ in ours { + self.msg_logger.log_outbound_message( + "broadcast", + &self.our_node_addr.to_string(), + &message.to_type_str(), + &message.get_message_tag(), + &message, + ); + self.loopback_sender + .send(message.clone()) + .await + .map_err(|_| MessagingError::LoopbackSendFailed)?; + } + + for to in &theirs { + self.msg_logger.log_outbound_message( + "broadcast", + &to.to_string(), + &message.to_type_str(), + &message.get_message_tag(), + &message, + ); + } + + self.networking + .send_multicast( + theirs.into_iter().map(|a| a.as_peer_id()).collect::>(), + (&message).into(), + ) + .await?; + + Ok(()) + } + + async fn publish_gossip + Send, TMsg: Into + Send>( + &mut self, + topic: TTopic, + message: TMsg, + ) -> Result<(), Self::Error> { + let msg = message.into(); + let topic = topic.into(); + self.msg_logger.log_outbound_message( + "gossip", + &topic.to_string(), + &msg.to_type_str(), + &msg.get_message_tag(), + &msg, + ); + self.networking.gossip(topic, (&msg).into()).await?; + Ok(()) + } +} diff --git a/applications/tari_validator_node/src/p2p/services/messaging/outbound.rs b/applications/tari_validator_node/src/p2p/services/messaging/outbound.rs deleted file mode 100644 index 8647b7f68..000000000 --- a/applications/tari_validator_node/src/p2p/services/messaging/outbound.rs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright 2021. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use async_trait::async_trait; -use tari_comms::types::CommsPublicKey; -use tari_consensus::messages::HotstuffMessage; -use tari_dan_p2p::{DanMessage, Message, OutboundService}; -use tokio::sync::mpsc; - -use crate::{comms::Destination, p2p::services::messaging::MessagingError}; - -const _LOG_TARGET: &str = "tari::dan::messages::outbound::validator_node"; - -#[derive(Debug, Clone)] -pub struct OutboundMessaging { - our_node_addr: CommsPublicKey, - msg_sender: mpsc::Sender<(Destination, DanMessage)>, - consensus_sender: mpsc::Sender<(Destination, HotstuffMessage)>, - loopback_sender: mpsc::Sender>, -} - -impl OutboundMessaging { - pub fn new( - our_node_addr: CommsPublicKey, - msg_sender: mpsc::Sender<(Destination, DanMessage)>, - consensus_sender: mpsc::Sender<(Destination, HotstuffMessage)>, - loopback_sender: mpsc::Sender>, - ) -> Self { - Self { - our_node_addr, - msg_sender, - consensus_sender, - loopback_sender, - } - } - - async fn send_message( - &self, - dest: Destination, - message: Message, - ) -> Result<(), MessagingError> { - match message { - Message::Consensus(msg) => { - self.consensus_sender - .send((dest, msg)) - .await - .map_err(|_| MessagingError::MessageSendFailed)?; - }, - Message::Dan(msg) => { - self.msg_sender - .send((dest, msg)) - .await - .map_err(|_| MessagingError::MessageSendFailed)?; - }, - } - - Ok(()) - } -} - -#[async_trait] -impl OutboundService for OutboundMessaging { - type Addr = CommsPublicKey; - type Error = MessagingError; - - async fn send_self> + Send>(&mut self, message: T) -> Result<(), MessagingError> { - self.loopback_sender - .send(message.into()) - .await - .map_err(|_| MessagingError::LoopbackSendFailed)?; - return Ok(()); - } - - async fn send> + Send>( - &mut self, - to: Self::Addr, - message: T, - ) -> Result<(), MessagingError> { - if to == self.our_node_addr { - return self.send_self(message).await; - } - - self.send_message(Destination::Peer(to), message.into()).await?; - - Ok(()) - } - - async fn broadcast<'a, I: IntoIterator + Send, T: Into> + Send>( - &mut self, - committee: I, - message: T, - ) -> Result<(), MessagingError> { - let message = message.into(); - let (ours, theirs) = committee - .into_iter() - .partition::, _>(|x| **x == self.our_node_addr); - - if ours.is_empty() && theirs.is_empty() { - return Ok(()); - } - - // send it more than once to ourselves?? - for _ in ours { - self.loopback_sender - .send(message.clone()) - .await - .map_err(|_| MessagingError::LoopbackSendFailed)?; - } - - self.send_message(Destination::Selected(theirs.into_iter().cloned().collect()), message) - .await?; - Ok(()) - } - - async fn flood> + Send>(&mut self, message: T) -> Result<(), MessagingError> { - self.send_message(Destination::Flood, message.into()).await - } -} diff --git a/applications/tari_validator_node/src/p2p/services/mod.rs b/applications/tari_validator_node/src/p2p/services/mod.rs index 9cbf07e12..12b47a994 100644 --- a/applications/tari_validator_node/src/p2p/services/mod.rs +++ b/applications/tari_validator_node/src/p2p/services/mod.rs @@ -21,7 +21,7 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // pub mod committee_state_sync; -pub mod comms_peer_provider; +// pub mod comms_peer_provider; pub mod mempool; -pub mod messaging; -pub mod networking; +pub mod message_dispatcher; +// pub mod messaging; diff --git a/applications/tari_validator_node/src/registration.rs b/applications/tari_validator_node/src/registration.rs index f29a20c47..cd52d6c3b 100644 --- a/applications/tari_validator_node/src/registration.rs +++ b/applications/tari_validator_node/src/registration.rs @@ -22,7 +22,6 @@ use std::{ net::{IpAddr, Ipv4Addr, SocketAddr}, - sync::Arc, time::Duration, }; @@ -30,8 +29,8 @@ use log::{error, info, warn}; use minotari_app_grpc::tari_rpc::RegisterValidatorNodeResponse; use tari_base_node_client::BaseNodeClientError; use tari_common::configuration::bootstrap::{grpc_default_port, ApplicationType}; -use tari_comms::NodeIdentity; -use tari_dan_common_types::Epoch; +use tari_dan_app_utilities::keypair::RistrettoKeypair; +use tari_dan_common_types::{Epoch, PeerAddress}; use tari_dan_storage_sqlite::error::SqliteStorageError; use tari_epoch_manager::{base_layer::EpochManagerHandle, EpochManagerError, EpochManagerEvent, EpochManagerReader}; use tari_shutdown::ShutdownSignal; @@ -64,8 +63,8 @@ pub enum AutoRegistrationError { pub async fn register( mut wallet_client: GrpcWalletClient, - node_identity: &NodeIdentity, - epoch_manager: &EpochManagerHandle, + keypair: &RistrettoKeypair, + epoch_manager: &EpochManagerHandle, ) -> Result { let balance = wallet_client.get_balance().await?; let constants = epoch_manager.get_base_layer_consensus_constants().await?; @@ -86,7 +85,7 @@ pub async fn register( loop { match wallet_client - .register_validator_node(node_identity, &fee_claim_public_key) + .register_validator_node(keypair, &fee_claim_public_key) .await { Ok(resp) => { @@ -127,22 +126,22 @@ pub async fn register( pub fn spawn( config: ApplicationConfig, - node_identity: Arc, - epoch_manager: EpochManagerHandle, + keypair: RistrettoKeypair, + epoch_manager: EpochManagerHandle, shutdown: ShutdownSignal, ) -> JoinHandle> { info!(target: LOG_TARGET, "♽️ Node configured for auto registration"); task::spawn(async move { - start(config, node_identity, epoch_manager, shutdown).await?; + start(config, keypair, epoch_manager, shutdown).await?; Ok(()) }) } async fn start( config: ApplicationConfig, - node_identity: Arc, - epoch_manager: EpochManagerHandle, + keypair: RistrettoKeypair, + epoch_manager: EpochManagerHandle, mut shutdown: ShutdownSignal, ) -> Result<(), AutoRegistrationError> { let mut rx = epoch_manager.subscribe().await?; @@ -152,7 +151,7 @@ async fn start( Ok(event) = rx.recv() => { match event { EpochManagerEvent::EpochChanged(epoch) => { - if let Err(err) = handle_epoch_changed(&config, &node_identity, &epoch_manager).await { + if let Err(err) = handle_epoch_changed(&config, &keypair, &epoch_manager).await { error!(target: LOG_TARGET, "Auto-registration failed for epoch {} with error: {}", epoch, err); } }, @@ -168,8 +167,8 @@ async fn start( async fn handle_epoch_changed( config: &ApplicationConfig, - node_identity: &NodeIdentity, - epoch_manager: &EpochManagerHandle, + keypair: &RistrettoKeypair, + epoch_manager: &EpochManagerHandle, ) -> Result<(), AutoRegistrationError> { if epoch_manager.last_registration_epoch().await?.is_none() { info!( @@ -186,7 +185,7 @@ async fn handle_epoch_changed( SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), port) })); - register(wallet_client, node_identity, epoch_manager).await?; + register(wallet_client, keypair, epoch_manager).await?; } else { info!( target: LOG_TARGET, diff --git a/applications/tari_validator_node/src/substate_resolver.rs b/applications/tari_validator_node/src/substate_resolver.rs index ff45427ec..fa8bd6661 100644 --- a/applications/tari_validator_node/src/substate_resolver.rs +++ b/applications/tari_validator_node/src/substate_resolver.rs @@ -5,7 +5,7 @@ use std::{collections::HashSet, time::Instant}; use async_trait::async_trait; use log::*; -use tari_comms::types::CommsPublicKey; +use tari_common_types::types::PublicKey; use tari_dan_common_types::{Epoch, ShardId}; use tari_dan_engine::{runtime::VirtualSubstates, state_store::memory::MemoryStateStore}; use tari_dan_storage::{consensus_models::SubstateRecord, StateStore, StorageError}; @@ -38,8 +38,8 @@ impl TariSubstateResolver where TStateStore: StateStore, - TEpochManager: EpochManagerReader, - TValidatorNodeClientFactory: ValidatorNodeClientFactory, + TEpochManager: EpochManagerReader, + TValidatorNodeClientFactory: ValidatorNodeClientFactory, TSubstateCache: SubstateCache, { pub fn new( @@ -119,7 +119,7 @@ where async fn resolve_remote_virtual_substates( &self, - claim_instructions: Vec<(Epoch, CommsPublicKey, ShardId)>, + claim_instructions: Vec<(Epoch, PublicKey, ShardId)>, ) -> Result { let mut retrieved_substates = VirtualSubstates::with_capacity(claim_instructions.len()); for (epoch, vn_pk, shard) in claim_instructions { @@ -151,9 +151,9 @@ where impl SubstateResolver for TariSubstateResolver where - TStateStore: StateStore + Sync + Send, - TEpochManager: EpochManagerReader, - TValidatorNodeClientFactory: ValidatorNodeClientFactory, + TStateStore: StateStore + Sync + Send, + TEpochManager: EpochManagerReader, + TValidatorNodeClientFactory: ValidatorNodeClientFactory, TSubstateCache: SubstateCache, { type Error = SubstateResolverError; @@ -211,8 +211,8 @@ where let signer = transaction.signer_public_key(); if let Some(vn) = validators.values().find(|vn| vn.fee_claim_public_key != *signer) { return Err(SubstateResolverError::UnauthorizedFeeClaim { - validator_address: vn.address.clone(), - signer: signer.clone(), + validator_address: vn.address.to_string(), + signer: signer.to_string(), }); } @@ -254,8 +254,5 @@ pub enum SubstateResolverError { #[error("Epoch manager error: {0}")] EpochManagerError(#[from] EpochManagerError), #[error("Unauthorized fee claim: validator node {validator_address} (transaction signed by: {signer})")] - UnauthorizedFeeClaim { - validator_address: CommsPublicKey, - signer: CommsPublicKey, - }, + UnauthorizedFeeClaim { validator_address: String, signer: String }, } diff --git a/applications/tari_validator_node/src/virtual_substate.rs b/applications/tari_validator_node/src/virtual_substate.rs index 82e3e1444..ffe5128f6 100644 --- a/applications/tari_validator_node/src/virtual_substate.rs +++ b/applications/tari_validator_node/src/virtual_substate.rs @@ -3,7 +3,6 @@ use log::*; use tari_common_types::types::PublicKey; -use tari_comms::types::CommsPublicKey; use tari_dan_common_types::Epoch; use tari_dan_engine::runtime::VirtualSubstates; use tari_dan_storage::{consensus_models::Block, StateStore, StorageError}; @@ -24,8 +23,8 @@ pub struct VirtualSubstateManager { impl VirtualSubstateManager where - TStateStore: StateStore, - TEpochManager: EpochManagerReader, + TStateStore: StateStore, + TEpochManager: EpochManagerReader, { pub fn new(state_store: TStateStore, epoch_manager: TEpochManager) -> Self { Self { @@ -48,7 +47,7 @@ where pub fn get_virtual_substates( &self, - claim_instructions: Vec<(Epoch, CommsPublicKey)>, + claim_instructions: Vec<(Epoch, PublicKey)>, ) -> Result { let mut virtual_substates = VirtualSubstates::with_capacity(claim_instructions.len()); @@ -75,11 +74,11 @@ where fn generate_validator_fee_claim( &self, epoch: Epoch, - address: &PublicKey, + public_key: &PublicKey, ) -> Result { let claim = self .store - .with_read_tx(|tx| self.generate_validator_fee_claim_inner(tx, epoch, address))?; + .with_read_tx(|tx| self.generate_validator_fee_claim_inner(tx, epoch, public_key))?; Ok(VirtualSubstate::UnclaimedValidatorFee(claim)) } @@ -87,16 +86,16 @@ where &self, tx: &mut ::ReadTransaction<'_>, epoch: Epoch, - address: &PublicKey, + public_key: &PublicKey, ) -> Result { - let validator_fee = Block::get_total_due_for_epoch(tx, epoch, address)?; + let validator_fee = Block::get_total_due_for_epoch(tx, epoch, public_key)?; // If validator_fee == 0: // A validator may claim without knowing that they have no fees for the epoch. // As long as they can pay the fee for the transaction, we can add the 0 claim. Ok(FeeClaim { epoch: epoch.as_u64(), - validator_public_key: address.clone(), + validator_public_key: public_key.clone(), amount: Amount::try_from(validator_fee).expect("Fee greater than Amount::MAX"), }) } diff --git a/applications/tari_validator_node_cli/Cargo.toml b/applications/tari_validator_node_cli/Cargo.toml index 01bc45e6f..26c36ac09 100644 --- a/applications/tari_validator_node_cli/Cargo.toml +++ b/applications/tari_validator_node_cli/Cargo.toml @@ -26,7 +26,7 @@ cargo_metadata = "0.15.3" dirs = "4.0.0" jfs = "0.7.1" log = "0.4.17" -multiaddr = "0.14.0" +multiaddr = "0.18.0" reqwest = { version = "0.11.11", features = ["json"] } serde = "1.0" serde_json = "1.0" diff --git a/applications/tari_validator_node_cli/src/command/debug.rs b/applications/tari_validator_node_cli/src/command/debug.rs deleted file mode 100644 index 14e36404e..000000000 --- a/applications/tari_validator_node_cli/src/command/debug.rs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2022. The Tari Project -// -// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -// following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -// disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -// following disclaimer in the documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -// products derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -use clap::{Args, Subcommand}; -use tari_validator_node_client::ValidatorNodeClient; - -#[derive(Debug, Subcommand, Clone)] -pub enum DebugSubcommand { - ShowMessages(ShowMessagesArgs), -} - -#[derive(Debug, Args, Clone)] -pub struct ShowMessagesArgs { - pub message_tag: String, -} - -impl DebugSubcommand { - pub async fn handle(self, client: ValidatorNodeClient) -> Result<(), anyhow::Error> { - #[allow(clippy::enum_glob_use)] - use DebugSubcommand::*; - match self { - ShowMessages(args) => handle_list_messages(client, args).await?, - } - Ok(()) - } -} - -async fn handle_list_messages(mut client: ValidatorNodeClient, args: ShowMessagesArgs) -> Result<(), anyhow::Error> { - let logs = client.get_message_logs(&args.message_tag).await?; - if logs.is_empty() { - println!("No messages found for tag '{}'", args.message_tag); - return Ok(()); - } - - println!("Messages for tag '{}':", args.message_tag); - for log in logs { - println!("{}", log); - println!(); - } - Ok(()) -} diff --git a/applications/tari_validator_node_cli/src/command/mod.rs b/applications/tari_validator_node_cli/src/command/mod.rs index 748119a0f..3e5247e06 100644 --- a/applications/tari_validator_node_cli/src/command/mod.rs +++ b/applications/tari_validator_node_cli/src/command/mod.rs @@ -33,13 +33,11 @@ pub use vn::VnSubcommand; use crate::command::{ account::AccountsSubcommand, - debug::DebugSubcommand, manifest::ManifestSubcommand, peer::PeersSubcommand, transaction::TransactionSubcommand, }; -mod debug; mod manifest; mod account; @@ -63,6 +61,4 @@ pub enum Command { Manifests(ManifestSubcommand), #[clap(subcommand, alias = "peer")] Peers(PeersSubcommand), - #[clap(subcommand)] - Debug(DebugSubcommand), } diff --git a/applications/tari_validator_node_cli/src/command/vn.rs b/applications/tari_validator_node_cli/src/command/vn.rs index 9932d4abf..77ac198ae 100644 --- a/applications/tari_validator_node_cli/src/command/vn.rs +++ b/applications/tari_validator_node_cli/src/command/vn.rs @@ -99,7 +99,7 @@ async fn handle_get_fee_info(args: GetFeesArgs, client: &mut ValidatorNodeClient for fee in resp.fees { table.add_row(table_row!( - fee.validator_addr, + fee.validator_public_key, fee.epoch, fee.block_id, fee.total_fee_due, diff --git a/applications/tari_validator_node_cli/src/key_manager.rs b/applications/tari_validator_node_cli/src/key_manager.rs index fd9d092bd..2ea5a4520 100644 --- a/applications/tari_validator_node_cli/src/key_manager.rs +++ b/applications/tari_validator_node_cli/src/key_manager.rs @@ -30,8 +30,11 @@ use anyhow::anyhow; use serde_json as json; use serde_json::json; use tari_common_types::types::{PrivateKey, PublicKey}; -use tari_crypto::{keys::PublicKey as PublicKeyT, tari_utilities::hex::Hex}; -use tari_dan_common_types::{crypto::create_key_pair, NodeAddressable}; +use tari_crypto::{ + keys::PublicKey as PublicKeyT, + tari_utilities::{hex::Hex, ByteArray}, +}; +use tari_dan_common_types::crypto::create_key_pair; use tari_template_lib::{crypto::RistrettoPublicKeyBytes, models::NonFungibleAddress}; #[derive(Debug)] diff --git a/applications/tari_validator_node_cli/src/main.rs b/applications/tari_validator_node_cli/src/main.rs index 62235179e..2a1826c99 100644 --- a/applications/tari_validator_node_cli/src/main.rs +++ b/applications/tari_validator_node_cli/src/main.rs @@ -66,7 +66,6 @@ async fn handle_command(command: Command, base_dir: PathBuf, client: ValidatorNo Command::Accounts(cmd) => cmd.handle(base_dir, client).await?, Command::Manifests(cmd) => cmd.handle()?, Command::Peers(cmd) => cmd.handle(client).await?, - Command::Debug(cmd) => cmd.handle(client).await?, } Ok(()) diff --git a/applications/tari_validator_node_web_ui/src/routes/VN/Components/Connections.tsx b/applications/tari_validator_node_web_ui/src/routes/VN/Components/Connections.tsx index 530919731..4ded84602 100644 --- a/applications/tari_validator_node_web_ui/src/routes/VN/Components/Connections.tsx +++ b/applications/tari_validator_node_web_ui/src/routes/VN/Components/Connections.tsx @@ -20,32 +20,39 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { addPeer, getConnections } from '../../../utils/json_rpc'; -import { toHexString, shortenString } from './helpers'; -import Table from '@mui/material/Table'; -import TableBody from '@mui/material/TableBody'; -import TableCell from '@mui/material/TableCell'; -import TableContainer from '@mui/material/TableContainer'; -import TableHead from '@mui/material/TableHead'; -import TableRow from '@mui/material/TableRow'; +import React, { useCallback, useEffect, useRef, useState } from "react"; +import { addPeer, getConnections } from "../../../utils/json_rpc"; +import { toHexString, shortenString } from "./helpers"; +import Table from "@mui/material/Table"; +import TableBody from "@mui/material/TableBody"; +import TableCell from "@mui/material/TableCell"; +import TableContainer from "@mui/material/TableContainer"; +import TableHead from "@mui/material/TableHead"; +import TableRow from "@mui/material/TableRow"; import { DataTableCell, BoxHeading2, -} from '../../../Components/StyledComponents'; -import AddIcon from '@mui/icons-material/Add'; -import Button from '@mui/material/Button'; -import { TextField } from '@mui/material'; -import { Form } from 'react-router-dom'; -import Fade from '@mui/material/Fade'; -import CopyToClipboard from '../../../Components/CopyToClipboard'; +} from "../../../Components/StyledComponents"; +import AddIcon from "@mui/icons-material/Add"; +import Button from "@mui/material/Button"; +import { TextField } from "@mui/material"; +import { Form } from "react-router-dom"; +import Fade from "@mui/material/Fade"; +import CopyToClipboard from "../../../Components/CopyToClipboard"; interface IConnection { + connection_id: number; address: string; - age: number; + age: Duration; direction: boolean; - node_id: number[]; - public_key: string; + peer_id: string; + ping_latency: Duration | null; + // public_key: string; +} + +interface Duration { + secs: number; + nanos: number; } const useInterval = (fn: () => Promise, ms: number) => { @@ -70,15 +77,18 @@ const useInterval = (fn: () => Promise, ms: number) => { function Connections() { const [connections, setConnections] = useState([]); const [showPeerDialog, setShowAddPeerDialog] = useState(false); - const [formState, setFormState] = useState({ publicKey: '', address: '' }); + const [formState, setFormState] = useState({ publicKey: "", address: "" }); const showAddPeerDialog = (setElseToggle: boolean = !showPeerDialog) => { setShowAddPeerDialog(setElseToggle); }; const onSubmitAddPeer = async () => { - await addPeer(formState.publicKey, [formState.address]); - setFormState({ publicKey: '', address: '' }); + await addPeer( + formState.publicKey, + formState.address ? [formState.address] : [], + ); + setFormState({ publicKey: "", address: "" }); setShowAddPeerDialog(false); }; const onChange = (e: React.ChangeEvent) => { @@ -141,30 +151,38 @@ function Connections() {
+ Peer id Address Age Direction - Node id - Public key + Latency - {connections.map( - ({ address, age, direction, node_id, public_key }) => ( - - {address} - {age} - - {direction ? 'Inbound' : 'Outbound'} - - {toHexString(node_id)} - - {shortenString(public_key)} - - - - ) - )} + {connections && + connections.map( + ({ + connection_id, + address, + age, + direction, + peer_id, + ping_latency, + }) => ( + + + {peer_id ? shortenString(peer_id) : "--"} + + + {address} + {displayDuration(age)} + {direction} + + {ping_latency ? displayDuration(ping_latency) : "--"} + + + ), + )}
@@ -172,4 +190,27 @@ function Connections() { ); } +function displayDuration(duration: Duration) { + if (duration.secs === 0) { + if (duration.nanos > 1000000) { + return `${(duration.nanos / 1000000).toFixed(2)}ms`; + } + if (duration.nanos > 1000) { + return `${(duration.nanos / 1000).toFixed(2)}µs`; + } + return `${duration.nanos / 1000}ns`; + } + if (duration.secs > 60 * 60) { + return `${(duration.secs / 60 / 60).toFixed(0)}h${( + duration.secs / 60 + ).toFixed(0)}m`; + } + if (duration.secs > 60) { + return `${(duration.secs / 60).toFixed(0)}m${(duration.secs % 60).toFixed( + 0, + )}s`; + } + return `${duration.secs}.${(duration.nanos / 1000000).toFixed(0)}s`; +} + export default Connections; diff --git a/applications/tari_validator_node_web_ui/src/routes/VN/Components/Info.tsx b/applications/tari_validator_node_web_ui/src/routes/VN/Components/Info.tsx index 5785724a9..9173079ce 100644 --- a/applications/tari_validator_node_web_ui/src/routes/VN/Components/Info.tsx +++ b/applications/tari_validator_node_web_ui/src/routes/VN/Components/Info.tsx @@ -31,7 +31,7 @@ import TableContainer from "@mui/material/TableContainer"; import TableRow from "@mui/material/TableRow"; import Button from "@mui/material/Button"; import { DataTableCell } from "../../../Components/StyledComponents"; -import {TextField} from "@mui/material"; +import { TextField } from "@mui/material"; function Info({ epoch, @@ -44,7 +44,7 @@ function Info({ }) { const [registering, setRegistering] = useState(false); const [registerMessage, setRegisterMessage] = useState(""); - const [feeClaimPublicKey, setRegisterFeeClaimPublicKey] = useState(''); + const [feeClaimPublicKey, setRegisterFeeClaimPublicKey] = useState(""); const register = () => { setRegistering(true); registerValidatorNode(feeClaimPublicKey).then((response) => { @@ -79,11 +79,13 @@ function Info({ Shard key setRegisterFeeClaimPublicKey(e.target.value)} /> + disabled={registering} + name="feeClaimFublicKey" + label="Fee Claim Public Key" + style={{ flexGrow: 1 }} + value={feeClaimPublicKey} + onChange={(e) => setRegisterFeeClaimPublicKey(e.target.value)} + />