From 106de0418e3435c482a79380ec4de9daf1a4e108 Mon Sep 17 00:00:00 2001 From: fmar Date: Mon, 22 Dec 2025 01:34:54 +0100 Subject: [PATCH 1/5] use isolate.run --- .../repositories/verifiers/bip340_event_verifier.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart index eb43da84a..9db797749 100644 --- a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart +++ b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart @@ -1,3 +1,5 @@ +import 'dart:isolate'; + import 'package:bip340/bip340.dart' as bip340; import '../../../domain_layer/entities/nip_01_event.dart'; @@ -8,6 +10,8 @@ import '../../../domain_layer/repositories/event_verifier.dart'; class Bip340EventVerifier implements EventVerifier { @override Future verify(Nip01Event event) async { - return bip340.verify(event.pubKey, event.id, event.sig); + return await Isolate.run(() { + return bip340.verify(event.pubKey, event.id, event.sig); + }); } } From 8ab39e91c05d3f008e4918b2e6d82b85e01a1e48 Mon Sep 17 00:00:00 2001 From: fmar Date: Mon, 22 Dec 2025 02:36:55 +0100 Subject: [PATCH 2/5] add useIsolate as an optional constructor param for configuration --- .../verifiers/bip340_event_verifier.dart | 8 +++- .../sample-app/lib/query_performance.dart | 45 ++++++++++++++++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart index 9db797749..602ffdfd1 100644 --- a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart +++ b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart @@ -8,10 +8,14 @@ import '../../../domain_layer/repositories/event_verifier.dart'; /// Pure dart event verifier using https://pub.dev/packages/bip340 /// can be slow on mobile devices class Bip340EventVerifier implements EventVerifier { + bool useIsolate = true; + + Bip340EventVerifier({this.useIsolate = true}); + @override Future verify(Nip01Event event) async { - return await Isolate.run(() { + return useIsolate? await Isolate.run(() { return bip340.verify(event.pubKey, event.id, event.sig); - }); + }) : bip340.verify(event.pubKey, event.id, event.sig); } } diff --git a/packages/sample-app/lib/query_performance.dart b/packages/sample-app/lib/query_performance.dart index 59ccc5cb7..5e26ee08c 100644 --- a/packages/sample-app/lib/query_performance.dart +++ b/packages/sample-app/lib/query_performance.dart @@ -5,6 +5,7 @@ import 'package:ndk_rust_verifier/data_layer/repositories/verifiers/rust_event_v class MyVerifiers { static final bip340Verifier = Bip340EventVerifier(); + static final bip340VerifierNoIsolate = Bip340EventVerifier(useIsolate: false); static final rustVerifier = RustEventVerifier(); } @@ -19,16 +20,25 @@ class QueryPerformancePage extends StatefulWidget { class _QueryPerformancePageState extends State { int _eventCount = 100; String _bip340Time = ''; + String _bip340NoIsolateTime = ''; String _rustTime = ''; bool _isVerifyingBip340 = false; + bool _isVerifyingBip340NoIsolate = false; bool _isVerifyingRust = false; - static const relays = ["ws://localhost:10547"]; + static const relays = ["wss://relay.primal.net"]; final ndkBip340 = Ndk(NdkConfig( eventVerifier: MyVerifiers.bip340Verifier, cache: MemCacheManager(), bootstrapRelays: relays, + logLevel: LogLevel.warning + )); + + final ndkBip340NoIsolate = Ndk(NdkConfig( + eventVerifier: MyVerifiers.bip340VerifierNoIsolate, + cache: MemCacheManager(), + bootstrapRelays: relays, )); final ndkRust = Ndk(NdkConfig( @@ -53,6 +63,22 @@ class _QueryPerformancePageState extends State { }); } + Future _runBip340NoIsolateQuery() async { + setState(() { + _isVerifyingBip340NoIsolate = true; + _bip340NoIsolateTime = ''; + }); + + final stopwatch = Stopwatch()..start(); + await _runQuery(ndkBip340NoIsolate); + stopwatch.stop(); + + setState(() { + _isVerifyingBip340NoIsolate = false; + _bip340NoIsolateTime = '${stopwatch.elapsedMilliseconds}ms'; + }); + } + Future _runRustQuery() async { setState(() { _isVerifyingRust = true; @@ -135,6 +161,23 @@ class _QueryPerformancePageState extends State { style: Theme.of(context).textTheme.bodyLarge, ), const SizedBox(height: 24), + ElevatedButton( + onPressed: _isVerifyingBip340NoIsolate ? null : _runBip340NoIsolateQuery, + child: _isVerifyingBip340NoIsolate + ? const SizedBox( + height: 20, + width: 20, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Text('Run with BIP340 (no isolate)'), + ), + const SizedBox(height: 8), + Text( + _bip340NoIsolateTime.isEmpty ? 'Not run yet' : 'Time: $_bip340NoIsolateTime', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.bodyLarge, + ), + const SizedBox(height: 24), ElevatedButton( onPressed: _isVerifyingRust ? null : _runRustQuery, child: _isVerifyingRust From 38ab22476a91596658ac475c60d3d6cc400f6c6c Mon Sep 17 00:00:00 2001 From: fmar Date: Wed, 14 Jan 2026 16:21:41 +0100 Subject: [PATCH 3/5] rollback --- .../sample-app/lib/query_performance.dart | 57 +++---------------- 1 file changed, 7 insertions(+), 50 deletions(-) diff --git a/packages/sample-app/lib/query_performance.dart b/packages/sample-app/lib/query_performance.dart index 5e26ee08c..fd028e32b 100644 --- a/packages/sample-app/lib/query_performance.dart +++ b/packages/sample-app/lib/query_performance.dart @@ -5,7 +5,6 @@ import 'package:ndk_rust_verifier/data_layer/repositories/verifiers/rust_event_v class MyVerifiers { static final bip340Verifier = Bip340EventVerifier(); - static final bip340VerifierNoIsolate = Bip340EventVerifier(useIsolate: false); static final rustVerifier = RustEventVerifier(); } @@ -20,25 +19,16 @@ class QueryPerformancePage extends StatefulWidget { class _QueryPerformancePageState extends State { int _eventCount = 100; String _bip340Time = ''; - String _bip340NoIsolateTime = ''; String _rustTime = ''; bool _isVerifyingBip340 = false; - bool _isVerifyingBip340NoIsolate = false; bool _isVerifyingRust = false; - static const relays = ["wss://relay.primal.net"]; + static const relays = ["ws://localhost:10547"]; final ndkBip340 = Ndk(NdkConfig( eventVerifier: MyVerifiers.bip340Verifier, cache: MemCacheManager(), bootstrapRelays: relays, - logLevel: LogLevel.warning - )); - - final ndkBip340NoIsolate = Ndk(NdkConfig( - eventVerifier: MyVerifiers.bip340VerifierNoIsolate, - cache: MemCacheManager(), - bootstrapRelays: relays, )); final ndkRust = Ndk(NdkConfig( @@ -63,22 +53,6 @@ class _QueryPerformancePageState extends State { }); } - Future _runBip340NoIsolateQuery() async { - setState(() { - _isVerifyingBip340NoIsolate = true; - _bip340NoIsolateTime = ''; - }); - - final stopwatch = Stopwatch()..start(); - await _runQuery(ndkBip340NoIsolate); - stopwatch.stop(); - - setState(() { - _isVerifyingBip340NoIsolate = false; - _bip340NoIsolateTime = '${stopwatch.elapsedMilliseconds}ms'; - }); - } - Future _runRustQuery() async { setState(() { _isVerifyingRust = true; @@ -147,33 +121,16 @@ class _QueryPerformancePageState extends State { ElevatedButton( onPressed: _isVerifyingBip340 ? null : _runBip340Query, child: _isVerifyingBip340 - ? const SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : const Text('Run with BIP340'), - ), - const SizedBox(height: 8), - Text( - _bip340Time.isEmpty ? 'Not run yet' : 'Time: $_bip340Time', - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.bodyLarge, - ), - const SizedBox(height: 24), - ElevatedButton( - onPressed: _isVerifyingBip340NoIsolate ? null : _runBip340NoIsolateQuery, - child: _isVerifyingBip340NoIsolate ? const SizedBox( height: 20, width: 20, child: CircularProgressIndicator(strokeWidth: 2), ) - : const Text('Run with BIP340 (no isolate)'), + : const Text('Run with BIP340'), ), const SizedBox(height: 8), Text( - _bip340NoIsolateTime.isEmpty ? 'Not run yet' : 'Time: $_bip340NoIsolateTime', + _bip340Time.isEmpty ? 'Not run yet' : 'Time: $_bip340Time', textAlign: TextAlign.center, style: Theme.of(context).textTheme.bodyLarge, ), @@ -182,10 +139,10 @@ class _QueryPerformancePageState extends State { onPressed: _isVerifyingRust ? null : _runRustQuery, child: _isVerifyingRust ? const SizedBox( - height: 20, - width: 20, - child: CircularProgressIndicator(strokeWidth: 2), - ) + height: 20, + width: 20, + child: CircularProgressIndicator(strokeWidth: 2), + ) : const Text('Run with Rust'), ), const SizedBox(height: 8), From 958f17cd450e1aa1934e992539bcb0a487e09b24 Mon Sep 17 00:00:00 2001 From: fmar Date: Thu, 15 Jan 2026 20:57:40 +0100 Subject: [PATCH 4/5] fix null check --- .../repositories/verifiers/bip340_event_verifier.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart index 7605f4499..7318f50d5 100644 --- a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart +++ b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart @@ -20,7 +20,7 @@ class Bip340EventVerifier implements EventVerifier { } if (!Nip01Utils.isIdValid(event)) return false; return useIsolate? await Isolate.run(() { - return bip340.verify(event.pubKey, event.id, event.sig); - }) : bip340.verify(event.pubKey, event.id, event.sig); + return bip340.verify(event.pubKey, event.id, event.sig!); + }) : bip340.verify(event.pubKey, event.id, event.sig!); } } From 153367809e4cb60ce121fda6e2948522c246fb3c Mon Sep 17 00:00:00 2001 From: fmar Date: Thu, 15 Jan 2026 21:09:58 +0100 Subject: [PATCH 5/5] use IsolateManager.instance.runInComputeIsolate --- .../repositories/verifiers/bip340_event_verifier.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart index 7318f50d5..2a46fd100 100644 --- a/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart +++ b/packages/ndk/lib/data_layer/repositories/verifiers/bip340_event_verifier.dart @@ -1,6 +1,7 @@ import 'dart:isolate'; import 'package:bip340/bip340.dart' as bip340; +import 'package:ndk/shared/isolates/isolate_manager.dart'; import '../../../domain_layer/entities/nip_01_event.dart'; import '../../../domain_layer/entities/nip_01_utils.dart'; @@ -19,8 +20,10 @@ class Bip340EventVerifier implements EventVerifier { return false; } if (!Nip01Utils.isIdValid(event)) return false; - return useIsolate? await Isolate.run(() { + return useIsolate? await await IsolateManager.instance.runInComputeIsolate((event) { return bip340.verify(event.pubKey, event.id, event.sig!); - }) : bip340.verify(event.pubKey, event.id, event.sig!); + }, + event + ) : bip340.verify(event.pubKey, event.id, event.sig!); } }