aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2025-04-23 23:48:16 -0400
committerXe Iaso <me@xeiaso.net>2025-04-23 23:48:16 -0400
commit3d0a5c2d8791764f15cd41459696722c22bcd312 (patch)
treea92f1f27a162b7c2f945f12a07643ae5a1c023f7
parentea321b7f13e59120a9995284ee0d1f9c7498c06b (diff)
downloadanubis-wasm.tar.xz
anubis-wasm.zip
feat(lib): limit concurrency of wasm-based verifierswasm
Signed-off-by: Xe Iaso <me@xeiaso.net>
-rw-r--r--lib/anubis.go6
-rw-r--r--lib/verifier.go22
2 files changed, 27 insertions, 1 deletions
diff --git a/lib/anubis.go b/lib/anubis.go
index 762c6aa..269df5d 100644
--- a/lib/anubis.go
+++ b/lib/anubis.go
@@ -152,7 +152,11 @@ func New(opts Options) (*Server, error) {
return nil, fmt.Errorf("can't load static/wasm/%s: %w", finfo.Name(), err)
}
- result.validators[name] = runner
+ var concurrentLimit int64 = 4
+
+ cv := NewConcurrentVerifier(runner, concurrentLimit)
+
+ result.validators[name] = cv
}
mux := http.NewServeMux()
diff --git a/lib/verifier.go b/lib/verifier.go
index 3c28c14..c41cb93 100644
--- a/lib/verifier.go
+++ b/lib/verifier.go
@@ -6,6 +6,8 @@ import (
"crypto/subtle"
"errors"
"fmt"
+
+ "golang.org/x/sync/semaphore"
)
var (
@@ -68,3 +70,23 @@ func hasLeadingZeroNibbles(data []byte, n uint32) bool {
}
return count >= n
}
+
+type ConcurrentVerifier struct {
+ Verifier
+ sem *semaphore.Weighted
+}
+
+func NewConcurrentVerifier(v Verifier, maxConcurrent int64) *ConcurrentVerifier {
+ return &ConcurrentVerifier{
+ Verifier: v,
+ sem: semaphore.NewWeighted(maxConcurrent),
+ }
+}
+
+func (cv *ConcurrentVerifier) Verify(ctx context.Context, challenge, verify []byte, nonce, difficulty uint32) (bool, error) {
+ if err := cv.sem.Acquire(ctx, 1); err != nil {
+ return false, fmt.Errorf("can't verify solution: %w", err)
+ }
+
+ return cv.Verifier.Verify(ctx, challenge, verify, nonce, difficulty)
+}