mukan-ibc/modules/light-clients/08-wasm/blsverifier/handler.go
Mukan Erkin Törük 6852832fe8
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
initial: sovereign Mukan Network fork
2026-05-11 03:18:28 +03:00

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)
}
}
}