We want to reuse the clients libp2p instance for receiving threshold signature shares directly from our users, for key resharing/rotation as validators join/leave the active validator set, broadcasting, and for other various multiparty computations. Tightly coupling this logic with the substrate client and using non-standard libp2p protocols seems the most appropriate way to do this.
It seems the best way to do this might be via forking sc-networking. Since this is not fun to maintian, might it make sense to add a feature to provide additional protocols/handlers via the sc-networking config?
Orchestra
in Polkadot, and the network protocol and bridge crates which use it.