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  }