github.com/0chain/gosdk@v1.17.11/zcncore/networkworker_mobile.go (about) 1 //go:build mobile 2 // +build mobile 3 4 package zcncore 5 6 import ( 7 "context" 8 "encoding/json" 9 "reflect" 10 "time" 11 12 "github.com/0chain/errors" 13 "github.com/0chain/gosdk/core/conf" 14 "github.com/0chain/gosdk/core/node" 15 "github.com/0chain/gosdk/core/util" 16 "go.uber.org/zap" 17 ) 18 19 const NETWORK_ENDPOINT = "/network" 20 21 var networkWorkerTimerInHours = 1 22 23 // Network details of the network 24 type Network struct { 25 net network 26 } 27 28 // NewNetwork create a new network 29 func NewNetwork() *Network { 30 return &Network{} 31 } 32 33 // AddMiner add miner to the network 34 func (net *Network) AddMiner(miner string) { 35 net.net.Miners = append(net.net.Miners, miner) 36 } 37 38 // AddSharder add sharder to the network 39 func (net *Network) AddSharder(sharder string) { 40 net.net.Sharders = append(net.net.Sharders, sharder) 41 } 42 43 type network struct { 44 Miners []string `json:"miners"` 45 Sharders []string `json:"sharders"` 46 } 47 48 func updateNetworkDetailsWorker(ctx context.Context) { 49 ticker := time.NewTicker(time.Duration(networkWorkerTimerInHours) * time.Hour) 50 for { 51 select { 52 case <-ctx.Done(): 53 logging.Info("Network stopped by user") 54 return 55 case <-ticker.C: 56 err := UpdateNetworkDetails() 57 if err != nil { 58 logging.Error("Update network detail worker fail", zap.Error(err)) 59 return 60 } 61 logging.Info("Successfully updated network details") 62 return 63 } 64 } 65 } 66 67 // UpdateNetworkDetails update network details 68 func UpdateNetworkDetails() error { 69 networkDetails, err := GetNetworkDetails() 70 if err != nil { 71 logging.Error("Failed to update network details ", zap.Error(err)) 72 return err 73 } 74 75 shouldUpdate := UpdateRequired(networkDetails) 76 if shouldUpdate { 77 _config.isConfigured = false 78 _config.chain.Miners = networkDetails.net.Miners 79 _config.chain.Sharders = networkDetails.net.Sharders 80 consensus := _config.chain.SharderConsensous 81 if consensus < conf.DefaultSharderConsensous { 82 consensus = conf.DefaultSharderConsensous 83 } 84 if len(networkDetails.net.Sharders) < consensus { 85 consensus = len(networkDetails.net.Sharders) 86 } 87 88 Sharders = node.NewHolder(networkDetails.net.Sharders, consensus) 89 node.InitCache(Sharders) 90 conf.InitChainNetwork(&conf.Network{ 91 Sharders: networkDetails.net.Sharders, 92 Miners: networkDetails.net.Miners, 93 }) 94 _config.isConfigured = true 95 } 96 return nil 97 } 98 99 func UpdateRequired(networkDetails *Network) bool { 100 miners := _config.chain.Miners 101 sharders := _config.chain.Sharders 102 if len(miners) == 0 || len(sharders) == 0 { 103 return true 104 } 105 106 minerSame := reflect.DeepEqual(miners, networkDetails.net.Miners) 107 sharderSame := reflect.DeepEqual(sharders, networkDetails.net.Sharders) 108 109 if minerSame && sharderSame { 110 return false 111 } 112 return true 113 } 114 115 func GetNetworkDetails() (*Network, error) { 116 req, err := util.NewHTTPGetRequest(_config.chain.BlockWorker + NETWORK_ENDPOINT) 117 if err != nil { 118 return nil, errors.New("get_network_details_error", "Unable to create new http request with error "+err.Error()) 119 } 120 121 res, err := req.Get() 122 if err != nil { 123 return nil, errors.New("get_network_details_error", "Unable to get http request with error "+err.Error()) 124 } 125 126 var networkResponse network 127 err = json.Unmarshal([]byte(res.Body), &networkResponse) 128 if err != nil { 129 return nil, errors.Wrap(err, "Error unmarshaling response :") 130 } 131 return &Network{net: networkResponse}, nil 132 } 133 134 // GetNetwork - get network details 135 func GetNetwork() *Network { 136 return &Network{ 137 net: network{ 138 Miners: _config.chain.Miners, 139 Sharders: _config.chain.Sharders, 140 }, 141 } 142 } 143 144 // SetNetwork set network details 145 // - net: network details 146 func SetNetwork(net *Network) { 147 _config.chain.Miners = net.net.Miners 148 _config.chain.Sharders = net.net.Sharders 149 150 consensus := _config.chain.SharderConsensous 151 if consensus < conf.DefaultSharderConsensous { 152 consensus = conf.DefaultSharderConsensous 153 } 154 if len(net.net.Sharders) < consensus { 155 consensus = len(net.net.Sharders) 156 } 157 158 Sharders = node.NewHolder(_config.chain.Sharders, consensus) 159 160 node.InitCache(Sharders) 161 162 conf.InitChainNetwork(&conf.Network{ 163 Miners: net.net.Miners, 164 Sharders: net.net.Sharders, 165 }) 166 } 167 168 func GetNetworkJSON() string { 169 network := GetNetwork() 170 networkBytes, _ := json.Marshal(network) 171 return string(networkBytes) 172 }