main.go raw

   1  package main
   2  
   3  import (
   4  	"fmt"
   5  	"common/crypto/secp256k1"
   6  	"common/crypto/sha256"
   7  	"common/helpers"
   8  	"syscall/js"
   9  	"time"
  10  )
  11  
  12  func main() {
  13  	seckey := sha256.Sum([]byte("benchmark test secret key material"))
  14  	pubkey, ok := secp256k1.PubKeyFromSecKey(seckey)
  15  	if !ok {
  16  		fmt.Println("FAIL: PubKeyFromSecKey")
  17  		return
  18  	}
  19  
  20  	fmt.Println("=== smesh crypto benchmark (Go WASM) ===")
  21  	fmt.Printf("pubkey: %s\n", helpers.HexEncode(pubkey[:]))
  22  
  23  	const n = 100
  24  
  25  	// Pre-hash messages.
  26  	var msgs [n][32]byte
  27  	for i := range msgs {
  28  		msgs[i] = sha256.Sum([]byte(fmt.Sprintf("benchmark message %d", i)))
  29  	}
  30  
  31  	// Aux randomness (zeros for deterministic bench).
  32  	var aux [32]byte
  33  
  34  	// Sign.
  35  	start := time.Now()
  36  	var sigs [n][64]byte
  37  	for i := range msgs {
  38  		sigs[i], _ = secp256k1.SignSchnorr(seckey, msgs[i], aux)
  39  	}
  40  	signDur := time.Since(start)
  41  
  42  	// Verify.
  43  	start = time.Now()
  44  	valid := 0
  45  	for i := range msgs {
  46  		if secp256k1.VerifySchnorr(pubkey, msgs[i], sigs[i]) {
  47  			valid++
  48  		}
  49  	}
  50  	verifyDur := time.Since(start)
  51  
  52  	fmt.Printf("\nsign   %d ops: %v  (%.1f ops/sec)\n", n, signDur, float64(n)/signDur.Seconds())
  53  	fmt.Printf("verify %d ops: %v  (%.1f ops/sec)\n", n, verifyDur, float64(n)/verifyDur.Seconds())
  54  	fmt.Printf("valid: %d/%d\n", valid, n)
  55  
  56  	// Keep alive briefly so output flushes.
  57  	done := make(chan struct{})
  58  	js.Global().Get("setTimeout").Invoke(js.FuncOf(func(this js.Value, args []js.Value) any {
  59  		close(done)
  60  		return nil
  61  	}), 100)
  62  	<-done
  63  }
  64