From 22f4cd53f8d90aebfb4fb9b435762ca551138146 Mon Sep 17 00:00:00 2001 From: Fangyu Gai Date: Fri, 18 Oct 2024 10:38:49 +0800 Subject: [PATCH] parameterize finality parameters --- cmd/babylond/cmd/flags.go | 39 +++++++++++++++++++++++++++++++++---- cmd/babylond/cmd/genesis.go | 30 ++++++++++++++++++++++------ cmd/babylond/cmd/testnet.go | 12 ++++++++++-- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/cmd/babylond/cmd/flags.go b/cmd/babylond/cmd/flags.go index 3c03e2c8e..06642a51c 100644 --- a/cmd/babylond/cmd/flags.go +++ b/cmd/babylond/cmd/flags.go @@ -2,11 +2,11 @@ package cmd import ( "encoding/hex" + "fmt" "strings" "time" "cosmossdk.io/math" - tmrand "github.com/cometbft/cometbft/libs/rand" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/spf13/cobra" @@ -15,6 +15,7 @@ import ( btcctypes "github.com/babylonlabs-io/babylon/x/btccheckpoint/types" btcltypes "github.com/babylonlabs-io/babylon/x/btclightclient/types" btcstypes "github.com/babylonlabs-io/babylon/x/btcstaking/types" + ftypes "github.com/babylonlabs-io/babylon/x/finality/types" ) const ( @@ -47,6 +48,10 @@ const ( flagMinSlashingFee = "min-slashing-fee-sat" flagSlashingRate = "slashing-rate" flagMinCommissionRate = "min-commission-rate" + flagSignedBlocksWindow = "signed-blocks-window" + flagMinSignedPerWindow = "min-signed-per-window" + flagFinalitySigTimeout = "finality-sig-timeout" + flagJailDuration = "jail-duration" ) type GenesisCLIArgs struct { @@ -80,6 +85,10 @@ type GenesisCLIArgs struct { MinUnbondingTime uint16 UnbondingFeeSat int64 MinCommissionRate math.LegacyDec + SignedBlocksWindow int64 + MinSignedPerWindow math.LegacyDec + FinalitySigTimeout int64 + JailDuration time.Duration } func addGenesisFlags(cmd *cobra.Command) { @@ -122,9 +131,13 @@ func addGenesisFlags(cmd *cobra.Command) { // blocks args cmd.Flags().Int64(flagBlockGasLimit, babylonApp.DefaultGasLimit, "Block gas limit") cmd.Flags().Int64(flagVoteExtensionEnableHeight, babylonApp.DefaultVoteExtensionsEnableHeight, "Vote extension enable height") + cmd.Flags().Int64(flagSignedBlocksWindow, ftypes.DefaultSignedBlocksWindow, "Size of the sliding window for tracking finality provider liveness") + cmd.Flags().String(flagMinSignedPerWindow, ftypes.DefaultMinSignedPerWindow.String(), "Minimum number of blocks that a finality provider is required to sign within the sliding window to avoid being jailed") + cmd.Flags().Int64(flagFinalitySigTimeout, ftypes.DefaultFinalitySigTimeout, "How much time (in terms of blocks) finality providers have to cast a finality vote before being judged as missing their voting turn on the given block") + cmd.Flags().String(flagJailDuration, ftypes.DefaultJailDuration.String(), "Minimum period of time that a finality provider remains jailed") } -func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { +func parseGenesisFlags(cmd *cobra.Command) (*GenesisCLIArgs, error) { chainID, _ := cmd.Flags().GetString(flags.FlagChainID) maxActiveValidators, _ := cmd.Flags().GetUint32(flagMaxActiveValidators) btcConfirmationDepth, _ := cmd.Flags().GetUint32(flagBtcConfirmationDepth) @@ -155,18 +168,32 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { blocksPerYear, _ := cmd.Flags().GetUint64(flagBlocksPerYear) blockGasLimit, _ := cmd.Flags().GetInt64(flagBlockGasLimit) voteExtensionEnableHeight, _ := cmd.Flags().GetInt64(flagVoteExtensionEnableHeight) + signedBlocksWindow, _ := cmd.Flags().GetInt64(flagSignedBlocksWindow) + minSignedPerWindowStr, _ := cmd.Flags().GetString(flagMinSignedPerWindow) + finalitySigTimeout, _ := cmd.Flags().GetInt64(flagFinalitySigTimeout) + jailDurationStr, _ := cmd.Flags().GetString(flagJailDuration) if chainID == "" { chainID = "chain-" + tmrand.NewRand().Str(6) } - var allowedReporterAddresses []string = make([]string, 0) + var allowedReporterAddresses = make([]string, 0) if reporterAddresses != "" { allowedReporterAddresses = strings.Split(reporterAddresses, ",") } genesisTime := time.Unix(genesisTimeUnix, 0) + minSignedPerWindow, err := math.LegacyNewDecFromStr(minSignedPerWindowStr) + if err != nil { + return nil, fmt.Errorf("invalid min-signed-per-window %s: %w", minSignedPerWindowStr, err) + } + + jailDuration, err := time.ParseDuration(jailDurationStr) + if err != nil { + return nil, fmt.Errorf("invalid jail-duration %s: %w", jailDurationStr, err) + } + return &GenesisCLIArgs{ ChainID: chainID, MaxActiveValidators: maxActiveValidators, @@ -198,5 +225,9 @@ func parseGenesisFlags(cmd *cobra.Command) *GenesisCLIArgs { BlocksPerYear: blocksPerYear, BlockGasLimit: blockGasLimit, VoteExtensionEnableHeight: voteExtensionEnableHeight, - } + SignedBlocksWindow: signedBlocksWindow, + MinSignedPerWindow: minSignedPerWindow, + FinalitySigTimeout: finalitySigTimeout, + JailDuration: jailDuration, + }, nil } diff --git a/cmd/babylond/cmd/genesis.go b/cmd/babylond/cmd/genesis.go index 71784cc90..70caf71e0 100644 --- a/cmd/babylond/cmd/genesis.go +++ b/cmd/babylond/cmd/genesis.go @@ -7,10 +7,6 @@ import ( "time" sdkmath "cosmossdk.io/math" - - btcstakingtypes "github.com/babylonlabs-io/babylon/x/btcstaking/types" - finalitytypes "github.com/babylonlabs-io/babylon/x/finality/types" - comettypes "github.com/cometbft/cometbft/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -36,8 +32,10 @@ import ( bbn "github.com/babylonlabs-io/babylon/types" btccheckpointtypes "github.com/babylonlabs-io/babylon/x/btccheckpoint/types" btclightclienttypes "github.com/babylonlabs-io/babylon/x/btclightclient/types" + btcstakingtypes "github.com/babylonlabs-io/babylon/x/btcstaking/types" checkpointingtypes "github.com/babylonlabs-io/babylon/x/checkpointing/types" epochingtypes "github.com/babylonlabs-io/babylon/x/epoching/types" + finalitytypes "github.com/babylonlabs-io/babylon/x/finality/types" ) func PrepareGenesisCmd(defaultNodeHome string, mbm module.BasicManager) *cobra.Command { @@ -57,13 +55,16 @@ Example: serverCtx := server.GetServerContextFromCmd(cmd) config := serverCtx.Config - genesisCliArgs := parseGenesisFlags(cmd) + genesisCliArgs, err := parseGenesisFlags(cmd) + if err != nil { + return fmt.Errorf("failed to parse genesis flags: %w", err) + } genFile := config.GenesisFile() genesisState, genesis, err := genutiltypes.GenesisStateFromGenFile(genFile) if err != nil { - return fmt.Errorf("failed to unmarshal genesis state: %s", err) + return fmt.Errorf("failed to unmarshal genesis state: %w", err) } network := args[0] @@ -101,6 +102,10 @@ Example: genesisCliArgs.GenesisTime, genesisCliArgs.BlockGasLimit, genesisCliArgs.VoteExtensionEnableHeight, + genesisCliArgs.SignedBlocksWindow, + genesisCliArgs.MinSignedPerWindow, + genesisCliArgs.FinalitySigTimeout, + genesisCliArgs.JailDuration, ) } else if network == "mainnet" { panic("Mainnet params not implemented.") @@ -293,6 +298,10 @@ func TestnetGenesisParams( genesisTime time.Time, blockGasLimit int64, voteExtensionEnableHeight int64, + signedBlocksWindow int64, + minSignedPerWindow sdkmath.LegacyDec, + finalitySigTimeout int64, + jailDuration time.Duration, ) GenesisParams { genParams := GenesisParams{} @@ -424,5 +433,14 @@ func TestnetGenesisParams( genParams.BlockGasLimit = blockGasLimit genParams.VoteExtensionsEnableHeight = voteExtensionEnableHeight + + genParams.FinalityParams.SignedBlocksWindow = signedBlocksWindow + genParams.FinalityParams.MinSignedPerWindow = minSignedPerWindow + genParams.FinalityParams.FinalitySigTimeout = finalitySigTimeout + genParams.FinalityParams.JailDuration = jailDuration + if err := genParams.FinalityParams.Validate(); err != nil { + panic(err) + } + return genParams } diff --git a/cmd/babylond/cmd/testnet.go b/cmd/babylond/cmd/testnet.go index 64e2ad368..369836701 100644 --- a/cmd/babylond/cmd/testnet.go +++ b/cmd/babylond/cmd/testnet.go @@ -10,7 +10,6 @@ import ( "time" "cosmossdk.io/math" - appkeepers "github.com/babylonlabs-io/babylon/app/keepers" cmtconfig "github.com/cometbft/cometbft/config" cmtos "github.com/cometbft/cometbft/libs/os" cmttime "github.com/cometbft/cometbft/types/time" @@ -35,6 +34,8 @@ import ( stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/spf13/cobra" + appkeepers "github.com/babylonlabs-io/babylon/app/keepers" + appparams "github.com/babylonlabs-io/babylon/app/params" "github.com/babylonlabs-io/babylon/privval" "github.com/babylonlabs-io/babylon/testutil/datagen" @@ -74,7 +75,10 @@ Example: serverCtx := server.GetServerContextFromCmd(cmd) config := serverCtx.Config - genesisCliArgs := parseGenesisFlags(cmd) + genesisCliArgs, err := parseGenesisFlags(cmd) + if err != nil { + return err + } outputDir, _ := cmd.Flags().GetString(flagOutputDir) keyringBackend, _ := cmd.Flags().GetString(flags.FlagKeyringBackend) @@ -118,6 +122,10 @@ Example: genesisCliArgs.GenesisTime, genesisCliArgs.BlockGasLimit, genesisCliArgs.VoteExtensionEnableHeight, + genesisCliArgs.SignedBlocksWindow, + genesisCliArgs.MinSignedPerWindow, + genesisCliArgs.FinalitySigTimeout, + genesisCliArgs.JailDuration, ) return InitTestnet(