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 }