From 5506b8c7e7050306b1b55fecd1cbf64df456485e Mon Sep 17 00:00:00 2001 From: sweexordious Date: Tue, 28 Nov 2023 17:41:22 +0100 Subject: [PATCH 1/4] feat: add moniker and valoper address to signatures query --- cmd/blobstream/query/cmd.go | 71 +++++++++++++++++++++++++++++-------- rpc/app_querier.go | 31 ++++++++++++++++ 2 files changed, 88 insertions(+), 14 deletions(-) diff --git a/cmd/blobstream/query/cmd.go b/cmd/blobstream/query/cmd.go index a35d8c58..e686eaac 100644 --- a/cmd/blobstream/query/cmd.go +++ b/cmd/blobstream/query/cmd.go @@ -9,6 +9,8 @@ import ( "strconv" "time" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + common2 "github.com/ethereum/go-ethereum/common" celestiatypes "github.com/celestiaorg/celestia-app/x/qgb/types" @@ -134,10 +136,19 @@ func Signers() *cobra.Command { } type signature struct { - EvmAddress string `json:"evmAddress"` - Signature string `json:"signature"` - Signed bool `json:"signed"` + EvmAddress string `json:"evmAddress"` + Moniker string `json:"moniker"` + Signature string `json:"signature"` + Signed bool `json:"signed"` + ValopAddress string `json:"valopAddress"` +} + +type validatorInfo struct { + EvmAddress string `json:"evmAddress"` + Moniker string `json:"moniker"` + ValopAddress string `json:"valopAddress"` } + type queryOutput struct { Signatures []signature `json:"signatures"` Nonce uint64 `json:"nonce"` @@ -162,6 +173,16 @@ func getSignaturesAndPrintThem( return err } + validatorSet, err := appQuerier.QueryStakingValidatorSet(ctx) + if err != nil { + return err + } + + validatorsInfo, err := toValidatorsInfo(ctx, appQuerier, validatorSet) + if err != nil { + return err + } + att, err := appQuerier.QueryAttestationByNonce(ctx, nonce) if err != nil { return err @@ -180,7 +201,7 @@ func getSignaturesAndPrintThem( if err != nil { return err } - qOutput := toQueryOutput(toValsetConfirmsMap(confirms), nonce, *lastValset) + qOutput := toQueryOutput(toValsetConfirmsMap(confirms), validatorsInfo, nonce, *lastValset) if outputFile == "" { printConfirms(logger, qOutput) } else { @@ -203,7 +224,7 @@ func getSignaturesAndPrintThem( if err != nil { return err } - qOutput := toQueryOutput(toDataCommitmentConfirmsMap(confirms), nonce, *lastValset) + qOutput := toQueryOutput(toDataCommitmentConfirmsMap(confirms), validatorsInfo, nonce, *lastValset) if outputFile == "" { printConfirms(logger, qOutput) } else { @@ -218,6 +239,24 @@ func getSignaturesAndPrintThem( return nil } +func toValidatorsInfo(ctx context.Context, appQuerier *rpc.AppQuerier, validatorSet []stakingtypes.Validator) (map[string]validatorInfo, error) { + validatorsInfo := make(map[string]validatorInfo) + for _, val := range validatorSet { + evmAddr, err := appQuerier.QueryEVMAddress(ctx, val.OperatorAddress) + if err != nil { + return nil, err + } + if evmAddr != "" { + validatorsInfo[evmAddr] = validatorInfo{ + EvmAddress: evmAddr, + Moniker: val.GetMoniker(), + ValopAddress: val.OperatorAddress, + } + } + } + return validatorsInfo, nil +} + func parseNonce(ctx context.Context, querier *rpc.AppQuerier, nonce string) (uint64, error) { switch nonce { case "latest": @@ -245,7 +284,7 @@ func toDataCommitmentConfirmsMap(confirms []types.DataCommitmentConfirm) map[str return confirmsMap } -func toQueryOutput(confirmsMap map[string]string, nonce uint64, lastValset celestiatypes.Valset) queryOutput { +func toQueryOutput(confirmsMap map[string]string, validatorsInfo map[string]validatorInfo, nonce uint64, lastValset celestiatypes.Valset) queryOutput { currThreshold := uint64(0) signatures := make([]signature, len(lastValset.Members)) // create the signature slice to be used for outputting the data @@ -253,16 +292,20 @@ func toQueryOutput(confirmsMap map[string]string, nonce uint64, lastValset celes sig, found := confirmsMap[val.EvmAddress] if found { signatures[key] = signature{ - EvmAddress: val.EvmAddress, - Signature: sig, - Signed: true, + EvmAddress: val.EvmAddress, + Signature: sig, + Signed: true, + Moniker: validatorsInfo[val.EvmAddress].Moniker, + ValopAddress: validatorsInfo[val.EvmAddress].ValopAddress, } currThreshold += val.Power } else { signatures[key] = signature{ - EvmAddress: val.EvmAddress, - Signature: "", - Signed: false, + EvmAddress: val.EvmAddress, + Signature: "", + Signed: false, + Moniker: validatorsInfo[val.EvmAddress].Moniker, + ValopAddress: validatorsInfo[val.EvmAddress].ValopAddress, } } } @@ -290,13 +333,13 @@ func printConfirms(logger tmlog.Logger, qOutput queryOutput) { logger.Info("orchestrators that signed the attestation") for _, sig := range qOutput.Signatures { if sig.Signed { - logger.Info(sig.EvmAddress, "signed", sig.Signed, "signature", sig.Signature) + logger.Info(sig.Moniker, "signed", sig.Signed, "evm_address", "valop_address", sig.ValopAddress, sig.EvmAddress, "signature", sig.Signature) } } logger.Info("orchestrators that missed signing the attestation") for _, sig := range qOutput.Signatures { if !sig.Signed { - logger.Info(sig.EvmAddress, "signed", sig.Signed) + logger.Info(sig.Moniker, "signed", sig.Signed, "evm_address", sig.EvmAddress, "valop_address", sig.ValopAddress) } } logger.Info("done") diff --git a/rpc/app_querier.go b/rpc/app_querier.go index 0f0c545f..6d975a1a 100644 --- a/rpc/app_querier.go +++ b/rpc/app_querier.go @@ -6,6 +6,9 @@ import ( "strconv" "time" + "github.com/cosmos/cosmos-sdk/types/query" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/celestiaorg/celestia-app/pkg/appconsts" cosmosgrpc "github.com/cosmos/cosmos-sdk/types/grpc" "google.golang.org/grpc/metadata" @@ -319,6 +322,34 @@ func (aq *AppQuerier) QueryLastValsetBeforeNonce(ctx context.Context, nonce uint return resp.Valset, nil } +// QueryStakingValidatorSet returns the list of all validators in the network. +func (aq *AppQuerier) QueryStakingValidatorSet(ctx context.Context) ([]stakingtypes.Validator, error) { + queryClient := stakingtypes.NewQueryClient(aq.clientConn) + resp, err := queryClient.Validators( + ctx, + &stakingtypes.QueryValidatorsRequest{Pagination: &query.PageRequest{Limit: 10000}}, + ) + if err != nil { + return nil, err + } + + return resp.Validators, nil +} + +// QueryEVMAddress returns the EVM address corresponding to a validator valop address. +func (aq *AppQuerier) QueryEVMAddress(ctx context.Context, valopAddress string) (string, error) { + queryClient := celestiatypes.NewQueryClient(aq.clientConn) + resp, err := queryClient.EVMAddress( + ctx, + &celestiatypes.QueryEVMAddressRequest{ValidatorAddress: valopAddress}, + ) + if err != nil { + return "", err + } + + return resp.EvmAddress, nil +} + // QueryHistoricalLastValsetBeforeNonce returns the last historical valset before nonce for a certain height. func (aq *AppQuerier) QueryHistoricalLastValsetBeforeNonce(ctx context.Context, nonce uint64, height uint64) (*celestiatypes.Valset, error) { queryClient := celestiatypes.NewQueryClient(aq.clientConn) From 71ac624cdb8ba76a8105a98fa208ed1f00ec4f89 Mon Sep 17 00:00:00 2001 From: sweexordious Date: Tue, 28 Nov 2023 17:45:25 +0100 Subject: [PATCH 2/4] docs: add comment on pagination --- rpc/app_querier.go | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc/app_querier.go b/rpc/app_querier.go index 6d975a1a..cb58e9b8 100644 --- a/rpc/app_querier.go +++ b/rpc/app_querier.go @@ -327,6 +327,7 @@ func (aq *AppQuerier) QueryStakingValidatorSet(ctx context.Context) ([]stakingty queryClient := stakingtypes.NewQueryClient(aq.clientConn) resp, err := queryClient.Validators( ctx, + // Using 10000 as a conservative limit for number of validators instead of having to handle pagination &stakingtypes.QueryValidatorsRequest{Pagination: &query.PageRequest{Limit: 10000}}, ) if err != nil { From 758ac66f9e3f59e68321675b6e7e99b1dd897bfc Mon Sep 17 00:00:00 2001 From: CHAMI Rachid Date: Tue, 28 Nov 2023 22:27:21 +0100 Subject: [PATCH 3/4] Update cmd/blobstream/query/cmd.go Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- cmd/blobstream/query/cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/blobstream/query/cmd.go b/cmd/blobstream/query/cmd.go index 0be5647f..b2555e02 100644 --- a/cmd/blobstream/query/cmd.go +++ b/cmd/blobstream/query/cmd.go @@ -348,7 +348,7 @@ func printConfirms(logger tmlog.Logger, qOutput queryOutput) { logger.Info("orchestrators that signed the attestation") for _, sig := range qOutput.Signatures { if sig.Signed { - logger.Info(sig.Moniker, "signed", sig.Signed, "evm_address", "valop_address", sig.ValopAddress, sig.EvmAddress, "signature", sig.Signature) + logger.Info(sig.Moniker, "signed", sig.Signed, "evm_address", sig.EvmAddress, "valop_address", sig.ValopAddress, "signature", sig.Signature) } } logger.Info("orchestrators that missed signing the attestation") From 2660c5a6f6f86c427dfb21e1ab694e0b5d1d3f10 Mon Sep 17 00:00:00 2001 From: sweexordious Date: Tue, 28 Nov 2023 23:31:11 +0100 Subject: [PATCH 4/4] fix: invalid param --- cmd/blobstream/query/cmd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/blobstream/query/cmd.go b/cmd/blobstream/query/cmd.go index b2555e02..cbce2ebc 100644 --- a/cmd/blobstream/query/cmd.go +++ b/cmd/blobstream/query/cmd.go @@ -420,7 +420,7 @@ func Signature() *cobra.Command { }() // create tm querier and app querier - tmQuerier, appQuerier, stops, err := common.NewTmAndAppQuerier(logger, config.coreRPC, config.coreRPC, config.grpcInsecure) + tmQuerier, appQuerier, stops, err := common.NewTmAndAppQuerier(logger, config.coreRPC, config.coreGRPC, config.grpcInsecure) stopFuncs = append(stopFuncs, stops...) if err != nil { return err