From e4390744748a312b9f39529fa5ace9c18e42c1cb Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Sun, 2 Jul 2023 23:53:34 +0530 Subject: [PATCH 01/28] Introducing DTO for Udpate Providers in smart contract --- .../0chain.net/smartcontract/dto/minerdto.go | 61 +++++++++++++++++++ .../smartcontract/dto/stakepooldto.go | 39 ++++++++++++ .../0chain.net/smartcontract/minersc/miner.go | 54 +++++++++++++--- .../smartcontract/minersc/sharder.go | 20 ++++-- 4 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 code/go/0chain.net/smartcontract/dto/minerdto.go create mode 100644 code/go/0chain.net/smartcontract/dto/stakepooldto.go diff --git a/code/go/0chain.net/smartcontract/dto/minerdto.go b/code/go/0chain.net/smartcontract/dto/minerdto.go new file mode 100644 index 0000000000..daf7eb22f3 --- /dev/null +++ b/code/go/0chain.net/smartcontract/dto/minerdto.go @@ -0,0 +1,61 @@ +package dto + +import ( + "0chain.net/core/common" + "0chain.net/smartcontract/provider" + "github.com/0chain/common/core/currency" +) + +// NodeType used in pools statistic. +type NodeType int + +// MinerDtoNode struct that holds information about the registering miner. +// swagger:model MinerDtoNode +type MinerDtoNode struct { + *SimpleDtoNode `json:"simple_miner,omitempty"` + *StakePool `json:"stake_pool,omitempty"` +} + +// swagger:model SimpleDtoNode +type SimpleDtoNode struct { + provider.Provider + N2NHost string `json:"n2n_host"` + Host string `json:"host"` + Port int `json:"port"` + Geolocation SimpleNodeGeolocation `json:"geolocation"` + Path string `json:"path"` + PublicKey string `json:"public_key"` + ShortName string `json:"short_name"` + BuildTag string `json:"build_tag"` + TotalStaked currency.Coin `json:"total_stake"` + Delete bool `json:"delete"` + + // settings and statistic + + // NodeType used for delegate pools statistic. + NodeType NodeType `json:"node_type,omitempty"` + + // LastHealthCheck used to check for active node + LastHealthCheck common.Timestamp `json:"last_health_check"` + + // Status will be set either node.NodeStatusActive or node.NodeStatusInactive + Status int `json:"-" msg:"-"` + + //LastSettingUpdateRound will be set to round number when settings were updated + LastSettingUpdateRound int64 `json:"last_setting_update_round"` +} + +// swagger:model SimpleNodeGeolocation +type SimpleNodeGeolocation struct { + Latitude *float64 `json:"latitude,omitempty"` + Longitude *float64 `json:"longitude,omitempty"` +} + +func NewMinerDtoNode() *MinerDtoNode { + return &MinerDtoNode{ + SimpleDtoNode: &SimpleDtoNode{ + Provider: provider.Provider{}, + }, + StakePool: NewStakePool(), + } +} diff --git a/code/go/0chain.net/smartcontract/dto/stakepooldto.go b/code/go/0chain.net/smartcontract/dto/stakepooldto.go new file mode 100644 index 0000000000..6ae83f2f4b --- /dev/null +++ b/code/go/0chain.net/smartcontract/dto/stakepooldto.go @@ -0,0 +1,39 @@ +package dto + +import ( + cstate "0chain.net/chaincore/chain/state" + "0chain.net/core/common" + "github.com/0chain/common/core/currency" +) + +type PoolStatus int + +// StakePool holds delegate information for an 0chain providers +type StakePool struct { + Pools map[string]*DelegatePool `json:"pools"` + Reward currency.Coin `json:"rewards"` + StakePoolSettings Settings `json:"settings"` + Minter cstate.ApprovedMinter `json:"minter"` + HasBeenKilled bool `json:"is_dead"` +} + +type DelegatePool struct { + Balance currency.Coin `json:"balance"` + Reward currency.Coin `json:"reward"` + Status *PoolStatus `json:"status"` + RoundCreated *int64 `json:"round_created"` // used for cool down + DelegateID *string `json:"delegate_id"` + StakedAt common.Timestamp `json:"staked_at"` +} + +type Settings struct { + DelegateWallet *string `json:"delegate_wallet,omitempty"` + MaxNumDelegates *int `json:"num_delegates,omitempty"` + ServiceChargeRatio *float64 `json:"service_charge,omitempty"` +} + +func NewStakePool() *StakePool { + return &StakePool{ + Pools: make(map[string]*DelegatePool), + } +} diff --git a/code/go/0chain.net/smartcontract/minersc/miner.go b/code/go/0chain.net/smartcontract/minersc/miner.go index d6eae9189b..79aab55e9f 100644 --- a/code/go/0chain.net/smartcontract/minersc/miner.go +++ b/code/go/0chain.net/smartcontract/minersc/miner.go @@ -1,6 +1,8 @@ package minersc import ( + "0chain.net/smartcontract/dto" + "encoding/json" "fmt" "0chain.net/smartcontract/stakepool/spenum" @@ -252,24 +254,24 @@ func (msc *MinerSmartContract) UpdateMinerSettings(t *transaction.Transaction, inputData []byte, gn *GlobalNode, balances cstate.StateContextI) ( resp string, err error) { - var update = NewMinerNode() - if err = update.Decode(inputData); err != nil { + requiredUpdateInMinerNode := dto.NewMinerDtoNode() + if err = json.Unmarshal(inputData, &requiredUpdateInMinerNode); err != nil { return "", common.NewErrorf("update_miner_settings", "decoding request: %v", err) } - err = validateNodeSettings(update, gn, "update_miner_settings") + err = validateNodeUpdateSettings(requiredUpdateInMinerNode, gn, "update_miner_settings") if err != nil { return "", err } var mn *MinerNode - mn, err = getMinerNode(update.ID, balances) + mn, err = getMinerNode(requiredUpdateInMinerNode.ID, balances) switch err { case nil: case util.ErrValueNotPresent: mn = NewMinerNode() - mn.ID = update.ID + mn.ID = requiredUpdateInMinerNode.ID default: return "", common.NewError("update_miner_settings", err.Error()) } @@ -287,8 +289,14 @@ func (msc *MinerSmartContract) UpdateMinerSettings(t *transaction.Transaction, return "", common.NewError("update_miner_settings", "access denied") } - mn.Settings.ServiceChargeRatio = update.Settings.ServiceChargeRatio - mn.Settings.MaxNumDelegates = update.Settings.MaxNumDelegates + // only update when there were values sent + if requiredUpdateInMinerNode.StakePool.StakePoolSettings.ServiceChargeRatio != nil { + mn.Settings.ServiceChargeRatio = *requiredUpdateInMinerNode.StakePoolSettings.ServiceChargeRatio + } + + if requiredUpdateInMinerNode.StakePool.StakePoolSettings.MaxNumDelegates != nil { + mn.Settings.MaxNumDelegates = *requiredUpdateInMinerNode.StakePoolSettings.MaxNumDelegates + } if err = mn.save(balances); err != nil { return "", common.NewErrorf("update_miner_settings", "saving: %v", err) @@ -349,3 +357,35 @@ func validateNodeSettings(node *MinerNode, gn *GlobalNode, opcode string) error return nil } + +func validateNodeUpdateSettings(update *dto.MinerDtoNode, gn *GlobalNode, opcode string) error { + if update.StakePoolSettings.ServiceChargeRatio != nil { + serviceChargeValue := *update.StakePoolSettings.ServiceChargeRatio + if serviceChargeValue < 0 { + return common.NewErrorf(opcode, + "invalid negative service charge: %v", serviceChargeValue) + } + + if serviceChargeValue > gn.MaxCharge { + return common.NewErrorf(opcode, + "max_charge is greater than allowed by SC: %v > %v", + serviceChargeValue, gn.MaxCharge) + } + } + + if update.StakePoolSettings.MaxNumDelegates != nil { + maxDelegateValue := *update.StakePoolSettings.MaxNumDelegates + if maxDelegateValue <= 0 { + return common.NewErrorf(opcode, + "invalid non-positive number_of_delegates: %v", maxDelegateValue) + } + + if maxDelegateValue > gn.MaxDelegates { + return common.NewErrorf(opcode, + "number_of_delegates greater than max_delegates of SC: %v > %v", + maxDelegateValue, gn.MaxDelegates) + } + } + + return nil +} diff --git a/code/go/0chain.net/smartcontract/minersc/sharder.go b/code/go/0chain.net/smartcontract/minersc/sharder.go index 1a309b546a..d236cd7be5 100644 --- a/code/go/0chain.net/smartcontract/minersc/sharder.go +++ b/code/go/0chain.net/smartcontract/minersc/sharder.go @@ -1,6 +1,8 @@ package minersc import ( + "0chain.net/smartcontract/dto" + "encoding/json" "errors" "fmt" @@ -21,19 +23,19 @@ func (msc *MinerSmartContract) UpdateSharderSettings(t *transaction.Transaction, inputData []byte, gn *GlobalNode, balances cstate.StateContextI) ( resp string, err error) { - var update = NewMinerNode() - if err = update.Decode(inputData); err != nil { + requiredUpdateInSharderNode := dto.NewMinerDtoNode() + if err = json.Unmarshal(inputData, &requiredUpdateInSharderNode); err != nil { return "", common.NewErrorf("update_sharder_settings", "decoding request: %v", err) } - err = validateNodeSettings(update, gn, "update_sharder_settings") + err = validateNodeUpdateSettings(requiredUpdateInSharderNode, gn, "update_sharder_settings") if err != nil { return "", err } var sn *MinerNode - sn, err = msc.getSharderNode(update.ID, balances) + sn, err = msc.getSharderNode(requiredUpdateInSharderNode.ID, balances) if err != nil { return "", common.NewError("update_sharder_settings", err.Error()) } @@ -49,8 +51,14 @@ func (msc *MinerSmartContract) UpdateSharderSettings(t *transaction.Transaction, return "", common.NewError("update_sharder_settings", "access denied") } - sn.Settings.ServiceChargeRatio = update.Settings.ServiceChargeRatio - sn.Settings.MaxNumDelegates = update.Settings.MaxNumDelegates + // only update when there were values sent + if requiredUpdateInSharderNode.StakePool.StakePoolSettings.ServiceChargeRatio != nil { + sn.Settings.ServiceChargeRatio = *requiredUpdateInSharderNode.StakePoolSettings.ServiceChargeRatio + } + + if requiredUpdateInSharderNode.StakePool.StakePoolSettings.MaxNumDelegates != nil { + sn.Settings.MaxNumDelegates = *requiredUpdateInSharderNode.StakePoolSettings.MaxNumDelegates + } if err = sn.save(balances); err != nil { return "", common.NewErrorf("update_sharder_settings", "saving: %v", err) From f504896cf52f463b7df2bef268cde0d3e05e6eb3 Mon Sep 17 00:00:00 2001 From: Piers Shepperson Date: Tue, 4 Jul 2023 13:10:53 +0100 Subject: [PATCH 02/28] min_lock_demand --- code/go/0chain.net/smartcontract/storagesc/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/config.go b/code/go/0chain.net/smartcontract/storagesc/config.go index f1e5297314..ca3417c5c4 100644 --- a/code/go/0chain.net/smartcontract/storagesc/config.go +++ b/code/go/0chain.net/smartcontract/storagesc/config.go @@ -344,7 +344,7 @@ func getConfiguredConfig() (conf *Config, err error) { conf.ValidatorReward = scc.GetFloat64(pfx + "validator_reward") conf.BlobberSlash = scc.GetFloat64(pfx + "blobber_slash") conf.CancellationCharge = scc.GetFloat64(pfx + "cancellation_charge") - conf.MinLockDemand = scc.GetFloat64(pfx + "MinLockDemand") + conf.MinLockDemand = scc.GetFloat64(pfx + "min_lock_demand") conf.MaxBlobbersPerAllocation = scc.GetInt(pfx + "max_blobbers_per_allocation") conf.MaxReadPrice, err = currency.ParseZCN(scc.GetFloat64(pfx + "max_read_price")) if err != nil { From 8a5278fbf367c2b1ba73df0bff2d3036de72e2e6 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Thu, 6 Jul 2023 22:28:24 +0530 Subject: [PATCH 03/28] Introducing DTO for Udpate Blobbers and Update Validators in 0chain. --- .../chaincore/chain/state/mocks/build.go | 4 - code/go/0chain.net/core/mocks/build.go | 4 - .../smartcontract/benchmark/mocks/build.go | 4 - .../smartcontract/dto/blobberdto.go | 41 ++++ .../smartcontract/dto/validationdto.go | 13 ++ .../smartcontract/storagesc/blobber.go | 175 ++++++++++++------ .../storagesc/blobber_eventdb.go | 60 ++++-- .../smartcontract/storagesc/blobber_test.go | 2 +- .../smartcontract/storagesc/models.go | 25 ++- .../smartcontract/storagesc/stakepool.go | 19 ++ .../smartcontract/storagesc/validator.go | 83 +++++---- .../storagesc/validator_eventdb.go | 37 +++- 12 files changed, 331 insertions(+), 136 deletions(-) delete mode 100644 code/go/0chain.net/chaincore/chain/state/mocks/build.go delete mode 100644 code/go/0chain.net/core/mocks/build.go delete mode 100644 code/go/0chain.net/smartcontract/benchmark/mocks/build.go create mode 100644 code/go/0chain.net/smartcontract/dto/blobberdto.go create mode 100644 code/go/0chain.net/smartcontract/dto/validationdto.go diff --git a/code/go/0chain.net/chaincore/chain/state/mocks/build.go b/code/go/0chain.net/chaincore/chain/state/mocks/build.go deleted file mode 100644 index da3350b582..0000000000 --- a/code/go/0chain.net/chaincore/chain/state/mocks/build.go +++ /dev/null @@ -1,4 +0,0 @@ -package mocks - -func init() { -} diff --git a/code/go/0chain.net/core/mocks/build.go b/code/go/0chain.net/core/mocks/build.go deleted file mode 100644 index da3350b582..0000000000 --- a/code/go/0chain.net/core/mocks/build.go +++ /dev/null @@ -1,4 +0,0 @@ -package mocks - -func init() { -} diff --git a/code/go/0chain.net/smartcontract/benchmark/mocks/build.go b/code/go/0chain.net/smartcontract/benchmark/mocks/build.go deleted file mode 100644 index da3350b582..0000000000 --- a/code/go/0chain.net/smartcontract/benchmark/mocks/build.go +++ /dev/null @@ -1,4 +0,0 @@ -package mocks - -func init() { -} diff --git a/code/go/0chain.net/smartcontract/dto/blobberdto.go b/code/go/0chain.net/smartcontract/dto/blobberdto.go new file mode 100644 index 0000000000..d558a17891 --- /dev/null +++ b/code/go/0chain.net/smartcontract/dto/blobberdto.go @@ -0,0 +1,41 @@ +package dto + +import ( + "0chain.net/core/common" + "0chain.net/smartcontract/provider" + "github.com/0chain/common/core/currency" +) + +// StorageDtoNode represents Blobber configurations used as DTO. +// This is just a DTO model which should be used in passing data to other service for ex, via HTTP call. +// This should not be used in the application for any business logic. +// The corresponding model is storagesc.StorageNode. +type StorageDtoNode struct { + provider.Provider + BaseURL *string `json:"url,omitempty"` + Geolocation *StorageNodeGeolocation `json:"geolocation,omitempty"` + Terms *Terms `json:"terms,omitempty"` + Capacity *int64 `json:"capacity,omitempty"` + Allocated *int64 `json:"allocated,omitempty"` + SavedData *int64 `json:"saved_data,omitempty"` + DataReadLastRewardRound *float64 `json:"data_read_last_reward_round,omitempty"` + LastRewardDataReadRound *int64 `json:"last_reward_data_read_round,omitempty"` + StakePoolSettings *Settings `json:"stake_pool_settings,omitempty"` + RewardRound *RewardRound `json:"reward_round,omitempty"` + NotAvailable *bool `json:"not_available,omitempty"` +} + +type RewardRound struct { + StartRound *int64 `json:"start_round,omitempty"` + Timestamp *common.Timestamp `json:"timestamp,omitempty"` +} + +type StorageNodeGeolocation struct { + Latitude *float64 `json:"latitude,omitempty"` + Longitude *float64 `json:"longitude,omitempty"` +} + +type Terms struct { + ReadPrice *currency.Coin `json:"read_price,omitempty"` + WritePrice *currency.Coin `json:"write_price,omitempty"` +} diff --git a/code/go/0chain.net/smartcontract/dto/validationdto.go b/code/go/0chain.net/smartcontract/dto/validationdto.go new file mode 100644 index 0000000000..01f3c133de --- /dev/null +++ b/code/go/0chain.net/smartcontract/dto/validationdto.go @@ -0,0 +1,13 @@ +package dto + +import ( + "0chain.net/core/common" + "0chain.net/smartcontract/provider" +) + +type ValidationDtoNode struct { + provider.Provider + BaseURL *string `json:"url"` + StakePoolSettings *Settings `json:"stake_pool_settings"` + LastHealthCheck *common.Timestamp `json:"last_health_check"` +} diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 3e5a9fe6a1..1407c95cb1 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -1,7 +1,9 @@ package storagesc import ( + "0chain.net/smartcontract/dto" "encoding/json" + "errors" "fmt" "math" "math/big" @@ -72,42 +74,72 @@ func (sc *StorageSmartContract) hasBlobberUrl(blobberURL string, } } +func validateBlobberUpdateSettings(updateBlobberRequest *dto.StorageDtoNode, conf *Config) error { + if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity <= conf.MinBlobberCapacity { + return errors.New("insufficient blobber capacity in update blobber settings") + } + + if err := validateBaseUrl(updateBlobberRequest.BaseURL); err != nil { + return err + } + + if updateBlobberRequest.Geolocation != nil { + geoLocation := &StorageNodeGeolocation{} + if updateBlobberRequest.Geolocation.Latitude != nil { + geoLocation.Latitude = *updateBlobberRequest.Geolocation.Latitude + } + if updateBlobberRequest.Geolocation.Longitude != nil { + geoLocation.Longitude = *updateBlobberRequest.Geolocation.Longitude + } + + if err := geoLocation.validate(); err != nil { + return err + } + } + + return nil +} + // update existing blobber, or reborn a deleted one func (sc *StorageSmartContract) updateBlobber( - t *transaction.Transaction, + txn *transaction.Transaction, conf *Config, - blobber, savedBlobber *StorageNode, - sp *stakePool, + updateBlobberRequest *dto.StorageDtoNode, + savedBlobber *StorageNode, + existingStakePool *stakePool, balances cstate.StateContextI, ) (err error) { // check terms - if err = blobber.Terms.validate(conf); err != nil { - return fmt.Errorf("invalid blobber terms: %v", err) + terms := getTermsFromDtoNode(updateBlobberRequest) + if terms != nil { + if err = terms.validate(conf); err != nil { + return fmt.Errorf("invalid blobber terms: %v", err) + } } - if blobber.Capacity <= 0 { - return sc.removeBlobber(t, blobber, balances) + if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity <= 0 { + return sc.removeBlobber(txn, updateBlobberRequest, balances) } // check params - if err = blobber.validate(conf); err != nil { + if err = validateBlobberUpdateSettings(updateBlobberRequest, conf); err != nil { return fmt.Errorf("invalid blobber params: %v", err) } - if savedBlobber.BaseURL != blobber.BaseURL { + if updateBlobberRequest.BaseURL != nil && *updateBlobberRequest.BaseURL != savedBlobber.BaseURL { //if updating url - has, err := sc.hasBlobberUrl(blobber.BaseURL, balances) + has, err := sc.hasBlobberUrl(*updateBlobberRequest.BaseURL, balances) if err != nil { return fmt.Errorf("could not check blobber url: %v", err) } if has { - return fmt.Errorf("blobber url update failed, %s already used", blobber.BaseURL) + return fmt.Errorf("blobber url update failed, %s already used", *updateBlobberRequest.BaseURL) } - // Save url - if blobber.BaseURL != "" { - _, err = balances.InsertTrieNode(blobber.GetUrlKey(sc.ID), &datastore.NOIDField{}) + // Save updated url + if *updateBlobberRequest.BaseURL != "" { + _, err = balances.InsertTrieNode(GetUrlKey(*updateBlobberRequest.BaseURL, sc.ID), &datastore.NOIDField{}) if err != nil { return fmt.Errorf("saving blobber url: " + err.Error()) } @@ -121,9 +153,9 @@ func (sc *StorageSmartContract) updateBlobber( } } - blobber.LastHealthCheck = t.CreationDate - blobber.Allocated = savedBlobber.Allocated - blobber.SavedData = savedBlobber.SavedData + updateBlobberRequest.LastHealthCheck = txn.CreationDate + updateBlobberRequest.Allocated = &savedBlobber.Allocated + updateBlobberRequest.SavedData = &savedBlobber.SavedData // update statistics sc.statIncr(statUpdateBlobber) @@ -132,42 +164,51 @@ func (sc *StorageSmartContract) updateBlobber( sc.statIncr(statNumberOfBlobbers) // reborn, if it was "removed" } - if err = validateStakePoolSettings(blobber.StakePoolSettings, conf); err != nil { - return fmt.Errorf("invalid new stake pool settings: %v", err) - } + if updateBlobberRequest.StakePoolSettings != nil { + if err = validateStakePoolSettingsForADtoNode(updateBlobberRequest.StakePoolSettings, conf); err != nil { + return fmt.Errorf("invalid new stake pool settings: %v", err) + } - // update stake pool settings - stakedCapacity, err := sp.stakedCapacity(blobber.Terms.WritePrice) - if err != nil { - return fmt.Errorf("error calculating staked capacity: %v", err) - } + // update stake pool settings + stakedCapacity, err := existingStakePool.stakedCapacity(terms.WritePrice) + if err != nil { + return fmt.Errorf("error calculating staked capacity: %v", err) + } - if blobber.Capacity < stakedCapacity { - return fmt.Errorf("write_price_change: staked capacity(%d) exceeding total_capacity(%d)", - stakedCapacity, blobber.Capacity) - } + if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity < stakedCapacity { + return fmt.Errorf("write_price_change: staked capacity(%d) exceeding total_capacity(%d)", + stakedCapacity, updateBlobberRequest.Capacity) + } - _, err = balances.InsertTrieNode(blobber.GetKey(), blobber) - if err != nil { - return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) - } + _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) + if err != nil { + return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) + } - sp.Settings.ServiceChargeRatio = blobber.StakePoolSettings.ServiceChargeRatio - sp.Settings.MaxNumDelegates = blobber.StakePoolSettings.MaxNumDelegates + if updateBlobberRequest.StakePoolSettings.ServiceChargeRatio != nil { + existingStakePool.Settings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio + savedBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio + } - // Save stake pool - if err = sp.Save(spenum.Blobber, blobber.ID, balances); err != nil { - return fmt.Errorf("saving stake pool: %v", err) - } - if err := emitUpdateBlobber(blobber, sp, balances); err != nil { - return fmt.Errorf("emmiting blobber %v: %v", blobber, err) + if updateBlobberRequest.StakePoolSettings.MaxNumDelegates != nil { + existingStakePool.Settings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates + savedBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates + } + + // Save stake pool + if err = existingStakePool.Save(spenum.Blobber, updateBlobberRequest.ID, balances); err != nil { + return fmt.Errorf("saving stake pool: %v", err) + } + if err := emitUpdateBlobber(updateBlobberRequest, existingStakePool, balances); err != nil { + return fmt.Errorf("emmiting blobber %v: %v", updateBlobberRequest, err) + } } return } // remove blobber (when a blobber provides capacity = 0) func (sc *StorageSmartContract) removeBlobber(t *transaction.Transaction, - blobber *StorageNode, balances cstate.StateContextI, + blobber *dto.StorageDtoNode, balances cstate.StateContextI, ) (err error) { // get saved blobber savedBlobber, err := sc.getBlobber(blobber.ID, balances) @@ -176,7 +217,8 @@ func (sc *StorageSmartContract) removeBlobber(t *transaction.Transaction, } // set to zero explicitly, for "direct" calls - blobber.Capacity = 0 + var zeroCapacity int64 = 0 + blobber.Capacity = &zeroCapacity // remove from the all list, since the blobber can't accept new allocations if savedBlobber.Capacity > 0 { @@ -251,7 +293,7 @@ func (sc *StorageSmartContract) addBlobber(t *transaction.Transaction, } // update blobber settings by owner of DelegateWallet -func (sc *StorageSmartContract) updateBlobberSettings(t *transaction.Transaction, +func (sc *StorageSmartContract) updateBlobberSettings(txn *transaction.Transaction, input []byte, balances cstate.StateContextI, ) (resp string, err error) { // get smart contract configuration @@ -261,8 +303,8 @@ func (sc *StorageSmartContract) updateBlobberSettings(t *transaction.Transaction "can't get config: "+err.Error()) } - var updatedBlobber = newBlobber("") - if err = updatedBlobber.Decode(input); err != nil { + var updatedBlobber = new(dto.StorageDtoNode) + if err = json.Unmarshal(input, updatedBlobber); err != nil { return "", common.NewError("update_blobber_settings_failed", "malformed request: "+err.Error()) } @@ -273,33 +315,56 @@ func (sc *StorageSmartContract) updateBlobberSettings(t *transaction.Transaction "can't get the blobber: "+err.Error()) } - var sp *stakePool - if sp, err = sc.getStakePool(spenum.Blobber, updatedBlobber.ID, balances); err != nil { + var existingStakePool *stakePool + if existingStakePool, err = sc.getStakePool(spenum.Blobber, updatedBlobber.ID, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", "can't get related stake pool: "+err.Error()) } - if sp.Settings.DelegateWallet == "" { + if existingStakePool.Settings.DelegateWallet == "" { return "", common.NewError("update_blobber_settings_failed", "blobber's delegate_wallet is not set") } - if t.ClientID != sp.Settings.DelegateWallet { + if txn.ClientID != existingStakePool.Settings.DelegateWallet { return "", common.NewError("update_blobber_settings_failed", "access denied, allowed for delegate_wallet owner only") } - if err = sc.updateBlobber(t, conf, updatedBlobber, blobber, sp, balances); err != nil { + if err = sc.updateBlobber(txn, conf, updatedBlobber, blobber, existingStakePool, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", err.Error()) } - blobber.Capacity = updatedBlobber.Capacity - blobber.Terms = updatedBlobber.Terms - blobber.StakePoolSettings = updatedBlobber.StakePoolSettings - blobber.NotAvailable = updatedBlobber.NotAvailable + if updatedBlobber.Capacity != nil { + blobber.Capacity = *updatedBlobber.Capacity + } + + terms := getTermsFromDtoNode(updatedBlobber) + if terms != nil { + blobber.Terms = *terms + } + + if updatedBlobber.NotAvailable != nil { + blobber.NotAvailable = *updatedBlobber.NotAvailable + } return string(blobber.Encode()), nil } +func getTermsFromDtoNode(dtoNode *dto.StorageDtoNode) *Terms { + terms := new(Terms) + if dtoNode.Terms == nil { + return terms + } + if dtoNode.Terms.WritePrice != nil { + terms.WritePrice = *dtoNode.Terms.WritePrice + } + if dtoNode.Terms.ReadPrice != nil { + terms.ReadPrice = *dtoNode.Terms.ReadPrice + } + + return terms +} + func (sc *StorageSmartContract) blobberHealthCheck(t *transaction.Transaction, _ []byte, balances cstate.StateContextI, ) (string, error) { diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go index e912bbc33a..4735f518c8 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go @@ -4,38 +4,70 @@ import ( cstate "0chain.net/chaincore/chain/state" "0chain.net/smartcontract/dbs" "0chain.net/smartcontract/dbs/event" + "0chain.net/smartcontract/dto" ) -func emitUpdateBlobber(sn *StorageNode, sp *stakePool, balances cstate.StateContextI) error { +func emitUpdateBlobber(sn *dto.StorageDtoNode, sp *stakePool, balances cstate.StateContextI) error { staked, err := sp.stake() if err != nil { return err } data := &event.Blobber{ - BaseURL: sn.BaseURL, - Latitude: sn.Geolocation.Latitude, - Longitude: sn.Geolocation.Longitude, - ReadPrice: sn.Terms.ReadPrice, - WritePrice: sn.Terms.WritePrice, - - Capacity: sn.Capacity, - Allocated: sn.Allocated, - SavedData: sn.SavedData, - NotAvailable: sn.NotAvailable, + BaseURL: getString(sn.BaseURL), + Capacity: getInt64(sn.Capacity), + Allocated: getInt64(sn.Allocated), + SavedData: getInt64(sn.SavedData), Provider: event.Provider{ ID: sn.ID, - DelegateWallet: sn.StakePoolSettings.DelegateWallet, - NumDelegates: sn.StakePoolSettings.MaxNumDelegates, - ServiceCharge: sn.StakePoolSettings.ServiceChargeRatio, + DelegateWallet: sp.Settings.DelegateWallet, + NumDelegates: sp.Settings.MaxNumDelegates, + ServiceCharge: sp.Settings.ServiceChargeRatio, LastHealthCheck: sn.LastHealthCheck, TotalStake: staked, }, OffersTotal: sp.TotalOffers, } + if sn.Geolocation != nil { + if sn.Geolocation.Latitude != nil { + data.Latitude = *sn.Geolocation.Latitude + } + if sn.Geolocation.Longitude != nil { + data.Longitude = *sn.Geolocation.Longitude + } + + } + + if sn.Terms != nil { + if sn.Terms.ReadPrice != nil { + data.ReadPrice = *sn.Terms.ReadPrice + } + if sn.Terms.WritePrice != nil { + data.WritePrice = *sn.Terms.WritePrice + } + } + + if sn.NotAvailable != nil { + data.NotAvailable = *sn.NotAvailable + } + balances.EmitEvent(event.TypeStats, event.TagUpdateBlobber, sn.ID, data) return nil } +func getString(pointerValue *string) string { + if pointerValue != nil { + return *pointerValue + } + return "" +} + +func getInt64(pointerValue *int64) int64 { + if pointerValue != nil { + return *pointerValue + } + return 0 +} + func emitAddBlobber(sn *StorageNode, sp *stakePool, balances cstate.StateContextI) error { staked, err := sp.stake() if err != nil { diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go index b070810d02..253b02710b 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go @@ -64,7 +64,7 @@ func TestStorageSmartContract_addBlobber(t *testing.T) { ab, err = ssc.getBlobber(b.ID, balances) require.NoError(t, err) - require.Equal(t, ab.BaseURL, NEW_BASE_URL) + require.Equal(t, NEW_BASE_URL, ab.BaseURL) require.Equal(t, ab.Capacity, b.Capacity) // can update URL diff --git a/code/go/0chain.net/smartcontract/storagesc/models.go b/code/go/0chain.net/smartcontract/storagesc/models.go index 7d90968767..b0a6d0283e 100644 --- a/code/go/0chain.net/smartcontract/storagesc/models.go +++ b/code/go/0chain.net/smartcontract/storagesc/models.go @@ -201,12 +201,20 @@ type ValidationNode struct { // validate the validator configurations func (sn *ValidationNode) validate(_ *Config) (err error) { - if strings.Contains(sn.BaseURL, "localhost") && + return validateBaseUrl(&sn.BaseURL) +} + +func validateBaseUrl(baseUrl *string) error { + if baseUrl != nil && strings.Contains(*baseUrl, "localhost") && node.Self.Host != "localhost" { return errors.New("invalid validator base url") } - return + return nil +} + +func GetValidatorUrlKey(globalKey, baseUrl string) datastore.Key { + return datastore.Key(globalKey + "validator:" + baseUrl) } func (sn *ValidationNode) GetKey(_ string) datastore.Key { @@ -214,7 +222,7 @@ func (sn *ValidationNode) GetKey(_ string) datastore.Key { } func (sn *ValidationNode) GetUrlKey(globalKey string) datastore.Key { - return datastore.Key(globalKey + "validator:" + sn.BaseURL) + return GetValidatorUrlKey(globalKey, sn.BaseURL) } func (sn *ValidationNode) Encode() []byte { @@ -333,6 +341,10 @@ type StorageNode struct { NotAvailable bool `json:"not_available"` } +func GetUrlKey(baseUrl, globalKey string) datastore.Key { + return datastore.Key(globalKey + baseUrl) +} + // validate the blobber configurations func (sn *StorageNode) validate(conf *Config) (err error) { if err = sn.Terms.validate(conf); err != nil { @@ -342,9 +354,8 @@ func (sn *StorageNode) validate(conf *Config) (err error) { return errors.New("insufficient blobber capacity") } - if strings.Contains(sn.BaseURL, "localhost") && - node.Self.Host != "localhost" { - return errors.New("invalid blobber base url") + if err := validateBaseUrl(&sn.BaseURL); err != nil { + return err } if err := sn.Geolocation.validate(); err != nil { @@ -359,7 +370,7 @@ func (sn *StorageNode) GetKey() datastore.Key { } func (sn *StorageNode) GetUrlKey(globalKey string) datastore.Key { - return datastore.Key(globalKey + sn.BaseURL) + return GetUrlKey(sn.BaseURL, globalKey) } func (sn *StorageNode) Encode() []byte { diff --git a/code/go/0chain.net/smartcontract/storagesc/stakepool.go b/code/go/0chain.net/smartcontract/storagesc/stakepool.go index ec26965c60..1f9016f3c7 100644 --- a/code/go/0chain.net/smartcontract/storagesc/stakepool.go +++ b/code/go/0chain.net/smartcontract/storagesc/stakepool.go @@ -1,6 +1,7 @@ package storagesc import ( + "0chain.net/smartcontract/dto" "encoding/json" "errors" "fmt" @@ -38,6 +39,24 @@ func validateStakePoolSettings( return nil } +func validateStakePoolSettingsForADtoNode(sps *dto.Settings, conf *Config) error { + if sps.ServiceChargeRatio != nil { + if *sps.ServiceChargeRatio < 0.0 { + return errors.New("negative service charge") + } + if *sps.ServiceChargeRatio > conf.MaxCharge { + return fmt.Errorf("service_charge (%f) is greater than"+ + " max allowed by SC (%f)", *sps.ServiceChargeRatio, conf.MaxCharge) + } + } + + if sps.MaxNumDelegates != nil && *sps.MaxNumDelegates <= 0 { + return errors.New("num_delegates <= 0") + } + + return nil +} + // stake pool of a blobber type stakePool struct { diff --git a/code/go/0chain.net/smartcontract/storagesc/validator.go b/code/go/0chain.net/smartcontract/storagesc/validator.go index 724b1fcf12..cc49ed38c0 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator.go @@ -1,6 +1,8 @@ package storagesc import ( + "0chain.net/smartcontract/dto" + "encoding/json" "fmt" "0chain.net/smartcontract/provider" @@ -130,7 +132,7 @@ func (_ *StorageSmartContract) getValidator( return getValidator(validatorID, balances) } -func (sc *StorageSmartContract) updateValidatorSettings(t *transaction.Transaction, input []byte, balances state.StateContextI) (string, error) { +func (sc *StorageSmartContract) updateValidatorSettings(txn *transaction.Transaction, input []byte, balances state.StateContextI) (string, error) { // get smart contract configuration conf, err := sc.getConfig(balances, true) if err != nil { @@ -138,14 +140,14 @@ func (sc *StorageSmartContract) updateValidatorSettings(t *transaction.Transacti "can't get config: "+err.Error()) } - var updatedValidator = new(ValidationNode) - if err = updatedValidator.Decode(input); err != nil { + var updatedValidator = new(dto.ValidationDtoNode) + if err = json.Unmarshal(input, updatedValidator); err != nil { return "", common.NewError("update_validator_settings_failed", "malformed request: "+err.Error()) } - var validator *ValidationNode - if validator, err = sc.getValidator(updatedValidator.ID, balances); err != nil { + var existingValidator *ValidationNode + if existingValidator, err = sc.getValidator(updatedValidator.ID, balances); err != nil { return "", common.NewError("update_validator_settings_failed", "can't get the validator: "+err.Error()) } @@ -161,23 +163,23 @@ func (sc *StorageSmartContract) updateValidatorSettings(t *transaction.Transacti "validator's delegate_wallet is not set") } - if t.ClientID != sp.Settings.DelegateWallet { + if txn.ClientID != sp.Settings.DelegateWallet { return "", common.NewError("update_validator_settings_failed", "access denied, allowed for delegate_wallet owner only") } - if err = sc.updateValidator(t, conf, updatedValidator, validator, balances); err != nil { + if err = sc.updateValidator(txn, conf, updatedValidator, existingValidator, balances); err != nil { return "", common.NewError("update_validator_settings_failed", err.Error()) } // Save validator - _, err = balances.InsertTrieNode(validator.GetKey(sc.ID), validator) + _, err = balances.InsertTrieNode(existingValidator.GetKey(sc.ID), existingValidator) if err != nil { return "", common.NewError("update_validator_settings_failed", "saving validator: "+err.Error()) } - return string(validator.Encode()), nil + return string(existingValidator.Encode()), nil } func (sc *StorageSmartContract) hasValidatorUrl(validatorURL string, @@ -196,28 +198,28 @@ func (sc *StorageSmartContract) hasValidatorUrl(validatorURL string, } // update existing validator, or reborn a deleted one -func (sc *StorageSmartContract) updateValidator(t *transaction.Transaction, - conf *Config, inputValidator *ValidationNode, savedValidator *ValidationNode, +func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, + conf *Config, inputValidator *dto.ValidationDtoNode, savedValidator *ValidationNode, balances state.StateContextI, ) (err error) { // check params - if err = inputValidator.validate(conf); err != nil { + if err = validateBaseUrl(inputValidator.BaseURL); err != nil { return fmt.Errorf("invalid validator params: %v", err) } - if savedValidator.BaseURL != inputValidator.BaseURL { + if inputValidator.BaseURL != nil && savedValidator.BaseURL != *inputValidator.BaseURL { //if updating url - has, err := sc.hasValidatorUrl(inputValidator.BaseURL, balances) + has, err := sc.hasValidatorUrl(*inputValidator.BaseURL, balances) if err != nil { - return fmt.Errorf("could not get validator of url: %s : %v", inputValidator.BaseURL, err) + return fmt.Errorf("could not get validator of url: %s : %v", *inputValidator.BaseURL, err) } if has { return fmt.Errorf("invalid validator url update, already used") } // Save url - if inputValidator.BaseURL != "" { - _, err = balances.InsertTrieNode(inputValidator.GetUrlKey(sc.ID), &datastore.NOIDField{}) + if *inputValidator.BaseURL != "" { + _, err = balances.InsertTrieNode(GetValidatorUrlKey(sc.ID, *inputValidator.BaseURL), &datastore.NOIDField{}) if err != nil { return fmt.Errorf("saving validator url: " + err.Error()) } @@ -231,33 +233,40 @@ func (sc *StorageSmartContract) updateValidator(t *transaction.Transaction, } } - savedValidator.StakePoolSettings = inputValidator.StakePoolSettings + if inputValidator.StakePoolSettings != nil { + // update statistics + sc.statIncr(statUpdateValidator) - // update statistics - sc.statIncr(statUpdateValidator) + // update stake pool settings + var existingStakePool *stakePool + if existingStakePool, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { + return fmt.Errorf("can't get stake pool: %v", err) + } - // update stake pool settings - var sp *stakePool - if sp, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { - return fmt.Errorf("can't get stake pool: %v", err) - } + if err = validateStakePoolSettingsForADtoNode(inputValidator.StakePoolSettings, conf); err != nil { + return fmt.Errorf("invalid new stake pool settings: %v", err) + } - if err = validateStakePoolSettings(inputValidator.StakePoolSettings, conf); err != nil { - return fmt.Errorf("invalid new stake pool settings: %v", err) - } + if inputValidator.StakePoolSettings.ServiceChargeRatio != nil { + existingStakePool.Settings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio + savedValidator.StakePoolSettings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio + } - sp.Settings.ServiceChargeRatio = inputValidator.StakePoolSettings.ServiceChargeRatio - sp.Settings.MaxNumDelegates = inputValidator.StakePoolSettings.MaxNumDelegates + if inputValidator.StakePoolSettings.MaxNumDelegates != nil { + existingStakePool.Settings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates + savedValidator.StakePoolSettings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates + } - // Save stake pool - if err = sp.Save(spenum.Validator, inputValidator.ID, balances); err != nil { - return fmt.Errorf("saving stake pool: %v", err) - } + // Save stake pool + if err = existingStakePool.Save(spenum.Validator, inputValidator.ID, balances); err != nil { + return fmt.Errorf("saving stake pool: %v", err) + } - inputValidator.LastHealthCheck = t.CreationDate + inputValidator.LastHealthCheck = &txn.CreationDate - if err := inputValidator.emitUpdate(sp, balances); err != nil { - return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) + if err := emitUpdateValidationNode(inputValidator, existingStakePool, balances); err != nil { + return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) + } } return diff --git a/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go b/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go index afa8834387..c052c327c2 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go @@ -2,6 +2,7 @@ package storagesc import ( "0chain.net/smartcontract/dbs" + "0chain.net/smartcontract/dto" "0chain.net/smartcontract/provider" "0chain.net/smartcontract/stakepool" "0chain.net/smartcontract/stakepool/spenum" @@ -40,8 +41,9 @@ func getValidators(validatorIDs []string, edb *event.EventDb) ([]*ValidationNode return vNodes, nil } -func (vn *ValidationNode) emitUpdate(sp *stakePool, balances cstate.StateContextI) error { - staked, err := sp.stake() +func emitUpdateValidationNode(validationNode *dto.ValidationDtoNode, + existingStakePool *stakePool, balances cstate.StateContextI) error { + staked, err := existingStakePool.stake() if err != nil { return err } @@ -49,18 +51,33 @@ func (vn *ValidationNode) emitUpdate(sp *stakePool, balances cstate.StateContext logging.Logger.Info("emitting validator update event") data := &event.Validator{ - BaseUrl: vn.BaseURL, Provider: event.Provider{ - ID: vn.ID, - TotalStake: staked, - DelegateWallet: vn.StakePoolSettings.DelegateWallet, - NumDelegates: vn.StakePoolSettings.MaxNumDelegates, - ServiceCharge: vn.StakePoolSettings.ServiceChargeRatio, - LastHealthCheck: vn.LastHealthCheck, + ID: validationNode.ID, + TotalStake: staked, }, } - balances.EmitEvent(event.TypeStats, event.TagUpdateValidator, vn.ID, data) + if validationNode.BaseURL != nil { + data.BaseUrl = *validationNode.BaseURL + } + + if validationNode.StakePoolSettings != nil { + if validationNode.StakePoolSettings.DelegateWallet != nil { + data.DelegateWallet = *validationNode.StakePoolSettings.DelegateWallet + } + if validationNode.StakePoolSettings.ServiceChargeRatio != nil { + data.ServiceCharge = *validationNode.StakePoolSettings.ServiceChargeRatio + } + if validationNode.StakePoolSettings.MaxNumDelegates != nil { + data.NumDelegates = *validationNode.StakePoolSettings.MaxNumDelegates + } + } + + if validationNode.LastHealthCheck != nil { + data.LastHealthCheck = *validationNode.LastHealthCheck + } + + balances.EmitEvent(event.TypeStats, event.TagUpdateValidator, validationNode.ID, data) return nil } From 27635c6b0e81bd0ac80e09d15c335a42726882ff Mon Sep 17 00:00:00 2001 From: Laxmi Prasad Oli Date: Sat, 24 Jun 2023 19:36:27 +0545 Subject: [PATCH 04/28] Remove repeated validation of transaction --- code/go/0chain.net/chaincore/transaction/handler.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/code/go/0chain.net/chaincore/transaction/handler.go b/code/go/0chain.net/chaincore/transaction/handler.go index dd2f4961e2..bf4e03f519 100644 --- a/code/go/0chain.net/chaincore/transaction/handler.go +++ b/code/go/0chain.net/chaincore/transaction/handler.go @@ -29,12 +29,6 @@ func PutTransaction(ctx context.Context, entity datastore.Entity) (interface{}, return nil, fmt.Errorf("invalid request %T", entity) } - err := txn.Validate(ctx) - if err != nil { - logging.Logger.Error("put transaction error", zap.String("txn", txn.Hash), zap.Error(err)) - return nil, err - } - if txn.DebugTxn() { logging.Logger.Info("put transaction", zap.Any("txn", txn)) } else { @@ -46,7 +40,7 @@ func PutTransaction(ctx context.Context, entity datastore.Entity) (interface{}, return txn, nil } - err = entity.GetEntityMetadata().GetStore().Write(ctx, txn) + err := entity.GetEntityMetadata().GetStore().Write(ctx, txn) if err != nil { logging.Logger.Error("put transaction", zap.Error(err), zap.String("txn", txn.Hash), zap.String("txn_obj", datastore.ToJSON(txn).String())) return nil, err From 45b27edec3b53cc3dba9c94a15ab425624997610 Mon Sep 17 00:00:00 2001 From: peterlimg Date: Sun, 2 Jul 2023 19:34:34 +1000 Subject: [PATCH 05/28] Check max token overflow on block execution --- code/go/0chain.net/chaincore/chain/state.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/go/0chain.net/chaincore/chain/state.go b/code/go/0chain.net/chaincore/chain/state.go index a4576e9cee..45f4e0a777 100644 --- a/code/go/0chain.net/chaincore/chain/state.go +++ b/code/go/0chain.net/chaincore/chain/state.go @@ -8,6 +8,7 @@ import ( "math" "time" + "0chain.net/chaincore/config" "github.com/0chain/common/core/currency" "0chain.net/chaincore/node" @@ -383,6 +384,10 @@ func (c *Chain) updateState(ctx context.Context, b *block.Block, bState util.Mer err, b.Hash, util.ToHex(b.ClientStateHash), util.ToHex(bState.GetRoot()), b.Round) } + if txn.Value > config.MaxTokenSupply { + return nil, errors.New("invalid transaction value, exceeds max token supply") + } + var ( clientState = CreateTxnMPT(bState) // begin transaction sctx = c.NewStateContext(b, clientState, txn, nil) From 04ca6d62a9295c5b0b9fa09aaddc19f8338a9703 Mon Sep 17 00:00:00 2001 From: shahnawaz-creator <117025384+shahnawaz-creator@users.noreply.github.com> Date: Mon, 3 Jul 2023 18:56:12 +0530 Subject: [PATCH 06/28] fix folder creation issue config-change-0helm-pr.yaml --- .github/workflows/config-change-0helm-pr.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/config-change-0helm-pr.yaml b/.github/workflows/config-change-0helm-pr.yaml index 5e784cda50..e80cf45c84 100644 --- a/.github/workflows/config-change-0helm-pr.yaml +++ b/.github/workflows/config-change-0helm-pr.yaml @@ -40,6 +40,7 @@ jobs: - name: "Copy 0chain.yaml and sc.yaml in 0helm one-pool-staging-test branch" if: ${{ contains(steps.changed-files.outputs.modified_files, 'docker.local/config/0chain.yaml') || contains(steps.changed-files.outputs.modified_files, 'docker.local/config/sc.yaml') }} run: | + mkdir -p 0helm/updated_configs touch 0helm/updated_configs/0chain.yaml touch 0helm/updated_configs/sc.yaml cp docker.local/config/0chain.yaml 0helm/updated_configs/0chain.yaml @@ -71,4 +72,4 @@ jobs: -d '{"ref": "staging"}' - \ No newline at end of file + From 3d708c0fcb65e6e0bec251e2c65cfe862038ca18 Mon Sep 17 00:00:00 2001 From: shahnawaz-creator <117025384+shahnawaz-creator@users.noreply.github.com> Date: Tue, 4 Jul 2023 11:11:17 +0530 Subject: [PATCH 07/28] updated docker-compose deployment (#2583) Co-authored-by: root --- docker.local/bin/start.p0sharder.sh | 5 +- docker.local/build.miner/p0docker-compose.yml | 41 +- .../build.sharder/p0docker-compose.yml | 49 +- docker.local/config/postgresql.conf | 696 ++++++++++++++++++ 4 files changed, 758 insertions(+), 33 deletions(-) create mode 100644 docker.local/config/postgresql.conf diff --git a/docker.local/bin/start.p0sharder.sh b/docker.local/bin/start.p0sharder.sh index 9a8668e9be..66f65ac286 100755 --- a/docker.local/bin/start.p0sharder.sh +++ b/docker.local/bin/start.p0sharder.sh @@ -5,6 +5,9 @@ PWD=$(pwd) SHARDER_DIR=$(basename "$PWD") SHARDER_ID=$(echo "$SHARDER_DIR" | sed -e 's/.*\(.\)$/\1/') +SSD_PATH="${1:-..}" +HDD_PATH="${2:-..}" + echo Starting sharder"$SHARDER_ID" in daemon mode ... -SHARDER=$SHARDER_ID docker-compose -p sharder"$SHARDER_ID" -f ../build.sharder/p0docker-compose.yml up -d +SHARDER=$SHARDER_ID SSD_PATH=$PROJECT_ROOT_SSD HDD_PATH=$PROJECT_ROOT_HDD docker-compose -p sharder"$SHARDER_ID" -f ../build.sharder/p0docker-compose.yml up -d diff --git a/docker.local/build.miner/p0docker-compose.yml b/docker.local/build.miner/p0docker-compose.yml index 813a91a0c5..9eee25c3d7 100644 --- a/docker.local/build.miner/p0docker-compose.yml +++ b/docker.local/build.miner/p0docker-compose.yml @@ -1,33 +1,44 @@ version: '3' services: redis: + container_name: miner-redis-${MINER} image: "redis:alpine" volumes: - ../config:/0chain/config - - ../miner${MINER}/data:/0chain/data - networks: - default: + - ${PROJECT_ROOT_SSD}/miner${MINER}/data:/0chain/data + # ports: + # - "637${MINER}:6379" sysctls: net.core.somaxconn: '511' command: redis-server /0chain/config/redis/state.redis.conf + restart: always + networks: + testnet0: + ipv4_address: 198.18.5.${MINER} redis_txns: + container_name: miner-redis-txns-${MINER} image: "redis:alpine" volumes: - ../config:/0chain/config - - ../miner${MINER}/data:/0chain/data - networks: - default: + - ${PROJECT_ROOT_SSD}/miner${MINER}/data:/0chain/data sysctls: net.core.somaxconn: '511' + # ports: + # - "638${MINER}:6379" command: redis-server /0chain/config/redis/transactions.redis.conf + restart: always + networks: + testnet0: + ipv4_address: 198.18.4.${MINER} miner: - image: 0chaindev/miner:latest + container_name: miner-${MINER} + image: 0chaindev/miner:staging environment: - DOCKER=true - - REDIS_HOST=redis - - REDIS_TXNS=redis_txns + - REDIS_HOST=miner-redis-${MINER} + - REDIS_TXNS=miner-redis-txns-${MINER} depends_on: - redis - redis_txns @@ -36,19 +47,17 @@ services: - redis_txns:redis_txns volumes: - ../config:/0chain/config - - ../miner${MINER}/data:/0chain/data - - ../miner${MINER}/log:/0chain/log + - ${PROJECT_ROOT_SSD}/miner${MINER}/data:/0chain/data + - ${PROJECT_ROOT_SSD}/miner${MINER}/log:/0chain/log ports: - "707${MINER}:707${MINER}" + command: ./bin/miner --deployment_mode 0 --keys_file config/b0mnode${MINER}_keys.txt --dkg_file config/b0mnode${MINER}_dkg.json + restart: always networks: - default: testnet0: - ipv4_address: 198.18.0.7${MINER} - command: ./bin/miner --deployment_mode 0 --keys_file config/b0mnode${MINER}_keys.txt --dkg_file config/b0mnode${MINER}_dkg.json + ipv4_address: 198.18.3.${MINER} networks: - default: - driver: bridge testnet0: external: true diff --git a/docker.local/build.sharder/p0docker-compose.yml b/docker.local/build.sharder/p0docker-compose.yml index 981df3e84a..b44a5ef535 100644 --- a/docker.local/build.sharder/p0docker-compose.yml +++ b/docker.local/build.sharder/p0docker-compose.yml @@ -1,32 +1,49 @@ version: '3' services: + postgres: + container_name: sharder-postgres-${SHARDER} + image: postgres:14 + environment: + POSTGRES_PORT: 5432 + POSTGRES_HOST: postgres + POSTGRES_USER: postgres + POSTGRES_HOST_AUTH_METHOD: trust + # ports: + # - 5432 + volumes: + - ../config/postgresql.conf:/etc/postgresql/postgresql.conf + - ${PROJECT_ROOT_SSD}/sharder${SHARDER}/data/postgresql:/var/lib/postgresql/data + - ../sql_script/:/docker-entrypoint-initdb.d/ + command: postgres -c config_file=/etc/postgresql/postgresql.conf + restart: always + networks: + testnet0: + ipv4_address: 198.18.2.${SHARDER} + sharder: - image: 0chaindev/sharder:latest - # deploy: - # resources: - # limits: - # cpus: '0.5' - # memory: 500M - # reservations: - # cpus: '0.1' - # memory: 100M + container_name: sharder-${SHARDER} + image: 0chaindev/sharder:staging environment: + - POSTGRES_HOST=sharder-postgres-${SHARDER} - DOCKER=true + depends_on: + - postgres volumes: - ../config:/0chain/config - - ../sharder${SHARDER}/log:/0chain/log - - ../sharder${SHARDER}/data:/0chain/data + - ${PROJECT_ROOT_HDD}/sharder${SHARDER}/log:/0chain/log + - ${PROJECT_ROOT_HDD}/sharder${SHARDER}/data:/0chain/data ports: - "717${SHARDER}:717${SHARDER}" + command: + - /bin/sh + - -c + - mkdir -p /0chain/data/blocks && mkdir -p /0chain/data/rocksdb && ./bin/sharder --deployment_mode 0 --keys_file config/b0snode${SHARDER}_keys.txt + restart: always networks: - default: testnet0: - ipv4_address: 198.18.0.8${SHARDER} - command: ./bin/sharder --deployment_mode 0 --keys_file config/b0snode${SHARDER}_keys.txt + ipv4_address: 198.18.1.${SHARDER} networks: - default: - driver: bridge testnet0: external: true diff --git a/docker.local/config/postgresql.conf b/docker.local/config/postgresql.conf new file mode 100644 index 0000000000..68fe38ec64 --- /dev/null +++ b/docker.local/config/postgresql.conf @@ -0,0 +1,696 @@ +# ----------------------------- +# PostgreSQL configuration file for 1024M RAM +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The "=" is optional.) Whitespace may be used. Comments are introduced with +# "#" anywhere on a line. The complete list of parameter names and allowed +# values can be found in the PostgreSQL documentation. +# +# The commented-out settings shown in this file represent the default values. +# Re-commenting a setting is NOT sufficient to revert it to the default value; +# you need to reload the server. +# +# This file is read on server startup and when the server receives a SIGHUP +# signal. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, run "pg_ctl reload", or execute +# "SELECT pg_reload_conf()". Some parameters, which are marked below, +# require a server shutdown and restart to take effect. +# +# Any parameter can also be given as a command-line option to the server, e.g., +# "postgres -c log_connections=on". Some parameters can be changed at run time +# with the "SET" SQL command. +# +# Memory units: kB = kilobytes Time units: ms = milliseconds +# MB = megabytes s = seconds +# GB = gigabytes min = minutes +# TB = terabytes h = hours +# d = days + + +#------------------------------------------------------------------------------ +# FILE LOCATIONS +#------------------------------------------------------------------------------ + +# The default values of these variables are driven from the -D command-line +# option or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '' # write an extra PID file + # (change requires restart) + + +#------------------------------------------------------------------------------ +# CONNECTIONS AND AUTHENTICATION +#------------------------------------------------------------------------------ + +# - Connection Settings - + +listen_addresses = '*' + # comma-separated list of addresses; + # defaults to 'localhost'; use '*' for all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 1000 # (change requires restart) +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories + # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # begin with 0 to use octal notation + # (change requires restart) +#bonjour = off # advertise server via Bonjour + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - TCP Keepalives - +# see "man 7 tcp" for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default + +# - Authentication - + +#authentication_timeout = 1min # 1s-600s +#password_encryption = md5 # md5 or scram-sha-256 +#db_user_namespace = off + +# GSSAPI using Kerberos +#krb_server_keyfile = '' +#krb_caseins_users = off + +# - SSL - + +#ssl = off +#ssl_ca_file = '' +#ssl_cert_file = 'server.crt' +#ssl_crl_file = '' +#ssl_key_file = 'server.key' +#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers +#ssl_prefer_server_ciphers = on +#ssl_ecdh_curve = 'prime256v1' +#ssl_dh_params_file = '' +#ssl_passphrase_command = '' +#ssl_passphrase_command_supports_reload = off + + +#------------------------------------------------------------------------------ +# RESOURCE USAGE (except WAL) +#------------------------------------------------------------------------------ +# max_connections * work_mem + shared_buffers + temp_buffers + maintenance_work_mem + os requires mem < RAM +# - Memory - + +#1/4 RAM +shared_buffers = 250MB # min 128kB 1/4 RAM + # (change requires restart) +#huge_pages = try # on, off, or try + # (change requires restart) +#temp_buffers = 8MB # min 800kB +#max_prepared_transactions = 0 # zero disables the feature + # (change requires restart) +# Caution: it is not advisable to set max_prepared_transactions nonzero unless +# you actively intend to use prepared transactions. +work_mem = 2MB # min 64kB +maintenance_work_mem = 2MB # min 1MB +autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem +#max_stack_depth = 2MB # min 100kB +dynamic_shared_memory_type = posix # the default is the first option + # supported by the operating system: + # posix + # sysv + # windows + # mmap + # use none to disable dynamic shared memory + # (change requires restart) + +# - Disk - + +#temp_file_limit = -1 # limits per-process temp file space + # in kB, or -1 for no limit + +# - Kernel Resources - + +#max_files_per_process = 1000 # min 25 + # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-100 milliseconds +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 10 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 1-10000 credits + +# - Background Writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables +#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round +#bgwriter_flush_after = 512kB # measured in pages, 0 disables + +# - Asynchronous Behavior - + +#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching +#max_worker_processes = 8 # (change requires restart) +#max_parallel_maintenance_workers = 2 # taken from max_parallel_workers +#max_parallel_workers_per_gather = 2 # taken from max_parallel_workers +#parallel_leader_participation = on +#max_parallel_workers = 8 # maximum number of max_worker_processes that + # can be used in parallel operations +#old_snapshot_threshold = -1 # 1min-60d; -1 disables; 0 is immediate + # (change requires restart) +#backend_flush_after = 0 # measured in pages, 0 disables + + +#------------------------------------------------------------------------------ +# WRITE-AHEAD LOG +#------------------------------------------------------------------------------ + +# - Settings - + +#wal_level = replica # minimal, replica, or logical + # (change requires restart) +fsync = off # flush data to disk for crash safety + # (turning this off can cause + # unrecoverable data corruption) +#synchronous_commit = on # synchronization level; + # off, local, remote_write, remote_apply, or on +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync (default on Linux and FreeBSD) + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_compression = off # enable compression of full-page writes +#wal_log_hints = off # also do full page writes of non-critical updates + # (change requires restart) +#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers + # (change requires restart) +#wal_writer_delay = 200ms # 1-10000 milliseconds +#wal_writer_flush_after = 1MB # measured in pages, 0 disables + +commit_delay = 500 # range 0-100000, in microseconds +commit_siblings = 10 # range 1-1000 + +# - Checkpoints - + +#checkpoint_timeout = 5min # range 30s-1d +max_wal_size = 4GB +min_wal_size = 2GB +#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 +#checkpoint_flush_after = 256kB # measured in pages, 0 disables +#checkpoint_warning = 30s # 0 disables + +# - Archiving - + +#archive_mode = off # enables archiving; off, on, or always + # (change requires restart) +#archive_command = '' # command to use to archive a logfile segment + # placeholders: %p = path of file to archive + # %f = file name only + # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' +#archive_timeout = 0 # force a logfile segment switch after this + # number of seconds; 0 disables + + +#------------------------------------------------------------------------------ +# REPLICATION +#------------------------------------------------------------------------------ + +# - Sending Servers - + +# Set these on the master and on any standby that will send replication data. + +#max_wal_senders = 10 # max number of walsender processes + # (change requires restart) +#wal_keep_segments = 0 # in logfile segments; 0 disables +#wal_sender_timeout = 60s # in milliseconds; 0 disables + +#max_replication_slots = 10 # max number of replication slots + # (change requires restart) +#track_commit_timestamp = off # collect timestamp of transaction commit + # (change requires restart) + +# - Master Server - + +# These settings are ignored on a standby server. + +#synchronous_standby_names = '' # standby servers that provide sync rep + # method to choose sync standbys, number of sync standbys, + # and comma-separated list of application_name + # from standby(s); '*' = all +#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed + +# - Standby Servers - + +# These settings are ignored on a master server. + +#hot_standby = on # "off" disallows queries during recovery + # (change requires restart) +#max_standby_archive_delay = 30s # max delay before canceling queries + # when reading WAL from archive; + # -1 allows indefinite delay +#max_standby_streaming_delay = 30s # max delay before canceling queries + # when reading streaming WAL; + # -1 allows indefinite delay +#wal_receiver_status_interval = 10s # send replies at least this often + # 0 disables +#hot_standby_feedback = off # send info from standby to prevent + # query conflicts +#wal_receiver_timeout = 60s # time that receiver waits for + # communication from master + # in milliseconds; 0 disables +#wal_retrieve_retry_interval = 5s # time to wait before retrying to + # retrieve WAL after a failed attempt + +# - Subscribers - + +# These settings are ignored on a publisher. + +#max_logical_replication_workers = 4 # taken from max_worker_processes + # (change requires restart) +#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers + + +#------------------------------------------------------------------------------ +# QUERY TUNING +#------------------------------------------------------------------------------ + +# - Planner Method Configuration - + +#enable_bitmapscan = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_indexscan = on +#enable_indexonlyscan = on +#enable_material = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_parallel_append = on +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on +#enable_partitionwise_join = off +#enable_partitionwise_aggregate = off +#enable_parallel_hash = on +#enable_partition_pruning = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +#parallel_tuple_cost = 0.1 # same scale as above +#parallel_setup_cost = 1000.0 # same scale as above + +#jit_above_cost = 100000 # perform JIT compilation if available + # and query more expensive than this; + # -1 disables +#jit_inline_above_cost = 500000 # inline small functions if query is + # more expensive than this; -1 disables +#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if + # query is more expensive than this; + # -1 disables + +#min_parallel_table_scan_size = 8MB +#min_parallel_index_scan_size = 512kB +effective_cache_size = 50MB + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 +#geqo_seed = 0.0 # range 0.0-1.0 + +# - Other Planner Options - + +#default_statistics_target = 100 # range 1-10000 +#constraint_exclusion = partition # on, off, or partition +#cursor_tuple_fraction = 0.1 # range 0.0-1.0 +#from_collapse_limit = 8 +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOIN clauses +#force_parallel_mode = off +#jit = off # allow JIT compilation + + +#------------------------------------------------------------------------------ +# REPORTING AND LOGGING +#------------------------------------------------------------------------------ + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, csvlog, syslog, and eventlog, + # depending on platform. csvlog + # requires logging_collector to be on. + +# This is used when logging to stderr: +#logging_collector = off # Enable capturing of stderr and csvlog + # into log files. Required to be on for + # csvlogs. + # (change requires restart) + +# These are only used if logging_collector is on: +#log_directory = 'log' # directory where log files are written, + # can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, + # can include strftime() escapes +#log_file_mode = 0600 # creation mode for log files, + # begin with 0 to use octal notation +#log_truncate_on_rotation = off # If on, an existing log file with the + # same name as the new log file will be + # truncated rather than appended to. + # But such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. +#log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 disables. +#log_rotation_size = 10MB # Automatic rotation of logfiles will + # happen after that much log output. + # 0 disables. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' +#syslog_sequence_numbers = on +#syslog_split_messages = on + +# This is only relevant when logging to eventlog (win32): +# (change requires restart) +#event_source = 'PostgreSQL' + +# - When to Log - + +#log_min_messages = warning # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_min_error_statement = error # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations, > 0 logs only + # statements running at least this number + # of milliseconds + + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = on +#log_checkpoints = off +#log_connections = off +#log_disconnections = off +#log_duration = off +#log_error_verbosity = default # terse, default, or verbose messages +#log_hostname = off +#log_line_prefix = '%m [%p] ' # special values: + # %a = application name + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %p = process ID + # %t = timestamp without milliseconds + # %m = timestamp with milliseconds + # %n = timestamp with milliseconds (as a Unix epoch) + # %i = command tag + # %e = SQL state + # %c = session ID + # %l = session line number + # %s = session start timestamp + # %v = virtual transaction ID + # %x = transaction ID (0 if none) + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_lock_waits = off # log lock waits >= deadlock_timeout +#log_statement = 'none' # none, ddl, mod, all +#log_replication_commands = off +#log_temp_files = -1 # log temporary files equal or larger + # than the specified size in kilobytes; + # -1 disables, 0 logs all temp files +log_timezone = 'Etc/UTC' + +#------------------------------------------------------------------------------ +# PROCESS TITLE +#------------------------------------------------------------------------------ + +#cluster_name = '' # added to process titles if nonempty + # (change requires restart) +#update_process_title = on + + +#------------------------------------------------------------------------------ +# STATISTICS +#------------------------------------------------------------------------------ + +# - Query and Index Statistics Collector - + +#track_activities = on +#track_counts = on +#track_io_timing = off +#track_functions = none # none, pl, all +#track_activity_query_size = 1024 # (change requires restart) +#stats_temp_directory = 'pg_stat_tmp' + + +# - Monitoring - + +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off +#log_statement_stats = off + + +#------------------------------------------------------------------------------ +# AUTOVACUUM +#------------------------------------------------------------------------------ + +#autovacuum = on # Enable autovacuum subprocess? 'on' + # requires track_counts to also be on. +#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and + # their durations, > 0 logs only + # actions running at least this number + # of milliseconds. +#autovacuum_max_workers = 3 # max number of autovacuum subprocesses + # (change requires restart) +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 50 # min number of row updates before + # vacuum +#autovacuum_analyze_threshold = 50 # min number of row updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age + # before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for + # autovacuum, in milliseconds; + # -1 means use vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#------------------------------------------------------------------------------ +# CLIENT CONNECTION DEFAULTS +#------------------------------------------------------------------------------ + +# - Statement Behavior - + +#client_min_messages = notice # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error +#search_path = '"$user", public' # schema names +#row_security = on +#default_tablespace = '' # a tablespace name, '' uses the default +#temp_tablespaces = '' # a list of tablespace names, '' uses + # only default tablespace +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#default_transaction_deferrable = off +#session_replication_role = 'origin' +#statement_timeout = 0 # in milliseconds, 0 is disabled +#lock_timeout = 0 # in milliseconds, 0 is disabled +#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled +#vacuum_freeze_min_age = 50000000 +#vacuum_freeze_table_age = 150000000 +#vacuum_multixact_freeze_min_age = 5000000 +#vacuum_multixact_freeze_table_age = 150000000 +#vacuum_cleanup_index_scale_factor = 0.1 # fraction of total number of tuples + # before index cleanup, 0 always performs + # index cleanup +#bytea_output = 'hex' # hex, escape +#xmlbinary = 'base64' +#xmloption = 'content' +#gin_fuzzy_search_limit = 0 +#gin_pending_list_limit = 4MB + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +#intervalstyle = 'postgres' +timezone = 'Etc/UTC' +#timezone_abbreviations = 'Default' # Select the set of available time zone + # abbreviations. Currently, there are + # Default + # Australia (historical usage) + # India + # You can create your own file in + # share/timezonesets/. +#extra_float_digits = 0 # min -15, max 3 +#client_encoding = sql_ascii # actually, defaults to database + # encoding + +# These settings are initialized by initdb, but they can be changed. +lc_messages = 'en_US.utf8' # locale for system error message + # strings +lc_monetary = 'en_US.utf8' # locale for monetary formatting +lc_numeric = 'en_US.utf8' # locale for number formatting +lc_time = 'en_US.utf8' # locale for time formatting + +# default configuration for text search +default_text_search_config = 'pg_catalog.english' + +# - Shared Library Preloading - + +shared_preload_libraries = 'pg_stat_statements' # (change requires restart) +pg_stat_statements.max = 10000 +pg_stat_statements.track = all +#local_preload_libraries = '' +#session_preload_libraries = '' +#jit_provider = 'llvmjit' # JIT library to use + +# - Other Defaults - + +#dynamic_library_path = '$libdir' +#extension_destdir = '' # prepend path when loading extensions + # and shared objects (added by Debian) + + +#------------------------------------------------------------------------------ +# LOCK MANAGEMENT +#------------------------------------------------------------------------------ + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_relation = -2 # negative values mean + # (max_pred_locks_per_transaction + # / -max_pred_locks_per_relation) - 1 +#max_pred_locks_per_page = 2 # min 0 + + +#------------------------------------------------------------------------------ +# VERSION AND PLATFORM COMPATIBILITY +#------------------------------------------------------------------------------ + +# - Previous PostgreSQL Versions - + +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#default_with_oids = off +#escape_string_warning = on +#lo_compat_privileges = off +#operator_precedence_warning = off +#quote_all_identifiers = off +#standard_conforming_strings = on +#synchronize_seqscans = on + +# - Other Platforms and Clients - + +#transform_null_equals = off + + +#------------------------------------------------------------------------------ +# ERROR HANDLING +#------------------------------------------------------------------------------ + +#exit_on_error = off # terminate session on any error? +#restart_after_crash = on # reinitialize after backend crash? +#data_sync_retry = off # retry or panic on failure to fsync + # data? + # (change requires restart) + + +#------------------------------------------------------------------------------ +# CONFIG FILE INCLUDES +#------------------------------------------------------------------------------ + +# These options allow settings to be loaded from files other than the +# default postgresql.conf. Note that these are directives, not variable +# assignments, so they can usefully be given more than once. + +#include_dir = '...' # include files ending in '.conf' from + # a directory, e.g., 'conf.d' +#include_if_exists = '...' # include file only if it exists +#include = '...' # include file + + +#------------------------------------------------------------------------------ +# CUSTOMIZED OPTIONS +#------------------------------------------------------------------------------ + +# Add settings for extensions here \ No newline at end of file From 461ff994b8504df339521b378035c639782a4275 Mon Sep 17 00:00:00 2001 From: devyetii Date: Sat, 1 Jul 2023 19:49:28 +0200 Subject: [PATCH 08/28] remove from docker-compose --- docker.local/build.sharder/docker-compose.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/docker.local/build.sharder/docker-compose.yml b/docker.local/build.sharder/docker-compose.yml index 851f06f273..e3a5e58db6 100644 --- a/docker.local/build.sharder/docker-compose.yml +++ b/docker.local/build.sharder/docker-compose.yml @@ -12,19 +12,6 @@ services: - ../sql_script/:/docker-entrypoint-initdb.d/ networks: default: - postgres-post: - image: postgres:14 - environment: - POSTGRES_PORT: 5432 - POSTGRES_HOST: postgres - POSTGRES_USER: postgres - POSTGRES_HOST_AUTH_METHOD: trust - volumes: - - ../bin:/0chain/bin - - ../sql:/0chain/sql - - ../sql_script/:/docker-entrypoint-initdb.d/ - links: - - postgres:postgres sharder: image: "sharder" From fef8fa2c6ce7161137826d8555e6d26009dbb437 Mon Sep 17 00:00:00 2001 From: Jayash Date: Tue, 4 Jul 2023 03:41:13 +0530 Subject: [PATCH 09/28] Rebase on sprint-july-1 --- code/go/0chain.net/smartcontract/storagesc/blobber.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 1407c95cb1..8d8b5f7ddd 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -175,8 +175,8 @@ func (sc *StorageSmartContract) updateBlobber( return fmt.Errorf("error calculating staked capacity: %v", err) } - if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity < stakedCapacity { - return fmt.Errorf("write_price_change: staked capacity(%d) exceeding total_capacity(%d)", + if updateBlobberRequest.SavedData != nil && *updateBlobberRequest.SavedData < stakedCapacity { + return fmt.Errorf("write_price_change: staked capacity(%d) exceeding used_capacity(%d)", stakedCapacity, updateBlobberRequest.Capacity) } From d5dfaf65861da5223a83e58a1f5a622a66b16d80 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Thu, 6 Jul 2023 22:48:09 +0530 Subject: [PATCH 10/28] Rebase --- code/go/0chain.net/smartcontract/storagesc/blobber.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 8d8b5f7ddd..8bc027e129 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -176,8 +176,8 @@ func (sc *StorageSmartContract) updateBlobber( } if updateBlobberRequest.SavedData != nil && *updateBlobberRequest.SavedData < stakedCapacity { - return fmt.Errorf("write_price_change: staked capacity(%d) exceeding used_capacity(%d)", - stakedCapacity, updateBlobberRequest.Capacity) + return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than used capacity (%d)", + stakedCapacity, *updateBlobberRequest.SavedData) } _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) From 62ae73f09e45203f912b619dcc5fab0d646a6030 Mon Sep 17 00:00:00 2001 From: Piers Shepperson Date: Thu, 6 Jul 2023 13:44:33 +0100 Subject: [PATCH 11/28] "min_lock_demand" (#2593) --- .../smartcontract/dbs/event/allocation_blobber_term.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dbs/event/allocation_blobber_term.go b/code/go/0chain.net/smartcontract/dbs/event/allocation_blobber_term.go index b00ee09a8a..8044ec4ff3 100644 --- a/code/go/0chain.net/smartcontract/dbs/event/allocation_blobber_term.go +++ b/code/go/0chain.net/smartcontract/dbs/event/allocation_blobber_term.go @@ -101,8 +101,7 @@ func (edb *EventDb) updateAllocationBlobberTerms(terms []AllocationBlobberTerm) } func (edb *EventDb) addOrOverwriteAllocationBlobberTerms(terms []AllocationBlobberTerm) error { - updateFields := []string{"read_price", "write_price", "min_lock_demand", - "max_offer_duration"} + updateFields := []string{"read_price", "write_price", "max_offer_duration"} return edb.Store.Get().Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "allocation_id"}, {Name: "blobber_id"}}, From 8503d7b5d67b690e2e0ba8aade2dca4c37e204a7 Mon Sep 17 00:00:00 2001 From: Jayash Date: Sun, 2 Jul 2023 01:17:15 +0530 Subject: [PATCH 12/28] Fix block rewards endpoint --- .../0chain.net/smartcontract/dbs/event/reward_provider_dev.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go index 31c425c0ff..b8cc15168d 100644 --- a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go +++ b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go @@ -171,7 +171,7 @@ func (edb *EventDb) GetBlockRewards(startBlock, endBlock string) ([]int64, error var blockRewards []BlockReward - err := edb.Get().Table("reward_providers").Select("provider_id, sum(amount) as amount").Where("block_number >= ? AND block_number <= ?", startBlock, endBlock).Group("provider_id").Scan(&blockRewards).Error + err := edb.Get().Table("reward_providers").Select("provider_id, sum(amount) as amount").Where("reward_type = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, startBlock, endBlock).Group("provider_id").Scan(&blockRewards).Error if err != nil { return nil, err } @@ -183,7 +183,7 @@ func (edb *EventDb) GetBlockRewards(startBlock, endBlock string) ([]int64, error for _, br := range blockRewards { var delegateRewards BlockReward - err = edb.Get().Table("reward_delegates").Select("provider_id, sum(amount) as amount").Where("block_number >= ? AND block_number <= ?", startBlock, endBlock).Group("provider_id").Scan(&delegateRewards).Error + err = edb.Get().Table("reward_delegates").Select("provider_id, sum(amount) as amount").Where("reward_type = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, startBlock, endBlock).Group("provider_id").Scan(&delegateRewards).Error if err != nil { return nil, err } From 8d411645d824eca6752e815cf26b08553141043c Mon Sep 17 00:00:00 2001 From: Jayash Date: Sun, 2 Jul 2023 01:59:26 +0530 Subject: [PATCH 13/28] Debug --- code/go/0chain.net/smartcontract/storagesc/allocation.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/go/0chain.net/smartcontract/storagesc/allocation.go b/code/go/0chain.net/smartcontract/storagesc/allocation.go index 69ac7fa125..266561af14 100755 --- a/code/go/0chain.net/smartcontract/storagesc/allocation.go +++ b/code/go/0chain.net/smartcontract/storagesc/allocation.go @@ -1516,6 +1516,10 @@ func (sc *StorageSmartContract) finalizeAllocation( return "", common.NewError("fini_alloc_failed", "can't get stake pool of "+d.BlobberID+": "+err.Error()) } + if err := sp.reduceOffer(d.Offer()); err != nil { + return "", common.NewError("fini_alloc_failed", + "error removing offer: "+err.Error()) + } sps = append(sps, sp) } From 83fc44816c44ddffb43ec9fda19ff908843160aa Mon Sep 17 00:00:00 2001 From: Jayash Date: Sun, 2 Jul 2023 10:30:31 +0530 Subject: [PATCH 14/28] Fix --- .../smartcontract/dbs/event/reward_provider_dev.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go index b8cc15168d..b84b6e83fd 100644 --- a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go +++ b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go @@ -182,15 +182,16 @@ func (edb *EventDb) GetBlockRewards(startBlock, endBlock string) ([]int64, error for _, br := range blockRewards { - var delegateRewards BlockReward - err = edb.Get().Table("reward_delegates").Select("provider_id, sum(amount) as amount").Where("reward_type = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, startBlock, endBlock).Group("provider_id").Scan(&delegateRewards).Error + var delegateReward int64 + + err = edb.Get().Table("reward_delegates").Select("sum(amount) as amount").Where("reward_type = ? AND provider_id = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, br.ProviderID, startBlock, endBlock).Scan(&delegateReward).Error if err != nil { return nil, err } - result = append(result, delegateRewards.Amount) + result = append(result, delegateReward) - totals = append(totals, br.Amount+delegateRewards.Amount) + totals = append(totals, br.Amount+delegateReward) } result = append(result, totals...) From dde7c98c22eceda6badf768c54aa525db20e3b83 Mon Sep 17 00:00:00 2001 From: Jayash Date: Sun, 2 Jul 2023 15:38:05 +0530 Subject: [PATCH 15/28] Added ordering in block rewards --- .../0chain.net/smartcontract/dbs/event/reward_provider_dev.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go index b84b6e83fd..55b3685f4d 100644 --- a/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go +++ b/code/go/0chain.net/smartcontract/dbs/event/reward_provider_dev.go @@ -171,7 +171,7 @@ func (edb *EventDb) GetBlockRewards(startBlock, endBlock string) ([]int64, error var blockRewards []BlockReward - err := edb.Get().Table("reward_providers").Select("provider_id, sum(amount) as amount").Where("reward_type = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, startBlock, endBlock).Group("provider_id").Scan(&blockRewards).Error + err := edb.Get().Table("reward_providers").Select("provider_id, sum(amount) as amount").Where("reward_type = ? AND block_number >= ? AND block_number <= ?", spenum.BlockRewardBlobber, startBlock, endBlock).Group("provider_id").Order("provider_id").Scan(&blockRewards).Error if err != nil { return nil, err } From 161ae8e6b7b6549ad44433cbf66d38d6edb79c50 Mon Sep 17 00:00:00 2001 From: Jayash Date: Thu, 6 Jul 2023 17:03:48 +0530 Subject: [PATCH 16/28] Removed reduce offer change --- code/go/0chain.net/smartcontract/storagesc/allocation.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/allocation.go b/code/go/0chain.net/smartcontract/storagesc/allocation.go index 266561af14..69ac7fa125 100755 --- a/code/go/0chain.net/smartcontract/storagesc/allocation.go +++ b/code/go/0chain.net/smartcontract/storagesc/allocation.go @@ -1516,10 +1516,6 @@ func (sc *StorageSmartContract) finalizeAllocation( return "", common.NewError("fini_alloc_failed", "can't get stake pool of "+d.BlobberID+": "+err.Error()) } - if err := sp.reduceOffer(d.Offer()); err != nil { - return "", common.NewError("fini_alloc_failed", - "error removing offer: "+err.Error()) - } sps = append(sps, sp) } From 899171f7c57618616a795f5b07a36b1bb69f27a3 Mon Sep 17 00:00:00 2001 From: Jayash Date: Thu, 6 Jul 2023 17:50:19 +0530 Subject: [PATCH 17/28] Revert changes --- code/go/0chain.net/smartcontract/dbs/event/challenge.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/go/0chain.net/smartcontract/dbs/event/challenge.go b/code/go/0chain.net/smartcontract/dbs/event/challenge.go index 363b9fac35..952632eb9d 100644 --- a/code/go/0chain.net/smartcontract/dbs/event/challenge.go +++ b/code/go/0chain.net/smartcontract/dbs/event/challenge.go @@ -36,7 +36,7 @@ func (edb *EventDb) GetAllChallengesByAllocationID(allocationID string) (Challen } func (edb *EventDb) GetPassedChallengesForBlobberAllocation(allocationID string) (map[string]int, error) { - var result map[string]int + result := make(map[string]int) edb.Store.Get().Table("challenges"). Select("blobber_id, count(*) as count"). From 691828cdda1a8062192164ca3fdc21d7bbb1c6c7 Mon Sep 17 00:00:00 2001 From: dabasov Date: Thu, 6 Jul 2023 17:00:20 +0300 Subject: [PATCH 18/28] fix writemarkers --- code/go/0chain.net/go.mod | 35 +++++++++++++++++------------------ code/go/0chain.net/go.sum | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/code/go/0chain.net/go.mod b/code/go/0chain.net/go.mod index 8ca2a4407f..f1be7fb988 100644 --- a/code/go/0chain.net/go.mod +++ b/code/go/0chain.net/go.mod @@ -3,14 +3,14 @@ module 0chain.net go 1.20 require ( - github.com/alicebob/miniredis/v2 v2.30.3 + github.com/alicebob/miniredis/v2 v2.30.4 github.com/didip/tollbooth v4.0.2+incompatible github.com/go-openapi/runtime v0.26.0 github.com/go-playground/validator/v10 v10.14.1 github.com/golang/snappy v0.0.4 github.com/gomodule/redigo v1.8.9 github.com/guregu/null v4.0.0+incompatible - github.com/hashicorp/golang-lru/v2 v2.0.3 + github.com/hashicorp/golang-lru/v2 v2.0.4 github.com/herumi/bls v1.37.0 github.com/herumi/mcl v1.84.0 github.com/koding/cache v0.0.0-20161222233018-4a3175c6b2fe @@ -30,25 +30,24 @@ require ( github.com/vmihailenco/msgpack/v5 v5.3.5 go.uber.org/atomic v1.11.0 go.uber.org/zap v1.24.0 - golang.org/x/crypto v0.10.0 - golang.org/x/net v0.11.0 + golang.org/x/crypto v0.11.0 + golang.org/x/net v0.12.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 gorm.io/driver/postgres v1.5.2 - gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 + gorm.io/gorm v1.25.2 ) require ( github.com/0chain/common v0.0.6-0.20230529052949-41994a93b4f9 - github.com/go-faker/faker/v4 v4.1.0 - github.com/google/uuid v1.3.0 - github.com/jackc/pgx/v5 v5.3.1 + github.com/go-faker/faker/v4 v4.1.1 + github.com/jackc/pgx/v5 v5.4.1 github.com/lib/pq v1.10.9 github.com/linxGnu/grocksdb v1.8.0 github.com/ory/dockertest/v3 v3.10.0 - github.com/pressly/goose/v3 v3.11.2 + github.com/pressly/goose/v3 v3.13.1 golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc - golang.org/x/sys v0.9.0 + golang.org/x/sys v0.10.0 gorm.io/driver/sqlite v1.5.2 moul.io/zapgorm2 v1.3.0 ) @@ -60,10 +59,10 @@ require ( github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/containerd/continuity v0.3.0 // indirect + github.com/containerd/continuity v0.4.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/docker/cli v23.0.6+incompatible // indirect - github.com/docker/docker v23.0.6+incompatible // indirect + github.com/docker/cli v24.0.2+incompatible // indirect + github.com/docker/docker v24.0.2+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect @@ -82,7 +81,7 @@ require ( github.com/gogo/protobuf v1.3.2 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/imdario/mergo v0.3.15 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect @@ -102,7 +101,7 @@ require ( github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/sirupsen/logrus v1.9.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/stretchr/objx v0.5.0 // indirect @@ -113,10 +112,10 @@ require ( github.com/yuin/gopher-lua v1.1.0 // indirect go.mongodb.org/mongo-driver v1.11.3 // indirect go.uber.org/multierr v1.9.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/text v0.10.0 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/text v0.11.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.8.0 // indirect + golang.org/x/tools v0.10.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/code/go/0chain.net/go.sum b/code/go/0chain.net/go.sum index 3804b36dbf..f2ed2bb0b2 100644 --- a/code/go/0chain.net/go.sum +++ b/code/go/0chain.net/go.sum @@ -55,6 +55,7 @@ github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis/v2 v2.30.3 h1:hrqDB4cHFSHQf4gO3xu6YKQg8PqJpNjLYsQAFYHstqw= github.com/alicebob/miniredis/v2 v2.30.3/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= +github.com/alicebob/miniredis/v2 v2.30.4/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= @@ -72,6 +73,7 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/continuity v0.4.1/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -82,8 +84,10 @@ github.com/didip/tollbooth v4.0.2+incompatible h1:fVSa33JzSz0hoh2NxpwZtksAzAgd7z github.com/didip/tollbooth v4.0.2+incompatible/go.mod h1:A9b0665CE6l1KmzpDws2++elm/CsuWBMa5Jv4WY0PEY= github.com/docker/cli v23.0.6+incompatible h1:CScadyCJ2ZKUDpAMZta6vK8I+6/m60VIjGIV7Wg/Eu4= github.com/docker/cli v23.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker v23.0.6+incompatible h1:aBD4np894vatVX99UTx/GyOUOK4uEcROwA3+bQhEcoU= github.com/docker/docker v23.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -102,6 +106,7 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/go-faker/faker/v4 v4.1.0 h1:ffuWmpDrducIUOO0QSKSF5Q2dxAht+dhsT9FvVHhPEI= github.com/go-faker/faker/v4 v4.1.0/go.mod h1:uuNc0PSRxF8nMgjGrrrU4Nw5cF30Jc6Kd0/FUTTYbhg= +github.com/go-faker/faker/v4 v4.1.1/go.mod h1:uuNc0PSRxF8nMgjGrrrU4Nw5cF30Jc6Kd0/FUTTYbhg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -246,6 +251,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.4/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/herumi/bls v1.37.0 h1:EKPaFujxWsxSMlfN1NeR9GTfVOeAsAaNRGbdBfn9lBE= @@ -256,6 +262,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -265,6 +272,7 @@ github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/ github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/pgx/v5 v5.4.1/go.mod h1:q6iHT8uDNXWiFNOlRqJzBTaSH3+2xCXkokxHZC5qWFY= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= @@ -344,6 +352,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pressly/goose/v3 v3.11.2 h1:QgTP45FhBBHdmf7hWKlbWFHtwPtxo0phSDkwDKGUrYs= github.com/pressly/goose/v3 v3.11.2/go.mod h1:LWQzSc4vwfHA/3B8getTp8g3J5Z8tFBxgxinmGlMlJk= +github.com/pressly/goose/v3 v3.13.1/go.mod h1:1WCIzQuOGhpx+D7bal+tGadbwVPmdfy9fltqYLMA8lM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -362,6 +371,7 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= @@ -459,6 +469,7 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -497,6 +508,7 @@ golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -533,6 +545,7 @@ golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -604,6 +617,7 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -616,6 +630,7 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -678,6 +693,7 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -796,6 +812,7 @@ gorm.io/driver/sqlite v1.5.2/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 h1:sC1Xj4TYrLqg1n3AN10w871An7wJM0gzgcm8jkIkECQ= gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From f01239d1ccfb033144af7cf914a53de58d6da16b Mon Sep 17 00:00:00 2001 From: dabasov Date: Thu, 6 Jul 2023 17:35:55 +0300 Subject: [PATCH 19/28] fixed dependency --- code/go/0chain.net/go.sum | 66 ++++++++++++++------------------------- 1 file changed, 24 insertions(+), 42 deletions(-) diff --git a/code/go/0chain.net/go.sum b/code/go/0chain.net/go.sum index f2ed2bb0b2..3a2f515157 100644 --- a/code/go/0chain.net/go.sum +++ b/code/go/0chain.net/go.sum @@ -53,8 +53,7 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis/v2 v2.30.3 h1:hrqDB4cHFSHQf4gO3xu6YKQg8PqJpNjLYsQAFYHstqw= -github.com/alicebob/miniredis/v2 v2.30.3/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= +github.com/alicebob/miniredis/v2 v2.30.4 h1:8S4/o1/KoUArAGbGwPxcwf0krlzceva2XVOSchFS7Eo= github.com/alicebob/miniredis/v2 v2.30.4/go.mod h1:b25qWj4fCEsBeAAR2mlb0ufImGC6uH3VlUfb/HS5zKg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= @@ -71,8 +70,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= +github.com/containerd/continuity v0.4.1 h1:wQnVrjIyQ8vhU2sgOiL5T07jo+ouqc2bnKsv5/EqGhU= github.com/containerd/continuity v0.4.1/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -82,11 +80,9 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/didip/tollbooth v4.0.2+incompatible h1:fVSa33JzSz0hoh2NxpwZtksAzAgd7zjmGO20HCZtF4M= github.com/didip/tollbooth v4.0.2+incompatible/go.mod h1:A9b0665CE6l1KmzpDws2++elm/CsuWBMa5Jv4WY0PEY= -github.com/docker/cli v23.0.6+incompatible h1:CScadyCJ2ZKUDpAMZta6vK8I+6/m60VIjGIV7Wg/Eu4= -github.com/docker/cli v23.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/docker v23.0.6+incompatible h1:aBD4np894vatVX99UTx/GyOUOK4uEcROwA3+bQhEcoU= -github.com/docker/docker v23.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.2+incompatible h1:eATx+oLz9WdNVkQrr0qjQ8HvRJ4bOOxfzEo8R+dA3cg= github.com/docker/docker v24.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= @@ -104,8 +100,7 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/go-faker/faker/v4 v4.1.0 h1:ffuWmpDrducIUOO0QSKSF5Q2dxAht+dhsT9FvVHhPEI= -github.com/go-faker/faker/v4 v4.1.0/go.mod h1:uuNc0PSRxF8nMgjGrrrU4Nw5cF30Jc6Kd0/FUTTYbhg= +github.com/go-faker/faker/v4 v4.1.1 h1:zkxj/JH/aezB4R6cTEMKU7qcVScGhlB3qRtF3D7K+rI= github.com/go-faker/faker/v4 v4.1.1/go.mod h1:uuNc0PSRxF8nMgjGrrrU4Nw5cF30Jc6Kd0/FUTTYbhg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -241,7 +236,6 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= @@ -249,8 +243,7 @@ github.com/guregu/null v4.0.0+incompatible h1:4zw0ckM7ECd6FNNddc3Fu4aty9nTlpkkzH github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= -github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/golang-lru/v2 v2.0.4 h1:7GHuZcgid37q8o5i3QI9KMT4nCWQQ3Kx3Ov6bb9MfK0= github.com/hashicorp/golang-lru/v2 v2.0.4/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -260,8 +253,7 @@ github.com/herumi/mcl v1.84.0 h1:kyaRWuULIUdX4QeYQccT+4nLrPMAT2Kxm4hZLdN44Pk= github.com/herumi/mcl v1.84.0/go.mod h1:h3LxvbUoOFYciRnV4Ycv9LNk6aqWFEyj115DV8aIrqw= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= -github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= @@ -270,8 +262,7 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/pgx/v5 v5.4.1 h1:oKfB/FhuVtit1bBM3zNRRsZ925ZkMN3HXL+LgLUM9lE= github.com/jackc/pgx/v5 v5.4.1/go.mod h1:q6iHT8uDNXWiFNOlRqJzBTaSH3+2xCXkokxHZC5qWFY= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= @@ -315,7 +306,7 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -350,8 +341,7 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pressly/goose/v3 v3.11.2 h1:QgTP45FhBBHdmf7hWKlbWFHtwPtxo0phSDkwDKGUrYs= -github.com/pressly/goose/v3 v3.11.2/go.mod h1:LWQzSc4vwfHA/3B8getTp8g3J5Z8tFBxgxinmGlMlJk= +github.com/pressly/goose/v3 v3.13.1 h1:4kYsfsboJvQDg1MEcMnXs8ubbz4AeHHXMW19XEAy3vI= github.com/pressly/goose/v3 v3.13.1/go.mod h1:1WCIzQuOGhpx+D7bal+tGadbwVPmdfy9fltqYLMA8lM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= @@ -369,8 +359,7 @@ github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFR github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= @@ -467,8 +456,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -506,8 +494,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -543,8 +530,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -567,7 +553,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -615,8 +601,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -628,8 +613,7 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -691,8 +675,7 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= -golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= +golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= golang.org/x/tools v0.10.0/go.mod h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -810,8 +793,7 @@ gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBp gorm.io/driver/sqlite v1.5.2 h1:TpQ+/dqCY4uCigCFyrfnrJnrW9zjpelWVoEVNy5qJkc= gorm.io/driver/sqlite v1.5.2/go.mod h1:qxAuCol+2r6PannQDpOP1FP6ag3mKi4esLnB/jHed+4= gorm.io/gorm v1.23.6/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= -gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55 h1:sC1Xj4TYrLqg1n3AN10w871An7wJM0gzgcm8jkIkECQ= -gorm.io/gorm v1.25.2-0.20230530020048-26663ab9bf55/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.2 h1:gs1o6Vsa+oVKG/a9ElL3XgyGfghFfkKA2SInQaCyMho= gorm.io/gorm v1.25.2/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -822,13 +804,13 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/ccgo/v3 v3.16.14 h1:af6KNtFgsVmnDYrWk3PQCS9XT6BXe7o3ZFJKkIKvXNQ= +modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= +modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= moul.io/zapgorm2 v1.3.0 h1:+CzUTMIcnafd0d/BvBce8T4uPn6DQnpIrz64cyixlkk= From 65d1cb81e35075500c144e322bdea60cd52ff78c Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Fri, 7 Jul 2023 14:43:30 +0530 Subject: [PATCH 20/28] minor refactor --- code/go/0chain.net/smartcontract/storagesc/blobber.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 68f079d822..05e1139cda 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -115,6 +115,7 @@ func (sc *StorageSmartContract) updateBlobber( if err = terms.validate(conf); err != nil { return fmt.Errorf("invalid blobber terms: %v", err) } + savedBlobber.Terms = *terms } if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity <= 0 { @@ -334,15 +335,11 @@ func (sc *StorageSmartContract) updateBlobberSettings(txn *transaction.Transacti if err = sc.updateBlobber(txn, conf, updatedBlobber, blobber, existingStakePool, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", err.Error()) } + if updatedBlobber.Capacity != nil { blobber.Capacity = *updatedBlobber.Capacity } - terms := getTermsFromDtoNode(updatedBlobber) - if terms != nil { - blobber.Terms = *terms - } - if updatedBlobber.NotAvailable != nil { blobber.NotAvailable = *updatedBlobber.NotAvailable } From f384c1da783a1d114e0f276782650d1cdd0e9c6f Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Fri, 7 Jul 2023 20:38:51 +0530 Subject: [PATCH 21/28] Fixing test by adding //go:generate msgp in the DTO nodes. --- .../smartcontract/dto/blobberdto.go | 2 + .../0chain.net/smartcontract/dto/minerdto.go | 2 + .../smartcontract/dto/stakepooldto.go | 2 + .../smartcontract/dto/validationdto.go | 2 + .../smartcontract/storagesc/blobber.go | 46 +++++++++---------- .../smartcontract/storagesc/blobber_test.go | 8 ++-- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dto/blobberdto.go b/code/go/0chain.net/smartcontract/dto/blobberdto.go index d558a17891..c95ae5caec 100644 --- a/code/go/0chain.net/smartcontract/dto/blobberdto.go +++ b/code/go/0chain.net/smartcontract/dto/blobberdto.go @@ -6,6 +6,8 @@ import ( "github.com/0chain/common/core/currency" ) +//go:generate msgp -io=false -tests=false -unexported -v + // StorageDtoNode represents Blobber configurations used as DTO. // This is just a DTO model which should be used in passing data to other service for ex, via HTTP call. // This should not be used in the application for any business logic. diff --git a/code/go/0chain.net/smartcontract/dto/minerdto.go b/code/go/0chain.net/smartcontract/dto/minerdto.go index daf7eb22f3..a99c97f406 100644 --- a/code/go/0chain.net/smartcontract/dto/minerdto.go +++ b/code/go/0chain.net/smartcontract/dto/minerdto.go @@ -6,6 +6,8 @@ import ( "github.com/0chain/common/core/currency" ) +//go:generate msgp -io=false -tests=false -unexported -v + // NodeType used in pools statistic. type NodeType int diff --git a/code/go/0chain.net/smartcontract/dto/stakepooldto.go b/code/go/0chain.net/smartcontract/dto/stakepooldto.go index 6ae83f2f4b..358d7b80c6 100644 --- a/code/go/0chain.net/smartcontract/dto/stakepooldto.go +++ b/code/go/0chain.net/smartcontract/dto/stakepooldto.go @@ -6,6 +6,8 @@ import ( "github.com/0chain/common/core/currency" ) +//go:generate msgp -v -io=false -tests=false + type PoolStatus int // StakePool holds delegate information for an 0chain providers diff --git a/code/go/0chain.net/smartcontract/dto/validationdto.go b/code/go/0chain.net/smartcontract/dto/validationdto.go index 01f3c133de..6f8ab8ccb2 100644 --- a/code/go/0chain.net/smartcontract/dto/validationdto.go +++ b/code/go/0chain.net/smartcontract/dto/validationdto.go @@ -5,6 +5,8 @@ import ( "0chain.net/smartcontract/provider" ) +//go:generate msgp -io=false -tests=false -unexported -v + type ValidationDtoNode struct { provider.Provider BaseURL *string `json:"url"` diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 05e1139cda..adcbf5d742 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -170,22 +170,6 @@ func (sc *StorageSmartContract) updateBlobber( return fmt.Errorf("invalid new stake pool settings: %v", err) } - // update stake pool settings - stakedCapacity, err := existingStakePool.stakedCapacity(terms.WritePrice) - if err != nil { - return fmt.Errorf("error calculating staked capacity: %v", err) - } - - if updateBlobberRequest.SavedData != nil && *updateBlobberRequest.SavedData > stakedCapacity { - return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than used capacity (%d)", - stakedCapacity, *updateBlobberRequest.SavedData) - } - - _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) - if err != nil { - return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) - } - if updateBlobberRequest.StakePoolSettings.ServiceChargeRatio != nil { existingStakePool.Settings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio savedBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio @@ -195,14 +179,30 @@ func (sc *StorageSmartContract) updateBlobber( existingStakePool.Settings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates savedBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates } + } - // Save stake pool - if err = existingStakePool.Save(spenum.Blobber, updateBlobberRequest.ID, balances); err != nil { - return fmt.Errorf("saving stake pool: %v", err) - } - if err := emitUpdateBlobber(updateBlobberRequest, existingStakePool, balances); err != nil { - return fmt.Errorf("emmiting blobber %v: %v", updateBlobberRequest, err) - } + // update stake pool settings + stakedCapacity, err := existingStakePool.stakedCapacity(terms.WritePrice) + if err != nil { + return fmt.Errorf("error calculating staked capacity: %v", err) + } + + if updateBlobberRequest.SavedData != nil && *updateBlobberRequest.SavedData > stakedCapacity { + return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than used capacity (%d)", + stakedCapacity, *updateBlobberRequest.SavedData) + } + + _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) + if err != nil { + return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) + } + + // Save stake pool + if err = existingStakePool.Save(spenum.Blobber, updateBlobberRequest.ID, balances); err != nil { + return fmt.Errorf("saving stake pool: %v", err) + } + if err := emitUpdateBlobber(updateBlobberRequest, existingStakePool, balances); err != nil { + return fmt.Errorf("emmiting blobber %v: %v", updateBlobberRequest, err) } return } diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go index 253b02710b..adf90f6d79 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go @@ -55,8 +55,8 @@ func TestStorageSmartContract_addBlobber(t *testing.T) { require.NotNil(t, ab) // can update URL - const NEW_BASE_URL = "https://new-base-url.com" - b.BaseURL = NEW_BASE_URL + const NewBaseUrl = "https://new-base-url.com" + b.BaseURL = NewBaseUrl b.Capacity = b.Capacity * 2 tp += 100 _, err = updateBlobber(t, b, 0, tp, ssc, balances) @@ -64,11 +64,11 @@ func TestStorageSmartContract_addBlobber(t *testing.T) { ab, err = ssc.getBlobber(b.ID, balances) require.NoError(t, err) - require.Equal(t, NEW_BASE_URL, ab.BaseURL) + require.Equal(t, NewBaseUrl, ab.BaseURL) require.Equal(t, ab.Capacity, b.Capacity) // can update URL - b2.BaseURL = NEW_BASE_URL + b2.BaseURL = NewBaseUrl b.Capacity = b2.Capacity * 2 tp += 100 _, err = updateBlobber(t, b2, 0, tp, ssc, balances) From 22dac5dd4b4714f1c5fc7dc34e5e7d1a8ff52e19 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Sat, 8 Jul 2023 03:53:40 +0530 Subject: [PATCH 22/28] refactoring in update blobber and validator calls. --- .../smartcontract/storagesc/blobber.go | 38 ++++++++----------- .../storagesc/blobber_eventdb.go | 34 ++++++++--------- .../smartcontract/storagesc/models.go | 21 ++++++++-- .../smartcontract/storagesc/validator.go | 20 +++++----- 4 files changed, 59 insertions(+), 54 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index adcbf5d742..9a765a7bea 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -110,12 +110,20 @@ func (sc *StorageSmartContract) updateBlobber( balances cstate.StateContextI, ) (err error) { // check terms - terms := getTermsFromDtoNode(updateBlobberRequest) - if terms != nil { - if err = terms.validate(conf); err != nil { - return fmt.Errorf("invalid blobber terms: %v", err) + if updateBlobberRequest.Terms != nil { + if updateBlobberRequest.Terms.ReadPrice != nil { + if err = validateReadPriceTerms(*updateBlobberRequest.Terms.ReadPrice, conf); err != nil { + return fmt.Errorf("invalid blobber terms: %v", err) + } + savedBlobber.Terms.ReadPrice = *updateBlobberRequest.Terms.ReadPrice + } + + if updateBlobberRequest.Terms.WritePrice != nil { + if err = validateWritePriceTerms(*updateBlobberRequest.Terms.WritePrice, conf); err != nil { + return fmt.Errorf("invalid blobber terms: %v", err) + } + savedBlobber.Terms.WritePrice = *updateBlobberRequest.Terms.WritePrice } - savedBlobber.Terms = *terms } if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity <= 0 { @@ -181,8 +189,9 @@ func (sc *StorageSmartContract) updateBlobber( } } - // update stake pool settings - stakedCapacity, err := existingStakePool.stakedCapacity(terms.WritePrice) + // update stake pool settings. + // using WritePrice of savedBlobber is fine because that has been updated earlier. + stakedCapacity, err := existingStakePool.stakedCapacity(savedBlobber.Terms.WritePrice) if err != nil { return fmt.Errorf("error calculating staked capacity: %v", err) } @@ -347,21 +356,6 @@ func (sc *StorageSmartContract) updateBlobberSettings(txn *transaction.Transacti return string(blobber.Encode()), nil } -func getTermsFromDtoNode(dtoNode *dto.StorageDtoNode) *Terms { - terms := new(Terms) - if dtoNode.Terms == nil { - return terms - } - if dtoNode.Terms.WritePrice != nil { - terms.WritePrice = *dtoNode.Terms.WritePrice - } - if dtoNode.Terms.ReadPrice != nil { - terms.ReadPrice = *dtoNode.Terms.ReadPrice - } - - return terms -} - func (sc *StorageSmartContract) blobberHealthCheck(t *transaction.Transaction, _ []byte, balances cstate.StateContextI, ) (string, error) { diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go index 4735f518c8..9e3cb4eda9 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go @@ -13,10 +13,6 @@ func emitUpdateBlobber(sn *dto.StorageDtoNode, sp *stakePool, balances cstate.St return err } data := &event.Blobber{ - BaseURL: getString(sn.BaseURL), - Capacity: getInt64(sn.Capacity), - Allocated: getInt64(sn.Allocated), - SavedData: getInt64(sn.SavedData), Provider: event.Provider{ ID: sn.ID, DelegateWallet: sp.Settings.DelegateWallet, @@ -27,6 +23,22 @@ func emitUpdateBlobber(sn *dto.StorageDtoNode, sp *stakePool, balances cstate.St }, OffersTotal: sp.TotalOffers, } + if sn.BaseURL != nil && *sn.BaseURL != "" { + data.BaseURL = *sn.BaseURL + } + + if sn.Capacity != nil && *sn.Capacity > 0 { + data.Capacity = *sn.Capacity + } + + if sn.Allocated != nil { + data.Allocated = *sn.Allocated + } + + if sn.SavedData != nil { + data.SavedData = *sn.SavedData + } + if sn.Geolocation != nil { if sn.Geolocation.Latitude != nil { data.Latitude = *sn.Geolocation.Latitude @@ -54,20 +66,6 @@ func emitUpdateBlobber(sn *dto.StorageDtoNode, sp *stakePool, balances cstate.St return nil } -func getString(pointerValue *string) string { - if pointerValue != nil { - return *pointerValue - } - return "" -} - -func getInt64(pointerValue *int64) int64 { - if pointerValue != nil { - return *pointerValue - } - return 0 -} - func emitAddBlobber(sn *StorageNode, sp *stakePool, balances cstate.StateContextI) error { staked, err := sp.stake() if err != nil { diff --git a/code/go/0chain.net/smartcontract/storagesc/models.go b/code/go/0chain.net/smartcontract/storagesc/models.go index b0a6d0283e..f69b226e9b 100644 --- a/code/go/0chain.net/smartcontract/storagesc/models.go +++ b/code/go/0chain.net/smartcontract/storagesc/models.go @@ -271,17 +271,30 @@ func (t *Terms) minLockDemand(gbSize, rdtu, minLockDemand float64) (currency.Coi // validate a received terms func (t *Terms) validate(conf *Config) (err error) { - if t.ReadPrice > conf.MaxReadPrice { + if err = validateReadPriceTerms(t.ReadPrice, conf); err != nil { + return + } + + return validateWritePriceTerms(t.WritePrice, conf) +} + +func validateReadPriceTerms(readPrice currency.Coin, conf *Config) error { + if readPrice > conf.MaxReadPrice { return errors.New("read_price is greater than max_read_price allowed") } - if t.WritePrice < conf.MinWritePrice { + + return nil +} + +func validateWritePriceTerms(writePrice currency.Coin, conf *Config) error { + if writePrice < conf.MinWritePrice { return errors.New("write_price is less than min_write_price allowed") } - if t.WritePrice > conf.MaxWritePrice { + if writePrice > conf.MaxWritePrice { return errors.New("write_price is greater than max_write_price allowed") } - return // nil + return nil } const ( diff --git a/code/go/0chain.net/smartcontract/storagesc/validator.go b/code/go/0chain.net/smartcontract/storagesc/validator.go index cc49ed38c0..a42b566ab2 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator.go @@ -233,16 +233,16 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, } } + // update stake pool settings + var existingStakePool *stakePool + if existingStakePool, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { + return fmt.Errorf("can't get stake pool: %v", err) + } + if inputValidator.StakePoolSettings != nil { // update statistics sc.statIncr(statUpdateValidator) - // update stake pool settings - var existingStakePool *stakePool - if existingStakePool, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { - return fmt.Errorf("can't get stake pool: %v", err) - } - if err = validateStakePoolSettingsForADtoNode(inputValidator.StakePoolSettings, conf); err != nil { return fmt.Errorf("invalid new stake pool settings: %v", err) } @@ -261,12 +261,12 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, if err = existingStakePool.Save(spenum.Validator, inputValidator.ID, balances); err != nil { return fmt.Errorf("saving stake pool: %v", err) } + } - inputValidator.LastHealthCheck = &txn.CreationDate + inputValidator.LastHealthCheck = &txn.CreationDate - if err := emitUpdateValidationNode(inputValidator, existingStakePool, balances); err != nil { - return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) - } + if err := emitUpdateValidationNode(inputValidator, existingStakePool, balances); err != nil { + return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) } return From 5385de010ceff798f4a5df6a107f4a4878fc3977 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Sat, 8 Jul 2023 13:16:14 +0530 Subject: [PATCH 23/28] fixing the staked calcualtion. --- code/go/0chain.net/smartcontract/storagesc/blobber.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 9a765a7bea..5f9ff00974 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -189,9 +189,13 @@ func (sc *StorageSmartContract) updateBlobber( } } + writePrice := currency.Coin(0) + if updateBlobberRequest.Terms != nil && updateBlobberRequest.Terms.WritePrice != nil { + writePrice = *updateBlobberRequest.Terms.WritePrice + } + // update stake pool settings. - // using WritePrice of savedBlobber is fine because that has been updated earlier. - stakedCapacity, err := existingStakePool.stakedCapacity(savedBlobber.Terms.WritePrice) + stakedCapacity, err := existingStakePool.stakedCapacity(writePrice) if err != nil { return fmt.Errorf("error calculating staked capacity: %v", err) } From b44605455734eddef9da4e492ef1fde1574e84ee Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Sat, 8 Jul 2023 16:24:22 +0530 Subject: [PATCH 24/28] fixing the staked calcualation. --- .../smartcontract/storagesc/blobber.go | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index 5f9ff00974..fdf78d89b4 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -189,20 +189,17 @@ func (sc *StorageSmartContract) updateBlobber( } } - writePrice := currency.Coin(0) - if updateBlobberRequest.Terms != nil && updateBlobberRequest.Terms.WritePrice != nil { - writePrice = *updateBlobberRequest.Terms.WritePrice - } - // update stake pool settings. - stakedCapacity, err := existingStakePool.stakedCapacity(writePrice) - if err != nil { - return fmt.Errorf("error calculating staked capacity: %v", err) - } + if updateBlobberRequest.Terms != nil && updateBlobberRequest.Terms.WritePrice != nil { + updatedStakedCapacity, err := existingStakePool.stakedCapacity(*updateBlobberRequest.Terms.WritePrice) + if err != nil { + return fmt.Errorf("error calculating staked capacity: %v", err) + } - if updateBlobberRequest.SavedData != nil && *updateBlobberRequest.SavedData > stakedCapacity { - return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than used capacity (%d)", - stakedCapacity, *updateBlobberRequest.SavedData) + if savedBlobber.Allocated > updatedStakedCapacity { + return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than allocated capacity (%d)", + updatedStakedCapacity, savedBlobber.Allocated) + } } _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) From 0839ec09d20243ea31179de546f6d2cdaeffb4f6 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Mon, 10 Jul 2023 20:39:49 +0530 Subject: [PATCH 25/28] modifying blobber and validator update by sending merged blobber and validator to the updater --- .../smartcontract/dto/blobberdto.go | 2 - .../smartcontract/dto/stakepooldto.go | 2 - .../smartcontract/storagesc/blobber.go | 197 +++++++++++------- .../storagesc/blobber_eventdb.go | 58 ++---- .../smartcontract/storagesc/blobber_test.go | 10 +- .../smartcontract/storagesc/stakepool.go | 19 -- .../smartcontract/storagesc/validator.go | 46 ++-- .../storagesc/validator_eventdb.go | 37 +--- 8 files changed, 177 insertions(+), 194 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dto/blobberdto.go b/code/go/0chain.net/smartcontract/dto/blobberdto.go index c95ae5caec..d558a17891 100644 --- a/code/go/0chain.net/smartcontract/dto/blobberdto.go +++ b/code/go/0chain.net/smartcontract/dto/blobberdto.go @@ -6,8 +6,6 @@ import ( "github.com/0chain/common/core/currency" ) -//go:generate msgp -io=false -tests=false -unexported -v - // StorageDtoNode represents Blobber configurations used as DTO. // This is just a DTO model which should be used in passing data to other service for ex, via HTTP call. // This should not be used in the application for any business logic. diff --git a/code/go/0chain.net/smartcontract/dto/stakepooldto.go b/code/go/0chain.net/smartcontract/dto/stakepooldto.go index 358d7b80c6..6ae83f2f4b 100644 --- a/code/go/0chain.net/smartcontract/dto/stakepooldto.go +++ b/code/go/0chain.net/smartcontract/dto/stakepooldto.go @@ -6,8 +6,6 @@ import ( "github.com/0chain/common/core/currency" ) -//go:generate msgp -v -io=false -tests=false - type PoolStatus int // StakePool holds delegate information for an 0chain providers diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index fdf78d89b4..e7e90af18c 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -83,20 +83,6 @@ func validateBlobberUpdateSettings(updateBlobberRequest *dto.StorageDtoNode, con return err } - if updateBlobberRequest.Geolocation != nil { - geoLocation := &StorageNodeGeolocation{} - if updateBlobberRequest.Geolocation.Latitude != nil { - geoLocation.Latitude = *updateBlobberRequest.Geolocation.Latitude - } - if updateBlobberRequest.Geolocation.Longitude != nil { - geoLocation.Longitude = *updateBlobberRequest.Geolocation.Longitude - } - - if err := geoLocation.validate(); err != nil { - return err - } - } - return nil } @@ -105,38 +91,39 @@ func (sc *StorageSmartContract) updateBlobber( txn *transaction.Transaction, conf *Config, updateBlobberRequest *dto.StorageDtoNode, - savedBlobber *StorageNode, + existingBlobber *StorageNode, existingStakePool *stakePool, balances cstate.StateContextI, ) (err error) { - // check terms - if updateBlobberRequest.Terms != nil { - if updateBlobberRequest.Terms.ReadPrice != nil { - if err = validateReadPriceTerms(*updateBlobberRequest.Terms.ReadPrice, conf); err != nil { - return fmt.Errorf("invalid blobber terms: %v", err) - } - savedBlobber.Terms.ReadPrice = *updateBlobberRequest.Terms.ReadPrice - } + // validate the new terms and update the existing blobber's terms + if err = validateTermsInUpdatedRequestAndMergeInSavedBlobber(updateBlobberRequest, existingBlobber, conf); err != nil { + return err + } - if updateBlobberRequest.Terms.WritePrice != nil { - if err = validateWritePriceTerms(*updateBlobberRequest.Terms.WritePrice, conf); err != nil { - return fmt.Errorf("invalid blobber terms: %v", err) - } - savedBlobber.Terms.WritePrice = *updateBlobberRequest.Terms.WritePrice - } + if err = validateGeolocationInUpdatedRequestAndMergeInSavedBlobber(updateBlobberRequest, existingBlobber); err != nil { + return err } - if updateBlobberRequest.Capacity != nil && *updateBlobberRequest.Capacity <= 0 { - return sc.removeBlobber(txn, updateBlobberRequest, balances) + if updateBlobberRequest.NotAvailable != nil { + existingBlobber.NotAvailable = *updateBlobberRequest.NotAvailable } - // check params + // storing the current capacity because existing blobber's capacity is updated. + currentCapacity := existingBlobber.Capacity + if updateBlobberRequest.Capacity != nil { + if *updateBlobberRequest.Capacity <= 0 { + return sc.removeBlobber(txn, updateBlobberRequest, balances) + } + + existingBlobber.Capacity = *updateBlobberRequest.Capacity + } + + // validate other params like capacity and baseUrl if err = validateBlobberUpdateSettings(updateBlobberRequest, conf); err != nil { return fmt.Errorf("invalid blobber params: %v", err) } - if updateBlobberRequest.BaseURL != nil && *updateBlobberRequest.BaseURL != savedBlobber.BaseURL { - //if updating url + if updateBlobberRequest.BaseURL != nil && *updateBlobberRequest.BaseURL != existingBlobber.BaseURL { has, err := sc.hasBlobberUrl(*updateBlobberRequest.BaseURL, balances) if err != nil { return fmt.Errorf("could not check blobber url: %v", err) @@ -146,77 +133,145 @@ func (sc *StorageSmartContract) updateBlobber( return fmt.Errorf("blobber url update failed, %s already used", *updateBlobberRequest.BaseURL) } - // Save updated url - if *updateBlobberRequest.BaseURL != "" { - _, err = balances.InsertTrieNode(GetUrlKey(*updateBlobberRequest.BaseURL, sc.ID), &datastore.NOIDField{}) + if existingBlobber.BaseURL != "" { + _, err = balances.DeleteTrieNode(existingBlobber.GetUrlKey(sc.ID)) if err != nil { - return fmt.Errorf("saving blobber url: " + err.Error()) + return fmt.Errorf("deleting blobber old url: " + err.Error()) } } - // remove old url - if savedBlobber.BaseURL != "" { - _, err = balances.DeleteTrieNode(savedBlobber.GetUrlKey(sc.ID)) + + if *updateBlobberRequest.BaseURL != "" { + existingBlobber.BaseURL = *updateBlobberRequest.BaseURL + _, err = balances.InsertTrieNode(existingBlobber.GetUrlKey(sc.ID), &datastore.NOIDField{}) if err != nil { - return fmt.Errorf("deleting blobber old url: " + err.Error()) + return fmt.Errorf("saving blobber url: " + err.Error()) } } } - updateBlobberRequest.LastHealthCheck = txn.CreationDate - updateBlobberRequest.Allocated = &savedBlobber.Allocated - updateBlobberRequest.SavedData = &savedBlobber.SavedData + existingBlobber.LastHealthCheck = txn.CreationDate // update statistics sc.statIncr(statUpdateBlobber) - if savedBlobber.Capacity == 0 { + if currentCapacity == 0 { sc.statIncr(statNumberOfBlobbers) // reborn, if it was "removed" } - if updateBlobberRequest.StakePoolSettings != nil { - if err = validateStakePoolSettingsForADtoNode(updateBlobberRequest.StakePoolSettings, conf); err != nil { - return fmt.Errorf("invalid new stake pool settings: %v", err) - } - - if updateBlobberRequest.StakePoolSettings.ServiceChargeRatio != nil { - existingStakePool.Settings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio - savedBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio - } - - if updateBlobberRequest.StakePoolSettings.MaxNumDelegates != nil { - existingStakePool.Settings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates - savedBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates - } + if err = validateStakePoolSettingsInUpdatedRequestAndMergeInSavedBlobber( + updateBlobberRequest, + existingBlobber, + existingStakePool, + conf, + ); err != nil { + return err } - // update stake pool settings. + // update stake pool settings if write price has changed. if updateBlobberRequest.Terms != nil && updateBlobberRequest.Terms.WritePrice != nil { updatedStakedCapacity, err := existingStakePool.stakedCapacity(*updateBlobberRequest.Terms.WritePrice) if err != nil { return fmt.Errorf("error calculating staked capacity: %v", err) } - if savedBlobber.Allocated > updatedStakedCapacity { + if existingBlobber.Allocated > updatedStakedCapacity { return fmt.Errorf("write_price_change: staked capacity (%d) can't go less than allocated capacity (%d)", - updatedStakedCapacity, savedBlobber.Allocated) + updatedStakedCapacity, existingBlobber.Allocated) } } - _, err = balances.InsertTrieNode(provider.GetKey(updateBlobberRequest.ID), updateBlobberRequest) + _, err = balances.InsertTrieNode(existingBlobber.GetKey(), existingBlobber) if err != nil { return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) } - // Save stake pool if err = existingStakePool.Save(spenum.Blobber, updateBlobberRequest.ID, balances); err != nil { return fmt.Errorf("saving stake pool: %v", err) } - if err := emitUpdateBlobber(updateBlobberRequest, existingStakePool, balances); err != nil { + + // existing blobber also contain the updated fields from the update blobber request + if err := emitUpdateBlobber(existingBlobber, existingStakePool, balances); err != nil { return fmt.Errorf("emmiting blobber %v: %v", updateBlobberRequest, err) } + return } +func validateTermsInUpdatedRequestAndMergeInSavedBlobber( + updatedBlobberRequest *dto.StorageDtoNode, + existingBlobber *StorageNode, + conf *Config, +) error { + if updatedBlobberRequest.Terms != nil { + if updatedBlobberRequest.Terms.ReadPrice != nil { + if err := validateReadPriceTerms(*updatedBlobberRequest.Terms.ReadPrice, conf); err != nil { + return fmt.Errorf("invalid blobber terms: %v", err) + } + existingBlobber.Terms.ReadPrice = *updatedBlobberRequest.Terms.ReadPrice + } + + if updatedBlobberRequest.Terms.WritePrice != nil { + if err := validateWritePriceTerms(*updatedBlobberRequest.Terms.WritePrice, conf); err != nil { + return fmt.Errorf("invalid blobber terms: %v", err) + } + existingBlobber.Terms.WritePrice = *updatedBlobberRequest.Terms.WritePrice + } + } + + return nil +} + +func validateGeolocationInUpdatedRequestAndMergeInSavedBlobber( + updatedBlobberRequest *dto.StorageDtoNode, + existingBlobber *StorageNode, +) error { + if updatedBlobberRequest.Geolocation != nil { + if updatedBlobberRequest.Geolocation.Latitude != nil { + existingBlobber.Geolocation.Latitude = *updatedBlobberRequest.Geolocation.Latitude + } + + if updatedBlobberRequest.Geolocation.Longitude != nil { + existingBlobber.Geolocation.Longitude = *updatedBlobberRequest.Geolocation.Longitude + } + } + + if err := existingBlobber.Geolocation.validate(); err != nil { + return err + } + + return nil +} + +func validateStakePoolSettingsInUpdatedRequestAndMergeInSavedBlobber( + updateBlobberRequest *dto.StorageDtoNode, + existingBlobber *StorageNode, + existingStakePool *stakePool, + conf *Config, +) error { + if updateBlobberRequest.StakePoolSettings != nil { + if updateBlobberRequest.StakePoolSettings.DelegateWallet != nil { + existingStakePool.Settings.DelegateWallet = *updateBlobberRequest.StakePoolSettings.DelegateWallet + existingBlobber.StakePoolSettings.DelegateWallet = *updateBlobberRequest.StakePoolSettings.DelegateWallet + } + + if updateBlobberRequest.StakePoolSettings.ServiceChargeRatio != nil { + existingStakePool.Settings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio + existingBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio + } + + if updateBlobberRequest.StakePoolSettings.MaxNumDelegates != nil { + existingStakePool.Settings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates + existingBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates + } + + if err := validateStakePoolSettings(existingBlobber.StakePoolSettings, conf); err != nil { + return fmt.Errorf("invalid new stake pool settings: %v", err) + } + } + + return nil +} + // remove blobber (when a blobber provides capacity = 0) func (sc *StorageSmartContract) removeBlobber(t *transaction.Transaction, blobber *dto.StorageDtoNode, balances cstate.StateContextI, @@ -342,18 +397,12 @@ func (sc *StorageSmartContract) updateBlobberSettings(txn *transaction.Transacti "access denied, allowed for delegate_wallet owner only") } + // merge the savedBlobber and updatedBlobber fields using the deltas from the updatedBlobber and + // emit the update blobber event to db. if err = sc.updateBlobber(txn, conf, updatedBlobber, blobber, existingStakePool, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", err.Error()) } - if updatedBlobber.Capacity != nil { - blobber.Capacity = *updatedBlobber.Capacity - } - - if updatedBlobber.NotAvailable != nil { - blobber.NotAvailable = *updatedBlobber.NotAvailable - } - return string(blobber.Encode()), nil } diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go index 9e3cb4eda9..e912bbc33a 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_eventdb.go @@ -4,64 +4,34 @@ import ( cstate "0chain.net/chaincore/chain/state" "0chain.net/smartcontract/dbs" "0chain.net/smartcontract/dbs/event" - "0chain.net/smartcontract/dto" ) -func emitUpdateBlobber(sn *dto.StorageDtoNode, sp *stakePool, balances cstate.StateContextI) error { +func emitUpdateBlobber(sn *StorageNode, sp *stakePool, balances cstate.StateContextI) error { staked, err := sp.stake() if err != nil { return err } data := &event.Blobber{ + BaseURL: sn.BaseURL, + Latitude: sn.Geolocation.Latitude, + Longitude: sn.Geolocation.Longitude, + ReadPrice: sn.Terms.ReadPrice, + WritePrice: sn.Terms.WritePrice, + + Capacity: sn.Capacity, + Allocated: sn.Allocated, + SavedData: sn.SavedData, + NotAvailable: sn.NotAvailable, Provider: event.Provider{ ID: sn.ID, - DelegateWallet: sp.Settings.DelegateWallet, - NumDelegates: sp.Settings.MaxNumDelegates, - ServiceCharge: sp.Settings.ServiceChargeRatio, + DelegateWallet: sn.StakePoolSettings.DelegateWallet, + NumDelegates: sn.StakePoolSettings.MaxNumDelegates, + ServiceCharge: sn.StakePoolSettings.ServiceChargeRatio, LastHealthCheck: sn.LastHealthCheck, TotalStake: staked, }, OffersTotal: sp.TotalOffers, } - if sn.BaseURL != nil && *sn.BaseURL != "" { - data.BaseURL = *sn.BaseURL - } - - if sn.Capacity != nil && *sn.Capacity > 0 { - data.Capacity = *sn.Capacity - } - - if sn.Allocated != nil { - data.Allocated = *sn.Allocated - } - - if sn.SavedData != nil { - data.SavedData = *sn.SavedData - } - - if sn.Geolocation != nil { - if sn.Geolocation.Latitude != nil { - data.Latitude = *sn.Geolocation.Latitude - } - if sn.Geolocation.Longitude != nil { - data.Longitude = *sn.Geolocation.Longitude - } - - } - - if sn.Terms != nil { - if sn.Terms.ReadPrice != nil { - data.ReadPrice = *sn.Terms.ReadPrice - } - if sn.Terms.WritePrice != nil { - data.WritePrice = *sn.Terms.WritePrice - } - } - - if sn.NotAvailable != nil { - data.NotAvailable = *sn.NotAvailable - } - balances.EmitEvent(event.TypeStats, event.TagUpdateBlobber, sn.ID, data) return nil } diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go index adf90f6d79..1a18cbc05e 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber_test.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber_test.go @@ -44,7 +44,7 @@ func TestStorageSmartContract_addBlobber(t *testing.T) { require.NoError(t, err) // reborn - b.Capacity = 2 * GB + b.Capacity = 3 * GB tp += 100 _, err = updateBlobber(t, b, 10*x10, tp, ssc, balances) require.NoError(t, err) @@ -53,27 +53,25 @@ func TestStorageSmartContract_addBlobber(t *testing.T) { ab, err = ssc.getBlobber(b.ID, balances) require.NoError(t, err) require.NotNil(t, ab) + require.Equal(t, int64(3*GB), ab.Capacity) - // can update URL const NewBaseUrl = "https://new-base-url.com" b.BaseURL = NewBaseUrl - b.Capacity = b.Capacity * 2 tp += 100 + // update URL but not the capacity _, err = updateBlobber(t, b, 0, tp, ssc, balances) require.NoError(t, err) ab, err = ssc.getBlobber(b.ID, balances) require.NoError(t, err) require.Equal(t, NewBaseUrl, ab.BaseURL) - require.Equal(t, ab.Capacity, b.Capacity) - // can update URL + require.Equal(t, int64(3*GB), ab.Capacity) b2.BaseURL = NewBaseUrl b.Capacity = b2.Capacity * 2 tp += 100 _, err = updateBlobber(t, b2, 0, tp, ssc, balances) require.Error(t, err) - } func TestStorageSmartContract_addBlobber_preventDuplicates(t *testing.T) { diff --git a/code/go/0chain.net/smartcontract/storagesc/stakepool.go b/code/go/0chain.net/smartcontract/storagesc/stakepool.go index 1f9016f3c7..ec26965c60 100644 --- a/code/go/0chain.net/smartcontract/storagesc/stakepool.go +++ b/code/go/0chain.net/smartcontract/storagesc/stakepool.go @@ -1,7 +1,6 @@ package storagesc import ( - "0chain.net/smartcontract/dto" "encoding/json" "errors" "fmt" @@ -39,24 +38,6 @@ func validateStakePoolSettings( return nil } -func validateStakePoolSettingsForADtoNode(sps *dto.Settings, conf *Config) error { - if sps.ServiceChargeRatio != nil { - if *sps.ServiceChargeRatio < 0.0 { - return errors.New("negative service charge") - } - if *sps.ServiceChargeRatio > conf.MaxCharge { - return fmt.Errorf("service_charge (%f) is greater than"+ - " max allowed by SC (%f)", *sps.ServiceChargeRatio, conf.MaxCharge) - } - } - - if sps.MaxNumDelegates != nil && *sps.MaxNumDelegates <= 0 { - return errors.New("num_delegates <= 0") - } - - return nil -} - // stake pool of a blobber type stakePool struct { diff --git a/code/go/0chain.net/smartcontract/storagesc/validator.go b/code/go/0chain.net/smartcontract/storagesc/validator.go index a42b566ab2..7202412629 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator.go @@ -152,18 +152,18 @@ func (sc *StorageSmartContract) updateValidatorSettings(txn *transaction.Transac "can't get the validator: "+err.Error()) } - var sp *stakePool - if sp, err = sc.getStakePool(spenum.Validator, updatedValidator.ID, balances); err != nil { + var existingStakePool *stakePool + if existingStakePool, err = sc.getStakePool(spenum.Validator, updatedValidator.ID, balances); err != nil { return "", common.NewError("update_validator_settings_failed", "can't get related stake pool: "+err.Error()) } - if sp.Settings.DelegateWallet == "" { + if existingStakePool.Settings.DelegateWallet == "" { return "", common.NewError("update_validator_settings_failed", "validator's delegate_wallet is not set") } - if txn.ClientID != sp.Settings.DelegateWallet { + if txn.ClientID != existingStakePool.Settings.DelegateWallet { return "", common.NewError("update_validator_settings_failed", "access denied, allowed for delegate_wallet owner only") } @@ -172,7 +172,7 @@ func (sc *StorageSmartContract) updateValidatorSettings(txn *transaction.Transac return "", common.NewError("update_validator_settings_failed", err.Error()) } - // Save validator + // save validator _, err = balances.InsertTrieNode(existingValidator.GetKey(sc.ID), existingValidator) if err != nil { return "", common.NewError("update_validator_settings_failed", @@ -208,7 +208,6 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, } if inputValidator.BaseURL != nil && savedValidator.BaseURL != *inputValidator.BaseURL { - //if updating url has, err := sc.hasValidatorUrl(*inputValidator.BaseURL, balances) if err != nil { return fmt.Errorf("could not get validator of url: %s : %v", *inputValidator.BaseURL, err) @@ -217,13 +216,7 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, if has { return fmt.Errorf("invalid validator url update, already used") } - // Save url - if *inputValidator.BaseURL != "" { - _, err = balances.InsertTrieNode(GetValidatorUrlKey(sc.ID, *inputValidator.BaseURL), &datastore.NOIDField{}) - if err != nil { - return fmt.Errorf("saving validator url: " + err.Error()) - } - } + // remove old url if savedValidator.BaseURL != "" { _, err = balances.DeleteTrieNode(savedValidator.GetUrlKey(sc.ID)) @@ -231,6 +224,15 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, return fmt.Errorf("deleting validator old url: " + err.Error()) } } + + // save url + if *inputValidator.BaseURL != "" { + savedValidator.BaseURL = *inputValidator.BaseURL + _, err = balances.InsertTrieNode(savedValidator.GetUrlKey(sc.ID), &datastore.NOIDField{}) + if err != nil { + return fmt.Errorf("saving validator url: " + err.Error()) + } + } } // update stake pool settings @@ -243,10 +245,6 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, // update statistics sc.statIncr(statUpdateValidator) - if err = validateStakePoolSettingsForADtoNode(inputValidator.StakePoolSettings, conf); err != nil { - return fmt.Errorf("invalid new stake pool settings: %v", err) - } - if inputValidator.StakePoolSettings.ServiceChargeRatio != nil { existingStakePool.Settings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio savedValidator.StakePoolSettings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio @@ -257,15 +255,23 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, savedValidator.StakePoolSettings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates } - // Save stake pool + if inputValidator.StakePoolSettings.DelegateWallet != nil { + existingStakePool.Settings.DelegateWallet = *inputValidator.StakePoolSettings.DelegateWallet + savedValidator.StakePoolSettings.DelegateWallet = *inputValidator.StakePoolSettings.DelegateWallet + } + + if err = validateStakePoolSettings(existingStakePool.StakePool.Settings, conf); err != nil { + return fmt.Errorf("invalid new stake pool settings: %v", err) + } + + // save stake pool if err = existingStakePool.Save(spenum.Validator, inputValidator.ID, balances); err != nil { return fmt.Errorf("saving stake pool: %v", err) } } inputValidator.LastHealthCheck = &txn.CreationDate - - if err := emitUpdateValidationNode(inputValidator, existingStakePool, balances); err != nil { + if err := savedValidator.emitUpdate(existingStakePool, balances); err != nil { return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) } diff --git a/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go b/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go index c052c327c2..afa8834387 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator_eventdb.go @@ -2,7 +2,6 @@ package storagesc import ( "0chain.net/smartcontract/dbs" - "0chain.net/smartcontract/dto" "0chain.net/smartcontract/provider" "0chain.net/smartcontract/stakepool" "0chain.net/smartcontract/stakepool/spenum" @@ -41,9 +40,8 @@ func getValidators(validatorIDs []string, edb *event.EventDb) ([]*ValidationNode return vNodes, nil } -func emitUpdateValidationNode(validationNode *dto.ValidationDtoNode, - existingStakePool *stakePool, balances cstate.StateContextI) error { - staked, err := existingStakePool.stake() +func (vn *ValidationNode) emitUpdate(sp *stakePool, balances cstate.StateContextI) error { + staked, err := sp.stake() if err != nil { return err } @@ -51,33 +49,18 @@ func emitUpdateValidationNode(validationNode *dto.ValidationDtoNode, logging.Logger.Info("emitting validator update event") data := &event.Validator{ + BaseUrl: vn.BaseURL, Provider: event.Provider{ - ID: validationNode.ID, - TotalStake: staked, + ID: vn.ID, + TotalStake: staked, + DelegateWallet: vn.StakePoolSettings.DelegateWallet, + NumDelegates: vn.StakePoolSettings.MaxNumDelegates, + ServiceCharge: vn.StakePoolSettings.ServiceChargeRatio, + LastHealthCheck: vn.LastHealthCheck, }, } - if validationNode.BaseURL != nil { - data.BaseUrl = *validationNode.BaseURL - } - - if validationNode.StakePoolSettings != nil { - if validationNode.StakePoolSettings.DelegateWallet != nil { - data.DelegateWallet = *validationNode.StakePoolSettings.DelegateWallet - } - if validationNode.StakePoolSettings.ServiceChargeRatio != nil { - data.ServiceCharge = *validationNode.StakePoolSettings.ServiceChargeRatio - } - if validationNode.StakePoolSettings.MaxNumDelegates != nil { - data.NumDelegates = *validationNode.StakePoolSettings.MaxNumDelegates - } - } - - if validationNode.LastHealthCheck != nil { - data.LastHealthCheck = *validationNode.LastHealthCheck - } - - balances.EmitEvent(event.TypeStats, event.TagUpdateValidator, validationNode.ID, data) + balances.EmitEvent(event.TypeStats, event.TagUpdateValidator, vn.ID, data) return nil } From ea2032ce054024ac85f5b4bbba718a3d8fd92501 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Mon, 10 Jul 2023 21:17:43 +0530 Subject: [PATCH 26/28] remove go:generate for the dto nodes. --- code/go/0chain.net/smartcontract/dto/minerdto.go | 2 -- code/go/0chain.net/smartcontract/dto/validationdto.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/code/go/0chain.net/smartcontract/dto/minerdto.go b/code/go/0chain.net/smartcontract/dto/minerdto.go index a99c97f406..daf7eb22f3 100644 --- a/code/go/0chain.net/smartcontract/dto/minerdto.go +++ b/code/go/0chain.net/smartcontract/dto/minerdto.go @@ -6,8 +6,6 @@ import ( "github.com/0chain/common/core/currency" ) -//go:generate msgp -io=false -tests=false -unexported -v - // NodeType used in pools statistic. type NodeType int diff --git a/code/go/0chain.net/smartcontract/dto/validationdto.go b/code/go/0chain.net/smartcontract/dto/validationdto.go index 6f8ab8ccb2..01f3c133de 100644 --- a/code/go/0chain.net/smartcontract/dto/validationdto.go +++ b/code/go/0chain.net/smartcontract/dto/validationdto.go @@ -5,8 +5,6 @@ import ( "0chain.net/smartcontract/provider" ) -//go:generate msgp -io=false -tests=false -unexported -v - type ValidationDtoNode struct { provider.Provider BaseURL *string `json:"url"` From 13f6602bbae036311b7f38f2066deabd606116fb Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Mon, 10 Jul 2023 21:59:24 +0530 Subject: [PATCH 27/28] remove go:generate for the dto nodes. --- code/go/0chain.net/smartcontract/storagesc/models.go | 5 ----- code/go/0chain.net/smartcontract/storagesc/validator.go | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/models.go b/code/go/0chain.net/smartcontract/storagesc/models.go index f69b226e9b..31c0fac83e 100644 --- a/code/go/0chain.net/smartcontract/storagesc/models.go +++ b/code/go/0chain.net/smartcontract/storagesc/models.go @@ -199,11 +199,6 @@ type ValidationNode struct { LastHealthCheck common.Timestamp `json:"last_health_check"` } -// validate the validator configurations -func (sn *ValidationNode) validate(_ *Config) (err error) { - return validateBaseUrl(&sn.BaseURL) -} - func validateBaseUrl(baseUrl *string) error { if baseUrl != nil && strings.Contains(*baseUrl, "localhost") && node.Self.Host != "localhost" { diff --git a/code/go/0chain.net/smartcontract/storagesc/validator.go b/code/go/0chain.net/smartcontract/storagesc/validator.go index 7202412629..56520bf7fe 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator.go @@ -270,7 +270,7 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, } } - inputValidator.LastHealthCheck = &txn.CreationDate + savedValidator.LastHealthCheck = txn.CreationDate if err := savedValidator.emitUpdate(existingStakePool, balances); err != nil { return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) } From 3ade9d138b64ddd2f560f22b26e8e432287131d7 Mon Sep 17 00:00:00 2001 From: Sunil Kumar Date: Wed, 12 Jul 2023 20:25:13 +0530 Subject: [PATCH 28/28] Refactoring the big name funcs to shorter names. --- .../smartcontract/storagesc/blobber.go | 107 +++++++++--------- .../smartcontract/storagesc/models.go | 10 +- .../smartcontract/storagesc/validator.go | 18 +-- 3 files changed, 65 insertions(+), 70 deletions(-) diff --git a/code/go/0chain.net/smartcontract/storagesc/blobber.go b/code/go/0chain.net/smartcontract/storagesc/blobber.go index e7e90af18c..56d6ba41e3 100644 --- a/code/go/0chain.net/smartcontract/storagesc/blobber.go +++ b/code/go/0chain.net/smartcontract/storagesc/blobber.go @@ -90,47 +90,47 @@ func validateBlobberUpdateSettings(updateBlobberRequest *dto.StorageDtoNode, con func (sc *StorageSmartContract) updateBlobber( txn *transaction.Transaction, conf *Config, - updateBlobberRequest *dto.StorageDtoNode, + updateBlobber *dto.StorageDtoNode, existingBlobber *StorageNode, - existingStakePool *stakePool, + existingSp *stakePool, balances cstate.StateContextI, ) (err error) { // validate the new terms and update the existing blobber's terms - if err = validateTermsInUpdatedRequestAndMergeInSavedBlobber(updateBlobberRequest, existingBlobber, conf); err != nil { + if err = validateAndSaveTerms(updateBlobber, existingBlobber, conf); err != nil { return err } - if err = validateGeolocationInUpdatedRequestAndMergeInSavedBlobber(updateBlobberRequest, existingBlobber); err != nil { + if err = validateAndSaveGeoLoc(updateBlobber, existingBlobber); err != nil { return err } - if updateBlobberRequest.NotAvailable != nil { - existingBlobber.NotAvailable = *updateBlobberRequest.NotAvailable + if updateBlobber.NotAvailable != nil { + existingBlobber.NotAvailable = *updateBlobber.NotAvailable } // storing the current capacity because existing blobber's capacity is updated. currentCapacity := existingBlobber.Capacity - if updateBlobberRequest.Capacity != nil { - if *updateBlobberRequest.Capacity <= 0 { - return sc.removeBlobber(txn, updateBlobberRequest, balances) + if updateBlobber.Capacity != nil { + if *updateBlobber.Capacity <= 0 { + return sc.removeBlobber(txn, updateBlobber, balances) } - existingBlobber.Capacity = *updateBlobberRequest.Capacity + existingBlobber.Capacity = *updateBlobber.Capacity } // validate other params like capacity and baseUrl - if err = validateBlobberUpdateSettings(updateBlobberRequest, conf); err != nil { + if err = validateBlobberUpdateSettings(updateBlobber, conf); err != nil { return fmt.Errorf("invalid blobber params: %v", err) } - if updateBlobberRequest.BaseURL != nil && *updateBlobberRequest.BaseURL != existingBlobber.BaseURL { - has, err := sc.hasBlobberUrl(*updateBlobberRequest.BaseURL, balances) + if updateBlobber.BaseURL != nil && *updateBlobber.BaseURL != existingBlobber.BaseURL { + has, err := sc.hasBlobberUrl(*updateBlobber.BaseURL, balances) if err != nil { return fmt.Errorf("could not check blobber url: %v", err) } if has { - return fmt.Errorf("blobber url update failed, %s already used", *updateBlobberRequest.BaseURL) + return fmt.Errorf("blobber url update failed, %s already used", *updateBlobber.BaseURL) } if existingBlobber.BaseURL != "" { @@ -140,8 +140,8 @@ func (sc *StorageSmartContract) updateBlobber( } } - if *updateBlobberRequest.BaseURL != "" { - existingBlobber.BaseURL = *updateBlobberRequest.BaseURL + if *updateBlobber.BaseURL != "" { + existingBlobber.BaseURL = *updateBlobber.BaseURL _, err = balances.InsertTrieNode(existingBlobber.GetUrlKey(sc.ID), &datastore.NOIDField{}) if err != nil { return fmt.Errorf("saving blobber url: " + err.Error()) @@ -158,18 +158,13 @@ func (sc *StorageSmartContract) updateBlobber( sc.statIncr(statNumberOfBlobbers) // reborn, if it was "removed" } - if err = validateStakePoolSettingsInUpdatedRequestAndMergeInSavedBlobber( - updateBlobberRequest, - existingBlobber, - existingStakePool, - conf, - ); err != nil { + if err = validateAndSaveSp(updateBlobber, existingBlobber, existingSp, conf); err != nil { return err } // update stake pool settings if write price has changed. - if updateBlobberRequest.Terms != nil && updateBlobberRequest.Terms.WritePrice != nil { - updatedStakedCapacity, err := existingStakePool.stakedCapacity(*updateBlobberRequest.Terms.WritePrice) + if updateBlobber.Terms != nil && updateBlobber.Terms.WritePrice != nil { + updatedStakedCapacity, err := existingSp.stakedCapacity(*updateBlobber.Terms.WritePrice) if err != nil { return fmt.Errorf("error calculating staked capacity: %v", err) } @@ -185,43 +180,43 @@ func (sc *StorageSmartContract) updateBlobber( return common.NewError("update_blobber_settings_failed", "saving blobber: "+err.Error()) } - if err = existingStakePool.Save(spenum.Blobber, updateBlobberRequest.ID, balances); err != nil { + if err = existingSp.Save(spenum.Blobber, updateBlobber.ID, balances); err != nil { return fmt.Errorf("saving stake pool: %v", err) } // existing blobber also contain the updated fields from the update blobber request - if err := emitUpdateBlobber(existingBlobber, existingStakePool, balances); err != nil { - return fmt.Errorf("emmiting blobber %v: %v", updateBlobberRequest, err) + if err := emitUpdateBlobber(existingBlobber, existingSp, balances); err != nil { + return fmt.Errorf("emmiting blobber %v: %v", updateBlobber, err) } return } -func validateTermsInUpdatedRequestAndMergeInSavedBlobber( - updatedBlobberRequest *dto.StorageDtoNode, +func validateAndSaveTerms( + updatedBlobber *dto.StorageDtoNode, existingBlobber *StorageNode, conf *Config, ) error { - if updatedBlobberRequest.Terms != nil { - if updatedBlobberRequest.Terms.ReadPrice != nil { - if err := validateReadPriceTerms(*updatedBlobberRequest.Terms.ReadPrice, conf); err != nil { + if updatedBlobber.Terms != nil { + if updatedBlobber.Terms.ReadPrice != nil { + if err := validateReadPrice(*updatedBlobber.Terms.ReadPrice, conf); err != nil { return fmt.Errorf("invalid blobber terms: %v", err) } - existingBlobber.Terms.ReadPrice = *updatedBlobberRequest.Terms.ReadPrice + existingBlobber.Terms.ReadPrice = *updatedBlobber.Terms.ReadPrice } - if updatedBlobberRequest.Terms.WritePrice != nil { - if err := validateWritePriceTerms(*updatedBlobberRequest.Terms.WritePrice, conf); err != nil { + if updatedBlobber.Terms.WritePrice != nil { + if err := validateWritePrice(*updatedBlobber.Terms.WritePrice, conf); err != nil { return fmt.Errorf("invalid blobber terms: %v", err) } - existingBlobber.Terms.WritePrice = *updatedBlobberRequest.Terms.WritePrice + existingBlobber.Terms.WritePrice = *updatedBlobber.Terms.WritePrice } } return nil } -func validateGeolocationInUpdatedRequestAndMergeInSavedBlobber( +func validateAndSaveGeoLoc( updatedBlobberRequest *dto.StorageDtoNode, existingBlobber *StorageNode, ) error { @@ -242,26 +237,26 @@ func validateGeolocationInUpdatedRequestAndMergeInSavedBlobber( return nil } -func validateStakePoolSettingsInUpdatedRequestAndMergeInSavedBlobber( - updateBlobberRequest *dto.StorageDtoNode, +func validateAndSaveSp( + updateBlobber *dto.StorageDtoNode, existingBlobber *StorageNode, - existingStakePool *stakePool, + existingSp *stakePool, conf *Config, ) error { - if updateBlobberRequest.StakePoolSettings != nil { - if updateBlobberRequest.StakePoolSettings.DelegateWallet != nil { - existingStakePool.Settings.DelegateWallet = *updateBlobberRequest.StakePoolSettings.DelegateWallet - existingBlobber.StakePoolSettings.DelegateWallet = *updateBlobberRequest.StakePoolSettings.DelegateWallet + if updateBlobber.StakePoolSettings != nil { + if updateBlobber.StakePoolSettings.DelegateWallet != nil { + existingSp.Settings.DelegateWallet = *updateBlobber.StakePoolSettings.DelegateWallet + existingBlobber.StakePoolSettings.DelegateWallet = *updateBlobber.StakePoolSettings.DelegateWallet } - if updateBlobberRequest.StakePoolSettings.ServiceChargeRatio != nil { - existingStakePool.Settings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio - existingBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobberRequest.StakePoolSettings.ServiceChargeRatio + if updateBlobber.StakePoolSettings.ServiceChargeRatio != nil { + existingSp.Settings.ServiceChargeRatio = *updateBlobber.StakePoolSettings.ServiceChargeRatio + existingBlobber.StakePoolSettings.ServiceChargeRatio = *updateBlobber.StakePoolSettings.ServiceChargeRatio } - if updateBlobberRequest.StakePoolSettings.MaxNumDelegates != nil { - existingStakePool.Settings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates - existingBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobberRequest.StakePoolSettings.MaxNumDelegates + if updateBlobber.StakePoolSettings.MaxNumDelegates != nil { + existingSp.Settings.MaxNumDelegates = *updateBlobber.StakePoolSettings.MaxNumDelegates + existingBlobber.StakePoolSettings.MaxNumDelegates = *updateBlobber.StakePoolSettings.MaxNumDelegates } if err := validateStakePoolSettings(existingBlobber.StakePoolSettings, conf); err != nil { @@ -381,25 +376,25 @@ func (sc *StorageSmartContract) updateBlobberSettings(txn *transaction.Transacti "can't get the blobber: "+err.Error()) } - var existingStakePool *stakePool - if existingStakePool, err = sc.getStakePool(spenum.Blobber, updatedBlobber.ID, balances); err != nil { + var existingSp *stakePool + if existingSp, err = sc.getStakePool(spenum.Blobber, updatedBlobber.ID, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", "can't get related stake pool: "+err.Error()) } - if existingStakePool.Settings.DelegateWallet == "" { + if existingSp.Settings.DelegateWallet == "" { return "", common.NewError("update_blobber_settings_failed", "blobber's delegate_wallet is not set") } - if txn.ClientID != existingStakePool.Settings.DelegateWallet { + if txn.ClientID != existingSp.Settings.DelegateWallet { return "", common.NewError("update_blobber_settings_failed", "access denied, allowed for delegate_wallet owner only") } // merge the savedBlobber and updatedBlobber fields using the deltas from the updatedBlobber and // emit the update blobber event to db. - if err = sc.updateBlobber(txn, conf, updatedBlobber, blobber, existingStakePool, balances); err != nil { + if err = sc.updateBlobber(txn, conf, updatedBlobber, blobber, existingSp, balances); err != nil { return "", common.NewError("update_blobber_settings_failed", err.Error()) } @@ -516,7 +511,7 @@ func (sc *StorageSmartContract) commitBlobberRead(t *transaction.Transaction, } var ( - numReads = commitRead.ReadMarker.ReadCounter - lastKnownCtr //todo check if it can be negative + numReads = commitRead.ReadMarker.ReadCounter - lastKnownCtr // todo check if it can be negative sizeRead = sizeInGB(numReads * CHUNK_SIZE) value = currency.Coin(float64(details.Terms.ReadPrice) * sizeRead) ) diff --git a/code/go/0chain.net/smartcontract/storagesc/models.go b/code/go/0chain.net/smartcontract/storagesc/models.go index 31c0fac83e..e772e69b6b 100644 --- a/code/go/0chain.net/smartcontract/storagesc/models.go +++ b/code/go/0chain.net/smartcontract/storagesc/models.go @@ -266,14 +266,14 @@ func (t *Terms) minLockDemand(gbSize, rdtu, minLockDemand float64) (currency.Coi // validate a received terms func (t *Terms) validate(conf *Config) (err error) { - if err = validateReadPriceTerms(t.ReadPrice, conf); err != nil { + if err = validateReadPrice(t.ReadPrice, conf); err != nil { return } - return validateWritePriceTerms(t.WritePrice, conf) + return validateWritePrice(t.WritePrice, conf) } -func validateReadPriceTerms(readPrice currency.Coin, conf *Config) error { +func validateReadPrice(readPrice currency.Coin, conf *Config) error { if readPrice > conf.MaxReadPrice { return errors.New("read_price is greater than max_read_price allowed") } @@ -281,7 +281,7 @@ func validateReadPriceTerms(readPrice currency.Coin, conf *Config) error { return nil } -func validateWritePriceTerms(writePrice currency.Coin, conf *Config) error { +func validateWritePrice(writePrice currency.Coin, conf *Config) error { if writePrice < conf.MinWritePrice { return errors.New("write_price is less than min_write_price allowed") } @@ -730,7 +730,7 @@ func (sa *StorageAllocation) addToWritePool( balances cstate.StateContextI, opts ...WithOption, ) error { - //default behaviour + // default behaviour if len(opts) == 0 { value, err := WithTokenTransfer(txn.Value, txn.ClientID, txn.ToClientID)(balances) if err != nil { diff --git a/code/go/0chain.net/smartcontract/storagesc/validator.go b/code/go/0chain.net/smartcontract/storagesc/validator.go index 56520bf7fe..74401e7f35 100644 --- a/code/go/0chain.net/smartcontract/storagesc/validator.go +++ b/code/go/0chain.net/smartcontract/storagesc/validator.go @@ -22,7 +22,7 @@ const ( func (sc *StorageSmartContract) addValidator(t *transaction.Transaction, input []byte, balances state.StateContextI) (string, error) { newValidator := newValidator("") - err := newValidator.Decode(input) //json.Unmarshal(input, &newValidator) + err := newValidator.Decode(input) // json.Unmarshal(input, &newValidator) if err != nil { return "", err } @@ -236,8 +236,8 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, } // update stake pool settings - var existingStakePool *stakePool - if existingStakePool, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { + var sp *stakePool + if sp, err = sc.getStakePool(spenum.Validator, inputValidator.ID, balances); err != nil { return fmt.Errorf("can't get stake pool: %v", err) } @@ -246,32 +246,32 @@ func (sc *StorageSmartContract) updateValidator(txn *transaction.Transaction, sc.statIncr(statUpdateValidator) if inputValidator.StakePoolSettings.ServiceChargeRatio != nil { - existingStakePool.Settings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio + sp.Settings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio savedValidator.StakePoolSettings.ServiceChargeRatio = *inputValidator.StakePoolSettings.ServiceChargeRatio } if inputValidator.StakePoolSettings.MaxNumDelegates != nil { - existingStakePool.Settings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates + sp.Settings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates savedValidator.StakePoolSettings.MaxNumDelegates = *inputValidator.StakePoolSettings.MaxNumDelegates } if inputValidator.StakePoolSettings.DelegateWallet != nil { - existingStakePool.Settings.DelegateWallet = *inputValidator.StakePoolSettings.DelegateWallet + sp.Settings.DelegateWallet = *inputValidator.StakePoolSettings.DelegateWallet savedValidator.StakePoolSettings.DelegateWallet = *inputValidator.StakePoolSettings.DelegateWallet } - if err = validateStakePoolSettings(existingStakePool.StakePool.Settings, conf); err != nil { + if err = validateStakePoolSettings(sp.StakePool.Settings, conf); err != nil { return fmt.Errorf("invalid new stake pool settings: %v", err) } // save stake pool - if err = existingStakePool.Save(spenum.Validator, inputValidator.ID, balances); err != nil { + if err = sp.Save(spenum.Validator, inputValidator.ID, balances); err != nil { return fmt.Errorf("saving stake pool: %v", err) } } savedValidator.LastHealthCheck = txn.CreationDate - if err := savedValidator.emitUpdate(existingStakePool, balances); err != nil { + if err := savedValidator.emitUpdate(sp, balances); err != nil { return fmt.Errorf("emmiting validator %v: %v", inputValidator, err) }