connection feature in work
This commit is contained in:
parent
a7943e6301
commit
a53a500fd7
5 changed files with 145 additions and 72 deletions
|
|
@ -68,7 +68,6 @@ func GetPublicPeers() []url.URL {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
print(d.Name())
|
|
||||||
if d.IsDir() || !strings.HasSuffix(d.Name(), ".md") || d.Name() == "README.md" {
|
if d.IsDir() || !strings.HasSuffix(d.Name(), ".md") || d.Name() == "README.md" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
77
cli/run.go
77
cli/run.go
|
|
@ -40,10 +40,19 @@ func newTendermint(app abci.Application, configFile string, v *viper.Viper) (*nm
|
||||||
}
|
}
|
||||||
|
|
||||||
laddrReturner := make(chan string, 2)
|
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
|
config.P2P.ListenAddress = "tcp://" + <-laddrReturner
|
||||||
|
|
||||||
|
//if config.P2P.PersistentPeers == "" {
|
||||||
config.P2P.PersistentPeers = <-laddrReturner
|
config.P2P.PersistentPeers = <-laddrReturner
|
||||||
|
//} else {
|
||||||
|
// <- laddrReturner
|
||||||
|
//}
|
||||||
|
|
||||||
var pv tmTypes.PrivValidator
|
var pv tmTypes.PrivValidator
|
||||||
if _, err := os.Stat(config.PrivValidatorKeyFile()); err == nil {
|
if _, err := os.Stat(config.PrivValidatorKeyFile()); err == nil {
|
||||||
|
|
@ -123,6 +132,30 @@ func buildNode() (*nm.Node, *badger.DB, error) {
|
||||||
return node, db, err
|
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() {
|
func runNode() {
|
||||||
node, db, err := buildNode()
|
node, db, err := buildNode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -149,7 +182,7 @@ func initGenesis() {
|
||||||
|
|
||||||
nodeinfo := p2p.DefaultNodeInfo{}
|
nodeinfo := p2p.DefaultNodeInfo{}
|
||||||
viper := cfg.WriteConfig(config, &defaultConfigPath, nodeinfo)
|
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)
|
fmt.Fprintf(os.Stderr, "Failed to init files: %v\n", err)
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
@ -164,30 +197,6 @@ func initGenesis() {
|
||||||
fmt.Println("Genesis node initialized.")
|
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) {
|
func initJoiner(path string) {
|
||||||
config := cfg.DefaultConfig()
|
config := cfg.DefaultConfig()
|
||||||
config.RootDir = filepath.Dir(filepath.Dir(defaultConfigPath))
|
config.RootDir = filepath.Dir(filepath.Dir(defaultConfigPath))
|
||||||
|
|
@ -197,6 +206,14 @@ func initJoiner(path string) {
|
||||||
os.Exit(3)
|
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()
|
node, db, err := buildNode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|
@ -205,10 +222,10 @@ func initJoiner(path string) {
|
||||||
|
|
||||||
cfg.WriteConfig(config, &defaultConfigPath, node.NodeInfo())
|
cfg.WriteConfig(config, &defaultConfigPath, node.NodeInfo())
|
||||||
|
|
||||||
if err := os.MkdirAll(filepath.Join(config.RootDir, "data"), 0o700); err != nil {
|
//if err := os.MkdirAll(filepath.Join(config.RootDir, "data"), 0o700); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "не удалось создать директорию data")
|
// fmt.Fprintln(os.Stderr, "не удалось создать директорию data")
|
||||||
os.Exit(1)
|
// os.Exit(1)
|
||||||
}
|
//}
|
||||||
|
|
||||||
if _, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()); err != nil {
|
if _, err := p2p.LoadOrGenNodeKey(config.NodeKeyFile()); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "ошибка генерации node_key.json")
|
fmt.Fprintln(os.Stderr, "ошибка генерации node_key.json")
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ var (
|
||||||
yggKeyPath = flag.String("ygg-key", "./config/yggdrasil.key", "Path to Yggdrasil key file")
|
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 {
|
if err := os.MkdirAll(filepath.Dir(config.PrivValidatorKeyFile()), 0700); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -46,6 +46,9 @@ func InitTendermintFiles(config *cfg.Config, chainName string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pv.Save()
|
||||||
|
|
||||||
|
if isGenesis {
|
||||||
// Genesis
|
// Genesis
|
||||||
genDoc := &tmTypes.GenesisDoc{
|
genDoc := &tmTypes.GenesisDoc{
|
||||||
ChainID: chainName,
|
ChainID: chainName,
|
||||||
|
|
@ -62,8 +65,9 @@ func InitTendermintFiles(config *cfg.Config, chainName string) error {
|
||||||
AppHash: []byte{},
|
AppHash: []byte{},
|
||||||
}
|
}
|
||||||
|
|
||||||
pv.Save()
|
|
||||||
return genDoc.SaveAs(config.GenesisFile())
|
return genDoc.SaveAs(config.GenesisFile())
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeYggdrasilKey(path string) {
|
func writeYggdrasilKey(path string) {
|
||||||
|
|
@ -116,6 +120,14 @@ func WriteConfig(config *cfg.Config, configPath *string, nodeInfo p2p.NodeInfo)
|
||||||
"private_key_file": *yggKeyPath,
|
"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{}{
|
v.Set("p2p", map[string]interface{}{
|
||||||
"use_legacy": false,
|
"use_legacy": false,
|
||||||
"queue_type": "priority",
|
"queue_type": "priority",
|
||||||
|
|
@ -125,13 +137,9 @@ func WriteConfig(config *cfg.Config, configPath *string, nodeInfo p2p.NodeInfo)
|
||||||
"bootstrap_peers": "",
|
"bootstrap_peers": "",
|
||||||
"persistent_peers": config.P2P.PersistentPeers,
|
"persistent_peers": config.P2P.PersistentPeers,
|
||||||
"addr_book_file": "config/addrbook.json",
|
"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)
|
err = v.WriteConfigAs(*configPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "error writing config: %v\n", err)
|
fmt.Fprintf(os.Stderr, "error writing config: %v\n", err)
|
||||||
|
|
@ -166,8 +174,24 @@ func DefaultConfig() *cfg.Config {
|
||||||
return cfg.DefaultConfig()
|
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) {
|
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 {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
@ -177,7 +201,7 @@ func UpdateGenesisJson(nodeInfo p2p.NodeInfo, v *viper.Viper, defaultConfigDirec
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
myPeer := yggdrasil.GetYggdrasilAddress(v, nil)
|
myPeer := yggdrasil.GetYggdrasilAddress(v)
|
||||||
|
|
||||||
p2peers := fmt.Sprintf("%s@ygg://[%s]:%d", nodeInfo.ID(), myPeer, yggListenPort)
|
p2peers := fmt.Sprintf("%s@ygg://[%s]:%d", nodeInfo.ID(), myPeer, yggListenPort)
|
||||||
dat["p2peers"] = p2peers
|
dat["p2peers"] = p2peers
|
||||||
|
|
@ -186,7 +210,7 @@ func UpdateGenesisJson(nodeInfo p2p.NodeInfo, v *viper.Viper, defaultConfigDirec
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
if err := os.WriteFile(defaultConfigDirectoryPath+"/genesis.json", out, 0o644); err != nil {
|
if err := os.WriteFile(genesisJsonPath, out, 0o644); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
36
genesis.json
Normal file
36
genesis.json
Normal file
|
|
@ -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="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -68,19 +68,15 @@ func GetPublicKey(keyPath string) (ed25519.PublicKey, error) {
|
||||||
return privateKey.Public().(ed25519.PublicKey), nil
|
return privateKey.Public().(ed25519.PublicKey), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetYggdrasilAddress(config *viper.Viper, ch chan string) string {
|
func GetYggdrasilAddress(config *viper.Viper) string {
|
||||||
var remoteTcp types.TCPRemoteMappings
|
//var remoteTcp types.TCPRemoteMappings
|
||||||
ygg := config.Sub("yggdrasil")
|
ygg := config.Sub("yggdrasil")
|
||||||
if ygg == nil {
|
if ygg == nil {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
laddr := config.Sub("p2p").GetString("laddr")
|
//laddr := config.Sub("p2p").GetString("laddr")
|
||||||
remoteTcp.Set(laddr)
|
//remoteTcp.Set(laddr)
|
||||||
if ch != nil {
|
|
||||||
ch <- remoteTcp[0].Mapped.String()
|
|
||||||
ch <- ""
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg := yggConfig.GenerateConfig()
|
cfg := yggConfig.GenerateConfig()
|
||||||
|
|
||||||
|
|
@ -147,13 +143,6 @@ func Yggdrasil(config *viper.Viper, ch chan string) {
|
||||||
return
|
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 peersList []string
|
||||||
var yggList []string
|
var yggList []string
|
||||||
|
|
||||||
|
|
@ -163,10 +152,18 @@ func Yggdrasil(config *viper.Viper, ch chan string) {
|
||||||
logger = log.New(os.Stdout, "", log.Flags())
|
logger = log.New(os.Stdout, "", log.Flags())
|
||||||
}
|
}
|
||||||
|
|
||||||
laddr := config.Sub("p2p").GetString("laddr")
|
laddr := p2p.GetString("laddr")
|
||||||
remoteTcp.Set(laddr)
|
remoteTcp.Set(laddr)
|
||||||
ch <- remoteTcp[0].Mapped.String()
|
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 := yggConfig.GenerateConfig()
|
||||||
|
|
||||||
cfg.AdminListen = ygg.GetString("admin_listen")
|
cfg.AdminListen = ygg.GetString("admin_listen")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue