From f6fc613ab71651ac5777c0d8f5e60333997bcf82 Mon Sep 17 00:00:00 2001 From: Brice Wang Date: Mon, 24 Jun 2019 20:56:22 -0700 Subject: [PATCH] Move registry fetch error to global variable (#294) * Add global ErrNotDeployed * Gofmt fix * Rename error to ErrSmartContractNotDeployed * Add default case for address retrieval error * Lint fix --- common/compiler/solidity_test.go | 2 +- consensus/istanbul/backend/engine.go | 19 ++++++++++++++----- core/currency.go | 16 ++++++++++++---- core/random.go | 4 +++- core/registeredAddresses.go | 7 ++++++- eth/gasprice/access_gasprice.go | 4 +++- 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 0da3bb337e89..483a2f349ab4 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -25,7 +25,7 @@ const ( testSource = ` contract test { /// @notice Will multiply ` + "`a`" + ` by 7. - function multiply(uint a) returns(uint d) { + function multiply(uint a) public returns(uint d) { return a * 7; } } diff --git a/consensus/istanbul/backend/engine.go b/consensus/istanbul/backend/engine.go index c807f5f25030..a8b80deef535 100644 --- a/consensus/istanbul/backend/engine.go +++ b/consensus/istanbul/backend/engine.go @@ -420,9 +420,12 @@ func (sb *Backend) Prepare(chain consensus.ChainReader, header *types.Header) er func (sb *Backend) getValSet(header *types.Header, state *state.StateDB) ([]common.Address, error) { var newValSet []common.Address validatorsAddress, err := sb.regAdd.GetRegisteredAddress(params.ValidatorsRegistryId) - if err != nil { + if err == core.ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) return newValSet, errValidatorsContractNotRegistered + } else if err != nil { + log.Error(err.Error()) + return newValSet, err } else { // Get the new epoch's validator set maxGasForGetValidators := uint64(1000000) @@ -465,7 +468,7 @@ func (sb *Backend) UpdateValSetDiff(chain consensus.ChainReader, header *types.H return nil } -// UpdateValSetDiff will update the validator set diff in the header, if the mined header is the last block of the epoch +// TODO(brice): This needs a comment. func (sb *Backend) IsLastBlockOfEpoch(header *types.Header) bool { return istanbul.IsLastBlockOfEpoch(header.Number.Uint64(), sb.config.Epoch) } @@ -483,22 +486,28 @@ func (sb *Backend) Finalize(chain consensus.ChainReader, header *types.Header, s // Add block rewards goldTokenAddress, err := sb.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId) - if err != nil { + if err == core.ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) + } else if err != nil { + log.Error(err.Error()) } if goldTokenAddress != nil { // add block rewards only if goldtoken smart contract has been initialized totalBlockRewards := big.NewInt(0) infrastructureBlockReward := big.NewInt(params.Ether) governanceAddress, err := sb.regAdd.GetRegisteredAddress(params.GovernanceRegistryId) - if err != nil { + if err == core.ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) + } else if err != nil { + log.Error(err.Error()) } stakerBlockReward := big.NewInt(params.Ether) bondedDepositsAddress, err := sb.regAdd.GetRegisteredAddress(params.BondedDepositsRegistryId) - if err != nil { + if err == core.ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) + } else if err != nil { + log.Error(err.Error()) } if governanceAddress != nil && bondedDepositsAddress != nil { diff --git a/core/currency.go b/core/currency.go index beabc6720f52..976009a88cbe 100644 --- a/core/currency.go +++ b/core/currency.go @@ -133,9 +133,11 @@ func (co *CurrencyOperator) getExchangeRate(currency *common.Address) (*exchange func (co *CurrencyOperator) ConvertToGold(val *big.Int, currencyFrom *common.Address) (*big.Int, error) { celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId) - if err != nil || currencyFrom == celoGoldAddress { + if err == ErrSmartContractNotDeployed || currencyFrom == celoGoldAddress { log.Warn("Registry address lookup failed", "err", err) return val, nil + } else if err != nil { + log.Error(err.Error()) } return co.Convert(val, currencyFrom, celoGoldAddress) } @@ -202,16 +204,20 @@ func (co *CurrencyOperator) retrieveExchangeRates() { sortedOraclesAddress, err := co.regAdd.GetRegisteredAddress(params.SortedOraclesRegistryId) - if err != nil { + if err == ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) return + } else if err != nil { + log.Error(err.Error()) } celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId) - if err != nil { + if err == ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) return + } else if err != nil { + log.Error(err.Error()) } co.currencyOperatorMu.Lock() @@ -312,9 +318,11 @@ func (gcWl *GasCurrencyWhitelist) retrieveWhitelist() []common.Address { returnList := []common.Address{} gasCurrencyWhiteListAddress, err := gcWl.regAdd.GetRegisteredAddress(params.GasCurrencyWhitelistRegistryId) - if err != nil { + if err == ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) return returnList + } else if err != nil { + log.Error(err.Error()) } log.Trace("GasCurrencyWhiteList.retrieveWhiteList() - Calling retrieveWhiteList", "address", gasCurrencyWhiteListAddress.Hex()) diff --git a/core/random.go b/core/random.go index 3b250674c892..518c71228e29 100644 --- a/core/random.go +++ b/core/random.go @@ -113,8 +113,10 @@ func NewRandom(registeredAddresses *RegisteredAddresses, iEvmH *InternalEVMHandl func (r *Random) address() *common.Address { if r.registeredAddresses != nil { randomAddress, err := r.registeredAddresses.GetRegisteredAddress(params.RandomRegistryId) - if err != nil { + if err == ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) + } else if err != nil { + log.Error(err.Error()) } return randomAddress } else { diff --git a/core/registeredAddresses.go b/core/registeredAddresses.go index f5b9bd69dea2..1b8a804c6ff0 100644 --- a/core/registeredAddresses.go +++ b/core/registeredAddresses.go @@ -27,6 +27,9 @@ import ( "github.com/ethereum/go-ethereum/params" ) +// ErrSmartContractNotDeployed is returned when the RegisteredAddresses mapping does not contain the specified contract +var ErrSmartContractNotDeployed = errors.New("registry contract not deployed") + const ( // This is taken from celo-monorepo/packages/protocol/build//contracts/Registry.json getAddressForABI = `[{"constant": true, @@ -104,6 +107,8 @@ func (ra *RegisteredAddresses) RefreshAddresses() { } func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) (*common.Address, error) { + log.Trace("RegisteredAddresses.GetRegisteredAddress called for", "registryId", registryId) + if len(ra.registeredAddresses) == 0 { // This refresh is for a light client that failed to refresh (did not have a network connection) during node construction ra.RefreshAddresses() } @@ -112,7 +117,7 @@ func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) (*common. defer ra.registeredAddressesMu.RUnlock() if address, ok := ra.registeredAddresses[registryId]; !ok { - return nil, errors.New("RegisteredAddresses.GetRegisteredAddress - " + registryId + " contract not deployed") + return nil, ErrSmartContractNotDeployed } else { return &address, nil } diff --git a/eth/gasprice/access_gasprice.go b/eth/gasprice/access_gasprice.go index 4c2d3628724c..e9d5e1073695 100644 --- a/eth/gasprice/access_gasprice.go +++ b/eth/gasprice/access_gasprice.go @@ -55,9 +55,11 @@ func GetGasPrice(ctx context.Context, iEvmH *core.InternalEVMHandler, regAdd *co var gasPrice *big.Int gasPriceOracleAddress, err := regAdd.GetRegisteredAddress(params.GasPriceOracleRegistryId) - if err != nil { + if err == core.ErrSmartContractNotDeployed { log.Warn("Registry address lookup failed", "err", err) return big.NewInt(0), errors.New("no gasprice oracle contract address found") + } else if err != nil { + log.Error(err.Error()) } _, err = iEvmH.MakeStaticCall(*gasPriceOracleAddress, gasPriceOracleABI, "getGasPriceSuggestion", []interface{}{}, &gasPrice, 2000, nil, nil)