diff --git a/CHANGELOG.md b/CHANGELOG.md index 38a4aec4f..22caf1f08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) ## Unreleased -### Security +### API Breaking * [#194](https://github.com/babylonlabs-io/babylon/pull/194) Adjusted handling of `FinalityProviderSigningInfo` in finality keeper queries to improve API security * Modified `QuerySigningInfosResponse` to remove direct exposure of sensitive fields diff --git a/proto/babylon/finality/v1/query.proto b/proto/babylon/finality/v1/query.proto index d5d65eeac..2689f74ca 100644 --- a/proto/babylon/finality/v1/query.proto +++ b/proto/babylon/finality/v1/query.proto @@ -234,9 +234,14 @@ message QuerySigningInfoRequest { // SigningInfoResponse defines the API response containing a finality provider's signing info // for monitoring their liveness activity. message SigningInfoResponse { + // fp_btc_pk is the BTC PK of the finality provider that casts this vote string fp_btc_pk_hex = 1; + // start_height is the block height at which finality provider become active int64 start_height = 2; + // missed_blocks_counter defines a counter to avoid unnecessary array reads. + // Note that `Sum(MissedBlocksBitArray)` always equals `MissedBlocksCounter`. int64 missed_blocks_counter = 3; + // Timestamp until which the validator is jailed due to liveness downtime. google.protobuf.Timestamp jailed_until = 4 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false, (amino.dont_omitempty) = true]; } diff --git a/x/finality/keeper/grpc_query.go b/x/finality/keeper/grpc_query.go index 462d5de99..f3452cc1d 100644 --- a/x/finality/keeper/grpc_query.go +++ b/x/finality/keeper/grpc_query.go @@ -246,7 +246,7 @@ func (k Keeper) SigningInfo(ctx context.Context, req *types.QuerySigningInfoRequ return nil, status.Errorf(codes.NotFound, "SigningInfo not found for the finality provider %s", req.FpBtcPkHex) } - return &types.QuerySigningInfoResponse{SigningInfo: k.convertToSigningInfoResponse(signingInfo)}, nil + return &types.QuerySigningInfoResponse{SigningInfo: convertToSigningInfoResponse(signingInfo)}, nil } // SigningInfos returns signing-infos of all finality providers. @@ -271,10 +271,10 @@ func (k Keeper) SigningInfos(ctx context.Context, req *types.QuerySigningInfosRe if err != nil { return nil, err } - return &types.QuerySigningInfosResponse{SigningInfos: k.convertToSigningInfosResponse(signInfos), Pagination: pageRes}, nil + return &types.QuerySigningInfosResponse{SigningInfos: convertToSigningInfosResponse(signInfos), Pagination: pageRes}, nil } -func (k Keeper) convertToSigningInfoResponse(info types.FinalityProviderSigningInfo) types.SigningInfoResponse { +func convertToSigningInfoResponse(info types.FinalityProviderSigningInfo) types.SigningInfoResponse { return types.SigningInfoResponse{ FpBtcPkHex: info.FpBtcPk.MarshalHex(), StartHeight: info.StartHeight, @@ -283,10 +283,10 @@ func (k Keeper) convertToSigningInfoResponse(info types.FinalityProviderSigningI } } -func (k Keeper) convertToSigningInfosResponse(signInfos []types.FinalityProviderSigningInfo) []types.SigningInfoResponse { +func convertToSigningInfosResponse(signInfos []types.FinalityProviderSigningInfo) []types.SigningInfoResponse { response := make([]types.SigningInfoResponse, len(signInfos)) for i, info := range signInfos { - response[i] = k.convertToSigningInfoResponse(info) + response[i] = convertToSigningInfoResponse(info) } return response }