From 2eaf7340f1529595c64c4137db10d5cac5568c01 Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Thu, 27 Feb 2025 13:09:33 +0200 Subject: [PATCH 1/6] feat(init_new_network): add init new basic layout for shidai --- src/shidai/internal/commands/commands.go | 67 +++++++++++++++++++ .../internal/sekai_handler/sekaiHandler.go | 5 ++ 2 files changed, 72 insertions(+) diff --git a/src/shidai/internal/commands/commands.go b/src/shidai/internal/commands/commands.go index 4fdff81f..d60d45b5 100644 --- a/src/shidai/internal/commands/commands.go +++ b/src/shidai/internal/commands/commands.go @@ -46,6 +46,7 @@ var ( "start": handleStartComamnd, "tx": handleTxCommand, "sekaid": handleSekaidCommand, + "new": handleInitNewCommand, } ) @@ -239,6 +240,72 @@ func handleJoinCommand(args map[string]interface{}) (string, error) { return fmt.Sprintf("Join command processed for IP: %s", ip), nil } +func handleInitNewCommand(args map[string]interface{}) (string, error) { + ip, ok := args["ip"].(string) + if !utils.ValidateIP(ip) || !ok { + return "", types.ErrInvalidOrMissingIP + } + + m, ok := args["mnemonic"].(string) + if !utils.ValidateMnemonic(m) || !ok { + return "", types.ErrInvalidOrMissingMnemonic + } + pathsToDel := []string{"/sekai/", "/interx/"} + for _, path := range pathsToDel { + err := os.RemoveAll(path) + if err != nil { + log.Error("Failed to delele ", zap.String("path", path), zap.Error(err)) + } + } + + masterMnemonic, err := mnemonicmanager.GenerateMnemonicsFromMaster(m) + if err != nil { + return "", err + } + + ctx := context.Background() + + p2p, ok := args["p2p_port"].(float64) + if !utils.ValidatePort(int(p2p)) || !ok { + return "", types.ErrInvalidOrMissingP2PPort + } + rpc, ok := args["rpc_port"].(float64) + if !utils.ValidatePort(int(rpc)) || !ok { + return "", types.ErrInvalidOrMissingRPCPort + } + interx, ok := args["interx_port"].(float64) + if !utils.ValidatePort(int(interx)) || !ok { + return "", types.ErrInvalidOrMissingInterxPort + } + + err = sekaihandler.InitSekaiNew(ctx, masterMnemonic) + if err != nil { + return "", err + } + err = sekaihandler.StartSekai() + if err != nil { + return "", fmt.Errorf("unable to start sekai: %w", err) + } + err = sekaihelper.CheckSekaiStart(ctx) + if err != nil { + return "", err + } + err = interxhandler.InitInterx(ctx, masterMnemonic) + if err != nil { + return "", fmt.Errorf("unable to init interx: %w", err) + } + err = interxhandler.StartInterx() + if err != nil { + return "", fmt.Errorf("unable to start interx: %w", err) + } + err = interxhelper.CheckInterxStart(ctx) + if err != nil { + return "", err + + } + return "Seccusess", nil +} + func handleStatusCommand(args map[string]interface{}) (string, error) { // TODO: // 1. Return publicIP diff --git a/src/shidai/internal/sekai_handler/sekaiHandler.go b/src/shidai/internal/sekai_handler/sekaiHandler.go index 37b242de..e054466e 100644 --- a/src/shidai/internal/sekai_handler/sekaiHandler.go +++ b/src/shidai/internal/sekai_handler/sekaiHandler.go @@ -70,6 +70,11 @@ func InitSekaiJoiner(ctx context.Context, tc *configconstructor.TargetSeedKiraCo return nil } +// TODO: +func InitSekaiNew(ctx context.Context, masterMnemonicSet *mnemonicsgenerator.MasterMnemonicSet) error { + return nil +} + func setSekaidKeys(masterMnemonicSet *mnemonicsgenerator.MasterMnemonicSet) error { log.Debug("Setting Sekaid keys", zap.String("home", types.SEKAI_HOME)) From 3740f141fb992f772a13329411ebb782b9cd29b8 Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Sun, 2 Mar 2025 17:06:22 +0200 Subject: [PATCH 2/6] feat(init_new_network): sCaller http abstractions for shidai --- .../sekai_helper/s_caller/s_caller.go | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/shidai/internal/sekai_handler/sekai_helper/s_caller/s_caller.go diff --git a/src/shidai/internal/sekai_handler/sekai_helper/s_caller/s_caller.go b/src/shidai/internal/sekai_handler/sekai_helper/s_caller/s_caller.go new file mode 100644 index 00000000..6bdfe69a --- /dev/null +++ b/src/shidai/internal/sekai_handler/sekai_helper/s_caller/s_caller.go @@ -0,0 +1,75 @@ +package scaller + +import ( + "fmt" + + httpexecutor "github.com/kiracore/sekin/src/shidai/internal/http_executor" + "github.com/kiracore/sekin/src/shidai/internal/logger" + "github.com/kiracore/sekin/src/shidai/internal/types" + "go.uber.org/zap" +) + +var log = logger.GetLogger() + +func InitCmd(networkName, moniker string) error { + cmd := httpexecutor.CommandRequest{ + Command: "init", + Args: map[string]interface{}{ + "home": types.SEKAI_HOME, + "chain-id": networkName, + "moniker": moniker, + }, + } + _, err := httpexecutor.ExecuteCallerCommand(types.SEKAI_CONTAINER_ADDRESS, "8080", "POST", cmd) + if err != nil { + log.Error("Failed to execute caller command", zap.Any("command", cmd), zap.Error(err)) + return fmt.Errorf("unable execute <%v> request, error: %w", cmd, err) + } + return nil +} + +func AddGenesisAccount(networkName, moniker, accountName string, coins []string) error { + // "address": "genesis", + // "coins": ["300000000000000ukex"], + // "keyring-backend": "test", + // "home": "/sekai", + // "log_format": "", + // "log_level": "", + // "trace": false + cmd := httpexecutor.CommandRequest{ + Command: "add-genesis-account", + Args: map[string]interface{}{ + "home": types.SEKAI_HOME, + "chain-id": networkName, + "moniker": moniker, + "address": accountName, + "keyring-backend": types.DefaultKeyring, + "coins": coins, + }, + } + _, err := httpexecutor.ExecuteCallerCommand(types.SEKAI_CONTAINER_ADDRESS, "8080", "POST", cmd) + if err != nil { + log.Error("Failed to execute caller command", zap.Any("command", cmd), zap.Error(err)) + return fmt.Errorf("unable execute <%v> request, error: %w", cmd, err) + } + return nil +} + +func GentxClaimCmd(networkName, moniker, accountName string) error { + cmd := httpexecutor.CommandRequest{ + Command: "gentx-claim", + Args: map[string]interface{}{ + "home": types.SEKAI_HOME, + "chain-id": networkName, + "moniker": moniker, + "address": accountName, + "keyring-backend": types.DefaultKeyring, + }, + } + _, err := httpexecutor.ExecuteCallerCommand(types.SEKAI_CONTAINER_ADDRESS, "8080", "POST", cmd) + if err != nil { + log.Error("Failed to execute caller command", zap.Any("command", cmd), zap.Error(err)) + return fmt.Errorf("unable execute <%v> request, error: %w", cmd, err) + } + return nil +} From c6867a243cf209281bef73d64c4a5d4e67cd777b Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Sun, 2 Mar 2025 17:07:02 +0200 Subject: [PATCH 3/6] feat(init_new_network): handleInitNewCommand() full implementation --- src/shidai/internal/commands/commands.go | 55 ++++++++++++++++-------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/shidai/internal/commands/commands.go b/src/shidai/internal/commands/commands.go index d60d45b5..9c033613 100644 --- a/src/shidai/internal/commands/commands.go +++ b/src/shidai/internal/commands/commands.go @@ -241,15 +241,23 @@ func handleJoinCommand(args map[string]interface{}) (string, error) { } func handleInitNewCommand(args map[string]interface{}) (string, error) { - ip, ok := args["ip"].(string) - if !utils.ValidateIP(ip) || !ok { - return "", types.ErrInvalidOrMissingIP + moniker, ok := args["moniker"].(string) + if !ok { + return "", types.ErrInvalidOrMissingMoniker + } + networkName, ok := args["network_name"].(string) + if !ok { + return "", types.ErrInvalidOrMissingNetworkName } - m, ok := args["mnemonic"].(string) if !utils.ValidateMnemonic(m) || !ok { return "", types.ErrInvalidOrMissingMnemonic } + coins, err := parseCoins(args) + if err != nil { + return "", err + } + pathsToDel := []string{"/sekai/", "/interx/"} for _, path := range pathsToDel { err := os.RemoveAll(path) @@ -265,20 +273,7 @@ func handleInitNewCommand(args map[string]interface{}) (string, error) { ctx := context.Background() - p2p, ok := args["p2p_port"].(float64) - if !utils.ValidatePort(int(p2p)) || !ok { - return "", types.ErrInvalidOrMissingP2PPort - } - rpc, ok := args["rpc_port"].(float64) - if !utils.ValidatePort(int(rpc)) || !ok { - return "", types.ErrInvalidOrMissingRPCPort - } - interx, ok := args["interx_port"].(float64) - if !utils.ValidatePort(int(interx)) || !ok { - return "", types.ErrInvalidOrMissingInterxPort - } - - err = sekaihandler.InitSekaiNew(ctx, masterMnemonic) + err = sekaihandler.InitSekaiNew(ctx, masterMnemonic, networkName, moniker, coins) if err != nil { return "", err } @@ -303,7 +298,29 @@ func handleInitNewCommand(args map[string]interface{}) (string, error) { return "", err } - return "Seccusess", nil + return "Successes", nil +} + +func parseCoins(args map[string]interface{}) ([]string, error) { + rawCoins, exists := args["coins"] + if !exists { + return []string{}, types.ErrInvalidOrMissingCoins + } + + coinsInterface, ok := rawCoins.([]interface{}) + if !ok { + return []string{}, types.ErrInvalidOrMissingCoins + } + + var coins []string + for _, c := range coinsInterface { + if str, ok := c.(string); ok { + coins = append(coins, str) + } else { + return []string{}, types.ErrInvalidOrMissingCoins + } + } + return coins, nil } func handleStatusCommand(args map[string]interface{}) (string, error) { From 5b54e956d83cd9416667f92183ea51c127fbe584 Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Sun, 2 Mar 2025 17:07:33 +0200 Subject: [PATCH 4/6] feat(init_new_network): add InitSekaiNew() --- .../internal/sekai_handler/sekaiHandler.go | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/shidai/internal/sekai_handler/sekaiHandler.go b/src/shidai/internal/sekai_handler/sekaiHandler.go index e054466e..64116b16 100644 --- a/src/shidai/internal/sekai_handler/sekaiHandler.go +++ b/src/shidai/internal/sekai_handler/sekaiHandler.go @@ -15,6 +15,7 @@ import ( configconstructor "github.com/kiracore/sekin/src/shidai/internal/sekai_handler/config_constructor" genesishandler "github.com/kiracore/sekin/src/shidai/internal/sekai_handler/genesis_handler" + scaller "github.com/kiracore/sekin/src/shidai/internal/sekai_handler/sekai_helper/s_caller" "github.com/kiracore/sekin/src/shidai/internal/types" "github.com/kiracore/sekin/src/shidai/internal/utils" ) @@ -71,7 +72,33 @@ func InitSekaiJoiner(ctx context.Context, tc *configconstructor.TargetSeedKiraCo } // TODO: -func InitSekaiNew(ctx context.Context, masterMnemonicSet *mnemonicsgenerator.MasterMnemonicSet) error { +func InitSekaiNew(ctx context.Context, masterMnemonicSet *mnemonicsgenerator.MasterMnemonicSet, networkName, moniker string, coins []string) error { + log.Debug("Initializing Sekai Joiner", zap.String("home", types.SEKAI_HOME), zap.String("chain-id", networkName)) + + err := scaller.InitCmd(networkName, moniker) + if err != nil { + return err + } + + err = setSekaidKeys(masterMnemonicSet) + if err != nil { + log.Error("Failed to set Sekai keys", zap.Error(err)) + return fmt.Errorf("unable to set sekai keys: %w", err) + } + + err = scaller.AddGenesisAccount(networkName, moniker, types.ValidatorAccountName, coins) + if err != nil { + return err + } + err = scaller.GentxClaimCmd(networkName, moniker, types.ValidatorAccountName) + if err != nil { + return err + } + + err = configconstructor.FormSekaiGenesisConfigs() + if err != nil { + return err + } return nil } @@ -92,7 +119,7 @@ func setSekaidKeys(masterMnemonicSet *mnemonicsgenerator.MasterMnemonicSet) erro } log.Debug("Empty validator state set successfully") - _, err = utils.AddKeyToKeyring("validator", string(masterMnemonicSet.ValidatorAddrMnemonic), types.SEKAI_HOME, "test") + _, err = utils.AddKeyToKeyring(types.ValidatorAccountName, string(masterMnemonicSet.ValidatorAddrMnemonic), types.SEKAI_HOME, types.DefaultKeyring) if err != nil { log.Error("Failed to add validator key to keyring", zap.Error(err)) return fmt.Errorf("unable to add validator key to keyring: %w", err) From 8efcfad7e02c52543f6f7670a0078dcb2cb92b02 Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Sun, 2 Mar 2025 17:08:11 +0200 Subject: [PATCH 5/6] feat(init_new_network): add config constructor for genesis node --- .../config_constructor/config_constructor.go | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/shidai/internal/sekai_handler/config_constructor/config_constructor.go b/src/shidai/internal/sekai_handler/config_constructor/config_constructor.go index 37a24ab0..632dbffc 100644 --- a/src/shidai/internal/sekai_handler/config_constructor/config_constructor.go +++ b/src/shidai/internal/sekai_handler/config_constructor/config_constructor.go @@ -61,6 +61,25 @@ type ResponseBlock struct { } `json:"result"` } +func FormSekaiGenesisConfigs() error { + configTomlSavePath := path.Join(types.SEKAI_HOME, "config", "config.toml") + configToml := types.NewDefaultConfig() + appToml := types.NewDefaultAppConfig() + + err := utils.SaveConfig(configTomlSavePath, *configToml) + if err != nil { + return err + } + + appTomlSavePath := path.Join(types.SEKAI_HOME, "config", "app.toml") + appToml = GetGenesisAppConfig(appToml) + err = utils.SaveAppConfig(appTomlSavePath, *appToml) + if err != nil { + return err + } + return nil +} + func FormSekaiJoinerConfigs(tc *TargetSeedKiraConfig) error { ctx := context.Background() @@ -224,6 +243,17 @@ func getConfigsBasedOnSeed(ctx context.Context, netInfo *networkInfo, tc *Target return cfgToUpdate, nil } +func GetGenesisAppConfig(config *types.AppConfig) *types.AppConfig { + config.StateSync.SnapshotInterval = 1000 + config.StateSync.SnapshotKeepRecent = 2 + config.Pruning = "nothing" + config.PruningKeepRecent = 2 + config.PruningKeepEvery = 100 + config.PruningInterval = 10 + config.GRPC.Address = fmt.Sprintf("0.0.0.0:%v", types.DEFAULT_GRPC_PORT) + + return config +} func GetJoinerAppConfig(config *types.AppConfig) *types.AppConfig { // return []utilsTypes.TomlValue{ // {Tag: "state-sync", Name: "snapshot-interval", Value: "200"}, From e1aebc8a5689ce12485bd11ea2ce39929a8522cc Mon Sep 17 00:00:00 2001 From: PeepoFrog Date: Sun, 2 Mar 2025 17:08:39 +0200 Subject: [PATCH 6/6] feat(init_new_network): declare new errors and constants --- src/shidai/internal/types/types.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/shidai/internal/types/types.go b/src/shidai/internal/types/types.go index 011a7183..3eb2016a 100644 --- a/src/shidai/internal/types/types.go +++ b/src/shidai/internal/types/types.go @@ -267,17 +267,27 @@ const ( InvalidOrMissingTx = "invalid or missing tx" + InvalidOrMissingNetworkName = "invalid or missing network name" + InvalidOrMissingMoniker = "invalid or missing moniker" + InvalidOrMissingCoins = "invalid or mission coins, []string required" + FilePermRO os.FileMode = 0444 FilePermRW os.FileMode = 0644 FilePermEX os.FileMode = 0755 DirPermRO os.FileMode = 0555 DirPermWR os.FileMode = 0755 + + ValidatorAccountName = "validator" + DefaultKeyring = "test" ) var ( - ErrInvalidOrMissingMnemonic = errors.New(InvalidOrMissingMnemonic) - ErrInvalidOrMissingIP = errors.New(InvalidOrMissingIP) + ErrInvalidOrMissingMnemonic = errors.New(InvalidOrMissingMnemonic) + ErrInvalidOrMissingIP = errors.New(InvalidOrMissingIP) + ErrInvalidOrMissingNetworkName = errors.New(InvalidOrMissingNetworkName) + ErrInvalidOrMissingMoniker = errors.New(InvalidOrMissingMoniker) + ErrInvalidOrMissingCoins = errors.New(InvalidOrMissingCoins) ErrInvalidOrMissingTx = errors.New(InvalidOrMissingTx)