package main import ( "bytes" "fmt" "time" "github.com/harmony-one/harmony/crypto/bls" bls_core "github.com/harmony-one/bls/ffi/go/bls" "github.com/harmony-one/harmony/crypto/hash" vrf_bls "github.com/harmony-one/harmony/crypto/vrf/bls" ) func init() { bls_core.Init(bls_core.BLS12_381) } func main() { blsPriKey := bls.RandPrivateKey() pubKeyWrapper := bls.PublicKeyWrapper{Object: blsPriKey.GetPublicKey()} pubKeyWrapper.Bytes.FromLibBLSPublicKey(pubKeyWrapper.Object) blockHash := hash.Keccak256([]byte{1, 2, 3, 4, 5}) size := 250 sig := &bls_core.Sign{} startTime := time.Now() for i := 0; i < size; i++ { sig = blsPriKey.SignHash(blockHash[:]) } endTime := time.Now() fmt.Printf("Time required to sign %d times: %f seconds\n", size, endTime.Sub(startTime).Seconds()) startTime = time.Now() for i := 0; i < size; i++ { if !sig.VerifyHash(pubKeyWrapper.Object, blockHash[:]) { fmt.Errorf("failed to verify sig") } } endTime = time.Now() fmt.Printf("Time required to verify sig %d times: %f seconds\n", size, endTime.Sub(startTime).Seconds()) sk := vrf_bls.NewVRFSigner(blsPriKey) vrf := [32]byte{} proof := []byte{} startTime = time.Now() for i := 0; i < size; i++ { vrf, proof = sk.Evaluate(blockHash[:]) } endTime = time.Now() fmt.Printf("Time required to generate vrf %d times: %f seconds\n", size, endTime.Sub(startTime).Seconds()) pk := vrf_bls.NewVRFVerifier(blsPriKey.GetPublicKey()) resultVrf := [32]byte{} startTime = time.Now() for i := 0; i < size; i++ { resultVrf, _ = pk.ProofToHash(blockHash, proof) } endTime = time.Now() fmt.Printf("Time required to verify vrf %d times: %f seconds\n", size, endTime.Sub(startTime).Seconds()) if bytes.Compare(vrf[:], resultVrf[:]) != 0 { fmt.Printf("Failed to verify VRF") } allPubs := []bls.PublicKeyWrapper{} allSigs := []*bls_core.Sign{} aggPub := &bls_core.PublicKey{} aggSig := &bls_core.Sign{} for i := 0; i < size; i++ { blsPriKey := bls.RandPrivateKey() pubKeyWrapper := bls.PublicKeyWrapper{Object: blsPriKey.GetPublicKey()} pubKeyWrapper.Bytes.FromLibBLSPublicKey(pubKeyWrapper.Object) allPubs = append(allPubs, pubKeyWrapper) sig := blsPriKey.SignHash(blockHash[:]) allSigs = append(allSigs, sig) } startTime = time.Now() for i := 0; i < size; i++ { aggPub.Add(allPubs[i].Object) } endTime = time.Now() fmt.Printf("Time required to aggregate %d pubKeys: %f seconds\n", size, endTime.Sub(startTime).Seconds()) startTime = time.Now() for i := 0; i < size; i++ { aggSig.Add(allSigs[i]) } endTime = time.Now() fmt.Printf("Time required to aggregate %d sigs: %f seconds\n", size, endTime.Sub(startTime).Seconds()) startTime = time.Now() if !aggSig.VerifyHash(aggPub, blockHash[:]) { fmt.Errorf("failed to verify sig") } endTime = time.Now() fmt.Printf("Time required to verify a %d aggregated sig: %f seconds\n", size, endTime.Sub(startTime).Seconds()) // A example result of a single run: //Time required to sign 1000 times: 0.542673 seconds //Time required to verify sig 1000 times: 1.499797 seconds //Time required to generate vrf 1000 times: 0.525362 seconds //Time required to verify vrf 1000 times: 2.076890 seconds }