0g-chain/x/dasigners/v1/keeper/grpc_query.go

93 lines
2.6 KiB
Go
Raw Normal View History

2024-05-09 18:54:47 +00:00
package keeper
import (
"context"
"github.com/0glabs/0g-chain/crypto/bn254util"
"github.com/0glabs/0g-chain/x/dasigners/v1/types"
"github.com/consensys/gnark-crypto/ecc/bn254"
sdk "github.com/cosmos/cosmos-sdk/types"
)
var _ types.QueryServer = Keeper{}
func (k Keeper) Signer(
c context.Context,
req *types.QuerySignerRequest,
) (*types.QuerySignerResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
signer, found, err := k.GetSigner(ctx, req.Account)
if err != nil {
return nil, err
}
if !found {
return nil, nil
}
return &types.QuerySignerResponse{Signer: &signer}, nil
}
func (k Keeper) EpochNumber(
c context.Context,
_ *types.QueryEpochNumberRequest,
) (*types.QueryEpochNumberResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
epochNumber, err := k.GetEpochNumber(ctx)
if err != nil {
return nil, err
}
return &types.QueryEpochNumberResponse{EpochNumber: epochNumber}, nil
}
func (k Keeper) EpochSignerSet(c context.Context, request *types.QueryEpochSignerSetRequest) (*types.QueryEpochSignerSetResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
signers, found := k.GetEpochSignerSet(ctx, request.EpochNumber)
if !found {
2024-05-11 09:13:54 +00:00
return nil, types.ErrEpochSignerSetNotFound
2024-05-09 18:54:47 +00:00
}
2024-05-11 09:13:54 +00:00
epochSignerSet := make([]*types.Signer, len(signers.Signers))
2024-05-09 18:54:47 +00:00
for _, account := range signers.Signers {
signer, found, err := k.GetSigner(ctx, account)
if err != nil {
return nil, err
}
if !found {
return nil, types.ErrSignerNotFound
}
epochSignerSet = append(epochSignerSet, &signer)
}
return &types.QueryEpochSignerSetResponse{Signers: epochSignerSet}, nil
}
func (k Keeper) AggregatePubkeyG1(c context.Context, request *types.QueryAggregatePubkeyG1Request) (*types.QueryAggregatePubkeyG1Response, error) {
ctx := sdk.UnwrapSDKContext(c)
signers, found := k.GetEpochSignerSet(ctx, request.EpochNumber)
if !found {
return nil, types.ErrEpochSignerSetNotFound
}
if len(request.SignersBitmap) != (len(signers.Signers)+7)/8 {
return nil, types.ErrSignerLengthNotMatch
}
aggPubkeyG1 := new(bn254.G1Affine)
2024-05-11 09:13:54 +00:00
hit := 0
2024-05-09 18:54:47 +00:00
for i, account := range signers.Signers {
b := request.SignersBitmap[i/8] & (1 << (i % 8))
if b == 0 {
continue
}
signer, found, err := k.GetSigner(ctx, account)
if err != nil {
return nil, err
}
if !found {
return nil, types.ErrSignerNotFound
}
2024-05-11 09:13:54 +00:00
hit += 1
2024-05-09 18:54:47 +00:00
aggPubkeyG1.Add(aggPubkeyG1, bn254util.DeserializeG1(signer.PubkeyG1))
}
return &types.QueryAggregatePubkeyG1Response{
AggregatePubkeyG1: bn254util.SerializeG1(aggPubkeyG1),
2024-05-11 09:13:54 +00:00
Total: uint64(len(signers.Signers)),
Hit: uint64(hit),
2024-05-09 18:54:47 +00:00
}, nil
}