Some checks failed
CodeQL / Analyze (push) Waiting to run
Docker Build & Push Simapp (main) / docker-build (push) Waiting to run
golangci-lint / lint (push) Waiting to run
Tests / Code Coverage / build (amd64) (push) Waiting to run
Tests / Code Coverage / build (arm64) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[additional-args:-tags="test_e2e" name:e2e path:./e2e]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:08-wasm path:./modules/light-clients/08-wasm]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:ibc-go path:.]) (push) Waiting to run
Deploy to GitHub Pages / Deploy to GitHub Pages (push) Has been cancelled
Buf-Push / push (push) Has been cancelled
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
package blsverifier
|
|
|
|
/*
|
|
* This custom query handler is used to aggregate public keys and verify a signature using BLS.
|
|
* It is used by the 08-wasm union light client, which we we use in the solidity IBC v2 e2e tests.
|
|
* The code here is taken from here: https://github.com/unionlabs/union/tree/main/uniond/app/custom_query
|
|
*/
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
)
|
|
|
|
const (
|
|
MessageSize = 32
|
|
)
|
|
|
|
type CustomQuery struct {
|
|
AggregateVerify *QueryAggregateVerify `json:"aggregate_verify,omitempty"`
|
|
Aggregate *QueryAggregate `json:"aggregate,omitempty"`
|
|
}
|
|
type QueryAggregate struct {
|
|
PublicKeys [][]byte `json:"public_keys"`
|
|
}
|
|
type QueryAggregateVerify struct {
|
|
PublicKeys [][]byte `json:"public_keys"`
|
|
Signature []byte `json:"signature"`
|
|
Message []byte `json:"message"`
|
|
}
|
|
|
|
func CustomQuerier() func(sdk.Context, json.RawMessage) ([]byte, error) {
|
|
return func(ctx sdk.Context, request json.RawMessage) ([]byte, error) {
|
|
var customQuery CustomQuery
|
|
err := json.Unmarshal([]byte(request), &customQuery)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse custom query %v", err)
|
|
}
|
|
|
|
switch {
|
|
case customQuery.Aggregate != nil:
|
|
aggregatedPublicKeys, err := AggregatePublicKeys(customQuery.Aggregate.PublicKeys)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to aggregate public keys %v", err)
|
|
}
|
|
|
|
return json.Marshal(aggregatedPublicKeys.Marshal())
|
|
case customQuery.AggregateVerify != nil:
|
|
if len(customQuery.AggregateVerify.Message) != MessageSize {
|
|
return nil, fmt.Errorf("invalid message length (%d), must be a %d bytes hash: %x", len(customQuery.AggregateVerify.Message), MessageSize, customQuery.AggregateVerify.Message)
|
|
}
|
|
|
|
msg := [MessageSize]byte{}
|
|
for i := range MessageSize {
|
|
msg[i] = customQuery.AggregateVerify.Message[i]
|
|
}
|
|
result, err := VerifySignature(customQuery.AggregateVerify.Signature, msg, customQuery.AggregateVerify.PublicKeys)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to verify signature %v", err)
|
|
}
|
|
|
|
return json.Marshal(result)
|
|
default:
|
|
return nil, fmt.Errorf("unknown custom query %v", request)
|
|
}
|
|
}
|
|
}
|