diff options
| -rw-r--r-- | lib/anubis.go | 6 | ||||
| -rw-r--r-- | lib/verifier.go | 22 |
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) +} |
