From d65f32f81996a0e7cce022bc859a11799cbcbaaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rich=CE=9Brd?= Date: Fri, 12 Jun 2026 08:32:33 -0400 Subject: [PATCH] chore: update libp2p to 2.0.0 (#1443) Co-authored-by: Arnaud --- .gitmodules | 20 +++++++-------- .../requests/node_lifecycle_request.nim | 2 +- .../storage_thread_request.nim | 17 ++++++------- storage/blockexchange/network/network.nim | 25 ++++++++++++------- storage/blockexchange/peers/peercontext.nim | 2 +- storage/conf.nim | 3 +-- storage/discovery.nim | 4 +-- storage/manifest/coders.nim | 1 + storage/rng.nim | 7 ++++-- storage/storage.nim | 5 ++-- storage/stores/networkstore.nim | 1 + storage/streams/asyncstreamwrapper.nim | 2 +- storage/utils/keyutils.nim | 2 +- tests/config.nims | 4 +-- tests/{logging.nim => logging_config.nim} | 2 +- .../blockexchange/discovery/testdiscovery.nim | 4 +-- tests/storage/blockexchange/testnetwork.nim | 2 +- tests/storage/examples.nim | 4 +-- tests/storage/helpers.nim | 5 ++-- tests/storage/helpers/nodeutils.nim | 3 ++- tests/storage/helpers/switchutils.nim | 19 ++++++++++++++ tests/storage/node/helpers.nim | 1 + vendor/logos-storage-nim-dht | 2 +- vendor/nim-boringssl | 1 + vendor/nim-chronos | 2 +- vendor/nim-libp2p | 2 +- vendor/nim-lsquic | 1 + vendor/nim-ngtcp2 | 1 - vendor/nim-protobuf-serialization | 2 +- vendor/nim-quic | 1 - vendor/nim-stew | 2 +- vendor/nim-websock | 2 +- 32 files changed, 91 insertions(+), 60 deletions(-) rename tests/{logging.nim => logging_config.nim} (87%) create mode 100644 tests/storage/helpers/switchutils.nim create mode 160000 vendor/nim-boringssl create mode 160000 vendor/nim-lsquic delete mode 160000 vendor/nim-ngtcp2 delete mode 160000 vendor/nim-quic diff --git a/.gitmodules b/.gitmodules index e6214d80..8538670b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -183,16 +183,16 @@ [submodule "vendor/nph"] path = vendor/nph url = https://github.com/arnetheduck/nph.git -[submodule "vendor/nim-quic"] - path = vendor/nim-quic - url = https://github.com/vacp2p/nim-quic.git - ignore = untracked - branch = main -[submodule "vendor/nim-ngtcp2"] - path = vendor/nim-ngtcp2 - url = https://github.com/vacp2p/nim-ngtcp2.git - ignore = untracked - branch = main [submodule "vendor/nim-merkletree"] path = vendor/nim-merkletree url = https://github.com/logos-storage/nim-merkletree +[submodule "vendor/nim-boringssl"] + path = vendor/nim-boringssl + url = https://github.com/vacp2p/nim-boringssl.git + ignore = untracked + branch = master +[submodule "vendor/nim-lsquic"] + path = vendor/nim-lsquic + url = https://github.com/vacp2p/nim-lsquic.git + ignore = untracked + branch = main diff --git a/library/storage_thread_requests/requests/node_lifecycle_request.nim b/library/storage_thread_requests/requests/node_lifecycle_request.nim index 105fc285..cccfd3fb 100644 --- a/library/storage_thread_requests/requests/node_lifecycle_request.nim +++ b/library/storage_thread_requests/requests/node_lifecycle_request.nim @@ -13,7 +13,7 @@ import results import confutils import confutils/std/net import confutils/defs -import libp2p +import libp2p except NATConfig import json_serialization import json_serialization/std/[options, net] import ../../alloc diff --git a/library/storage_thread_requests/storage_thread_request.nim b/library/storage_thread_requests/storage_thread_request.nim index 946ef4f8..eaa0bba4 100644 --- a/library/storage_thread_requests/storage_thread_request.nim +++ b/library/storage_thread_requests/storage_thread_request.nim @@ -58,9 +58,7 @@ proc createShared*( # We can improve this by dispatching the callbacks to a thread pool or # moving to a MP channel. # See: https://github.com/logos-storage/logos-storage-nim/pull/1322#discussion_r2340708316 -proc handleRes[T: string | void | seq[byte]]( - res: Result[T, string], request: ptr StorageThreadRequest -) = +proc handleRes(res: Result[string, string], request: ptr StorageThreadRequest) = ## Handles the Result responses, which can either be Result[string, string] or ## Result[void, string]. defer: @@ -78,12 +76,13 @@ proc handleRes[T: string | void | seq[byte]]( return foreignThreadGc: - var msg: cstring = "" - when T is string: - msg = res.get().cstring() - request[].callback( - RET_OK, unsafeAddr msg[0], cast[csize_t](len(msg)), request[].userData - ) + let msg = res.get() + if msg.len == 0: + request[].callback(RET_OK, nil, cast[csize_t](0), request[].userData) + else: + request[].callback( + RET_OK, unsafeAddr msg[0], cast[csize_t](msg.len), request[].userData + ) return proc process*( diff --git a/storage/blockexchange/network/network.nim b/storage/blockexchange/network/network.nim index 5f53fe20..1d7ebafb 100644 --- a/storage/blockexchange/network/network.nim +++ b/storage/blockexchange/network/network.nim @@ -13,7 +13,7 @@ import std/sequtils import pkg/chronos import pkg/libp2p -import pkg/libp2p/utils/semaphore +import pkg/libp2p/protocols/protocol as lp_protocol import pkg/questionable import pkg/questionable/results @@ -103,17 +103,23 @@ proc send*( peerId = id, hasWantList = msg.wantList.entries.len > 0 return + var acquired = false try: let peer = b.peers[id] await b.inflightSema.acquire() + acquired = true await peer.send(msg) except CancelledError as error: raise error except CatchableError as err: error "Error sending message", peer = id, msg = err.msg finally: - b.inflightSema.release() + if acquired: + try: + b.inflightSema.release() + except AsyncSemaphoreError as err: + error "Error releasing inflight semaphore", msg = err.msg proc handleWantList( b: BlockExcNetwork, peer: NetworkPeer, list: WantList @@ -295,7 +301,6 @@ method init*(self: BlockExcNetwork) {.raises: [].} = await blockexcPeer.readLoop(conn) # attach read loop self.handler = handler - self.codec = Codec proc stop*(self: BlockExcNetwork) {.async: (raises: []).} = await self.trackedFutures.cancelTracked() @@ -309,14 +314,16 @@ proc new*( ## Create a new BlockExcNetwork instance ## - let self = BlockExcNetwork( - switch: switch, - getConn: connProvider, - inflightSema: newAsyncSemaphore(maxInflight), - maxInflight: maxInflight, + let self = lp_protocol.new( + BlockExcNetwork, @[Codec], nil, maxIncomingStreamsTotal = maxInflight ) + self.switch = switch + self.getConn = connProvider + self.inflightSema = newAsyncSemaphore(max(maxInflight, 1)) + if maxInflight == 0: + discard self.inflightSema.tryAcquire() - self.maxIncomingStreams = self.maxInflight + self.maxInflight = maxInflight proc sendWantList( id: PeerId, diff --git a/storage/blockexchange/peers/peercontext.nim b/storage/blockexchange/peers/peercontext.nim index 9e7c80f6..d81a4161 100644 --- a/storage/blockexchange/peers/peercontext.nim +++ b/storage/blockexchange/peers/peercontext.nim @@ -7,7 +7,7 @@ ## This file may not be copied, modified, or distributed except according to ## those terms. -import std/math +import std/[math, options] import pkg/libp2p import pkg/chronos diff --git a/storage/conf.nim b/storage/conf.nim index a6d0b571..2937bad4 100644 --- a/storage/conf.nim +++ b/storage/conf.nim @@ -30,10 +30,9 @@ import pkg/toml_serialization import pkg/metrics import pkg/metrics/chronos_httpserver import pkg/stew/byteutils -import pkg/libp2p +import pkg/libp2p except NATConfig import pkg/questionable import pkg/questionable/results -import pkg/stew/base64 import ./storagetypes import ./discovery diff --git a/storage/discovery.nim b/storage/discovery.nim index 8c724940..c5943d88 100644 --- a/storage/discovery.nim +++ b/storage/discovery.nim @@ -21,7 +21,7 @@ import pkg/contractabi/address as ca import pkg/codexdht/discv5/[routing_table, protocol as discv5] from pkg/nimcrypto import keccak256 -import ./rng +import ./rng as storage_rng import ./errors import ./logutils @@ -260,7 +260,7 @@ proc new*( bindPort = bindPort, record = self.providerRecord.get, bootstrapRecords = bootstrapNodes, - rng = Rng.instance(), + rng = storage_rng.libp2pRng(storage_rng.Rng.instance()), providers = ProvidersManager.new(store), config = discoveryConfig, ) diff --git a/storage/manifest/coders.nim b/storage/manifest/coders.nim index 80a9879e..8f0ae128 100644 --- a/storage/manifest/coders.nim +++ b/storage/manifest/coders.nim @@ -14,6 +14,7 @@ import times {.push raises: [].} import std/tables +import std/options import pkg/libp2p import pkg/questionable diff --git a/storage/rng.nim b/storage/rng.nim index 3b46f963..8f9b0c65 100644 --- a/storage/rng.nim +++ b/storage/rng.nim @@ -8,8 +8,8 @@ ## those terms. import std/sugar -import pkg/libp2p/crypto/crypto import pkg/bearssl/rand +import pkg/libp2p/crypto/rng as libp2p_rng type RngSampleError = object of CatchableError @@ -19,9 +19,12 @@ var rng {.threadvar.}: Rng proc instance*(t: type Rng): Rng = if rng.isNil: - rng = newRng() + rng = HmacDrbgContext.new() rng +proc libp2pRng*(rng: Rng): libp2p_rng.Rng = + libp2p_rng.newBearSslRng(rng) + # Random helpers: similar as in stdlib, but with HmacDrbgContext rng # TODO: Move these somewhere else? const randMax = 18_446_744_073_709_551_615'u64 diff --git a/storage/storage.nim b/storage/storage.nim index 8c45f078..678f5f87 100644 --- a/storage/storage.nim +++ b/storage/storage.nim @@ -174,8 +174,9 @@ proc new*( let switch = SwitchBuilder .new() .withPrivateKey(privateKey) - .withAddresses(@[listenMultiAddr]) - .withRng(random.Rng.instance()) + .withAddresses(@[listenMultiAddr], enableWildcardResolver = true) + .withIdentifyPusher(false) + .withRng(random.Rng.instance().libp2pRng) .withNoise() .withYamux() .withMaxConnections(config.maxPeers) diff --git a/storage/stores/networkstore.nim b/storage/stores/networkstore.nim index 8c781f6b..19faacd5 100644 --- a/storage/stores/networkstore.nim +++ b/storage/stores/networkstore.nim @@ -9,6 +9,7 @@ {.push raises: [].} +import std/options import pkg/chronos import pkg/libp2p import pkg/questionable/results diff --git a/storage/streams/asyncstreamwrapper.nim b/storage/streams/asyncstreamwrapper.nim index f80c0696..e37c7df6 100644 --- a/storage/streams/asyncstreamwrapper.nim +++ b/storage/streams/asyncstreamwrapper.nim @@ -79,7 +79,7 @@ proc completeWrite( await fut method write*( - self: AsyncStreamWrapper, msg: seq[byte] + self: AsyncStreamWrapper, msg: sink seq[byte] ): Future[void] {.async: (raises: [CancelledError, LPStreamError], raw: true).} = # Avoid a copy of msg being kept in the closure created by `{.async.}` as this # drives up memory usage diff --git a/storage/utils/keyutils.nim b/storage/utils/keyutils.nim index 372777c2..2a99102e 100644 --- a/storage/utils/keyutils.nim +++ b/storage/utils/keyutils.nim @@ -27,7 +27,7 @@ proc setupKey*(path: string): ?!PrivateKey = if not path.fileAccessible({AccessFlags.Find}): info "Creating a private key and saving it" let - res = ?PrivateKey.random(Rng.instance()[]).mapFailure(StorageKeyError) + res = ?PrivateKey.random(Rng.instance().libp2pRng).mapFailure(StorageKeyError) bytes = ?res.getBytes().mapFailure(StorageKeyError) ?path.secureWriteFile(bytes).mapFailure(StorageKeyError) diff --git a/tests/config.nims b/tests/config.nims index 8ae00806..3e310ad6 100644 --- a/tests/config.nims +++ b/tests/config.nims @@ -7,8 +7,8 @@ when not defined(chronicles_log_level): --define: - "chronicles_log_level:NONE" # compile all log statements + "chronicles_log_level:TRACE" # compile trace log statements --define: "chronicles_sinks:textlines[dynamic]" # allow logs to be filtered at runtime --"import": - "logging" # ensure that logging is ignored at runtime + "logging_config" # ensure that logging is ignored at runtime diff --git a/tests/logging.nim b/tests/logging_config.nim similarity index 87% rename from tests/logging.nim rename to tests/logging_config.nim index 30f91e6e..3e1c8d5a 100644 --- a/tests/logging.nim +++ b/tests/logging_config.nim @@ -1,5 +1,5 @@ when not defined(nimscript): - import pkg/storage/logutils + import pkg/chronicles proc ignoreLogging(level: LogLevel, message: LogOutputStr) = discard diff --git a/tests/storage/blockexchange/discovery/testdiscovery.nim b/tests/storage/blockexchange/discovery/testdiscovery.nim index d467361e..dec89b95 100644 --- a/tests/storage/blockexchange/discovery/testdiscovery.nim +++ b/tests/storage/blockexchange/discovery/testdiscovery.nim @@ -1,6 +1,4 @@ -import std/sequtils -import std/sugar -import std/tables +import std/[options, sequtils, sugar, tables] import pkg/chronos diff --git a/tests/storage/blockexchange/testnetwork.nim b/tests/storage/blockexchange/testnetwork.nim index dd035a44..3c8039fe 100644 --- a/tests/storage/blockexchange/testnetwork.nim +++ b/tests/storage/blockexchange/testnetwork.nim @@ -15,7 +15,7 @@ import ../helpers asyncchecksuite "Network - Handlers": let rng = Rng.instance() - seckey = PrivateKey.random(rng[]).tryGet() + seckey = PrivateKey.random(rng.libp2pRng).tryGet() peerId = PeerId.init(seckey.getPublicKey().tryGet()).tryGet() chunker = RandomChunker.new(Rng.instance(), size = 1024, chunkSize = 256) diff --git a/tests/storage/examples.nim b/tests/storage/examples.nim index 4b171b82..aa4b20fe 100644 --- a/tests/storage/examples.nim +++ b/tests/storage/examples.nim @@ -2,7 +2,7 @@ import std/[random, sequtils] import pkg/libp2p import pkg/stint -import pkg/storage/rng +import pkg/storage/rng as storage_rng import pkg/storage/stores import pkg/storage/blocktype as bt import pkg/storage/merkletree @@ -16,7 +16,7 @@ proc example*(_: type bt.Block, size: int = 4096): bt.Block = bt.Block.new(bytes).tryGet() proc example*(_: type PeerId): PeerId = - let key = PrivateKey.random(Rng.instance[]).get + let key = PrivateKey.random(storage_rng.Rng.instance().libp2pRng).get PeerId.init(key.getPublicKey().get).get proc example*(_: type PeerContext): PeerContext = diff --git a/tests/storage/helpers.nim b/tests/storage/helpers.nim index 423d2b69..2fbe050b 100644 --- a/tests/storage/helpers.nim +++ b/tests/storage/helpers.nim @@ -19,11 +19,12 @@ import ./helpers/randomchunker import ./helpers/mockchunker import ./helpers/mockdiscovery import ./helpers/always +import ./helpers/switchutils import ../checktest export - randomchunker, nodeutils, datasetutils, mockdiscovery, mockchunker, always, checktest, - manifest + randomchunker, nodeutils, datasetutils, mockdiscovery, mockchunker, switchutils, + always, checktest, manifest export libp2p except setup, eventually diff --git a/tests/storage/helpers/nodeutils.nim b/tests/storage/helpers/nodeutils.nim index 328f1e6b..fdaf6162 100644 --- a/tests/storage/helpers/nodeutils.nim +++ b/tests/storage/helpers/nodeutils.nim @@ -2,7 +2,7 @@ import std/[sequtils, sets] import pkg/chronos import pkg/taskpools -import pkg/libp2p +import pkg/libp2p except NATConfig import pkg/libp2p/errors import pkg/codexdht/discv5/routing_table @@ -22,6 +22,7 @@ import ./datasetutils import ./mockdiscovery import ../examples import ../../helpers +import ./switchutils proc nextFreePort*(startPort: int): Future[int] {.async.} = proc client(server: StreamServer, transp: StreamTransport) {.async: (raises: []).} = diff --git a/tests/storage/helpers/switchutils.nim b/tests/storage/helpers/switchutils.nim new file mode 100644 index 00000000..380913bf --- /dev/null +++ b/tests/storage/helpers/switchutils.nim @@ -0,0 +1,19 @@ +import pkg/libp2p +import pkg/storage/rng as storage_rng + +proc newStandardSwitch*( + transportFlags: set[ServerFlags] = {}, + sendSignedPeerRecord = false, + addrs: MultiAddress = + MultiAddress.init("/ip4/127.0.0.1/tcp/0").expect("invalid multiaddress"), +): Switch = + SwitchBuilder + .new() + .withAddresses(@[addrs], enableWildcardResolver = true) + .withSignedPeerRecord(sendSignedPeerRecord) + .withIdentifyPusher(false) + .withRng(storage_rng.Rng.instance().libp2pRng) + .withNoise() + .withMplex() + .withTcpTransport(transportFlags) + .build() diff --git a/tests/storage/node/helpers.nim b/tests/storage/node/helpers.nim index d5e9678f..af4012b8 100644 --- a/tests/storage/node/helpers.nim +++ b/tests/storage/node/helpers.nim @@ -7,6 +7,7 @@ import pkg/storage/chunker import pkg/storage/stores import ../../asynctest +import ../helpers/switchutils type CountingStore* = ref object of NetworkStore lookups*: Table[Cid, int] diff --git a/vendor/logos-storage-nim-dht b/vendor/logos-storage-nim-dht index 1af8dcf5..d13c1c15 160000 --- a/vendor/logos-storage-nim-dht +++ b/vendor/logos-storage-nim-dht @@ -1 +1 @@ -Subproject commit 1af8dcf50447b5f68d1843e321c71dd871ecf245 +Subproject commit d13c1c1588338d4622221cc47ba88f642a73a94e diff --git a/vendor/nim-boringssl b/vendor/nim-boringssl new file mode 160000 index 00000000..f8111056 --- /dev/null +++ b/vendor/nim-boringssl @@ -0,0 +1 @@ +Subproject commit f8111056182cf6abd9e35de77a919e873ef94652 diff --git a/vendor/nim-chronos b/vendor/nim-chronos index 785fcf4d..9620a469 160000 --- a/vendor/nim-chronos +++ b/vendor/nim-chronos @@ -1 +1 @@ -Subproject commit 785fcf4ddec1101a3df1f044d6331504d7ab95c6 +Subproject commit 9620a4691ab8bff1dcab33bc13a15c7012f53eb9 diff --git a/vendor/nim-libp2p b/vendor/nim-libp2p index e82080f7..c4319937 160000 --- a/vendor/nim-libp2p +++ b/vendor/nim-libp2p @@ -1 +1 @@ -Subproject commit e82080f7b1aa61c6d35fa5311b873f41eff4bb52 +Subproject commit c43199378f46d0aaf61be1cad1ee1d63e8f665d6 diff --git a/vendor/nim-lsquic b/vendor/nim-lsquic new file mode 160000 index 00000000..00e4b7df --- /dev/null +++ b/vendor/nim-lsquic @@ -0,0 +1 @@ +Subproject commit 00e4b7dfaa197cd120267aa897b33b0914166b45 diff --git a/vendor/nim-ngtcp2 b/vendor/nim-ngtcp2 deleted file mode 160000 index 791eb859..00000000 --- a/vendor/nim-ngtcp2 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 791eb859145f9f268eb23eb9cbe777bdd7699c4d diff --git a/vendor/nim-protobuf-serialization b/vendor/nim-protobuf-serialization index 4d74e157..f45476a3 160000 --- a/vendor/nim-protobuf-serialization +++ b/vendor/nim-protobuf-serialization @@ -1 +1 @@ -Subproject commit 4d74e157cdf1bdcd0ffd41519ebde740c4b80447 +Subproject commit f45476a3c1f4e7bff73845e6450d686be040ddeb diff --git a/vendor/nim-quic b/vendor/nim-quic deleted file mode 160000 index 6d8678a1..00000000 --- a/vendor/nim-quic +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6d8678a159bfb902f9725f0081d542134cd93916 diff --git a/vendor/nim-stew b/vendor/nim-stew index b6616873..4382b18f 160000 --- a/vendor/nim-stew +++ b/vendor/nim-stew @@ -1 +1 @@ -Subproject commit b66168735d6f3841c5239c3169d3fe5fe98b1257 +Subproject commit 4382b18f04b3c43c8409bfcd6b62063773b2bbaa diff --git a/vendor/nim-websock b/vendor/nim-websock index 35ae76f1..387a8eb7 160000 --- a/vendor/nim-websock +++ b/vendor/nim-websock @@ -1 +1 @@ -Subproject commit 35ae76f1559e835c80f9c1a3943bf995d3dd9eb5 +Subproject commit 387a8eb7e961e8fdd3b1a717d36bc53b55e4dc5d