github.com/0chain/gosdk@v1.17.11/zboxcore/blockchain/entity.go (about)

     1  // Methods and types for blockchain entities and interactions.
     2  package blockchain
     3  
     4  import (
     5  	"encoding/json"
     6  	"math"
     7  	"sync"
     8  	"sync/atomic"
     9  
    10  	"github.com/0chain/gosdk/core/util"
    11  
    12  	"github.com/0chain/gosdk/core/conf"
    13  	"github.com/0chain/gosdk/core/node"
    14  )
    15  
    16  var miners []string
    17  var mGuard sync.Mutex
    18  
    19  func getMinMinersSubmit() int {
    20  	minMiners := util.MaxInt(calculateMinRequired(float64(chain.MinSubmit), float64(len(chain.Miners))/100), 1)
    21  	return minMiners
    22  }
    23  
    24  func calculateMinRequired(minRequired, percent float64) int {
    25  	return int(math.Ceil(minRequired * percent))
    26  }
    27  
    28  // GetStableMiners get stable miners
    29  func GetStableMiners() []string {
    30  	mGuard.Lock()
    31  	defer mGuard.Unlock()
    32  	if len(miners) == 0 {
    33  		miners = util.GetRandom(chain.Miners, getMinMinersSubmit())
    34  	}
    35  
    36  	return miners
    37  }
    38  
    39  // ResetStableMiners reset stable miners to random miners
    40  func ResetStableMiners() {
    41  	mGuard.Lock()
    42  	defer mGuard.Unlock()
    43  	miners = util.GetRandom(chain.Miners, getMinMinersSubmit())
    44  }
    45  
    46  type ChainConfig struct {
    47  	BlockWorker     string
    48  	Sharders        []string
    49  	Miners          []string
    50  	MinSubmit       int
    51  	MinConfirmation int
    52  	ChainID         string
    53  	MaxTxnQuery     int
    54  	QuerySleepTime  int
    55  }
    56  
    57  // StakePoolSettings information.
    58  type StakePoolSettings struct {
    59  	DelegateWallet string  `json:"delegate_wallet"`
    60  	NumDelegates   int     `json:"num_delegates"`
    61  	ServiceCharge  float64 `json:"service_charge"`
    62  }
    63  
    64  // UpdateStakePoolSettings represent stake pool information of a provider node.
    65  type UpdateStakePoolSettings struct {
    66  	DelegateWallet *string  `json:"delegate_wallet,omitempty"`
    67  	NumDelegates   *int     `json:"num_delegates,omitempty"`
    68  	ServiceCharge  *float64 `json:"service_charge,omitempty"`
    69  }
    70  
    71  // ValidationNode represents a validation node (miner)
    72  type ValidationNode struct {
    73  	ID                string            `json:"id"`
    74  	BaseURL           string            `json:"url"`
    75  	StakePoolSettings StakePoolSettings `json:"stake_pool_settings"`
    76  }
    77  
    78  // UpdateValidationNode represents a validation node (miner) update
    79  type UpdateValidationNode struct {
    80  	ID                string                   `json:"id"`
    81  	BaseURL           *string                  `json:"url"`
    82  	StakePoolSettings *UpdateStakePoolSettings `json:"stake_pool_settings"`
    83  }
    84  
    85  // StorageNode represents a storage node (blobber)
    86  type StorageNode struct {
    87  	ID      string `json:"id"`
    88  	Baseurl string `json:"url"`
    89  
    90  	skip uint64 `json:"-"` // skip on error
    91  }
    92  
    93  // SetSkip set skip, whether to skip this node in operations or not
    94  //   - t is the boolean value
    95  func (sn *StorageNode) SetSkip(t bool) {
    96  	var val uint64
    97  	if t {
    98  		val = 1
    99  	}
   100  	atomic.StoreUint64(&sn.skip, val)
   101  }
   102  
   103  // IsSkip check if skip
   104  func (sn *StorageNode) IsSkip() bool {
   105  	return atomic.LoadUint64(&sn.skip) > 0
   106  }
   107  
   108  // PopulateNodes populate nodes from json string
   109  //   - nodesjson is the json string
   110  func PopulateNodes(nodesjson string) ([]string, error) {
   111  	sharders := make([]string, 0)
   112  	err := json.Unmarshal([]byte(nodesjson), &sharders)
   113  	return sharders, err
   114  }
   115  
   116  var chain *ChainConfig
   117  var Sharders *node.NodeHolder
   118  
   119  func init() {
   120  	chain = &ChainConfig{
   121  		MaxTxnQuery:     5,
   122  		QuerySleepTime:  5,
   123  		MinSubmit:       10,
   124  		MinConfirmation: 10,
   125  	}
   126  }
   127  
   128  // GetChainConfig get chain config
   129  func GetChainID() string {
   130  	return chain.ChainID
   131  }
   132  
   133  // PopulateChain populate chain from json string
   134  //   - minerjson is the array of miner urls, serialized as json
   135  //   - sharderjson is the array of sharder urls, serialized as json
   136  func PopulateChain(minerjson string, sharderjson string) error {
   137  	var err error
   138  	chain.Miners, err = PopulateNodes(minerjson)
   139  	if err != nil {
   140  		return err
   141  	}
   142  	sharders, err := PopulateNodes(sharderjson)
   143  	if err != nil {
   144  		return err
   145  	}
   146  	SetSharders(sharders)
   147  	return nil
   148  }
   149  
   150  // GetBlockWorker get block worker
   151  func GetBlockWorker() string {
   152  	return chain.BlockWorker
   153  }
   154  
   155  // GetSharders get sharders
   156  func GetAllSharders() []string {
   157  	return Sharders.All()
   158  }
   159  
   160  // GetSharders get healthy sharders
   161  func GetSharders() []string {
   162  	return Sharders.Healthy()
   163  }
   164  
   165  // GetMiners get miners
   166  func GetMiners() []string {
   167  	return chain.Miners
   168  }
   169  
   170  // GetMaxTxnQuery get max transaction query
   171  func GetMaxTxnQuery() int {
   172  	return chain.MaxTxnQuery
   173  }
   174  
   175  func GetQuerySleepTime() int {
   176  	return chain.QuerySleepTime
   177  }
   178  
   179  func GetMinSubmit() int {
   180  	return chain.MinSubmit
   181  }
   182  
   183  func GetMinConfirmation() int {
   184  	return chain.MinConfirmation
   185  }
   186  
   187  func SetBlockWorker(blockWorker string) {
   188  	chain.BlockWorker = blockWorker
   189  }
   190  
   191  func SetSharders(sharderArray []string) {
   192  	consensus := conf.DefaultSharderConsensous
   193  	config, err := conf.GetClientConfig()
   194  	if err == nil && config != nil {
   195  		consensus = config.SharderConsensous
   196  	}
   197  	if len(sharderArray) < consensus {
   198  		consensus = len(sharderArray)
   199  	}
   200  	Sharders = node.NewHolder(sharderArray, consensus)
   201  }
   202  
   203  func SetMiners(minerArray []string) {
   204  	chain.Miners = minerArray
   205  }
   206  
   207  func SetChainID(id string) {
   208  	chain.ChainID = id
   209  }
   210  
   211  // SetMaxTxnQuery set max transaction query, maximum number of trials to query a transaction confirmation from sharders.
   212  //   - num is the number of transaction query
   213  func SetMaxTxnQuery(num int) {
   214  	chain.MaxTxnQuery = num
   215  }
   216  
   217  // SetQuerySleepTime set query sleep time, number of seconds to sleep between each transaction query.
   218  //   - time is the sleep time
   219  func SetQuerySleepTime(time int) {
   220  	chain.QuerySleepTime = time
   221  }
   222  
   223  // SetMinSubmit set minimum submit, minimum number of miners to submit a transaction
   224  //   - minSubmit is the minimum submit
   225  func SetMinSubmit(minSubmit int) {
   226  	chain.MinSubmit = minSubmit
   227  }
   228  
   229  // SetMinConfirmation set minimum confirmation, minimum number of miners to confirm a transaction
   230  //   - minConfirmation is the minimum confirmation
   231  func SetMinConfirmation(minConfirmation int) {
   232  	chain.MinConfirmation = minConfirmation
   233  }