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

111 lines
3.1 KiB
Go
Raw Normal View History

2024-08-03 17:31:58 +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,
2024-08-03 17:42:40 +00:00
request *types.QuerySignerRequest,
2024-08-03 17:31:58 +00:00
) (*types.QuerySignerResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
2024-08-03 17:42:40 +00:00
n := len(request.Accounts)
response := types.QuerySignerResponse{Signer: make([]*types.Signer, n)}
for i := 0; i < n; i += 1 {
signer, found, err := k.GetSigner(ctx, request.Accounts[i])
if err != nil {
return nil, err
}
if !found {
return nil, nil
}
response.Signer[i] = &signer
2024-08-03 17:31:58 +00:00
}
2024-08-03 17:42:40 +00:00
return &response, nil
2024-08-03 17:31:58 +00:00
}
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
}
2024-08-03 17:42:40 +00:00
func (k Keeper) QuorumCount(
c context.Context,
request *types.QueryQuorumCountRequest,
) (*types.QueryQuorumCountResponse, error) {
2024-08-03 17:31:58 +00:00
ctx := sdk.UnwrapSDKContext(c)
2024-08-03 17:42:40 +00:00
quorumCount, err := k.GetQuorumCount(ctx, request.EpochNumber)
if err != nil {
return nil, err
}
return &types.QueryQuorumCountResponse{QuorumCount: quorumCount}, nil
}
func (k Keeper) EpochQuorum(c context.Context, request *types.QueryEpochQuorumRequest) (*types.QueryEpochQuorumResponse, error) {
ctx := sdk.UnwrapSDKContext(c)
quorums, found := k.GetEpochQuorums(ctx, request.EpochNumber)
2024-08-03 17:31:58 +00:00
if !found {
2024-08-03 17:42:40 +00:00
return nil, types.ErrQuorumNotFound
2024-08-03 17:31:58 +00:00
}
2024-08-03 17:42:40 +00:00
if len(quorums.Quorums) <= int(request.QuorumId) {
return nil, types.ErrQuorumIdOutOfBound
2024-08-03 17:31:58 +00:00
}
2024-08-03 17:42:40 +00:00
return &types.QueryEpochQuorumResponse{Quorum: quorums.Quorums[request.QuorumId]}, nil
2024-08-03 17:31:58 +00:00
}
func (k Keeper) AggregatePubkeyG1(c context.Context, request *types.QueryAggregatePubkeyG1Request) (*types.QueryAggregatePubkeyG1Response, error) {
ctx := sdk.UnwrapSDKContext(c)
2024-08-03 17:42:40 +00:00
quorums, found := k.GetEpochQuorums(ctx, request.EpochNumber)
2024-08-03 17:31:58 +00:00
if !found {
2024-08-03 17:42:40 +00:00
return nil, types.ErrQuorumNotFound
2024-08-03 17:31:58 +00:00
}
2024-08-03 17:42:40 +00:00
if len(quorums.Quorums) <= int(request.QuorumId) {
return nil, types.ErrQuorumIdOutOfBound
}
quorum := quorums.Quorums[request.QuorumId]
if (len(quorum.Signers)+7)/8 != len(request.QuorumBitmap) {
return nil, types.ErrQuorumBitmapLengthMismatch
2024-08-03 17:31:58 +00:00
}
aggPubkeyG1 := new(bn254.G1Affine)
2024-08-03 17:38:46 +00:00
hit := 0
2024-08-03 17:42:40 +00:00
added := make(map[string]struct{})
for i, signer := range quorum.Signers {
b := request.QuorumBitmap[i/8] & (1 << (i % 8))
2024-08-03 17:31:58 +00:00
if b == 0 {
continue
}
2024-08-03 17:42:40 +00:00
if _, ok := added[signer]; ok {
continue
}
added[signer] = struct{}{}
signer, found, err := k.GetSigner(ctx, signer)
2024-08-03 17:31:58 +00:00
if err != nil {
return nil, err
}
if !found {
return nil, types.ErrSignerNotFound
}
2024-08-03 17:38:46 +00:00
hit += 1
2024-08-03 17:31:58 +00:00
aggPubkeyG1.Add(aggPubkeyG1, bn254util.DeserializeG1(signer.PubkeyG1))
}
return &types.QueryAggregatePubkeyG1Response{
AggregatePubkeyG1: bn254util.SerializeG1(aggPubkeyG1),
2024-08-03 17:42:40 +00:00
Total: uint64(len(quorum.Signers)),
2024-08-03 17:38:46 +00:00
Hit: uint64(hit),
2024-08-03 17:31:58 +00:00
}, nil
}