diff --git a/autopeering/autopeering.go b/autopeering/autopeering.go index 1c160f9..947cbfa 100644 --- a/autopeering/autopeering.go +++ b/autopeering/autopeering.go @@ -68,7 +68,6 @@ func GetPublicPeers() []url.URL { if err != nil { return nil } - print(d.Name()) if d.IsDir() || !strings.HasSuffix(d.Name(), ".md") || d.Name() == "README.md" { return nil } diff --git a/cli/run.go b/cli/run.go index 3d5145b..eae96e1 100644 --- a/cli/run.go +++ b/cli/run.go @@ -40,10 +40,19 @@ func newTendermint(app abci.Application, configFile string, v *viper.Viper) (*nm } laddrReturner := make(chan string, 2) - go yggdrasil.Yggdrasil(v, laddrReturner) + config.P2P.PersistentPeers = cfg.ReadP2Peers(configFile) + //v.Set("p2p.persistent_peers", config.P2P.PersistentPeers) + //v.Set("") + + go yggdrasil.Yggdrasil(v, laddrReturner) config.P2P.ListenAddress = "tcp://" + <-laddrReturner + + //if config.P2P.PersistentPeers == "" { config.P2P.PersistentPeers = <-laddrReturner + //} else { + // <- laddrReturner + //} var pv tmTypes.PrivValidator if _, err := os.Stat(config.PrivValidatorKeyFile()); err == nil { @@ -123,6 +132,30 @@ func buildNode() (*nm.Node, *badger.DB, error) { return node, db, err } +func copyFile(src, dst string) error { + in, err := os.Open(src) + if err != nil { + return err + } + defer in.Close() + + if err = os.MkdirAll(filepath.Dir(dst), 0o700); err != nil { + return err + } + + out, err := os.Create(dst) + if err != nil { + return err + } + defer func() { + _ = out.Sync() + _ = out.Close() + }() + + _, err = io.Copy(out, in) + return err +} + func runNode() { node, db, err := buildNode() if err != nil { @@ -149,7 +182,7 @@ func initGenesis() { nodeinfo := p2p.DefaultNodeInfo{} viper := cfg.WriteConfig(config, &defaultConfigPath, nodeinfo) - if err := cfg.InitTendermintFiles(config, chainName); err != nil { + if err := cfg.InitTendermintFiles(config, true, chainName); err != nil { fmt.Fprintf(os.Stderr, "Failed to init files: %v\n", err) panic(err) } @@ -164,30 +197,6 @@ func initGenesis() { fmt.Println("Genesis node initialized.") } -func copyFile(src, dst string) error { - in, err := os.Open(src) - if err != nil { - return err - } - defer in.Close() - - if err = os.MkdirAll(filepath.Dir(dst), 0o700); err != nil { - return err - } - - out, err := os.Create(dst) - if err != nil { - return err - } - defer func() { - _ = out.Sync() - _ = out.Close() - }() - - _, err = io.Copy(out, in) - return err -} - func initJoiner(path string) { config := cfg.DefaultConfig() config.RootDir = filepath.Dir(filepath.Dir(defaultConfigPath)) @@ -197,6 +206,14 @@ func initJoiner(path string) { os.Exit(3) } + nodeinfo := p2p.DefaultNodeInfo{} + cfg.WriteConfig(config, &defaultConfigPath, nodeinfo) + //viper := cfg.WriteConfig(config, &defaultConfigPath, nodeinfo) + if err := cfg.InitTendermintFiles(config, false, chainName); err != nil { + fmt.Fprintf(os.Stderr, "Failed to init files: %v\n", err) + panic(err) + } + node, db, err := buildNode() if err != nil { panic(err) @@ -205,10 +222,10 @@ func initJoiner(path string) { cfg.WriteConfig(config, &defaultConfigPath, node.NodeInfo()) - if err := os.MkdirAll(filepath.Join(config.RootDir, "data"), 0o700); err != nil { - fmt.Fprintln(os.Stderr, "не удалось создать директорию data") - os.Exit(1) - } + //if err := os.MkdirAll(filepath.Join(config.RootDir, "data"), 0o700); err != nil { + // fmt.Fprintln(os.Stderr, "не удалось создать директорию data") + // os.Exit(1) + //} if _, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()); err != nil { fmt.Fprintln(os.Stderr, "ошибка генерации node_key.json") diff --git a/configfunctions/configfunctions.go b/configfunctions/configfunctions.go index 32de6ce..a259988 100644 --- a/configfunctions/configfunctions.go +++ b/configfunctions/configfunctions.go @@ -23,7 +23,7 @@ var ( yggKeyPath = flag.String("ygg-key", "./config/yggdrasil.key", "Path to Yggdrasil key file") ) -func InitTendermintFiles(config *cfg.Config, chainName string) error { +func InitTendermintFiles(config *cfg.Config, isGenesis bool, chainName string) error { if err := os.MkdirAll(filepath.Dir(config.PrivValidatorKeyFile()), 0700); err != nil { return err } @@ -46,24 +46,28 @@ func InitTendermintFiles(config *cfg.Config, chainName string) error { return err } - // Genesis - genDoc := &tmTypes.GenesisDoc{ - ChainID: chainName, - GenesisTime: time.Now(), - ConsensusParams: tmTypes.DefaultConsensusParams(), - Validators: []tmTypes.GenesisValidator{ - { - Address: key.Address(), - PubKey: key, - Power: 10, - Name: config.Moniker, - }, - }, - AppHash: []byte{}, - } - pv.Save() - return genDoc.SaveAs(config.GenesisFile()) + + if isGenesis { + // Genesis + genDoc := &tmTypes.GenesisDoc{ + ChainID: chainName, + GenesisTime: time.Now(), + ConsensusParams: tmTypes.DefaultConsensusParams(), + Validators: []tmTypes.GenesisValidator{ + { + Address: key.Address(), + PubKey: key, + Power: 10, + Name: config.Moniker, + }, + }, + AppHash: []byte{}, + } + + return genDoc.SaveAs(config.GenesisFile()) + } + return nil } func writeYggdrasilKey(path string) { @@ -116,6 +120,14 @@ func WriteConfig(config *cfg.Config, configPath *string, nodeInfo p2p.NodeInfo) "private_key_file": *yggKeyPath, }) + if a := ReadP2Peers(*configPath); a == "" { + nodeId := nodeInfo.ID() + myPeer := yggdrasil.GetYggdrasilAddress(v) + config.P2P.PersistentPeers = string(nodeId) + "@ygg://[" + myPeer + "]:" + strconv.Itoa(yggListenPort) + } else { + config.P2P.PersistentPeers = a + } + v.Set("p2p", map[string]interface{}{ "use_legacy": false, "queue_type": "priority", @@ -125,13 +137,9 @@ func WriteConfig(config *cfg.Config, configPath *string, nodeInfo p2p.NodeInfo) "bootstrap_peers": "", "persistent_peers": config.P2P.PersistentPeers, "addr_book_file": "config/addrbook.json", - "addr_book_strict": true, + "addr_book_strict": false, }) - nodeId := nodeInfo.ID() - myPeer := yggdrasil.GetYggdrasilAddress(v, nil) - config.P2P.PersistentPeers = string(nodeId) + "@ygg://[" + myPeer + "]:" + strconv.Itoa(yggListenPort) - err = v.WriteConfigAs(*configPath) if err != nil { fmt.Fprintf(os.Stderr, "error writing config: %v\n", err) @@ -166,8 +174,24 @@ func DefaultConfig() *cfg.Config { return cfg.DefaultConfig() } +func ReadP2Peers(configFile string) string { + var genesis map[string]any + genesisJson, err := os.ReadFile(filepath.Join(filepath.Dir(configFile), "genesis.json")) + if err != nil { + return "" + } + _ = json.Unmarshal(genesisJson, &genesis) + p2peers, ok := genesis["p2peers"].(string) + if ok && p2peers != "" { + return p2peers + } else { + return "" + } +} + func UpdateGenesisJson(nodeInfo p2p.NodeInfo, v *viper.Viper, defaultConfigDirectoryPath string) { - file, err := os.ReadFile(defaultConfigDirectoryPath + "/genesis.json") + genesisJsonPath := filepath.Join(defaultConfigDirectoryPath, "genesis.json") + file, err := os.ReadFile(genesisJsonPath) if err != nil { panic(err) } @@ -177,7 +201,7 @@ func UpdateGenesisJson(nodeInfo p2p.NodeInfo, v *viper.Viper, defaultConfigDirec panic(err) } - myPeer := yggdrasil.GetYggdrasilAddress(v, nil) + myPeer := yggdrasil.GetYggdrasilAddress(v) p2peers := fmt.Sprintf("%s@ygg://[%s]:%d", nodeInfo.ID(), myPeer, yggListenPort) dat["p2peers"] = p2peers @@ -186,7 +210,7 @@ func UpdateGenesisJson(nodeInfo p2p.NodeInfo, v *viper.Viper, defaultConfigDirec if err != nil { panic(err) } - if err := os.WriteFile(defaultConfigDirectoryPath+"/genesis.json", out, 0o644); err != nil { + if err := os.WriteFile(genesisJsonPath, out, 0o644); err != nil { panic(err) } } diff --git a/genesis.json b/genesis.json new file mode 100644 index 0000000..bca55dd --- /dev/null +++ b/genesis.json @@ -0,0 +1,36 @@ +{ + "app_hash": "", + "chain_id": "lbc-chain", + "consensus_params": { + "block": { + "max_bytes": "22020096", + "max_gas": "-1", + "time_iota_ms": "1000" + }, + "evidence": { + "max_age_duration": "172800000000000", + "max_age_num_blocks": "100000", + "max_bytes": "1048576" + }, + "validator": { + "pub_key_types": [ + "ed25519" + ] + }, + "version": {} + }, + "genesis_time": "2025-07-12T17:34:34.7567451Z", + "initial_height": "0", + "p2peers": "f8366fe22e5a3cd64281ecfc6e50075903848ab9@ygg://[200:6687:b756:51a2:1147:aef0:9011:c142]:4224", + "validators": [ + { + "address": "F1585752261F319FE0A9E2097825A2807622AE5A", + "name": "DESKTOP-HN9RCT8", + "power": "10", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gnPCTB+kqaiw2TmFwrZYoCcWiPO3SdTf1IB7rEdBulE=" + } + } + ] +} \ No newline at end of file diff --git a/yggdrasil/yggdrasil.go b/yggdrasil/yggdrasil.go index 7771566..ad6efe0 100644 --- a/yggdrasil/yggdrasil.go +++ b/yggdrasil/yggdrasil.go @@ -68,19 +68,15 @@ func GetPublicKey(keyPath string) (ed25519.PublicKey, error) { return privateKey.Public().(ed25519.PublicKey), nil } -func GetYggdrasilAddress(config *viper.Viper, ch chan string) string { - var remoteTcp types.TCPRemoteMappings +func GetYggdrasilAddress(config *viper.Viper) string { + //var remoteTcp types.TCPRemoteMappings ygg := config.Sub("yggdrasil") if ygg == nil { return "" } - laddr := config.Sub("p2p").GetString("laddr") - remoteTcp.Set(laddr) - if ch != nil { - ch <- remoteTcp[0].Mapped.String() - ch <- "" - } + //laddr := config.Sub("p2p").GetString("laddr") + //remoteTcp.Set(laddr) cfg := yggConfig.GenerateConfig() @@ -147,13 +143,6 @@ func Yggdrasil(config *viper.Viper, ch chan string) { return } - peers := p2p.GetString("persistent_peers") - parsed, err := ppp.ParseEntries(peers) - if err != nil { - log.Errorln("Error: persistent peers has an error") - return - } - var peersList []string var yggList []string @@ -163,10 +152,18 @@ func Yggdrasil(config *viper.Viper, ch chan string) { logger = log.New(os.Stdout, "", log.Flags()) } - laddr := config.Sub("p2p").GetString("laddr") + laddr := p2p.GetString("laddr") remoteTcp.Set(laddr) ch <- remoteTcp[0].Mapped.String() + peers := p2p.GetString("persistent_peers") + parsed, err := ppp.ParseEntries(peers) + if err != nil { + parsed = []ppp.ParsedEntry{} + ch <- "" + log.Warnln("Warning: persistent peers has an error") + } + cfg := yggConfig.GenerateConfig() cfg.AdminListen = ygg.GetString("admin_listen")