From 81bdbdf8f28da2fe7456e6fd61d1cedc93bd7687 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 18 Nov 2022 17:16:05 +0800 Subject: [PATCH 01/26] upgrade libp2p to 0.50.0 --- Cargo.lock | 439 +++++++++++++++++++------ Cargo.toml | 3 + client/authority-discovery/Cargo.toml | 2 +- client/cli/Cargo.toml | 2 +- client/consensus/common/Cargo.toml | 2 +- client/network-gossip/Cargo.toml | 2 +- client/network/Cargo.toml | 2 +- client/network/bitswap/Cargo.toml | 2 +- client/network/common/Cargo.toml | 2 +- client/network/light/Cargo.toml | 2 +- client/network/src/behaviour.rs | 2 +- client/network/src/discovery.rs | 2 +- client/network/src/service.rs | 29 +- client/network/src/transport.rs | 8 +- client/network/sync/Cargo.toml | 2 +- client/network/test/Cargo.toml | 2 +- client/network/transactions/Cargo.toml | 2 +- client/offchain/Cargo.toml | 2 +- client/peerset/Cargo.toml | 2 +- client/telemetry/Cargo.toml | 2 +- client/telemetry/src/transport.rs | 2 +- 21 files changed, 373 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a22cfa8ba8dd6..74e13b8e351b2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,6 +136,45 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "asn1-rs" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf6690c370453db30743b373a60ba498fc0d6d83b11f4abfd87a84a075db5dd4" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "asn1_der" version = "0.7.4" @@ -197,6 +236,18 @@ dependencies = [ "vec-arena", ] +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock", + "autocfg", + "blocking", + "futures-lite", +] + [[package]] name = "async-global-executor" version = "2.0.2" @@ -250,6 +301,18 @@ dependencies = [ "event-listener", ] +[[package]] +name = "async-net" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e67316bc7eff608fe723df5d32ed639946adcd69e07df41fd42a7b411f1f" +dependencies = [ + "async-io", + "autocfg", + "blocking", + "futures-lite", +] + [[package]] name = "async-process" version = "1.4.0" @@ -269,9 +332,9 @@ dependencies = [ [[package]] name = "async-std" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52580991739c5cdb36cde8b2a516371c0a3b70dda36d916cc08b82372916808c" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-attributes", "async-channel", @@ -288,7 +351,6 @@ dependencies = [ "kv-log-macro", "log", "memchr", - "num_cpus", "once_cell", "pin-project-lite 0.2.6", "pin-utils", @@ -766,9 +828,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "bzip2-sys" @@ -914,7 +976,7 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time", + "time 0.1.44", "winapi", ] @@ -1601,6 +1663,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "der-parser" +version = "8.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d4bc9b0db0a0df9ae64634ac5bdefb7afcb534e182275ca0beadbe486701c1" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1695,20 +1771,21 @@ dependencies = [ ] [[package]] -name = "dissimilar" -version = "1.0.2" +name = "displaydoc" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4b29f4b9bb94bf267d57269fd0706d343a160937108e9619fe380645428abb" +checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "dns-parser" -version = "0.8.0" +name = "dissimilar" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d33be9473d06f75f58220f71f7a9317aca647dc061dbd3c361b0bef505fbea" -dependencies = [ - "byteorder", - "quick-error", -] +checksum = "fc4b29f4b9bb94bf267d57269fd0706d343a160937108e9619fe380645428abb" [[package]] name = "doc-comment" @@ -2489,9 +2566,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" dependencies = [ "futures-channel", "futures-core", @@ -2504,9 +2581,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" dependencies = [ "futures-core", "futures-sink", @@ -2514,15 +2591,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" [[package]] name = "futures-executor" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6" +checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" dependencies = [ "futures-core", "futures-task", @@ -2532,9 +2609,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" [[package]] name = "futures-lite" @@ -2553,9 +2630,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" dependencies = [ "proc-macro2", "quote", @@ -2564,9 +2641,9 @@ dependencies = [ [[package]] name = "futures-rustls" -version = "0.22.1" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01fe9932a224b72b45336d96040aa86386d674a31d0af27d800ea7bc8ca97fe" +checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" dependencies = [ "futures-io", "rustls", @@ -2575,15 +2652,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" [[package]] name = "futures-timer" @@ -2593,9 +2670,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" dependencies = [ "futures-channel", "futures-core", @@ -3043,9 +3120,9 @@ dependencies = [ [[package]] name = "if-watch" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065c008e570a43c00de6aed9714035e5ea6a498c255323db9091722af6ee67dd" +checksum = "ba7abdbb86e485125dad06c2691e1e393bf3b08c7b743b43aa162a00fd39062e" dependencies = [ "async-io", "core-foundation", @@ -3055,6 +3132,7 @@ dependencies = [ "ipnet", "log", "rtnetlink", + "smol", "system-configuration", "windows", ] @@ -3553,16 +3631,14 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec878fda12ebec479186b3914ebc48ff180fa4c51847e11a1a68bf65249e02c1" +version = "0.50.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "bytes", "futures", "futures-timer", "getrandom 0.2.3", "instant", - "lazy_static", "libp2p-core", "libp2p-dns", "libp2p-identify", @@ -3572,9 +3648,9 @@ dependencies = [ "libp2p-mplex", "libp2p-noise", "libp2p-ping", + "libp2p-quic", "libp2p-request-response", "libp2p-swarm", - "libp2p-swarm-derive", "libp2p-tcp", "libp2p-wasm-ext", "libp2p-websocket", @@ -3587,9 +3663,8 @@ dependencies = [ [[package]] name = "libp2p-core" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799676bb0807c788065e57551c6527d461ad572162b0519d1958946ff9e0539d" +version = "0.38.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "asn1_der", "bs58", @@ -3599,11 +3674,11 @@ dependencies = [ "futures", "futures-timer", "instant", - "lazy_static", "log", "multiaddr", "multihash", "multistream-select", + "once_cell", "parking_lot 0.12.1", "pin-project", "prost", @@ -3620,9 +3695,8 @@ dependencies = [ [[package]] name = "libp2p-dns" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2322c9fb40d99101def6a01612ee30500c89abbbecb6297b3cd252903a4c1720" +version = "0.38.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "async-std-resolver", "futures", @@ -3635,9 +3709,8 @@ dependencies = [ [[package]] name = "libp2p-identify" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf9a121f699e8719bda2e6e9e9b6ddafc6cff4602471d6481c1067930ccb29b" +version = "0.41.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "asynchronous-codec", "futures", @@ -3656,9 +3729,8 @@ dependencies = [ [[package]] name = "libp2p-kad" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6721c200e2021f6c3fab8b6cf0272ead8912d871610ee194ebd628cecf428f22" +version = "0.42.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "arrayvec 0.7.2", "asynchronous-codec", @@ -3684,13 +3756,11 @@ dependencies = [ [[package]] name = "libp2p-mdns" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "761704e727f7d68d58d7bc2231eafae5fc1b9814de24290f126df09d4bd37a15" +version = "0.42.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "async-io", "data-encoding", - "dns-parser", "futures", "if-watch", "libp2p-core", @@ -3699,14 +3769,14 @@ dependencies = [ "rand 0.8.5", "smallvec", "socket2", + "trust-dns-proto", "void", ] [[package]] name = "libp2p-metrics" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ee31b08e78b7b8bfd1c4204a9dd8a87b4fcdf6dafc57eb51701c1c264a81cb9" +version = "0.11.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "libp2p-core", "libp2p-identify", @@ -3718,9 +3788,8 @@ dependencies = [ [[package]] name = "libp2p-mplex" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692664acfd98652de739a8acbb0a0d670f1d67190a49be6b4395e22c37337d89" +version = "0.38.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "asynchronous-codec", "bytes", @@ -3736,16 +3805,15 @@ dependencies = [ [[package]] name = "libp2p-noise" -version = "0.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "048155686bd81fe6cb5efdef0c6290f25ad32a0a42e8f4f72625cf6a505a206f" +version = "0.41.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "bytes", "curve25519-dalek 3.0.2", "futures", - "lazy_static", "libp2p-core", "log", + "once_cell", "prost", "prost-build", "rand 0.8.5", @@ -3758,9 +3826,8 @@ dependencies = [ [[package]] name = "libp2p-ping" -version = "0.40.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7228b9318d34689521349a86eb39a3c3a802c9efc99a0568062ffb80913e3f91" +version = "0.41.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "futures", "futures-timer", @@ -3772,11 +3839,30 @@ dependencies = [ "void", ] +[[package]] +name = "libp2p-quic" +version = "0.7.0-alpha" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +dependencies = [ + "async-std", + "bytes", + "futures", + "futures-timer", + "if-watch", + "libp2p-core", + "libp2p-tls", + "log", + "parking_lot 0.12.1", + "quinn-proto", + "rand 0.8.5", + "rustls", + "thiserror", +] + [[package]] name = "libp2p-request-response" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8827af16a017b65311a410bb626205a9ad92ec0473967618425039fa5231adc1" +version = "0.23.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "async-trait", "bytes", @@ -3792,16 +3878,17 @@ dependencies = [ [[package]] name = "libp2p-swarm" -version = "0.40.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46d13df7c37807965d82930c0e4b04a659efcb6cca237373b206043db5398ecf" +version = "0.41.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ + "async-std", "either", "fnv", "futures", "futures-timer", "instant", "libp2p-core", + "libp2p-swarm-derive", "log", "pin-project", "rand 0.8.5", @@ -3812,9 +3899,8 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eddc4497a8b5a506013c40e8189864f9c3a00db2b25671f428ae9007f3ba32" +version = "0.30.2" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "heck", "quote", @@ -3823,9 +3909,8 @@ dependencies = [ [[package]] name = "libp2p-tcp" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9839d96761491c6d3e238e70554b856956fca0ab60feb9de2cd08eed4473fa92" +version = "0.38.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "async-io", "futures", @@ -3837,11 +3922,27 @@ dependencies = [ "socket2", ] +[[package]] +name = "libp2p-tls" +version = "0.1.0-alpha" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +dependencies = [ + "futures", + "futures-rustls", + "libp2p-core", + "rcgen", + "ring", + "rustls", + "thiserror", + "webpki", + "x509-parser", + "yasna", +] + [[package]] name = "libp2p-wasm-ext" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b5b8e7a73e379e47b1b77f8a82c4721e97eca01abcd18e9cd91a23ca6ce97" +version = "0.38.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "futures", "js-sys", @@ -3853,9 +3954,8 @@ dependencies = [ [[package]] name = "libp2p-websocket" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3758ae6f89b2531a24b6d9f5776bda6a626b60a57600d7185d43dfa75ca5ecc4" +version = "0.40.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "either", "futures", @@ -3872,9 +3972,8 @@ dependencies = [ [[package]] name = "libp2p-yamux" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30f079097a21ad017fc8139460630286f02488c8c13b26affb46623aa20d8845" +version = "0.42.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "futures", "libp2p-core", @@ -4259,14 +4358,14 @@ checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" [[package]] name = "multiaddr" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c580bfdd8803cce319b047d239559a22f809094aaea4ac13902a1fdcfcd4261" +checksum = "a4aebdb21e90f81d13ed01dc84123320838e53963c2ca94b60b305d3fa64f31e" dependencies = [ "arrayref", - "bs58", "byteorder", "data-encoding", + "multibase", "multihash", "percent-encoding", "serde", @@ -4326,8 +4425,7 @@ checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333" [[package]] name = "multistream-select" version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bc41247ec209813e2fd414d6e16b9d94297dacf3cd613fa6ef09cd4d9755c10" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "bytes", "futures", @@ -4931,6 +5029,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "oid-registry" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d4bda43fd1b844cbc6e6e54b5444e2b1bc7838bce59ad205902cccbb26d6761" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.16.0" @@ -6559,6 +6666,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" +[[package]] +name = "pem" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c64931a1a212348ec4f3b4362585eca7159d0d09cbdf4a7f74f02173596fd4" +dependencies = [ + "base64", +] + [[package]] name = "percent-encoding" version = "2.1.0" @@ -6917,9 +7033,8 @@ dependencies = [ [[package]] name = "prost-codec" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011ae9ff8359df7915f97302d591cdd9e0e27fbd5a4ddc5bd13b71079bb20987" +version = "0.3.0" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "asynchronous-codec", "bytes", @@ -7006,6 +7121,24 @@ dependencies = [ "pin-project-lite 0.1.12", ] +[[package]] +name = "quinn-proto" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57098b1a3d2159d13dc3a98c0e3a5f8ab91ac3dd2471e52b1d712ea0c1085555" +dependencies = [ + "bytes", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki", +] + [[package]] name = "quote" version = "1.0.18" @@ -7152,6 +7285,18 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "rcgen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" +dependencies = [ + "pem", + "ring", + "time 0.3.17", + "yasna", +] + [[package]] name = "redox_syscall" version = "0.2.10" @@ -7422,6 +7567,15 @@ dependencies = [ "semver 1.0.4", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "0.35.9" @@ -7438,9 +7592,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.20.2" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" +checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" dependencies = [ "log", "ring", @@ -7489,8 +7643,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" dependencies = [ "futures", "pin-project", @@ -9223,6 +9376,24 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +[[package]] +name = "smol" +version = "1.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cf3b5351f3e783c1d79ab5fc604eeed8b8ae9abd36b166e8b87a089efd85e4" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", + "once_cell", +] + [[package]] name = "snap" version = "1.0.5" @@ -10667,6 +10838,33 @@ dependencies = [ "winapi", ] +[[package]] +name = "time" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +dependencies = [ + "itoa 1.0.4", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +dependencies = [ + "time-core", +] + [[package]] name = "tiny-bip39" version = "0.8.2" @@ -10976,8 +11174,10 @@ dependencies = [ "lazy_static", "rand 0.8.5", "smallvec", + "socket2", "thiserror", "tinyvec", + "tokio", "tracing", "url", ] @@ -12094,6 +12294,24 @@ dependencies = [ "zeroize", ] +[[package]] +name = "x509-parser" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" +dependencies = [ + "asn1-rs", + "base64", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror", + "time 0.3.17", +] + [[package]] name = "yamux" version = "0.10.2" @@ -12108,6 +12326,15 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "yasna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346d34a236c9d3e5f3b9b74563f238f955bbd05fa0b8b4efa53c130c43982f4c" +dependencies = [ + "time 0.3.17", +] + [[package]] name = "zeroize" version = "1.5.7" diff --git a/Cargo.toml b/Cargo.toml index 956c106e0dc2d..809eb8dbf24dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -310,3 +310,6 @@ inherits = "release" lto = "fat" # https://doc.rust-lang.org/rustc/codegen-options/index.html#codegen-units codegen-units = 1 + +[patch.crates-io] +libp2p = { version = "0.50.0", git = "https://github.com/libp2p/rust-libp2p.git", branch = "master" } diff --git a/client/authority-discovery/Cargo.toml b/client/authority-discovery/Cargo.toml index 0da79bd70ff44..e43694648e459 100644 --- a/client/authority-discovery/Cargo.toml +++ b/client/authority-discovery/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = futures = "0.3.21" futures-timer = "3.0.1" ip_network = "0.4.1" -libp2p = { version = "0.49.0", default-features = false, features = ["kad"] } +libp2p = { version = "0.50.0", features = ["kad"] } log = "0.4.17" prost = "0.11" rand = "0.7.2" diff --git a/client/cli/Cargo.toml b/client/cli/Cargo.toml index 50025d591e19c..8f194f743671f 100644 --- a/client/cli/Cargo.toml +++ b/client/cli/Cargo.toml @@ -18,7 +18,7 @@ chrono = "0.4.10" clap = { version = "4.0.9", features = ["derive", "string"] } fdlimit = "0.2.1" futures = "0.3.21" -libp2p = "0.49.0" +libp2p = "0.50.0" log = "0.4.17" names = { version = "0.13.0", default-features = false } parity-scale-codec = "3.0.0" diff --git a/client/consensus/common/Cargo.toml b/client/consensus/common/Cargo.toml index 971ee71ab8040..d65f3c9bb8048 100644 --- a/client/consensus/common/Cargo.toml +++ b/client/consensus/common/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] async-trait = "0.1.57" futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" -libp2p = { version = "0.49.0", default-features = false } +libp2p = "0.50.0" log = "0.4.17" parking_lot = "0.12.1" serde = { version = "1.0", features = ["derive"] } diff --git a/client/network-gossip/Cargo.toml b/client/network-gossip/Cargo.toml index 31930515ff118..bf525855f4dde 100644 --- a/client/network-gossip/Cargo.toml +++ b/client/network-gossip/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] ahash = "0.7.6" futures = "0.3.21" futures-timer = "3.0.1" -libp2p = { version = "0.49.0", default-features = false } +libp2p = "0.50.0" log = "0.4.17" lru = "0.8.1" tracing = "0.1.29" diff --git a/client/network/Cargo.toml b/client/network/Cargo.toml index afd9880148081..d31686b4d9e84 100644 --- a/client/network/Cargo.toml +++ b/client/network/Cargo.toml @@ -26,7 +26,7 @@ fnv = "1.0.6" futures = "0.3.21" futures-timer = "3.0.2" ip_network = "0.4.1" -libp2p = { version = "0.49.0", features = ["async-std", "dns", "identify", "kad", "mdns-async-io", "mplex", "noise", "ping", "tcp", "yamux", "websocket"] } +libp2p = { version = "0.50.0", features = ["async-std", "dns", "identify", "kad", "macros", "mdns", "mplex", "noise", "ping", "tcp", "yamux", "websocket"] } linked_hash_set = "0.1.3" linked-hash-map = "0.5.4" log = "0.4.17" diff --git a/client/network/bitswap/Cargo.toml b/client/network/bitswap/Cargo.toml index 9793eeae51b26..1100feeb65bd2 100644 --- a/client/network/bitswap/Cargo.toml +++ b/client/network/bitswap/Cargo.toml @@ -19,7 +19,7 @@ prost-build = "0.11" [dependencies] cid = "0.8.6" futures = "0.3.21" -libp2p = "0.49.0" +libp2p = "0.50.0" log = "0.4.17" prost = "0.11" thiserror = "1.0" diff --git a/client/network/common/Cargo.toml b/client/network/common/Cargo.toml index bf4a89c70b88c..e959b9822dc69 100644 --- a/client/network/common/Cargo.toml +++ b/client/network/common/Cargo.toml @@ -25,7 +25,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", features = [ ] } futures = "0.3.21" futures-timer = "3.0.2" -libp2p = { version = "0.49.0", features = [ "request-response", "kad" ] } +libp2p = { version = "0.50.0", features = ["request-response", "kad"] } linked_hash_set = "0.1.3" prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" } smallvec = "1.8.0" diff --git a/client/network/light/Cargo.toml b/client/network/light/Cargo.toml index c7ec6eda7a70b..9991086fa04d4 100644 --- a/client/network/light/Cargo.toml +++ b/client/network/light/Cargo.toml @@ -22,7 +22,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", features = [ "derive", ] } futures = "0.3.21" -libp2p = "0.49.0" +libp2p = "0.50.0" log = "0.4.16" prost = "0.11" sp-blockchain = { version = "4.0.0-dev", path = "../../../primitives/blockchain" } diff --git a/client/network/src/behaviour.rs b/client/network/src/behaviour.rs index 2e646956e9d8c..6d38a1537e0e4 100644 --- a/client/network/src/behaviour.rs +++ b/client/network/src/behaviour.rs @@ -29,7 +29,7 @@ use libp2p::{ core::{Multiaddr, PeerId, PublicKey}, identify::Info as IdentifyInfo, kad::record, - NetworkBehaviour, + swarm::NetworkBehaviour, }; use sc_consensus::import_queue::{IncomingBlock, RuntimeOrigin}; diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 00fc78061293d..73f0ca13cd74e 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -64,7 +64,7 @@ use libp2p::{ GetClosestPeersError, Kademlia, KademliaBucketInserts, KademliaConfig, KademliaEvent, QueryId, QueryResult, Quorum, Record, }, - mdns::{Mdns, MdnsConfig, MdnsEvent}, + mdns::{async_io::Mdns, Config as MdnsConfig, Event as MdnsEvent}, multiaddr::Protocol, swarm::{ behaviour::toggle::{Toggle, ToggleIntoConnectionHandler}, diff --git a/client/network/src/service.rs b/client/network/src/service.rs index 5ffd36007f530..c635c4cfb98e2 100644 --- a/client/network/src/service.rs +++ b/client/network/src/service.rs @@ -39,15 +39,15 @@ use crate::{ }; use codec::Encode; -use futures::{channel::oneshot, prelude::*}; +use futures::{channel::oneshot, executor::ThreadPoolBuilder, prelude::*}; use libp2p::{ - core::{either::EitherError, upgrade, ConnectedPoint, Executor}, + core::{either::EitherError, upgrade, ConnectedPoint}, identify::Info as IdentifyInfo, kad::record::Key as KademliaKey, multiaddr, ping::Failure as PingFailure, swarm::{ - AddressScore, ConnectionError, ConnectionLimits, DialError, NetworkBehaviour, + AddressScore, ConnectionError, ConnectionLimits, DialError, Executor, NetworkBehaviour, PendingConnectionError, Swarm, SwarmBuilder, SwarmEvent, }, Multiaddr, PeerId, @@ -381,7 +381,19 @@ where } }; - let mut builder = SwarmBuilder::new(transport, behaviour, local_peer_id) + let builder = if let Some(spawner) = params.executor { + struct SpawnImpl(F); + impl + Send>>)> Executor for SpawnImpl { + fn exec(&self, f: Pin + Send>>) { + (self.0)(f) + } + } + SwarmBuilder::with_executor(transport, behaviour, local_peer_id, SpawnImpl(spawner)) + } else { + let tp = ThreadPoolBuilder::new().name_prefix("libp2p-swarm-task-").create()?; + SwarmBuilder::with_executor(transport, behaviour, local_peer_id, tp) + }; + let builder = builder .connection_limits( ConnectionLimits::default() .with_max_established_per_peer(Some(crate::MAX_CONNECTIONS_PER_PEER as u32)) @@ -393,15 +405,6 @@ where .notify_handler_buffer_size(NonZeroUsize::new(32).expect("32 != 0; qed")) .connection_event_buffer_size(1024) .max_negotiating_inbound_streams(2048); - if let Some(spawner) = params.executor { - struct SpawnImpl(F); - impl + Send>>)> Executor for SpawnImpl { - fn exec(&self, f: Pin + Send>>) { - (self.0)(f) - } - } - builder = builder.executor(Box::new(SpawnImpl(spawner))); - } (builder.build(), bandwidth) }; diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index 23645b11795c3..c9af1bbac241b 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -55,16 +55,16 @@ pub fn build_transport( // Build the base layer of the transport. let transport = if !memory_only { let tcp_config = tcp::GenTcpConfig::new().nodelay(true); - let desktop_trans = tcp::TcpTransport::new(tcp_config.clone()); + let desktop_trans = tcp::async_io::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(desktop_trans) - .or_transport(tcp::TcpTransport::new(tcp_config.clone())); + .or_transport(tcp::async_io::Transport::new(tcp_config.clone())); let dns_init = futures::executor::block_on(dns::DnsConfig::system(desktop_trans)); EitherTransport::Left(if let Ok(dns) = dns_init { EitherTransport::Left(dns) } else { - let desktop_trans = tcp::TcpTransport::new(tcp_config.clone()); + let desktop_trans = tcp::async_io::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(desktop_trans) - .or_transport(tcp::TcpTransport::new(tcp_config)); + .or_transport(tcp::async_io::Transport::new(tcp_config)); EitherTransport::Right(desktop_trans.map_err(dns::DnsErr::Transport)) }) } else { diff --git a/client/network/sync/Cargo.toml b/client/network/sync/Cargo.toml index ce1dd8f895d61..b8ee9f7e2e707 100644 --- a/client/network/sync/Cargo.toml +++ b/client/network/sync/Cargo.toml @@ -20,7 +20,7 @@ prost-build = "0.11" array-bytes = "4.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.21" -libp2p = "0.49.0" +libp2p = "0.50.0" log = "0.4.17" lru = "0.8.1" mockall = "0.11.2" diff --git a/client/network/test/Cargo.toml b/client/network/test/Cargo.toml index eb4d54b9dc82d..4f5d44cf5fecc 100644 --- a/client/network/test/Cargo.toml +++ b/client/network/test/Cargo.toml @@ -17,7 +17,7 @@ async-std = "1.11.0" async-trait = "0.1.57" futures = "0.3.21" futures-timer = "3.0.1" -libp2p = { version = "0.49.0", default-features = false } +libp2p = "0.50.0" log = "0.4.17" parking_lot = "0.12.1" rand = "0.7.2" diff --git a/client/network/transactions/Cargo.toml b/client/network/transactions/Cargo.toml index 147a86d8de2ae..fc1bbaaf3fee5 100644 --- a/client/network/transactions/Cargo.toml +++ b/client/network/transactions/Cargo.toml @@ -18,7 +18,7 @@ array-bytes = "4.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.21" hex = "0.4.0" -libp2p = "0.49.0" +libp2p = "0.50.0" log = "0.4.17" pin-project = "1.0.12" prometheus-endpoint = { package = "substrate-prometheus-endpoint", version = "0.10.0-dev", path = "../../../utils/prometheus" } diff --git a/client/offchain/Cargo.toml b/client/offchain/Cargo.toml index f23335ef97e33..dd2babbe81985 100644 --- a/client/offchain/Cargo.toml +++ b/client/offchain/Cargo.toml @@ -21,7 +21,7 @@ futures = "0.3.21" futures-timer = "3.0.2" hyper = { version = "0.14.16", features = ["stream", "http2"] } hyper-rustls = { version = "0.23.0", features = ["http2"] } -libp2p = { version = "0.49.0", default-features = false } +libp2p = "0.50.0" num_cpus = "1.13" once_cell = "1.8" parking_lot = "0.12.1" diff --git a/client/peerset/Cargo.toml b/client/peerset/Cargo.toml index ade2bc3d78d03..bf69fd9b3f3cc 100644 --- a/client/peerset/Cargo.toml +++ b/client/peerset/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] futures = "0.3.21" -libp2p = { version = "0.49.0", default-features = false } +libp2p = "0.50.0" log = "0.4.17" serde_json = "1.0.85" wasm-timer = "0.2" diff --git a/client/telemetry/Cargo.toml b/client/telemetry/Cargo.toml index f8c6f281546db..1cb0871981c25 100644 --- a/client/telemetry/Cargo.toml +++ b/client/telemetry/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] chrono = "0.4.19" futures = "0.3.21" -libp2p = { version = "0.49.0", default-features = false, features = ["dns-async-std", "tcp-async-io", "wasm-ext", "websocket"] } +libp2p = { version = "0.50.0", features = ["async-std", "dns", "tcp", "wasm-ext", "websocket"] } log = "0.4.17" parking_lot = "0.12.1" pin-project = "1.0.12" diff --git a/client/telemetry/src/transport.rs b/client/telemetry/src/transport.rs index d64da44a83b6b..2bbe1603a9f85 100644 --- a/client/telemetry/src/transport.rs +++ b/client/telemetry/src/transport.rs @@ -31,7 +31,7 @@ const CONNECT_TIMEOUT: Duration = Duration::from_secs(20); pub(crate) fn initialize_transport() -> Result { let transport = { - let tcp_transport = libp2p::tcp::TcpTransport::new(libp2p::tcp::GenTcpConfig::new()); + let tcp_transport = libp2p::tcp::async_io::Transport::new(libp2p::tcp::Config::new()); let inner = block_on(libp2p::dns::DnsConfig::system(tcp_transport))?; libp2p::websocket::framed::WsConfig::new(inner).and_then(|connec, _| { let connec = connec From 21cf90c9e0b3969d2f90a7afebab8ffd55c71d9c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 11:25:14 +0800 Subject: [PATCH 02/26] on_swarm_event and on_connection_handler_event --- client/network/src/discovery.rs | 2 +- client/network/src/peer_info.rs | 294 +++++++++++++++----------------- 2 files changed, 138 insertions(+), 158 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 73f0ca13cd74e..e3f14db702a58 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -64,7 +64,7 @@ use libp2p::{ GetClosestPeersError, Kademlia, KademliaBucketInserts, KademliaConfig, KademliaEvent, QueryId, QueryResult, Quorum, Record, }, - mdns::{async_io::Mdns, Config as MdnsConfig, Event as MdnsEvent}, + mdns::{async_io::Behaviour as Mdns, Config as MdnsConfig, Event as MdnsEvent}, multiaddr::Protocol, swarm::{ behaviour::toggle::{Toggle, ToggleIntoConnectionHandler}, diff --git a/client/network/src/peer_info.rs b/client/network/src/peer_info.rs index e04d006f50501..e81cfddd238c6 100644 --- a/client/network/src/peer_info.rs +++ b/client/network/src/peer_info.rs @@ -19,16 +19,17 @@ use fnv::FnvHashMap; use futures::prelude::*; use libp2p::{ - core::{ - connection::ConnectionId, either::EitherOutput, transport::ListenerId, ConnectedPoint, - PeerId, PublicKey, - }, + core::{connection::ConnectionId, either::EitherOutput, ConnectedPoint, PeerId, PublicKey}, identify::{ Behaviour as Identify, Config as IdentifyConfig, Event as IdentifyEvent, Info as IdentifyInfo, }, ping::{Behaviour as Ping, Config as PingConfig, Event as PingEvent, Success as PingSuccess}, swarm::{ + behaviour::{ + AddressChange, ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm, + ListenFailure, + }, ConnectionHandler, IntoConnectionHandler, IntoConnectionHandlerSelect, NetworkBehaviour, NetworkBehaviourAction, PollParameters, }, @@ -188,172 +189,151 @@ impl NetworkBehaviour for PeerInfoBehaviour { list } - fn inject_address_change( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - old: &ConnectedPoint, - new: &ConnectedPoint, - ) { - self.ping.inject_address_change(peer_id, conn, old, new); - self.identify.inject_address_change(peer_id, conn, old, new); - - if let Some(entry) = self.nodes_info.get_mut(peer_id) { - if let Some(endpoint) = entry.endpoints.iter_mut().find(|e| e == &old) { - *endpoint = new.clone(); - } else { - error!(target: "sub-libp2p", - "Unknown address change for peer {:?} from {:?} to {:?}", peer_id, old, new); - } - } else { - error!(target: "sub-libp2p", - "Unknown peer {:?} to change address from {:?} to {:?}", peer_id, old, new); - } - } - - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - failed_addresses: Option<&Vec>, - other_established: usize, - ) { - self.ping.inject_connection_established( - peer_id, - conn, - endpoint, - failed_addresses, - other_established, - ); - self.identify.inject_connection_established( - peer_id, - conn, - endpoint, - failed_addresses, - other_established, - ); - match self.nodes_info.entry(*peer_id) { - Entry::Vacant(e) => { - e.insert(NodeInfo::new(endpoint.clone())); + fn on_swarm_event(&mut self, event: FromSwarm) { + match event { + FromSwarm::ConnectionEstablished( + e @ ConnectionEstablished { peer_id, endpoint, .. }, + ) => { + self.ping.on_swarm_event(FromSwarm::ConnectionEstablished(e)); + self.identify.on_swarm_event(FromSwarm::ConnectionEstablished(e)); + + match self.nodes_info.entry(peer_id) { + Entry::Vacant(e) => { + e.insert(NodeInfo::new(endpoint.clone())); + }, + Entry::Occupied(e) => { + let e = e.into_mut(); + if e.info_expire.as_ref().map(|exp| *exp < Instant::now()).unwrap_or(false) + { + e.client_version = None; + e.latest_ping = None; + } + e.info_expire = None; + e.endpoints.push(endpoint.clone()); + }, + } }, - Entry::Occupied(e) => { - let e = e.into_mut(); - if e.info_expire.as_ref().map(|exp| *exp < Instant::now()).unwrap_or(false) { - e.client_version = None; - e.latest_ping = None; + FromSwarm::ConnectionClosed(ConnectionClosed { + peer_id, + connection_id, + endpoint, + handler, + remaining_established, + }) => { + let (ping_handler, identity_handler) = handler.into_inner(); + self.ping.on_swarm_event(FromSwarm::ConnectionClosed(ConnectionClosed { + peer_id, + connection_id, + endpoint, + handler: ping_handler, + remaining_established, + })); + self.identify.on_swarm_event(FromSwarm::ConnectionClosed(ConnectionClosed { + peer_id, + connection_id, + endpoint, + handler: identity_handler, + remaining_established, + })); + + if let Some(entry) = self.nodes_info.get_mut(&peer_id) { + if remaining_established == 0 { + entry.info_expire = Some(Instant::now() + CACHE_EXPIRE); + } + entry.endpoints.retain(|ep| ep != endpoint) + } else { + error!(target: "sub-libp2p", + "Unknown connection to {:?} closed: {:?}", peer_id, endpoint); } - e.info_expire = None; - e.endpoints.push(endpoint.clone()); + }, + FromSwarm::DialFailure(DialFailure { peer_id, handler, error }) => { + let (ping_handler, identity_handler) = handler.into_inner(); + self.ping.on_swarm_event(FromSwarm::DialFailure(DialFailure { + peer_id, + handler: ping_handler, + error, + })); + self.identify.on_swarm_event(FromSwarm::DialFailure(DialFailure { + peer_id, + handler: identity_handler, + error, + })); + }, + FromSwarm::ListenerClosed(e) => { + self.ping.on_swarm_event(FromSwarm::ListenerClosed(e)); + self.identify.on_swarm_event(FromSwarm::ListenerClosed(e)); + }, + FromSwarm::ListenFailure(ListenFailure { local_addr, send_back_addr, handler }) => { + let (ping_handler, identity_handler) = handler.into_inner(); + self.ping.on_swarm_event(FromSwarm::ListenFailure(ListenFailure { + local_addr, + send_back_addr, + handler: ping_handler, + })); + self.identify.on_swarm_event(FromSwarm::ListenFailure(ListenFailure { + local_addr, + send_back_addr, + handler: identity_handler, + })); + }, + FromSwarm::ListenerError(e) => { + self.ping.on_swarm_event(FromSwarm::ListenerError(e)); + self.identify.on_swarm_event(FromSwarm::ListenerError(e)); + }, + FromSwarm::ExpiredExternalAddr(e) => { + self.ping.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); + self.identify.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); + }, + FromSwarm::NewListener(e) => { + self.ping.on_swarm_event(FromSwarm::NewListener(e)); + self.identify.on_swarm_event(FromSwarm::NewListener(e)); + }, + FromSwarm::ExpiredListenAddr(e) => { + self.ping.on_swarm_event(FromSwarm::ExpiredListenAddr(e)); + self.identify.on_swarm_event(FromSwarm::ExpiredListenAddr(e)); + }, + FromSwarm::NewExternalAddr(e) => { + self.ping.on_swarm_event(FromSwarm::NewExternalAddr(e)); + self.identify.on_swarm_event(FromSwarm::NewExternalAddr(e)); + }, + FromSwarm::AddressChange(e @ AddressChange { peer_id, old, new, .. }) => { + self.ping.on_swarm_event(FromSwarm::AddressChange(e)); + self.identify.on_swarm_event(FromSwarm::AddressChange(e)); + + if let Some(entry) = self.nodes_info.get_mut(&peer_id) { + if let Some(endpoint) = entry.endpoints.iter_mut().find(|e| e == &old) { + *endpoint = new.clone(); + } else { + error!(target: "sub-libp2p", + "Unknown address change for peer {:?} from {:?} to {:?}", peer_id, old, new); + } + } else { + error!(target: "sub-libp2p", + "Unknown peer {:?} to change address from {:?} to {:?}", peer_id, old, new); + } + }, + FromSwarm::NewListenAddr(e) => { + self.ping.on_swarm_event(FromSwarm::NewListenAddr(e)); + self.identify.on_swarm_event(FromSwarm::NewListenAddr(e)); }, } } - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - handler: ::Handler, - remaining_established: usize, - ) { - let (ping_handler, identity_handler) = handler.into_inner(); - self.identify.inject_connection_closed( - peer_id, - conn, - endpoint, - identity_handler, - remaining_established, - ); - self.ping.inject_connection_closed( - peer_id, - conn, - endpoint, - ping_handler, - remaining_established, - ); - - if let Some(entry) = self.nodes_info.get_mut(peer_id) { - if remaining_established == 0 { - entry.info_expire = Some(Instant::now() + CACHE_EXPIRE); - } - entry.endpoints.retain(|ep| ep != endpoint) - } else { - error!(target: "sub-libp2p", - "Unknown connection to {:?} closed: {:?}", peer_id, endpoint); - } - } - - fn inject_event( + fn on_connection_handler_event( &mut self, peer_id: PeerId, - connection: ConnectionId, - event: <::Handler as ConnectionHandler>::OutEvent, + connection_id: ConnectionId, + event: <::Handler as + ConnectionHandler>::OutEvent, ) { match event { - EitherOutput::First(event) => self.ping.inject_event(peer_id, connection, event), - EitherOutput::Second(event) => self.identify.inject_event(peer_id, connection, event), + EitherOutput::First(event) => + self.ping.on_connection_handler_event(peer_id, connection_id, event), + EitherOutput::Second(event) => + self.identify.on_connection_handler_event(peer_id, connection_id, event), } } - fn inject_dial_failure( - &mut self, - peer_id: Option, - handler: Self::ConnectionHandler, - error: &libp2p::swarm::DialError, - ) { - let (ping_handler, identity_handler) = handler.into_inner(); - self.identify.inject_dial_failure(peer_id, identity_handler, error); - self.ping.inject_dial_failure(peer_id, ping_handler, error); - } - - fn inject_new_listener(&mut self, id: ListenerId) { - self.ping.inject_new_listener(id); - self.identify.inject_new_listener(id); - } - - fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.ping.inject_new_listen_addr(id, addr); - self.identify.inject_new_listen_addr(id, addr); - } - - fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.ping.inject_expired_listen_addr(id, addr); - self.identify.inject_expired_listen_addr(id, addr); - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - self.ping.inject_new_external_addr(addr); - self.identify.inject_new_external_addr(addr); - } - - fn inject_expired_external_addr(&mut self, addr: &Multiaddr) { - self.ping.inject_expired_external_addr(addr); - self.identify.inject_expired_external_addr(addr); - } - - fn inject_listen_failure( - &mut self, - local_addr: &Multiaddr, - send_back_addr: &Multiaddr, - handler: Self::ConnectionHandler, - ) { - let (ping_handler, identity_handler) = handler.into_inner(); - self.identify - .inject_listen_failure(local_addr, send_back_addr, identity_handler); - self.ping.inject_listen_failure(local_addr, send_back_addr, ping_handler); - } - - fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn error::Error + 'static)) { - self.ping.inject_listener_error(id, err); - self.identify.inject_listener_error(id, err); - } - - fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - self.ping.inject_listener_closed(id, reason); - self.identify.inject_listener_closed(id, reason); - } - fn poll( &mut self, cx: &mut Context, From 8a227e445e08036ce546fdde6417cd3f880cc9e6 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 11:27:43 +0800 Subject: [PATCH 03/26] replace `Swarm::new` with `Swarm::with_threadpool_executor` --- client/network/src/discovery.rs | 6 +++++- client/network/src/protocol/notifications/tests.rs | 6 +++++- client/network/src/request_responses.rs | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index e3f14db702a58..13b619566428c 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -949,7 +949,11 @@ mod tests { config.finish() }; - let mut swarm = Swarm::new(transport, behaviour, keypair.public().to_peer_id()); + let mut swarm = Swarm::with_threadpool_executor( + transport, + behaviour, + keypair.public().to_peer_id(), + ); let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); diff --git a/client/network/src/protocol/notifications/tests.rs b/client/network/src/protocol/notifications/tests.rs index fa79366d20283..66b2c0ef8d97a 100644 --- a/client/network/src/protocol/notifications/tests.rs +++ b/client/network/src/protocol/notifications/tests.rs @@ -100,7 +100,11 @@ fn build_nodes() -> (Swarm, Swarm) { .collect(), }; - let mut swarm = Swarm::new(transport, behaviour, keypairs[index].public().to_peer_id()); + let mut swarm = Swarm::with_threadpool_executor( + transport, + behaviour, + keypairs[index].public().to_peer_id(), + ); swarm.listen_on(addrs[index].clone()).unwrap(); out.push(swarm); } diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index d49cbd8051341..75e96acef3410 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -953,7 +953,8 @@ mod tests { let behaviour = RequestResponsesBehaviour::new(list, handle).unwrap(); - let mut swarm = Swarm::new(transport, behaviour, keypair.public().to_peer_id()); + let mut swarm = + Swarm::with_threadpool_executor(transport, behaviour, keypair.public().to_peer_id()); let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); swarm.listen_on(listen_addr.clone()).unwrap(); From 8a97a52712e300b13efdeadd58968e02ffb07946 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 12:37:44 +0800 Subject: [PATCH 04/26] on_swarm_event and on_connection_handler_event part 2 --- client/network/src/peer_info.rs | 1 - client/network/src/request_responses.rs | 201 +++++++++++------------- client/network/src/transport.rs | 2 +- 3 files changed, 97 insertions(+), 107 deletions(-) diff --git a/client/network/src/peer_info.rs b/client/network/src/peer_info.rs index e81cfddd238c6..97604a82c35b0 100644 --- a/client/network/src/peer_info.rs +++ b/client/network/src/peer_info.rs @@ -40,7 +40,6 @@ use sc_network_common::utils::interval; use smallvec::SmallVec; use std::{ collections::hash_map::Entry, - error, io, pin::Pin, task::{Context, Poll}, time::{Duration, Instant}, diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index 75e96acef3410..b8c7725631570 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -40,14 +40,16 @@ use futures::{ prelude::*, }; use libp2p::{ - core::{connection::ConnectionId, transport::ListenerId, ConnectedPoint, Multiaddr, PeerId}, + core::{connection::ConnectionId, Multiaddr, PeerId}, request_response::{ handler::RequestResponseHandler, ProtocolSupport, RequestResponse, RequestResponseCodec, RequestResponseConfig, RequestResponseEvent, RequestResponseMessage, ResponseChannel, }, swarm::{ - handler::multi::MultiHandler, ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, - NetworkBehaviourAction, PollParameters, + behaviour::{ConnectionClosed, DialFailure, FromSwarm, ListenFailure}, + handler::multi::MultiHandler, + ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, + PollParameters, }, }; use sc_network_common::{ @@ -312,120 +314,109 @@ impl NetworkBehaviour for RequestResponsesBehaviour { Vec::new() } - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - failed_addresses: Option<&Vec>, - other_established: usize, - ) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_connection_established( - p, + fn on_swarm_event(&mut self, event: FromSwarm) { + match event { + FromSwarm::ConnectionEstablished(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ConnectionEstablished(e)); + }, + FromSwarm::ConnectionClosed(ConnectionClosed { peer_id, - conn, + connection_id, endpoint, - failed_addresses, - other_established, - ) - } - } - - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - handler: ::Handler, - remaining_established: usize, - ) { - for (p_name, event) in handler.into_iter() { - if let Some((proto, _)) = self.protocols.get_mut(p_name.as_str()) { - proto.inject_connection_closed( - peer_id, - conn, - endpoint, - event, - remaining_established, - ) - } else { - log::error!( - target: "sub-libp2p", - "inject_connection_closed: no request-response instance registered for protocol {:?}", - p_name, - ) - } + handler, + remaining_established, + }) => + for (p_name, p_handler) in handler.into_iter() { + if let Some((proto, _)) = self.protocols.get_mut(p_name.as_str()) { + proto.on_swarm_event(FromSwarm::ConnectionClosed(ConnectionClosed { + peer_id, + connection_id, + endpoint, + handler: p_handler, + remaining_established, + })); + } else { + log::error!( + target: "sub-libp2p", + "on_swarm_event/connection_closed: no request-response instance registered for protocol {:?}", + p_name, + ) + } + }, + FromSwarm::DialFailure(DialFailure { peer_id, error, .. }) => + for (p, _) in self.protocols.values_mut() { + let handler = p.new_handler(); + NetworkBehaviour::on_swarm_event( + p, + FromSwarm::DialFailure(DialFailure { peer_id, handler, error }), + ); + }, + FromSwarm::ListenerClosed(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ListenerClosed(e)); + }, + FromSwarm::ListenFailure(ListenFailure { local_addr, send_back_addr, handler }) => + for (p_name, p_handler) in handler.into_iter() { + if let Some((proto, _)) = self.protocols.get_mut(p_name.as_str()) { + proto.on_swarm_event(FromSwarm::ListenFailure(ListenFailure { + local_addr, + send_back_addr, + handler: p_handler, + })); + } else { + log::error!( + target: "sub-libp2p", + "on_swarm_event/listen_failure: no request-response instance registered for protocol {:?}", + p_name, + ) + } + }, + FromSwarm::ListenerError(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ListenerError(e)); + }, + FromSwarm::ExpiredExternalAddr(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredExternalAddr(e)); + }, + FromSwarm::NewListener(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::NewListener(e)); + }, + FromSwarm::ExpiredListenAddr(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::ExpiredListenAddr(e)); + }, + FromSwarm::NewExternalAddr(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::NewExternalAddr(e)); + }, + FromSwarm::AddressChange(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::AddressChange(e)); + }, + FromSwarm::NewListenAddr(e) => + for (p, _) in self.protocols.values_mut() { + NetworkBehaviour::on_swarm_event(p, FromSwarm::NewListenAddr(e)); + }, } } - fn inject_event( + fn on_connection_handler_event( &mut self, peer_id: PeerId, - connection: ConnectionId, - (p_name, event): ::OutEvent, + connection_id: ConnectionId, + (p_name, event): <::Handler as + ConnectionHandler>::OutEvent, ) { if let Some((proto, _)) = self.protocols.get_mut(&*p_name) { - return proto.inject_event(peer_id, connection, event) + return proto.on_connection_handler_event(peer_id, connection_id, event) } log::warn!(target: "sub-libp2p", - "inject_node_event: no request-response instance registered for protocol {:?}", - p_name) - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_new_external_addr(p, addr) - } - } - - fn inject_expired_external_addr(&mut self, addr: &Multiaddr) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_expired_external_addr(p, addr) - } - } - - fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_expired_listen_addr(p, id, addr) - } - } - - fn inject_dial_failure( - &mut self, - peer_id: Option, - _: Self::ConnectionHandler, - error: &libp2p::swarm::DialError, - ) { - for (p, _) in self.protocols.values_mut() { - let handler = p.new_handler(); - NetworkBehaviour::inject_dial_failure(p, peer_id, handler, error) - } - } - - fn inject_new_listener(&mut self, id: ListenerId) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_new_listener(p, id) - } - } - - fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_new_listen_addr(p, id, addr) - } - } - - fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_listener_error(p, id, err) - } - } - - fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - for (p, _) in self.protocols.values_mut() { - NetworkBehaviour::inject_listener_closed(p, id, reason) - } + "on_connection_handler_event: no request-response instance registered for protocol {:?}", + p_name) } fn poll( diff --git a/client/network/src/transport.rs b/client/network/src/transport.rs index c9af1bbac241b..c13f36267e88e 100644 --- a/client/network/src/transport.rs +++ b/client/network/src/transport.rs @@ -54,7 +54,7 @@ pub fn build_transport( ) -> (Boxed<(PeerId, StreamMuxerBox)>, Arc) { // Build the base layer of the transport. let transport = if !memory_only { - let tcp_config = tcp::GenTcpConfig::new().nodelay(true); + let tcp_config = tcp::Config::new().nodelay(true); let desktop_trans = tcp::async_io::Transport::new(tcp_config.clone()); let desktop_trans = websocket::WsConfig::new(desktop_trans) .or_transport(tcp::async_io::Transport::new(tcp_config.clone())); From e9b731b1b5e9ab359c0ea485352f59237edbf208 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 14:02:22 +0800 Subject: [PATCH 05/26] on_swarm_event and on_connection_handler_event part 3 --- client/network/src/discovery.rs | 190 ++++++++++++-------------------- 1 file changed, 73 insertions(+), 117 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 13b619566428c..3c03fbac04277 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -51,10 +51,7 @@ use futures::prelude::*; use futures_timer::Delay; use ip_network::IpNetwork; use libp2p::{ - core::{ - connection::ConnectionId, transport::ListenerId, ConnectedPoint, Multiaddr, PeerId, - PublicKey, - }, + core::{connection::ConnectionId, Multiaddr, PeerId, PublicKey}, kad::{ handler::KademliaHandlerProto, record::{ @@ -67,7 +64,10 @@ use libp2p::{ mdns::{async_io::Behaviour as Mdns, Config as MdnsConfig, Event as MdnsEvent}, multiaddr::Protocol, swarm::{ - behaviour::toggle::{Toggle, ToggleIntoConnectionHandler}, + behaviour::{ + toggle::{Toggle, ToggleIntoConnectionHandler}, + DialFailure, FromSwarm, NewExternalAddr, + }, ConnectionHandler, DialError, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters, }, @@ -78,7 +78,6 @@ use sp_core::hexdisplay::HexDisplay; use std::{ cmp, collections::{HashMap, HashSet, VecDeque}, - io, num::NonZeroUsize, task::{Context, Poll}, time::Duration, @@ -516,127 +515,84 @@ impl NetworkBehaviour for DiscoveryBehaviour { list } - fn inject_address_change( - &mut self, - peer_id: &PeerId, - connection_id: &ConnectionId, - old: &ConnectedPoint, - new: &ConnectedPoint, - ) { - self.kademlia.inject_address_change(peer_id, connection_id, old, new) - } - - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - failed_addresses: Option<&Vec>, - other_established: usize, - ) { - self.num_connections += 1; - self.kademlia.inject_connection_established( - peer_id, - conn, - endpoint, - failed_addresses, - other_established, - ) - } + fn on_swarm_event(&mut self, event: FromSwarm) { + match event { + FromSwarm::ConnectionEstablished(e) => { + self.num_connections += 1; + self.kademlia.on_swarm_event(FromSwarm::ConnectionEstablished(e)); + }, + FromSwarm::ConnectionClosed(e) => { + self.num_connections -= 1; + self.kademlia.on_swarm_event(FromSwarm::ConnectionClosed(e)); + }, + FromSwarm::DialFailure(e @ DialFailure { peer_id, error, .. }) => { + if let Some(peer_id) = peer_id { + if let DialError::Transport(errors) = error { + if let Some(list) = self.ephemeral_addresses.get_mut(&peer_id) { + for (addr, _error) in errors { + list.retain(|a| a != addr); + } + } + } + } - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - handler: ::Handler, - remaining_established: usize, - ) { - self.num_connections -= 1; - self.kademlia.inject_connection_closed( - peer_id, - conn, - endpoint, - handler, - remaining_established, - ) - } + self.kademlia.on_swarm_event(FromSwarm::DialFailure(e)); + }, + FromSwarm::ListenerClosed(e) => { + self.kademlia.on_swarm_event(FromSwarm::ListenerClosed(e)); + }, + FromSwarm::ListenFailure(_) => { + // NetworkBehaviour::inject_listen_failure on Kademlia does nothing. + }, + FromSwarm::ListenerError(e) => { + self.kademlia.on_swarm_event(FromSwarm::ListenerError(e)); + }, + FromSwarm::ExpiredExternalAddr(e) => { + // We intentionally don't remove the element from `known_external_addresses` in + // order to not print the log line again. - fn inject_dial_failure( - &mut self, - peer_id: Option, - handler: Self::ConnectionHandler, - error: &DialError, - ) { - if let Some(peer_id) = peer_id { - if let DialError::Transport(errors) = error { - if let Some(list) = self.ephemeral_addresses.get_mut(&peer_id) { - for (addr, _error) in errors { - list.retain(|a| a != addr); + self.kademlia.on_swarm_event(FromSwarm::ExpiredExternalAddr(e)); + }, + FromSwarm::NewListener(e) => { + self.kademlia.on_swarm_event(FromSwarm::NewListener(e)); + }, + FromSwarm::ExpiredListenAddr(e) => { + self.kademlia.on_swarm_event(FromSwarm::ExpiredListenAddr(e)); + }, + FromSwarm::NewExternalAddr(e @ NewExternalAddr { addr }) => { + let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id.into())); + + if Self::can_add_to_dht(addr) { + // NOTE: we might re-discover the same address multiple times + // in which case we just want to refrain from logging. + if self.known_external_addresses.insert(new_addr.clone()) { + info!( + target: "sub-libp2p", + "🔍 Discovered new external address for our node: {}", + new_addr, + ); } } - } - } - self.kademlia.inject_dial_failure(peer_id, handler, error) + self.kademlia.on_swarm_event(FromSwarm::NewExternalAddr(e)); + }, + FromSwarm::AddressChange(e) => { + self.kademlia.on_swarm_event(FromSwarm::AddressChange(e)); + }, + FromSwarm::NewListenAddr(e) => { + self.kademlia.on_swarm_event(FromSwarm::NewListenAddr(e)); + }, + } } - fn inject_event( + fn on_connection_handler_event( &mut self, peer_id: PeerId, - connection: ConnectionId, - event: <::Handler as ConnectionHandler>::OutEvent, + connection_id: ConnectionId, + event: <::Handler as + ConnectionHandler>::OutEvent, ) { - self.kademlia.inject_event(peer_id, connection, event) - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - let new_addr = addr.clone().with(Protocol::P2p(self.local_peer_id.into())); - - if Self::can_add_to_dht(addr) { - // NOTE: we might re-discover the same address multiple times - // in which case we just want to refrain from logging. - if self.known_external_addresses.insert(new_addr.clone()) { - info!( - target: "sub-libp2p", - "🔍 Discovered new external address for our node: {}", - new_addr, - ); - } - } - - self.kademlia.inject_new_external_addr(addr) - } - - fn inject_expired_external_addr(&mut self, addr: &Multiaddr) { - // We intentionally don't remove the element from `known_external_addresses` in order - // to not print the log line again. - - self.kademlia.inject_expired_external_addr(addr) - } - - fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.kademlia.inject_expired_listen_addr(id, addr) - } - - fn inject_new_listener(&mut self, id: ListenerId) { - self.kademlia.inject_new_listener(id) - } - - fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.kademlia.inject_new_listen_addr(id, addr) - } - - fn inject_listen_failure(&mut self, _: &Multiaddr, _: &Multiaddr, _: Self::ConnectionHandler) { - // NetworkBehaviour::inject_listen_failure on Kademlia does nothing. - } - - fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { - self.kademlia.inject_listener_error(id, err) - } - - fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - self.kademlia.inject_listener_closed(id, reason) + self.kademlia.on_connection_handler_event(peer_id, connection_id, event); } fn poll( From d27d73afe167d6c1a14d34119519132a3fdc33d8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 14:17:10 +0800 Subject: [PATCH 06/26] on_swarm_event and on_connection_handler_event part 4 --- client/network/src/protocol.rs | 88 +- .../src/protocol/notifications/behaviour.rs | 851 +++++++++--------- .../src/protocol/notifications/tests.rs | 85 +- 3 files changed, 467 insertions(+), 557 deletions(-) diff --git a/client/network/src/protocol.rs b/client/network/src/protocol.rs index 63d060f423773..1410dd885fd20 100644 --- a/client/network/src/protocol.rs +++ b/client/network/src/protocol.rs @@ -22,11 +22,11 @@ use bytes::Bytes; use codec::{Decode, DecodeAll, Encode}; use futures::{channel::oneshot, prelude::*}; use libp2p::{ - core::{connection::ConnectionId, transport::ListenerId, ConnectedPoint}, + core::connection::ConnectionId, request_response::OutboundFailure, swarm::{ - ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, - PollParameters, + behaviour::FromSwarm, ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, + NetworkBehaviourAction, PollParameters, }, Multiaddr, PeerId, }; @@ -65,7 +65,7 @@ use sp_runtime::{ }; use std::{ collections::{HashMap, HashSet, VecDeque}, - io, iter, + iter, num::NonZeroUsize, pin::Pin, sync::Arc, @@ -1253,47 +1253,18 @@ where self.behaviour.addresses_of_peer(peer_id) } - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - failed_addresses: Option<&Vec>, - other_established: usize, - ) { - self.behaviour.inject_connection_established( - peer_id, - conn, - endpoint, - failed_addresses, - other_established, - ) - } - - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - handler: ::Handler, - remaining_established: usize, - ) { - self.behaviour.inject_connection_closed( - peer_id, - conn, - endpoint, - handler, - remaining_established, - ) + fn on_swarm_event(&mut self, event: FromSwarm) { + self.behaviour.on_swarm_event(event); } - fn inject_event( + fn on_connection_handler_event( &mut self, peer_id: PeerId, - connection: ConnectionId, - event: <::Handler as ConnectionHandler>::OutEvent, + connection_id: ConnectionId, + event: <::Handler as + ConnectionHandler>::OutEvent, ) { - self.behaviour.inject_event(peer_id, connection, event) + self.behaviour.on_connection_handler_event(peer_id, connection_id, event); } fn poll( @@ -1673,41 +1644,4 @@ where cx.waker().wake_by_ref(); Poll::Pending } - - fn inject_dial_failure( - &mut self, - peer_id: Option, - handler: Self::ConnectionHandler, - error: &libp2p::swarm::DialError, - ) { - self.behaviour.inject_dial_failure(peer_id, handler, error); - } - - fn inject_new_listener(&mut self, id: ListenerId) { - self.behaviour.inject_new_listener(id) - } - - fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.behaviour.inject_new_listen_addr(id, addr) - } - - fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.behaviour.inject_expired_listen_addr(id, addr) - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - self.behaviour.inject_new_external_addr(addr) - } - - fn inject_expired_external_addr(&mut self, addr: &Multiaddr) { - self.behaviour.inject_expired_external_addr(addr) - } - - fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn std::error::Error + 'static)) { - self.behaviour.inject_listener_error(id, err); - } - - fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - self.behaviour.inject_listener_closed(id, reason); - } } diff --git a/client/network/src/protocol/notifications/behaviour.rs b/client/network/src/protocol/notifications/behaviour.rs index 04f6fe445ac63..2db46867128ac 100644 --- a/client/network/src/protocol/notifications/behaviour.rs +++ b/client/network/src/protocol/notifications/behaviour.rs @@ -24,8 +24,10 @@ use bytes::BytesMut; use fnv::FnvHashMap; use futures::prelude::*; use libp2p::{ - core::{connection::ConnectionId, ConnectedPoint, Multiaddr, PeerId}, + core::{connection::ConnectionId, Multiaddr, PeerId}, swarm::{ + behaviour::{ConnectionClosed, ConnectionEstablished, DialFailure, FromSwarm}, + handler::ConnectionHandler, DialError, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, NotifyHandler, PollParameters, }, @@ -1060,202 +1062,310 @@ impl NetworkBehaviour for Notifications { Vec::new() } - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - _failed_addresses: Option<&Vec>, - _other_established: usize, - ) { - for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { - match self.peers.entry((*peer_id, set_id)).or_insert(PeerState::Poisoned) { - // Requested | PendingRequest => Enabled - st @ &mut PeerState::Requested | st @ &mut PeerState::PendingRequest { .. } => { - trace!(target: "sub-libp2p", - "Libp2p => Connected({}, {:?}, {:?}): Connection was requested by PSM.", - peer_id, set_id, endpoint - ); - trace!(target: "sub-libp2p", "Handler({:?}, {:?}) <= Open({:?})", peer_id, *conn, set_id); - self.events.push_back(NetworkBehaviourAction::NotifyHandler { - peer_id: *peer_id, - handler: NotifyHandler::One(*conn), - event: NotifsHandlerIn::Open { protocol_index: set_id.into() }, - }); + fn on_swarm_event(&mut self, event: FromSwarm) { + match event { + FromSwarm::ConnectionEstablished(ConnectionEstablished { + peer_id, + endpoint, + connection_id, + .. + }) => { + for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { + match self.peers.entry((peer_id, set_id)).or_insert(PeerState::Poisoned) { + // Requested | PendingRequest => Enabled + st @ &mut PeerState::Requested | + st @ &mut PeerState::PendingRequest { .. } => { + trace!(target: "sub-libp2p", + "Libp2p => Connected({}, {:?}, {:?}): Connection was requested by PSM.", + peer_id, set_id, endpoint + ); + trace!(target: "sub-libp2p", "Handler({:?}, {:?}) <= Open({:?})", peer_id, connection_id, set_id); + self.events.push_back(NetworkBehaviourAction::NotifyHandler { + peer_id, + handler: NotifyHandler::One(connection_id), + event: NotifsHandlerIn::Open { protocol_index: set_id.into() }, + }); + + let mut connections = SmallVec::new(); + connections.push((connection_id, ConnectionState::Opening)); + *st = PeerState::Enabled { connections }; + }, - let mut connections = SmallVec::new(); - connections.push((*conn, ConnectionState::Opening)); - *st = PeerState::Enabled { connections }; - }, + // Poisoned gets inserted above if the entry was missing. + // Ø | Backoff => Disabled + st @ &mut PeerState::Poisoned | st @ &mut PeerState::Backoff { .. } => { + let backoff_until = + if let PeerState::Backoff { timer_deadline, .. } = st { + Some(*timer_deadline) + } else { + None + }; + trace!(target: "sub-libp2p", + "Libp2p => Connected({}, {:?}, {:?}, {:?}): Not requested by PSM, disabling.", + peer_id, set_id, endpoint, connection_id); + + let mut connections = SmallVec::new(); + connections.push((connection_id, ConnectionState::Closed)); + *st = PeerState::Disabled { connections, backoff_until }; + }, - // Poisoned gets inserted above if the entry was missing. - // Ø | Backoff => Disabled - st @ &mut PeerState::Poisoned | st @ &mut PeerState::Backoff { .. } => { - let backoff_until = if let PeerState::Backoff { timer_deadline, .. } = st { - Some(*timer_deadline) + // In all other states, add this new connection to the list of closed + // inactive connections. + PeerState::Incoming { connections, .. } | + PeerState::Disabled { connections, .. } | + PeerState::DisabledPendingEnable { connections, .. } | + PeerState::Enabled { connections, .. } => { + trace!(target: "sub-libp2p", + "Libp2p => Connected({}, {:?}, {:?}, {:?}): Secondary connection. Leaving closed.", + peer_id, set_id, endpoint, connection_id); + connections.push((connection_id, ConnectionState::Closed)); + }, + } + } + }, + FromSwarm::ConnectionClosed(ConnectionClosed { peer_id, connection_id, .. }) => { + for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { + let mut entry = if let Entry::Occupied(entry) = + self.peers.entry((peer_id, set_id)) + { + entry } else { - None + error!(target: "sub-libp2p", "inject_connection_closed: State mismatch in the custom protos handler"); + debug_assert!(false); + return }; - trace!(target: "sub-libp2p", - "Libp2p => Connected({}, {:?}, {:?}, {:?}): Not requested by PSM, disabling.", - peer_id, set_id, endpoint, *conn); - - let mut connections = SmallVec::new(); - connections.push((*conn, ConnectionState::Closed)); - *st = PeerState::Disabled { connections, backoff_until }; - }, - // In all other states, add this new connection to the list of closed inactive - // connections. - PeerState::Incoming { connections, .. } | - PeerState::Disabled { connections, .. } | - PeerState::DisabledPendingEnable { connections, .. } | - PeerState::Enabled { connections, .. } => { - trace!(target: "sub-libp2p", - "Libp2p => Connected({}, {:?}, {:?}, {:?}): Secondary connection. Leaving closed.", - peer_id, set_id, endpoint, *conn); - connections.push((*conn, ConnectionState::Closed)); - }, - } - } - } + match mem::replace(entry.get_mut(), PeerState::Poisoned) { + // Disabled => Disabled | Backoff | Ø + PeerState::Disabled { mut connections, backoff_until } => { + trace!(target: "sub-libp2p", "Libp2p => Disconnected({}, {:?}, {:?}): Disabled.", + peer_id, set_id, connection_id); - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - _endpoint: &ConnectedPoint, - _handler: ::Handler, - _remaining_established: usize, - ) { - for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { - let mut entry = if let Entry::Occupied(entry) = self.peers.entry((*peer_id, set_id)) { - entry - } else { - error!(target: "sub-libp2p", "inject_connection_closed: State mismatch in the custom protos handler"); - debug_assert!(false); - return - }; + if let Some(pos) = + connections.iter().position(|(c, _)| *c == connection_id) + { + connections.remove(pos); + } else { + debug_assert!(false); + error!(target: "sub-libp2p", + "inject_connection_closed: State mismatch in the custom protos handler"); + } - match mem::replace(entry.get_mut(), PeerState::Poisoned) { - // Disabled => Disabled | Backoff | Ø - PeerState::Disabled { mut connections, backoff_until } => { - trace!(target: "sub-libp2p", "Libp2p => Disconnected({}, {:?}, {:?}): Disabled.", - peer_id, set_id, *conn); + if connections.is_empty() { + if let Some(until) = backoff_until { + let now = Instant::now(); + if until > now { + let delay_id = self.next_delay_id; + self.next_delay_id.0 += 1; + let delay = futures_timer::Delay::new(until - now); + self.delays.push( + async move { + delay.await; + (delay_id, peer_id, set_id) + } + .boxed(), + ); + + *entry.get_mut() = PeerState::Backoff { + timer: delay_id, + timer_deadline: until, + }; + } else { + entry.remove(); + } + } else { + entry.remove(); + } + } else { + *entry.get_mut() = + PeerState::Disabled { connections, backoff_until }; + } + }, - if let Some(pos) = connections.iter().position(|(c, _)| *c == *conn) { - connections.remove(pos); - } else { - debug_assert!(false); - error!(target: "sub-libp2p", - "inject_connection_closed: State mismatch in the custom protos handler"); - } + // DisabledPendingEnable => DisabledPendingEnable | Backoff + PeerState::DisabledPendingEnable { + mut connections, + timer_deadline, + timer, + } => { + trace!( + target: "sub-libp2p", + "Libp2p => Disconnected({}, {:?}, {:?}): Disabled but pending enable.", + peer_id, set_id, connection_id + ); - if connections.is_empty() { - if let Some(until) = backoff_until { - let now = Instant::now(); - if until > now { - let delay_id = self.next_delay_id; - self.next_delay_id.0 += 1; - let delay = futures_timer::Delay::new(until - now); - let peer_id = *peer_id; - self.delays.push( - async move { - delay.await; - (delay_id, peer_id, set_id) - } - .boxed(), - ); + if let Some(pos) = + connections.iter().position(|(c, _)| *c == connection_id) + { + connections.remove(pos); + } else { + error!(target: "sub-libp2p", + "inject_connection_closed: State mismatch in the custom protos handler"); + debug_assert!(false); + } - *entry.get_mut() = - PeerState::Backoff { timer: delay_id, timer_deadline: until }; + if connections.is_empty() { + trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); + self.peerset.dropped(set_id, peer_id, DropReason::Unknown); + *entry.get_mut() = PeerState::Backoff { timer, timer_deadline }; } else { - entry.remove(); + *entry.get_mut() = PeerState::DisabledPendingEnable { + connections, + timer_deadline, + timer, + }; } - } else { - entry.remove(); - } - } else { - *entry.get_mut() = PeerState::Disabled { connections, backoff_until }; - } - }, + }, - // DisabledPendingEnable => DisabledPendingEnable | Backoff - PeerState::DisabledPendingEnable { mut connections, timer_deadline, timer } => { - trace!( - target: "sub-libp2p", - "Libp2p => Disconnected({}, {:?}, {:?}): Disabled but pending enable.", - peer_id, set_id, *conn - ); + // Incoming => Incoming | Disabled | Backoff | Ø + PeerState::Incoming { mut connections, backoff_until } => { + trace!( + target: "sub-libp2p", + "Libp2p => Disconnected({}, {:?}, {:?}): OpenDesiredByRemote.", + peer_id, set_id, connection_id + ); - if let Some(pos) = connections.iter().position(|(c, _)| *c == *conn) { - connections.remove(pos); - } else { - error!(target: "sub-libp2p", - "inject_connection_closed: State mismatch in the custom protos handler"); - debug_assert!(false); - } + debug_assert!(connections + .iter() + .any(|(_, s)| matches!(s, ConnectionState::OpenDesiredByRemote))); - if connections.is_empty() { - trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); - self.peerset.dropped(set_id, *peer_id, DropReason::Unknown); - *entry.get_mut() = PeerState::Backoff { timer, timer_deadline }; - } else { - *entry.get_mut() = - PeerState::DisabledPendingEnable { connections, timer_deadline, timer }; - } - }, + if let Some(pos) = + connections.iter().position(|(c, _)| *c == connection_id) + { + connections.remove(pos); + } else { + error!(target: "sub-libp2p", + "inject_connection_closed: State mismatch in the custom protos handler"); + debug_assert!(false); + } - // Incoming => Incoming | Disabled | Backoff | Ø - PeerState::Incoming { mut connections, backoff_until } => { - trace!( - target: "sub-libp2p", - "Libp2p => Disconnected({}, {:?}, {:?}): OpenDesiredByRemote.", - peer_id, set_id, *conn - ); + let no_desired_left = !connections + .iter() + .any(|(_, s)| matches!(s, ConnectionState::OpenDesiredByRemote)); + + // If no connection is `OpenDesiredByRemote` anymore, clean up the + // peerset incoming request. + if no_desired_left { + // In the incoming state, we don't report "Dropped". Instead we will + // just ignore the corresponding Accept/Reject. + if let Some(state) = self + .incoming + .iter_mut() + .find(|i| i.alive && i.set_id == set_id && i.peer_id == peer_id) + { + state.alive = false; + } else { + error!(target: "sub-libp2p", "State mismatch in libp2p: no entry in \ + incoming corresponding to an incoming state in peers"); + debug_assert!(false); + } + } - debug_assert!(connections - .iter() - .any(|(_, s)| matches!(s, ConnectionState::OpenDesiredByRemote))); + if connections.is_empty() { + if let Some(until) = backoff_until { + let now = Instant::now(); + if until > now { + let delay_id = self.next_delay_id; + self.next_delay_id.0 += 1; + let delay = futures_timer::Delay::new(until - now); + self.delays.push( + async move { + delay.await; + (delay_id, peer_id, set_id) + } + .boxed(), + ); + + *entry.get_mut() = PeerState::Backoff { + timer: delay_id, + timer_deadline: until, + }; + } else { + entry.remove(); + } + } else { + entry.remove(); + } + } else if no_desired_left { + // If no connection is `OpenDesiredByRemote` anymore, switch to + // `Disabled`. + *entry.get_mut() = + PeerState::Disabled { connections, backoff_until }; + } else { + *entry.get_mut() = + PeerState::Incoming { connections, backoff_until }; + } + }, - if let Some(pos) = connections.iter().position(|(c, _)| *c == *conn) { - connections.remove(pos); - } else { - error!(target: "sub-libp2p", - "inject_connection_closed: State mismatch in the custom protos handler"); - debug_assert!(false); - } + // Enabled => Enabled | Backoff + // Peers are always backed-off when disconnecting while Enabled. + PeerState::Enabled { mut connections } => { + trace!( + target: "sub-libp2p", + "Libp2p => Disconnected({}, {:?}, {:?}): Enabled.", + peer_id, set_id, connection_id + ); - let no_desired_left = !connections - .iter() - .any(|(_, s)| matches!(s, ConnectionState::OpenDesiredByRemote)); - - // If no connection is `OpenDesiredByRemote` anymore, clean up the peerset - // incoming request. - if no_desired_left { - // In the incoming state, we don't report "Dropped". Instead we will just - // ignore the corresponding Accept/Reject. - if let Some(state) = self - .incoming - .iter_mut() - .find(|i| i.alive && i.set_id == set_id && i.peer_id == *peer_id) - { - state.alive = false; - } else { - error!(target: "sub-libp2p", "State mismatch in libp2p: no entry in \ - incoming corresponding to an incoming state in peers"); - debug_assert!(false); - } - } + debug_assert!(connections.iter().any(|(_, s)| matches!( + s, + ConnectionState::Opening | ConnectionState::Open(_) + ))); + + if let Some(pos) = + connections.iter().position(|(c, _)| *c == connection_id) + { + let (_, state) = connections.remove(pos); + if let ConnectionState::Open(_) = state { + if let Some((replacement_pos, replacement_sink)) = connections + .iter() + .enumerate() + .find_map(|(num, (_, s))| match s { + ConnectionState::Open(s) => Some((num, s.clone())), + _ => None, + }) { + if pos <= replacement_pos { + trace!( + target: "sub-libp2p", + "External API <= Sink replaced({}, {:?})", + peer_id, set_id + ); + let event = NotificationsOut::CustomProtocolReplaced { + peer_id, + set_id, + notifications_sink: replacement_sink, + }; + self.events.push_back( + NetworkBehaviourAction::GenerateEvent(event), + ); + } + } else { + trace!( + target: "sub-libp2p", "External API <= Closed({}, {:?})", + peer_id, set_id + ); + let event = NotificationsOut::CustomProtocolClosed { + peer_id, + set_id, + }; + self.events.push_back( + NetworkBehaviourAction::GenerateEvent(event), + ); + } + } + } else { + error!(target: "sub-libp2p", + "inject_connection_closed: State mismatch in the custom protos handler"); + debug_assert!(false); + } + + if connections.is_empty() { + trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); + self.peerset.dropped(set_id, peer_id, DropReason::Unknown); + let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng()); - if connections.is_empty() { - if let Some(until) = backoff_until { - let now = Instant::now(); - if until > now { let delay_id = self.next_delay_id; self.next_delay_id.0 += 1; - let delay = futures_timer::Delay::new(until - now); - let peer_id = *peer_id; + let delay = futures_timer::Delay::new(Duration::from_secs(ban_dur)); self.delays.push( async move { delay.await; @@ -1264,209 +1374,137 @@ impl NetworkBehaviour for Notifications { .boxed(), ); + *entry.get_mut() = PeerState::Backoff { + timer: delay_id, + timer_deadline: Instant::now() + Duration::from_secs(ban_dur), + }; + } else if !connections.iter().any(|(_, s)| { + matches!(s, ConnectionState::Opening | ConnectionState::Open(_)) + }) { + trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); + self.peerset.dropped(set_id, peer_id, DropReason::Unknown); + *entry.get_mut() = - PeerState::Backoff { timer: delay_id, timer_deadline: until }; + PeerState::Disabled { connections, backoff_until: None }; } else { - entry.remove(); + *entry.get_mut() = PeerState::Enabled { connections }; } - } else { - entry.remove(); - } - } else if no_desired_left { - // If no connection is `OpenDesiredByRemote` anymore, switch to `Disabled`. - *entry.get_mut() = PeerState::Disabled { connections, backoff_until }; - } else { - *entry.get_mut() = PeerState::Incoming { connections, backoff_until }; + }, + + PeerState::Requested | + PeerState::PendingRequest { .. } | + PeerState::Backoff { .. } => { + // This is a serious bug either in this state machine or in libp2p. + error!(target: "sub-libp2p", + "`inject_connection_closed` called for unknown peer {}", + peer_id); + debug_assert!(false); + }, + PeerState::Poisoned => { + error!(target: "sub-libp2p", "State of peer {} is poisoned", peer_id); + debug_assert!(false); + }, } - }, + } + }, + FromSwarm::DialFailure(DialFailure { peer_id, error, .. }) => { + if let DialError::Transport(errors) = error { + for (addr, error) in errors.iter() { + trace!(target: "sub-libp2p", "Libp2p => Reach failure for {:?} through {:?}: {:?}", peer_id, addr, error); + } + } - // Enabled => Enabled | Backoff - // Peers are always backed-off when disconnecting while Enabled. - PeerState::Enabled { mut connections } => { - trace!( - target: "sub-libp2p", - "Libp2p => Disconnected({}, {:?}, {:?}): Enabled.", - peer_id, set_id, *conn - ); + if let Some(peer_id) = peer_id { + trace!(target: "sub-libp2p", "Libp2p => Dial failure for {:?}", peer_id); + + for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { + if let Entry::Occupied(mut entry) = self.peers.entry((peer_id, set_id)) { + match mem::replace(entry.get_mut(), PeerState::Poisoned) { + // The peer is not in our list. + st @ PeerState::Backoff { .. } => { + *entry.into_mut() = st; + }, + + // "Basic" situation: we failed to reach a peer that the peerset + // requested. + st @ PeerState::Requested | + st @ PeerState::PendingRequest { .. } => { + trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); + self.peerset.dropped(set_id, peer_id, DropReason::Unknown); + + let now = Instant::now(); + let ban_duration = match st { + PeerState::PendingRequest { timer_deadline, .. } + if timer_deadline > now => + cmp::max(timer_deadline - now, Duration::from_secs(5)), + _ => Duration::from_secs(5), + }; - debug_assert!(connections.iter().any(|(_, s)| matches!( - s, - ConnectionState::Opening | ConnectionState::Open(_) - ))); - - if let Some(pos) = connections.iter().position(|(c, _)| *c == *conn) { - let (_, state) = connections.remove(pos); - if let ConnectionState::Open(_) = state { - if let Some((replacement_pos, replacement_sink)) = - connections.iter().enumerate().find_map(|(num, (_, s))| match s { - ConnectionState::Open(s) => Some((num, s.clone())), - _ => None, - }) { - if pos <= replacement_pos { - trace!( - target: "sub-libp2p", - "External API <= Sink replaced({}, {:?})", - peer_id, set_id + let delay_id = self.next_delay_id; + self.next_delay_id.0 += 1; + let delay = futures_timer::Delay::new(ban_duration); + let peer_id = peer_id; + self.delays.push( + async move { + delay.await; + (delay_id, peer_id, set_id) + } + .boxed(), ); - let event = NotificationsOut::CustomProtocolReplaced { - peer_id: *peer_id, - set_id, - notifications_sink: replacement_sink, + + *entry.into_mut() = PeerState::Backoff { + timer: delay_id, + timer_deadline: now + ban_duration, }; - self.events - .push_back(NetworkBehaviourAction::GenerateEvent(event)); - } - } else { - trace!( - target: "sub-libp2p", "External API <= Closed({}, {:?})", - peer_id, set_id - ); - let event = NotificationsOut::CustomProtocolClosed { - peer_id: *peer_id, - set_id, - }; - self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); + }, + + // We can still get dial failures even if we are already connected + // to the peer, as an extra diagnostic for an earlier attempt. + st @ PeerState::Disabled { .. } | + st @ PeerState::Enabled { .. } | + st @ PeerState::DisabledPendingEnable { .. } | + st @ PeerState::Incoming { .. } => { + *entry.into_mut() = st; + }, + + PeerState::Poisoned => { + error!(target: "sub-libp2p", "State of {:?} is poisoned", peer_id); + debug_assert!(false); + }, } } - } else { - error!(target: "sub-libp2p", - "inject_connection_closed: State mismatch in the custom protos handler"); - debug_assert!(false); } - - if connections.is_empty() { - trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); - self.peerset.dropped(set_id, *peer_id, DropReason::Unknown); - let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng()); - - let delay_id = self.next_delay_id; - self.next_delay_id.0 += 1; - let delay = futures_timer::Delay::new(Duration::from_secs(ban_dur)); - let peer_id = *peer_id; - self.delays.push( - async move { - delay.await; - (delay_id, peer_id, set_id) - } - .boxed(), - ); - - *entry.get_mut() = PeerState::Backoff { - timer: delay_id, - timer_deadline: Instant::now() + Duration::from_secs(ban_dur), - }; - } else if !connections.iter().any(|(_, s)| { - matches!(s, ConnectionState::Opening | ConnectionState::Open(_)) - }) { - trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); - self.peerset.dropped(set_id, *peer_id, DropReason::Unknown); - - *entry.get_mut() = PeerState::Disabled { connections, backoff_until: None }; - } else { - *entry.get_mut() = PeerState::Enabled { connections }; - } - }, - - PeerState::Requested | - PeerState::PendingRequest { .. } | - PeerState::Backoff { .. } => { - // This is a serious bug either in this state machine or in libp2p. - error!(target: "sub-libp2p", - "`inject_connection_closed` called for unknown peer {}", - peer_id); - debug_assert!(false); - }, - PeerState::Poisoned => { - error!(target: "sub-libp2p", "State of peer {} is poisoned", peer_id); - debug_assert!(false); - }, - } + } + }, + FromSwarm::ListenerClosed(_) => {}, + FromSwarm::ListenFailure(_) => {}, + FromSwarm::ListenerError(_) => {}, + FromSwarm::ExpiredExternalAddr(_) => {}, + FromSwarm::NewListener(_) => {}, + FromSwarm::ExpiredListenAddr(_) => {}, + FromSwarm::NewExternalAddr(_) => {}, + FromSwarm::AddressChange(_) => {}, + FromSwarm::NewListenAddr(_) => {}, } } - fn inject_dial_failure( + fn on_connection_handler_event( &mut self, - peer_id: Option, - _: Self::ConnectionHandler, - error: &DialError, + peer_id: PeerId, + connection_id: ConnectionId, + event: <::Handler as + ConnectionHandler>::OutEvent, ) { - if let DialError::Transport(errors) = error { - for (addr, error) in errors.iter() { - trace!(target: "sub-libp2p", "Libp2p => Reach failure for {:?} through {:?}: {:?}", peer_id, addr, error); - } - } - - if let Some(peer_id) = peer_id { - trace!(target: "sub-libp2p", "Libp2p => Dial failure for {:?}", peer_id); - - for set_id in (0..self.notif_protocols.len()).map(sc_peerset::SetId::from) { - if let Entry::Occupied(mut entry) = self.peers.entry((peer_id, set_id)) { - match mem::replace(entry.get_mut(), PeerState::Poisoned) { - // The peer is not in our list. - st @ PeerState::Backoff { .. } => { - *entry.into_mut() = st; - }, - - // "Basic" situation: we failed to reach a peer that the peerset requested. - st @ PeerState::Requested | st @ PeerState::PendingRequest { .. } => { - trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); - self.peerset.dropped(set_id, peer_id, DropReason::Unknown); - - let now = Instant::now(); - let ban_duration = match st { - PeerState::PendingRequest { timer_deadline, .. } - if timer_deadline > now => - cmp::max(timer_deadline - now, Duration::from_secs(5)), - _ => Duration::from_secs(5), - }; - - let delay_id = self.next_delay_id; - self.next_delay_id.0 += 1; - let delay = futures_timer::Delay::new(ban_duration); - let peer_id = peer_id; - self.delays.push( - async move { - delay.await; - (delay_id, peer_id, set_id) - } - .boxed(), - ); - - *entry.into_mut() = PeerState::Backoff { - timer: delay_id, - timer_deadline: now + ban_duration, - }; - }, - - // We can still get dial failures even if we are already connected to the - // peer, as an extra diagnostic for an earlier attempt. - st @ PeerState::Disabled { .. } | - st @ PeerState::Enabled { .. } | - st @ PeerState::DisabledPendingEnable { .. } | - st @ PeerState::Incoming { .. } => { - *entry.into_mut() = st; - }, - - PeerState::Poisoned => { - error!(target: "sub-libp2p", "State of {:?} is poisoned", peer_id); - debug_assert!(false); - }, - } - } - } - } - } - - fn inject_event(&mut self, source: PeerId, connection: ConnectionId, event: NotifsHandlerOut) { match event { NotifsHandlerOut::OpenDesiredByRemote { protocol_index } => { let set_id = sc_peerset::SetId::from(protocol_index); trace!(target: "sub-libp2p", "Handler({:?}, {:?}]) => OpenDesiredByRemote({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); - let mut entry = if let Entry::Occupied(entry) = self.peers.entry((source, set_id)) { + let mut entry = if let Entry::Occupied(entry) = self.peers.entry((peer_id, set_id)) + { entry } else { error!( @@ -1484,7 +1522,7 @@ impl NetworkBehaviour for Notifications { .iter() .any(|(_, s)| matches!(s, ConnectionState::OpenDesiredByRemote))); if let Some((_, connec_state)) = - connections.iter_mut().find(|(c, _)| *c == connection) + connections.iter_mut().find(|(c, _)| *c == connection_id) { if let ConnectionState::Closed = *connec_state { *connec_state = ConnectionState::OpenDesiredByRemote; @@ -1517,14 +1555,14 @@ impl NetworkBehaviour for Notifications { ))); if let Some((_, connec_state)) = - connections.iter_mut().find(|(c, _)| *c == connection) + connections.iter_mut().find(|(c, _)| *c == connection_id) { if let ConnectionState::Closed = *connec_state { trace!(target: "sub-libp2p", "Handler({:?}, {:?}) <= Open({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); self.events.push_back(NetworkBehaviourAction::NotifyHandler { - peer_id: source, - handler: NotifyHandler::One(connection), + peer_id, + handler: NotifyHandler::One(connection_id), event: NotifsHandlerIn::Open { protocol_index: set_id.into() }, }); *connec_state = ConnectionState::Opening; @@ -1554,7 +1592,7 @@ impl NetworkBehaviour for Notifications { // Disabled => Disabled | Incoming PeerState::Disabled { mut connections, backoff_until } => { if let Some((_, connec_state)) = - connections.iter_mut().find(|(c, _)| *c == connection) + connections.iter_mut().find(|(c, _)| *c == connection_id) { if let ConnectionState::Closed = *connec_state { *connec_state = ConnectionState::OpenDesiredByRemote; @@ -1563,10 +1601,10 @@ impl NetworkBehaviour for Notifications { self.next_incoming_index.0 += 1; trace!(target: "sub-libp2p", "PSM <= Incoming({}, {:?}).", - source, incoming_id); - self.peerset.incoming(set_id, source, incoming_id); + peer_id, incoming_id); + self.peerset.incoming(set_id, peer_id, incoming_id); self.incoming.push(IncomingPeer { - peer_id: source, + peer_id, set_id, alive: true, incoming_id, @@ -1598,14 +1636,14 @@ impl NetworkBehaviour for Notifications { // DisabledPendingEnable => Enabled | DisabledPendingEnable PeerState::DisabledPendingEnable { mut connections, timer, timer_deadline } => { if let Some((_, connec_state)) = - connections.iter_mut().find(|(c, _)| *c == connection) + connections.iter_mut().find(|(c, _)| *c == connection_id) { if let ConnectionState::Closed = *connec_state { trace!(target: "sub-libp2p", "Handler({:?}, {:?}) <= Open({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); self.events.push_back(NetworkBehaviourAction::NotifyHandler { - peer_id: source, - handler: NotifyHandler::One(connection), + peer_id, + handler: NotifyHandler::One(connection_id), event: NotifsHandlerIn::Open { protocol_index: set_id.into() }, }); *connec_state = ConnectionState::Opening; @@ -1649,9 +1687,10 @@ impl NetworkBehaviour for Notifications { trace!(target: "sub-libp2p", "Handler({}, {:?}) => CloseDesired({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); - let mut entry = if let Entry::Occupied(entry) = self.peers.entry((source, set_id)) { + let mut entry = if let Entry::Occupied(entry) = self.peers.entry((peer_id, set_id)) + { entry } else { error!(target: "sub-libp2p", "CloseDesired: State mismatch in the custom protos handler"); @@ -1668,7 +1707,7 @@ impl NetworkBehaviour for Notifications { ))); let pos = if let Some(pos) = - connections.iter().position(|(c, _)| *c == connection) + connections.iter().position(|(c, _)| *c == connection_id) { pos } else { @@ -1686,10 +1725,10 @@ impl NetworkBehaviour for Notifications { debug_assert!(matches!(connections[pos].1, ConnectionState::Open(_))); connections[pos].1 = ConnectionState::Closing; - trace!(target: "sub-libp2p", "Handler({}, {:?}) <= Close({:?})", source, connection, set_id); + trace!(target: "sub-libp2p", "Handler({}, {:?}) <= Close({:?})", peer_id, connection_id, set_id); self.events.push_back(NetworkBehaviourAction::NotifyHandler { - peer_id: source, - handler: NotifyHandler::One(connection), + peer_id, + handler: NotifyHandler::One(connection_id), event: NotifsHandlerIn::Close { protocol_index: set_id.into() }, }); @@ -1699,9 +1738,9 @@ impl NetworkBehaviour for Notifications { _ => None, }) { if pos <= replacement_pos { - trace!(target: "sub-libp2p", "External API <= Sink replaced({:?})", source); + trace!(target: "sub-libp2p", "External API <= Sink replaced({:?})", peer_id); let event = NotificationsOut::CustomProtocolReplaced { - peer_id: source, + peer_id, set_id, notifications_sink: replacement_sink, }; @@ -1715,17 +1754,16 @@ impl NetworkBehaviour for Notifications { .iter() .any(|(_, s)| matches!(s, ConnectionState::Opening)) { - trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", source, set_id); - self.peerset.dropped(set_id, source, DropReason::Refused); + trace!(target: "sub-libp2p", "PSM <= Dropped({}, {:?})", peer_id, set_id); + self.peerset.dropped(set_id, peer_id, DropReason::Refused); *entry.into_mut() = PeerState::Disabled { connections, backoff_until: None }; } else { *entry.into_mut() = PeerState::Enabled { connections }; } - trace!(target: "sub-libp2p", "External API <= Closed({}, {:?})", source, set_id); - let event = - NotificationsOut::CustomProtocolClosed { peer_id: source, set_id }; + trace!(target: "sub-libp2p", "External API <= Closed({}, {:?})", peer_id, set_id); + let event = NotificationsOut::CustomProtocolClosed { peer_id, set_id }; self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } }, @@ -1749,16 +1787,16 @@ impl NetworkBehaviour for Notifications { trace!(target: "sub-libp2p", "Handler({}, {:?}) => CloseResult({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); - match self.peers.get_mut(&(source, set_id)) { + match self.peers.get_mut(&(peer_id, set_id)) { // Move the connection from `Closing` to `Closed`. Some(PeerState::Incoming { connections, .. }) | Some(PeerState::DisabledPendingEnable { connections, .. }) | Some(PeerState::Disabled { connections, .. }) | Some(PeerState::Enabled { connections, .. }) => { if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::Closing) + *c == connection_id && matches!(s, ConnectionState::Closing) }) { *connec_state = ConnectionState::Closed; } else { @@ -1787,9 +1825,9 @@ impl NetworkBehaviour for Notifications { let set_id = sc_peerset::SetId::from(protocol_index); trace!(target: "sub-libp2p", "Handler({}, {:?}) => OpenResultOk({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); - match self.peers.get_mut(&(source, set_id)) { + match self.peers.get_mut(&(peer_id, set_id)) { Some(PeerState::Enabled { connections, .. }) => { debug_assert!(connections.iter().any(|(_, s)| matches!( s, @@ -1799,12 +1837,12 @@ impl NetworkBehaviour for Notifications { connections.iter().any(|(_, s)| matches!(s, ConnectionState::Open(_))); if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::Opening) + *c == connection_id && matches!(s, ConnectionState::Opening) }) { if !any_open { - trace!(target: "sub-libp2p", "External API <= Open({}, {:?})", source, set_id); + trace!(target: "sub-libp2p", "External API <= Open({}, {:?})", peer_id, set_id); let event = NotificationsOut::CustomProtocolOpen { - peer_id: source, + peer_id, set_id, negotiated_fallback, received_handshake, @@ -1815,7 +1853,8 @@ impl NetworkBehaviour for Notifications { *connec_state = ConnectionState::Open(notifications_sink); } else if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::OpeningThenClosing) + *c == connection_id && + matches!(s, ConnectionState::OpeningThenClosing) }) { *connec_state = ConnectionState::Closing; } else { @@ -1829,7 +1868,7 @@ impl NetworkBehaviour for Notifications { Some(PeerState::DisabledPendingEnable { connections, .. }) | Some(PeerState::Disabled { connections, .. }) => { if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::OpeningThenClosing) + *c == connection_id && matches!(s, ConnectionState::OpeningThenClosing) }) { *connec_state = ConnectionState::Closing; } else { @@ -1852,9 +1891,10 @@ impl NetworkBehaviour for Notifications { let set_id = sc_peerset::SetId::from(protocol_index); trace!(target: "sub-libp2p", "Handler({:?}, {:?}) => OpenResultErr({:?})", - source, connection, set_id); + peer_id, connection_id, set_id); - let mut entry = if let Entry::Occupied(entry) = self.peers.entry((source, set_id)) { + let mut entry = if let Entry::Occupied(entry) = self.peers.entry((peer_id, set_id)) + { entry } else { error!(target: "sub-libp2p", "OpenResultErr: State mismatch in the custom protos handler"); @@ -1870,12 +1910,13 @@ impl NetworkBehaviour for Notifications { ))); if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::Opening) + *c == connection_id && matches!(s, ConnectionState::Opening) }) { *connec_state = ConnectionState::Closed; } else if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && matches!(s, ConnectionState::OpeningThenClosing) + *c == connection_id && + matches!(s, ConnectionState::OpeningThenClosing) }) { *connec_state = ConnectionState::Closing; } else { @@ -1887,8 +1928,8 @@ impl NetworkBehaviour for Notifications { if !connections.iter().any(|(_, s)| { matches!(s, ConnectionState::Opening | ConnectionState::Open(_)) }) { - trace!(target: "sub-libp2p", "PSM <= Dropped({:?})", source); - self.peerset.dropped(set_id, source, DropReason::Refused); + trace!(target: "sub-libp2p", "PSM <= Dropped({:?})", peer_id); + self.peerset.dropped(set_id, peer_id, DropReason::Refused); let ban_dur = Uniform::new(5, 10).sample(&mut rand::thread_rng()); *entry.into_mut() = PeerState::Disabled { @@ -1908,7 +1949,7 @@ impl NetworkBehaviour for Notifications { PeerState::DisabledPendingEnable { connections, .. } => { if let Some((_, connec_state)) = connections.iter_mut().find(|(c, s)| { - *c == connection && + *c == connection_id && matches!(s, ConnectionState::OpeningThenClosing) }) { *connec_state = ConnectionState::Closing; @@ -1937,30 +1978,30 @@ impl NetworkBehaviour for Notifications { NotifsHandlerOut::Notification { protocol_index, message } => { let set_id = sc_peerset::SetId::from(protocol_index); - if self.is_open(&source, set_id) { + if self.is_open(&peer_id, set_id) { trace!( target: "sub-libp2p", "Handler({:?}) => Notification({}, {:?}, {} bytes)", - connection, - source, + connection_id, + peer_id, set_id, message.len() ); trace!( target: "sub-libp2p", "External API <= Message({}, {:?})", - source, + peer_id, set_id, ); - let event = NotificationsOut::Notification { peer_id: source, set_id, message }; + let event = NotificationsOut::Notification { peer_id, set_id, message }; self.events.push_back(NetworkBehaviourAction::GenerateEvent(event)); } else { trace!( target: "sub-libp2p", "Handler({:?}) => Post-close notification({}, {:?}, {} bytes)", - connection, - source, + connection_id, + peer_id, set_id, message.len() ); diff --git a/client/network/src/protocol/notifications/tests.rs b/client/network/src/protocol/notifications/tests.rs index 66b2c0ef8d97a..9f93de85f690a 100644 --- a/client/network/src/protocol/notifications/tests.rs +++ b/client/network/src/protocol/notifications/tests.rs @@ -22,20 +22,16 @@ use crate::protocol::notifications::{Notifications, NotificationsOut, ProtocolCo use futures::prelude::*; use libp2p::{ - core::{ - connection::ConnectionId, - transport::{ListenerId, MemoryTransport}, - upgrade, ConnectedPoint, - }, + core::{connection::ConnectionId, transport::MemoryTransport, upgrade}, identity, noise, swarm::{ - ConnectionHandler, DialError, IntoConnectionHandler, NetworkBehaviour, + behaviour::FromSwarm, ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters, Swarm, SwarmEvent, }, yamux, Multiaddr, PeerId, Transport, }; use std::{ - error, io, iter, + iter, task::{Context, Poll}, time::Duration, }; @@ -154,42 +150,18 @@ impl NetworkBehaviour for CustomProtoWithAddr { list } - fn inject_connection_established( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - failed_addresses: Option<&Vec>, - other_established: usize, - ) { - self.inner.inject_connection_established( - peer_id, - conn, - endpoint, - failed_addresses, - other_established, - ) - } - - fn inject_connection_closed( - &mut self, - peer_id: &PeerId, - conn: &ConnectionId, - endpoint: &ConnectedPoint, - handler: ::Handler, - remaining_established: usize, - ) { - self.inner - .inject_connection_closed(peer_id, conn, endpoint, handler, remaining_established) + fn on_swarm_event(&mut self, event: FromSwarm) { + self.inner.on_swarm_event(event); } - fn inject_event( + fn on_connection_handler_event( &mut self, peer_id: PeerId, - connection: ConnectionId, - event: <::Handler as ConnectionHandler>::OutEvent, + connection_id: ConnectionId, + event: <::Handler as + ConnectionHandler>::OutEvent, ) { - self.inner.inject_event(peer_id, connection, event) + self.inner.on_connection_handler_event(peer_id, connection_id, event); } fn poll( @@ -199,43 +171,6 @@ impl NetworkBehaviour for CustomProtoWithAddr { ) -> Poll> { self.inner.poll(cx, params) } - - fn inject_dial_failure( - &mut self, - peer_id: Option, - handler: Self::ConnectionHandler, - error: &DialError, - ) { - self.inner.inject_dial_failure(peer_id, handler, error) - } - - fn inject_new_listener(&mut self, id: ListenerId) { - self.inner.inject_new_listener(id) - } - - fn inject_new_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.inner.inject_new_listen_addr(id, addr) - } - - fn inject_expired_listen_addr(&mut self, id: ListenerId, addr: &Multiaddr) { - self.inner.inject_expired_listen_addr(id, addr) - } - - fn inject_new_external_addr(&mut self, addr: &Multiaddr) { - self.inner.inject_new_external_addr(addr) - } - - fn inject_expired_external_addr(&mut self, addr: &Multiaddr) { - self.inner.inject_expired_external_addr(addr) - } - - fn inject_listener_error(&mut self, id: ListenerId, err: &(dyn error::Error + 'static)) { - self.inner.inject_listener_error(id, err); - } - - fn inject_listener_closed(&mut self, id: ListenerId, reason: Result<(), &io::Error>) { - self.inner.inject_listener_closed(id, reason); - } } #[test] From 672cac2ea02e1c59b8f433ff0b87951de9004f0f Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 21 Nov 2022 15:27:15 +0800 Subject: [PATCH 07/26] update libp2p --- Cargo.lock | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74e13b8e351b2..b0dd27e0fb8c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3632,7 +3632,7 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" version = "0.50.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "bytes", "futures", @@ -3664,7 +3664,7 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "asn1_der", "bs58", @@ -3696,7 +3696,7 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-std-resolver", "futures", @@ -3710,7 +3710,7 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "asynchronous-codec", "futures", @@ -3730,7 +3730,7 @@ dependencies = [ [[package]] name = "libp2p-kad" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "arrayvec 0.7.2", "asynchronous-codec", @@ -3757,7 +3757,7 @@ dependencies = [ [[package]] name = "libp2p-mdns" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-io", "data-encoding", @@ -3776,7 +3776,7 @@ dependencies = [ [[package]] name = "libp2p-metrics" version = "0.11.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "libp2p-core", "libp2p-identify", @@ -3789,7 +3789,7 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "asynchronous-codec", "bytes", @@ -3806,7 +3806,7 @@ dependencies = [ [[package]] name = "libp2p-noise" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "bytes", "curve25519-dalek 3.0.2", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "futures", "futures-timer", @@ -3842,7 +3842,7 @@ dependencies = [ [[package]] name = "libp2p-quic" version = "0.7.0-alpha" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-std", "bytes", @@ -3862,7 +3862,7 @@ dependencies = [ [[package]] name = "libp2p-request-response" version = "0.23.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-trait", "bytes", @@ -3879,7 +3879,7 @@ dependencies = [ [[package]] name = "libp2p-swarm" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-std", "either", @@ -3900,7 +3900,7 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" version = "0.30.2" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "heck", "quote", @@ -3910,7 +3910,7 @@ dependencies = [ [[package]] name = "libp2p-tcp" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "async-io", "futures", @@ -3925,7 +3925,7 @@ dependencies = [ [[package]] name = "libp2p-tls" version = "0.1.0-alpha" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "futures", "futures-rustls", @@ -3942,7 +3942,7 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "futures", "js-sys", @@ -3955,7 +3955,7 @@ dependencies = [ [[package]] name = "libp2p-websocket" version = "0.40.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "either", "futures", @@ -3973,7 +3973,7 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "futures", "libp2p-core", @@ -4424,8 +4424,8 @@ checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333" [[package]] name = "multistream-select" -version = "0.12.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +version = "0.12.1" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "bytes", "futures", @@ -7034,7 +7034,7 @@ dependencies = [ [[package]] name = "prost-codec" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "asynchronous-codec", "bytes", @@ -7643,7 +7643,7 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#08510dd523eaf2c0f80dfaebec951ee0a7bb42a9" +source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" dependencies = [ "futures", "pin-project", From 2fa1b2bbef007098be42d408f7ab468fd289428d Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 28 Nov 2022 11:41:31 +0800 Subject: [PATCH 08/26] libp2p 0.50.0 --- Cargo.lock | 68 ++++++++++++++++++++++++++++++++++++------------------ Cargo.toml | 3 --- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 12ab5a37b44eb..24e29b1763e83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3638,7 +3638,8 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "libp2p" version = "0.50.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e0a0d2f693675f49ded13c5d510c48b78069e23cbd9108d7ccd59f6dc568819" dependencies = [ "bytes", "futures", @@ -3670,7 +3671,8 @@ dependencies = [ [[package]] name = "libp2p-core" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6a8fcd392ff67af6cc3f03b1426c41f7f26b6b9aff2dc632c1c56dd649e571f" dependencies = [ "asn1_der", "bs58", @@ -3691,6 +3693,7 @@ dependencies = [ "prost-build", "rand 0.8.5", "rw-stream-sink", + "sec1", "sha2 0.10.2", "smallvec", "thiserror", @@ -3702,7 +3705,8 @@ dependencies = [ [[package]] name = "libp2p-dns" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e42a271c1b49f789b92f7fc87749fa79ce5c7bdc88cbdfacb818a4bca47fec5" dependencies = [ "async-std-resolver", "futures", @@ -3716,7 +3720,8 @@ dependencies = [ [[package]] name = "libp2p-identify" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "647d6a99f8d5b7366ee6bcc608ec186e2fb58b497cf914c8409b803bd0f594a2" dependencies = [ "asynchronous-codec", "futures", @@ -3736,7 +3741,8 @@ dependencies = [ [[package]] name = "libp2p-kad" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ee545eedf4f88502b2a4a2323405c3225d212d643212b0615856ca227fb9c3" dependencies = [ "arrayvec 0.7.2", "asynchronous-codec", @@ -3763,7 +3769,8 @@ dependencies = [ [[package]] name = "libp2p-mdns" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f378264aade9872d6ccd315c0accc18be3a35d15fc1b9c36e5b6f983b62b5b" dependencies = [ "async-io", "data-encoding", @@ -3782,7 +3789,8 @@ dependencies = [ [[package]] name = "libp2p-metrics" version = "0.11.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad8a64f29da86005c86a4d2728b8a0719e9b192f4092b609fd8790acb9dec55" dependencies = [ "libp2p-core", "libp2p-identify", @@ -3795,7 +3803,8 @@ dependencies = [ [[package]] name = "libp2p-mplex" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03805b44107aa013e7cbbfa5627b31c36cbedfdfb00603c0311998882bc4bace" dependencies = [ "asynchronous-codec", "bytes", @@ -3812,7 +3821,8 @@ dependencies = [ [[package]] name = "libp2p-noise" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a978cb57efe82e892ec6f348a536bfbd9fee677adbe5689d7a93ad3a9bffbf2e" dependencies = [ "bytes", "curve25519-dalek 3.0.2", @@ -3826,6 +3836,7 @@ dependencies = [ "sha2 0.10.2", "snow", "static_assertions", + "thiserror", "x25519-dalek", "zeroize", ] @@ -3833,7 +3844,8 @@ dependencies = [ [[package]] name = "libp2p-ping" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929fcace45a112536e22b3dcfd4db538723ef9c3cb79f672b98be2cc8e25f37f" dependencies = [ "futures", "futures-timer", @@ -3848,7 +3860,8 @@ dependencies = [ [[package]] name = "libp2p-quic" version = "0.7.0-alpha" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01e7c867e95c8130667b24409d236d37598270e6da69b3baf54213ba31ffca59" dependencies = [ "async-std", "bytes", @@ -3868,7 +3881,8 @@ dependencies = [ [[package]] name = "libp2p-request-response" version = "0.23.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3236168796727bfcf4927f766393415361e2c644b08bedb6a6b13d957c9a4884" dependencies = [ "async-trait", "bytes", @@ -3885,7 +3899,8 @@ dependencies = [ [[package]] name = "libp2p-swarm" version = "0.41.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca5d9634c4ce6cbfc0c91d932bb7a7ae89d37c6caea98fe3f8760a23b7ac486" dependencies = [ "async-std", "either", @@ -3906,7 +3921,8 @@ dependencies = [ [[package]] name = "libp2p-swarm-derive" version = "0.30.2" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61e1e960da4bb32dc4728c69e3a6cf83992507816d2a5a7dad22a187b5b0287" dependencies = [ "heck", "quote", @@ -3916,7 +3932,8 @@ dependencies = [ [[package]] name = "libp2p-tcp" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b257baf6df8f2df39678b86c578961d48cc8b68642a12f0f763f56c8e5858d" dependencies = [ "async-io", "futures", @@ -3931,7 +3948,8 @@ dependencies = [ [[package]] name = "libp2p-tls" version = "0.1.0-alpha" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7905ce0d040576634e8a3229a7587cc8beab83f79db6023800f1792895defa8" dependencies = [ "futures", "futures-rustls", @@ -3948,7 +3966,8 @@ dependencies = [ [[package]] name = "libp2p-wasm-ext" version = "0.38.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb1a35299860e0d4b3c02a3e74e3b293ad35ae0cee8a056363b0c862d082069" dependencies = [ "futures", "js-sys", @@ -3961,7 +3980,8 @@ dependencies = [ [[package]] name = "libp2p-websocket" version = "0.40.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d705506030d5c0aaf2882437c70dab437605f21c5f9811978f694e6917a3b54" dependencies = [ "either", "futures", @@ -3979,7 +3999,8 @@ dependencies = [ [[package]] name = "libp2p-yamux" version = "0.42.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f63594a0aa818642d9d4915c791945053877253f08a3626f13416b5cd928a29" dependencies = [ "futures", "libp2p-core", @@ -4431,7 +4452,8 @@ checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333" [[package]] name = "multistream-select" version = "0.12.1" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8552ab875c1313b97b8d20cb857b9fd63e2d1d6a0a1b53ce9821e575405f27a" dependencies = [ "bytes", "futures", @@ -7040,7 +7062,8 @@ dependencies = [ [[package]] name = "prost-codec" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc34979ff898b6e141106178981ce2596c387ea6e62533facfc61a37fc879c0" dependencies = [ "asynchronous-codec", "bytes", @@ -7649,7 +7672,8 @@ dependencies = [ [[package]] name = "rw-stream-sink" version = "0.3.0" -source = "git+https://github.com/libp2p/rust-libp2p.git?branch=master#9b182778e119200ee3f1e623f92149ef63d677ae" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26338f5e09bb721b85b135ea05af7767c90b52f6de4f087d4f4a3a9d64e7dc04" dependencies = [ "futures", "pin-project", diff --git a/Cargo.toml b/Cargo.toml index 809eb8dbf24dc..956c106e0dc2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -310,6 +310,3 @@ inherits = "release" lto = "fat" # https://doc.rust-lang.org/rustc/codegen-options/index.html#codegen-units codegen-units = 1 - -[patch.crates-io] -libp2p = { version = "0.50.0", git = "https://github.com/libp2p/rust-libp2p.git", branch = "master" } From b3c33b5706144503ca116677db7f292fd5213ea8 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 28 Nov 2022 12:35:41 +0800 Subject: [PATCH 09/26] rename OutboundQueryCompleted to OutboundQueryProgressed refs https://github.com/libp2p/rust-libp2p/pull/2712 --- client/network/src/discovery.rs | 45 ++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 3c03fbac04277..f95a78c43deec 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -58,8 +58,8 @@ use libp2p::{ self, store::{MemoryStore, RecordStore}, }, - GetClosestPeersError, Kademlia, KademliaBucketInserts, KademliaConfig, KademliaEvent, - QueryId, QueryResult, Quorum, Record, + GetClosestPeersError, GetRecordOk, Kademlia, KademliaBucketInserts, KademliaConfig, + KademliaEvent, QueryId, QueryResult, Quorum, Record, }, mdns::{async_io::Behaviour as Mdns, Config as MdnsConfig, Event as MdnsEvent}, multiaddr::Protocol, @@ -366,7 +366,7 @@ impl DiscoveryBehaviour { /// A corresponding `ValueFound` or `ValueNotFound` event will later be generated. pub fn get_value(&mut self, key: record::Key) { if let Some(k) = self.kademlia.as_mut() { - k.get_record(key.clone(), Quorum::One); + k.get_record(key.clone()); } } @@ -642,6 +642,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { } } + let records = Vec::new(); while let Poll::Ready(ev) = self.kademlia.poll(cx, params) { match ev { NetworkBehaviourAction::GenerateEvent(ev) => match ev { @@ -661,7 +662,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { KademliaEvent::InboundRequest { .. } => { // We are not interested in this event at the moment. }, - KademliaEvent::OutboundQueryCompleted { + KademliaEvent::OutboundQueryProgressed { result: QueryResult::GetClosestPeers(res), .. } => match res { @@ -686,24 +687,28 @@ impl NetworkBehaviour for DiscoveryBehaviour { } }, }, - KademliaEvent::OutboundQueryCompleted { + KademliaEvent::OutboundQueryProgressed { result: QueryResult::GetRecord(res), stats, + step, .. } => { let ev = match res { - Ok(ok) => { - let results = ok - .records - .into_iter() - .map(|r| (r.record.key, r.record.value)) - .collect(); - - DiscoveryOut::ValueFound( - results, - stats.duration().unwrap_or_default(), - ) - }, + Ok(ok) => + if let GetRecordOk::FoundRecord(r) = ok { + DiscoveryOut::ValueFound( + vec![(r.record.key, r.record.value)], + stats.duration().unwrap_or_default(), + ) + } else { + debug!( + target: "sub-libp2p", + "Libp2p => Query progressed to {:?} step (last: {:?})", + step.count, + step.last, + ); + continue + }, Err(e @ libp2p::kad::GetRecordError::NotFound { .. }) => { trace!( target: "sub-libp2p", @@ -729,7 +734,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { }; return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)) }, - KademliaEvent::OutboundQueryCompleted { + KademliaEvent::OutboundQueryProgressed { result: QueryResult::PutRecord(res), stats, .. @@ -751,7 +756,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { }; return Poll::Ready(NetworkBehaviourAction::GenerateEvent(ev)) }, - KademliaEvent::OutboundQueryCompleted { + KademliaEvent::OutboundQueryProgressed { result: QueryResult::RepublishRecord(res), .. } => match res { @@ -767,7 +772,7 @@ impl NetworkBehaviour for DiscoveryBehaviour { ), }, // We never start any other type of query. - KademliaEvent::OutboundQueryCompleted { result: e, .. } => { + KademliaEvent::OutboundQueryProgressed { result: e, .. } => { warn!(target: "sub-libp2p", "Libp2p => Unhandled Kademlia event: {:?}", e) }, }, From 20437d740f7cf9c928f56df1039f84bf9f45c0bd Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 28 Nov 2022 12:41:29 +0800 Subject: [PATCH 10/26] remove unused var --- client/network/src/discovery.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index f95a78c43deec..8048c12c6ad15 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -642,7 +642,6 @@ impl NetworkBehaviour for DiscoveryBehaviour { } } - let records = Vec::new(); while let Poll::Ready(ev) = self.kademlia.poll(cx, params) { match ev { NetworkBehaviourAction::GenerateEvent(ev) => match ev { From dbb7becf17e81a39519f2a8d67f36d49845d5f51 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Mon, 28 Nov 2022 12:59:43 +0800 Subject: [PATCH 11/26] accumulate outbound_query_records until query is finished --- client/network/src/discovery.rs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index 8048c12c6ad15..e1ea9b861b33c 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -249,6 +249,7 @@ impl DiscoveryConfig { NonZeroUsize::new(MAX_KNOWN_EXTERNAL_ADDRESSES) .expect("value is a constant; constant is non-zero; qed."), ), + outbound_query_records: Vec::new(), } } } @@ -286,6 +287,8 @@ pub struct DiscoveryBehaviour { allow_non_globals_in_dht: bool, /// A cache of discovered external addresses. Only used for logging purposes. known_external_addresses: LruHashSet, + /// A cache of outbound query records. + outbound_query_records: Vec<(record::Key, Vec)>, } impl DiscoveryBehaviour { @@ -695,10 +698,9 @@ impl NetworkBehaviour for DiscoveryBehaviour { let ev = match res { Ok(ok) => if let GetRecordOk::FoundRecord(r) = ok { - DiscoveryOut::ValueFound( - vec![(r.record.key, r.record.value)], - stats.duration().unwrap_or_default(), - ) + self.outbound_query_records + .push((r.record.key, r.record.value)); + continue } else { debug!( target: "sub-libp2p", @@ -706,7 +708,16 @@ impl NetworkBehaviour for DiscoveryBehaviour { step.count, step.last, ); - continue + if step.last { + let records = + self.outbound_query_records.drain(..).collect(); + DiscoveryOut::ValueFound( + records, + stats.duration().unwrap_or_default(), + ) + } else { + continue + } }, Err(e @ libp2p::kad::GetRecordError::NotFound { .. }) => { trace!( From f0dcf444c57db0b9d5a9806e29327f279846218c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 30 Nov 2022 12:20:46 +0800 Subject: [PATCH 12/26] format code --- client/network/src/request_responses.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index b8c7725631570..81704ef22c9a2 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -414,9 +414,11 @@ impl NetworkBehaviour for RequestResponsesBehaviour { return proto.on_connection_handler_event(peer_id, connection_id, event) } - log::warn!(target: "sub-libp2p", - "on_connection_handler_event: no request-response instance registered for protocol {:?}", - p_name) + log::warn!( + target: "sub-libp2p", + "on_connection_handler_event: no request-response instance registered for protocol {:?}", + p_name + ); } fn poll( From 849064f8a440a21ce26a836dc221fe56bb622c57 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 30 Nov 2022 12:22:18 +0800 Subject: [PATCH 13/26] use p_handler instead of new_handler https://github.com/paritytech/substrate/pull/12734#discussion_r1027640610 --- client/network/src/request_responses.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index 81704ef22c9a2..589f5489951a5 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -344,13 +344,21 @@ impl NetworkBehaviour for RequestResponsesBehaviour { ) } }, - FromSwarm::DialFailure(DialFailure { peer_id, error, .. }) => - for (p, _) in self.protocols.values_mut() { - let handler = p.new_handler(); - NetworkBehaviour::on_swarm_event( - p, - FromSwarm::DialFailure(DialFailure { peer_id, handler, error }), - ); + FromSwarm::DialFailure(DialFailure { peer_id, error, handler }) => + for (p_name, p_handler) in handler.into_iter() { + if let Some((proto, _)) = self.protocols.get_mut(p_name.as_str()) { + proto.on_swarm_event(FromSwarm::DialFailure(DialFailure { + peer_id, + handler: p_handler, + error, + })); + } else { + log::error!( + target: "sub-libp2p", + "on_swarm_event/dial_failure: no request-response instance registered for protocol {:?}", + p_name, + ) + } }, FromSwarm::ListenerClosed(e) => for (p, _) in self.protocols.values_mut() { From 0a8854f17702c70d514c42d3c258ed55f367bc6a Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 30 Nov 2022 12:26:30 +0800 Subject: [PATCH 14/26] pass ListenFailure to kademlia https://github.com/paritytech/substrate/pull/12734#discussion_r1034716664 --- client/network/src/discovery.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index e1ea9b861b33c..1b894c6109bb9 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -544,8 +544,8 @@ impl NetworkBehaviour for DiscoveryBehaviour { FromSwarm::ListenerClosed(e) => { self.kademlia.on_swarm_event(FromSwarm::ListenerClosed(e)); }, - FromSwarm::ListenFailure(_) => { - // NetworkBehaviour::inject_listen_failure on Kademlia does nothing. + FromSwarm::ListenFailure(e) => { + self.kademlia.on_swarm_event(FromSwarm::ListenFailure(e)); }, FromSwarm::ListenerError(e) => { self.kademlia.on_swarm_event(FromSwarm::ListenerError(e)); From edd7d8d60a47770edd562d9d24fbdcb802faad85 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Tue, 6 Dec 2022 14:54:45 +0800 Subject: [PATCH 15/26] use tokio executor in tests https://github.com/paritytech/substrate/pull/12734#discussion_r1039291776 --- client/network/src/discovery.rs | 20 +++++++++++++++---- .../src/protocol/notifications/tests.rs | 19 +++++++++++++++--- client/network/src/request_responses.rs | 20 ++++++++++++++++--- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/client/network/src/discovery.rs b/client/network/src/discovery.rs index a65f8bd00a6c4..16dbc7662c192 100644 --- a/client/network/src/discovery.rs +++ b/client/network/src/discovery.rs @@ -878,12 +878,19 @@ mod tests { }, identity::{ed25519, Keypair}, noise, - swarm::{Swarm, SwarmEvent}, + swarm::{Executor, Swarm, SwarmEvent}, yamux, Multiaddr, }; use sc_network_common::config::ProtocolId; use sp_core::hash::H256; - use std::{collections::HashSet, task::Poll}; + use std::{collections::HashSet, pin::Pin, task::Poll}; + + struct TokioExecutor(tokio::runtime::Runtime); + impl Executor for TokioExecutor { + fn exec(&self, f: Pin + Send>>) { + let _ = self.0.spawn(f); + } + } #[test] fn discovery_working() { @@ -920,8 +927,13 @@ mod tests { config.finish() }; - let mut swarm = - Swarm::with_threadpool_executor(transport, behaviour, keypair.public().to_peer_id()); + let runtime = tokio::runtime::Runtime::new().unwrap(); + let mut swarm = Swarm::with_executor( + transport, + behaviour, + keypair.public().to_peer_id(), + TokioExecutor(runtime), + ); let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); diff --git a/client/network/src/protocol/notifications/tests.rs b/client/network/src/protocol/notifications/tests.rs index d3d9b7ef77422..6e858697486ea 100644 --- a/client/network/src/protocol/notifications/tests.rs +++ b/client/network/src/protocol/notifications/tests.rs @@ -25,17 +25,25 @@ use libp2p::{ core::{connection::ConnectionId, transport::MemoryTransport, upgrade}, identity, noise, swarm::{ - behaviour::FromSwarm, ConnectionHandler, IntoConnectionHandler, NetworkBehaviour, + behaviour::FromSwarm, ConnectionHandler, Executor, IntoConnectionHandler, NetworkBehaviour, NetworkBehaviourAction, PollParameters, Swarm, SwarmEvent, }, yamux, Multiaddr, PeerId, Transport, }; use std::{ iter, + pin::Pin, task::{Context, Poll}, time::Duration, }; +struct TokioExecutor(tokio::runtime::Runtime); +impl Executor for TokioExecutor { + fn exec(&self, f: Pin + Send>>) { + let _ = self.0.spawn(f); + } +} + /// Builds two nodes that have each other as bootstrap nodes. /// This is to be used only for testing, and a panic will happen if something goes wrong. fn build_nodes() -> (Swarm, Swarm) { @@ -96,8 +104,13 @@ fn build_nodes() -> (Swarm, Swarm) { .collect(), }; - let mut swarm = - Swarm::with_threadpool_executor(transport, behaviour, keypairs[index].public().to_peer_id()); + let runtime = tokio::runtime::Runtime::new().unwrap(); + let mut swarm = Swarm::with_executor( + transport, + behaviour, + keypairs[index].public().to_peer_id(), + TokioExecutor(runtime), + ); swarm.listen_on(addrs[index].clone()).unwrap(); out.push(swarm); } diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index 589f5489951a5..8bacb99a4c53c 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -920,12 +920,19 @@ mod tests { }, identity::Keypair, noise, - swarm::{Swarm, SwarmEvent}, + swarm::{Executor, Swarm, SwarmEvent}, Multiaddr, }; use sc_peerset::{Peerset, PeersetConfig, SetConfig}; use std::{iter, time::Duration}; + struct TokioExecutor(tokio::runtime::Runtime); + impl Executor for TokioExecutor { + fn exec(&self, f: Pin + Send>>) { + let _ = self.0.spawn(f); + } + } + fn build_swarm( list: impl Iterator, ) -> (Swarm, Multiaddr, Peerset) { @@ -954,8 +961,13 @@ mod tests { let behaviour = RequestResponsesBehaviour::new(list, handle).unwrap(); - let mut swarm = - Swarm::with_threadpool_executor(transport, behaviour, keypair.public().to_peer_id()); + let runtime = tokio::runtime::Runtime::new().unwrap(); + let mut swarm = Swarm::with_executor( + transport, + behaviour, + keypair.public().to_peer_id(), + TokioExecutor(runtime), + ); let listen_addr: Multiaddr = format!("/memory/{}", rand::random::()).parse().unwrap(); swarm.listen_on(listen_addr.clone()).unwrap(); @@ -1073,6 +1085,7 @@ mod tests { fn max_response_size_exceeded() { let protocol_name = "/test/req-resp/1"; let mut pool = LocalPool::new(); + let tokio_executor = tokio::runtime::Runtime::new().unwrap(); // Build swarms whose behaviour is `RequestResponsesBehaviour`. let mut swarms = (0..2) @@ -1190,6 +1203,7 @@ mod tests { let protocol_name_1 = "/test/req-resp-1/1"; let protocol_name_2 = "/test/req-resp-2/1"; let mut pool = LocalPool::new(); + let tokio_executor = tokio::runtime::Runtime::new().unwrap(); let mut swarm_1 = { let protocol_configs = vec![ From bc1cb52a5b58bcfd0a882697fc4d02be4f9b707a Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 23 Dec 2022 17:17:46 +0700 Subject: [PATCH 16/26] use chrono Local::now instead of deprecated Local::today --- client/cli/src/runner.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/cli/src/runner.rs b/client/cli/src/runner.rs index d4191feddfa90..897a2c4726ae8 100644 --- a/client/cli/src/runner.rs +++ b/client/cli/src/runner.rs @@ -200,7 +200,7 @@ impl Runner { pub fn print_node_infos(config: &Configuration) { info!("{}", C::impl_name()); info!("✌️ version {}", C::impl_version()); - info!("❤️ by {}, {}-{}", C::author(), C::copyright_start_year(), Local::today().year()); + info!("❤️ by {}, {}-{}", C::author(), C::copyright_start_year(), Local::now().year()); info!("📋 Chain specification: {}", config.chain_spec.name()); info!("🏷 Node name: {}", config.network.node_name); info!("👤 Role: {}", config.display_role()); From 74015c5d2614386a6c365be7cff10b7dc1b535b1 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Fri, 23 Dec 2022 17:44:07 +0700 Subject: [PATCH 17/26] remove unused vars from request_responses tests --- client/network/src/request_responses.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/network/src/request_responses.rs b/client/network/src/request_responses.rs index 8bacb99a4c53c..45f1030400908 100644 --- a/client/network/src/request_responses.rs +++ b/client/network/src/request_responses.rs @@ -1085,7 +1085,6 @@ mod tests { fn max_response_size_exceeded() { let protocol_name = "/test/req-resp/1"; let mut pool = LocalPool::new(); - let tokio_executor = tokio::runtime::Runtime::new().unwrap(); // Build swarms whose behaviour is `RequestResponsesBehaviour`. let mut swarms = (0..2) @@ -1203,7 +1202,6 @@ mod tests { let protocol_name_1 = "/test/req-resp-1/1"; let protocol_name_2 = "/test/req-resp-2/1"; let mut pool = LocalPool::new(); - let tokio_executor = tokio::runtime::Runtime::new().unwrap(); let mut swarm_1 = { let protocol_configs = vec![ From a7624b16f0146b421d8201f0306e795a20b0d0b3 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 14:38:56 +0700 Subject: [PATCH 18/26] attempt to fix pallet UI tests --- .../dev_mode_without_arg_max_encoded_len.stderr | 2 +- .../storage_ensure_span_are_ok_on_wrong_gen.stderr | 10 +++++----- ...rage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr | 10 +++++----- .../tests/pallet_ui/storage_info_unsatisfied.stderr | 2 +- .../pallet_ui/storage_info_unsatisfied_nmap.stderr | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frame/support/test/tests/pallet_ui/dev_mode_without_arg_max_encoded_len.stderr b/frame/support/test/tests/pallet_ui/dev_mode_without_arg_max_encoded_len.stderr index be31b39c11725..c9de991135082 100644 --- a/frame/support/test/tests/pallet_ui/dev_mode_without_arg_max_encoded_len.stderr +++ b/frame/support/test/tests/pallet_ui/dev_mode_without_arg_max_encoded_len.stderr @@ -26,5 +26,5 @@ error[E0277]: the trait bound `Vec: MaxEncodedLen` is not satisfied (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7) - and 79 others + and $N others = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageMyStorage, Vec>` to implement `StorageInfoTrait` diff --git a/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen.stderr b/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen.stderr index 364eb5e6d5bb1..bc6d98b8da84d 100644 --- a/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen.stderr +++ b/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen.stderr @@ -28,7 +28,7 @@ error[E0277]: the trait bound `Bar: EncodeLike` is not satisfied <&[(T,)] as EncodeLike>> <&[(T,)] as EncodeLike>> <&[T] as EncodeLike>> - and 281 others + and $N others = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `PartialStorageInfoTrait` @@ -48,7 +48,7 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied Rc Vec bytes::bytes::Bytes - and 3 others + and $N others = note: required for `Bar` to implement `Encode` = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` @@ -69,7 +69,7 @@ error[E0277]: the trait bound `Bar: TypeInfo` is not satisfied (A, B, C, D) (A, B, C, D, E) (A, B, C, D, E, F) - and 163 others + and $N others = note: required for `Bar` to implement `StaticTypeInfo` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `StorageEntryMetadataBuilder` @@ -103,7 +103,7 @@ error[E0277]: the trait bound `Bar: EncodeLike` is not satisfied <&[(T,)] as EncodeLike>> <&[(T,)] as EncodeLike>> <&[T] as EncodeLike>> - and 281 others + and $N others = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `StorageEntryMetadataBuilder` @@ -123,7 +123,7 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied Rc Vec bytes::bytes::Bytes - and 3 others + and $N others = note: required for `Bar` to implement `Encode` = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` diff --git a/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr b/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr index 371e90323d9cb..1c010d662d07a 100644 --- a/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr +++ b/frame/support/test/tests/pallet_ui/storage_ensure_span_are_ok_on_wrong_gen_unnamed.stderr @@ -28,7 +28,7 @@ error[E0277]: the trait bound `Bar: EncodeLike` is not satisfied <&[(T,)] as EncodeLike>> <&[(T,)] as EncodeLike>> <&[T] as EncodeLike>> - and 281 others + and $N others = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `PartialStorageInfoTrait` @@ -48,7 +48,7 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied Rc Vec bytes::bytes::Bytes - and 3 others + and $N others = note: required for `Bar` to implement `Encode` = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` @@ -69,7 +69,7 @@ error[E0277]: the trait bound `Bar: TypeInfo` is not satisfied (A, B, C, D) (A, B, C, D, E) (A, B, C, D, E, F) - and 163 others + and $N others = note: required for `Bar` to implement `StaticTypeInfo` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `StorageEntryMetadataBuilder` @@ -103,7 +103,7 @@ error[E0277]: the trait bound `Bar: EncodeLike` is not satisfied <&[(T,)] as EncodeLike>> <&[(T,)] as EncodeLike>> <&[T] as EncodeLike>> - and 281 others + and $N others = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `StorageEntryMetadataBuilder` @@ -123,7 +123,7 @@ error[E0277]: the trait bound `Bar: WrapperTypeEncode` is not satisfied Rc Vec bytes::bytes::Bytes - and 3 others + and $N others = note: required for `Bar` to implement `Encode` = note: required for `Bar` to implement `FullEncode` = note: required for `Bar` to implement `FullCodec` diff --git a/frame/support/test/tests/pallet_ui/storage_info_unsatisfied.stderr b/frame/support/test/tests/pallet_ui/storage_info_unsatisfied.stderr index b5443c6f327e4..c17f9eaa03251 100644 --- a/frame/support/test/tests/pallet_ui/storage_info_unsatisfied.stderr +++ b/frame/support/test/tests/pallet_ui/storage_info_unsatisfied.stderr @@ -13,5 +13,5 @@ error[E0277]: the trait bound `Bar: MaxEncodedLen` is not satisfied (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7) - and 79 others + and $N others = note: required for `frame_support::pallet_prelude::StorageValue<_GeneratedPrefixForStorageFoo, Bar>` to implement `StorageInfoTrait` diff --git a/frame/support/test/tests/pallet_ui/storage_info_unsatisfied_nmap.stderr b/frame/support/test/tests/pallet_ui/storage_info_unsatisfied_nmap.stderr index afc7aaa8768cf..c34c796fe59c1 100644 --- a/frame/support/test/tests/pallet_ui/storage_info_unsatisfied_nmap.stderr +++ b/frame/support/test/tests/pallet_ui/storage_info_unsatisfied_nmap.stderr @@ -13,6 +13,6 @@ error[E0277]: the trait bound `Bar: MaxEncodedLen` is not satisfied (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6) (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7) - and 79 others + and $N others = note: required for `Key` to implement `KeyGeneratorMaxEncodedLen` = note: required for `frame_support::pallet_prelude::StorageNMap<_GeneratedPrefixForStorageFoo, Key, u32>` to implement `StorageInfoTrait` From 012b7c690d1c425b20eb6aa25988db28fb8f215b Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 14:49:54 +0700 Subject: [PATCH 19/26] restart CI From 8e895f670632dafd1a0f72556969306f042c42ef Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 15:02:56 +0700 Subject: [PATCH 20/26] restart CI From 81835bbdfc69301cc2cb53b968f1bb9b881a12b2 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 15:34:49 +0700 Subject: [PATCH 21/26] restart CI From 518906efd85fc3d40ce1cee56487989eab5b23ef Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 16:03:37 +0700 Subject: [PATCH 22/26] restart CI From 4421961d0e84d286b038ff9a315aa9ffd95f28b9 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 17:17:58 +0700 Subject: [PATCH 23/26] restart CI From 1cd1f7bc6bc624f6ccf98ded6c34b8e6fc5c1b84 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 17:26:23 +0700 Subject: [PATCH 24/26] restart CI From 5029024c4fb150b5820f4684bbe9db8863ca364c Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Wed, 4 Jan 2023 17:56:33 +0700 Subject: [PATCH 25/26] restart CI From e3f37e60d82d8e27020ebb7bbcc32839a1f42813 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 5 Jan 2023 12:05:59 +0700 Subject: [PATCH 26/26] restart CI