package sr25519 import ( "fmt" schnorrkel "github.com/ChainSafe/go-schnorrkel" "github.com/tendermint/tendermint/crypto" ) var _ crypto.BatchVerifier = BatchVerifier{} // BatchVerifier implements batch verification for sr25519. // https://github.com/ChainSafe/go-schnorrkel is used for batch verification type BatchVerifier struct { *schnorrkel.BatchVerifier } func NewBatchVerifier() crypto.BatchVerifier { return BatchVerifier{schnorrkel.NewBatchVerifier()} } func (b BatchVerifier) Add(key crypto.PubKey, msg, sig []byte) error { var sig64 [SignatureSize]byte copy(sig64[:], sig) signature := new(schnorrkel.Signature) err := signature.Decode(sig64) if err != nil { return fmt.Errorf("unable to decode signature: %w", err) } signingContext := schnorrkel.NewSigningContext([]byte{}, msg) var pk [PubKeySize]byte copy(pk[:], key.Bytes()) return b.BatchVerifier.Add(signingContext, signature, schnorrkel.NewPublicKey(pk)) } func (b BatchVerifier) Verify() bool { return b.BatchVerifier.Verify() }