Skip to content

Commit

Permalink
Return error on registry address lookup failure (ethereum#280)
Browse files Browse the repository at this point in the history
* Return error on registry address lookup failure
  • Loading branch information
bricewang authored Jun 19, 2019
1 parent a824e97 commit 4642776
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 27 deletions.
2 changes: 1 addition & 1 deletion consensus/consensus.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ type ConsensusIEvmH interface {
}

type ConsensusRegAdd interface {
GetRegisteredAddress(registryId string) *common.Address
GetRegisteredAddress(registryId string) (*common.Address, error)
}

// Engine is an algorithm agnostic consensus engine.
Expand Down
19 changes: 12 additions & 7 deletions consensus/istanbul/backend/engine.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,14 +378,15 @@ 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
validatorAddress := sb.regAdd.GetRegisteredAddress(params.ValidatorsRegistryId)
if validatorAddress == nil {
validatorsAddress, err := sb.regAdd.GetRegisteredAddress(params.ValidatorsRegistryId)
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
return newValSet, errValidatorsContractNotRegistered
} else {
// Get the new epoch's validator set
maxGasForGetValidators := uint64(1000000)
// TODO(asa) - Once the validator election smart contract is completed, then a more accurate gas value should be used.
_, err := sb.iEvmH.MakeStaticCall(*validatorAddress, getValidatorsFuncABI, "getValidators", []interface{}{}, &newValSet, maxGasForGetValidators, header, state)
_, err := sb.iEvmH.MakeStaticCall(*validatorsAddress, getValidatorsFuncABI, "getValidators", []interface{}{}, &newValSet, maxGasForGetValidators, header, state)
return newValSet, err
}
}
Expand Down Expand Up @@ -440,14 +441,18 @@ func (sb *Backend) Finalize(chain consensus.ChainReader, header *types.Header, s
sb.updateGasPriceSuggestion(state)

infrastructureBlockReward := big.NewInt(params.Ether)
governanceAddress := sb.regAdd.GetRegisteredAddress(params.GovernanceRegistryId)
if governanceAddress != nil {
governanceAddress, err := sb.regAdd.GetRegisteredAddress(params.GovernanceRegistryId)
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
} else {
state.AddBalance(*governanceAddress, infrastructureBlockReward)
}

stakerBlockReward := big.NewInt(params.Ether)
bondedDepositsAddress := sb.regAdd.GetRegisteredAddress(params.BondedDepositsRegistryId)
if bondedDepositsAddress != nil {
bondedDepositsAddress, err := sb.regAdd.GetRegisteredAddress(params.BondedDepositsRegistryId)
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
} else {
state.AddBalance(*bondedDepositsAddress, stakerBlockReward)
_, err := sb.iEvmH.MakeCall(*bondedDepositsAddress, setCumulativeRewardWeightFuncABI, "setCumulativeRewardWeight", []interface{}{stakerBlockReward}, nil, 100000, big.NewInt(0), header, state)
if err != nil {
Expand Down
23 changes: 12 additions & 11 deletions core/currency.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,9 @@ func (co *CurrencyOperator) getExchangeRate(currency *common.Address) (*exchange
}

func (co *CurrencyOperator) ConvertToGold(val *big.Int, currencyFrom *common.Address) (*big.Int, error) {
celoGoldAddress := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)
if currencyFrom == nil || currencyFrom == celoGoldAddress {
celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)
if err != nil || currencyFrom == celoGoldAddress {
log.Warn("Registry address lookup failed", "err", err)
return val, nil
}
return co.Convert(val, currencyFrom, celoGoldAddress)
Expand Down Expand Up @@ -199,17 +200,17 @@ func (co *CurrencyOperator) retrieveExchangeRates() {
gasCurrencyAddresses := co.gcWl.retrieveWhitelist()
log.Trace("CurrencyOperator.retrieveExchangeRates called", "gasCurrencyAddresses", gasCurrencyAddresses)

sortedOraclesAddress := co.regAdd.GetRegisteredAddress(params.SortedOraclesRegistryId)
sortedOraclesAddress, err := co.regAdd.GetRegisteredAddress(params.SortedOraclesRegistryId)

if sortedOraclesAddress == nil {
log.Error("Can't get the sortedOracles smart contract address from the registry")
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
return
}

celoGoldAddress := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)
celoGoldAddress, err := co.regAdd.GetRegisteredAddress(params.GoldTokenRegistryId)

if celoGoldAddress == nil {
log.Error("Can't get the celo gold smart contract address from the registry")
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
return
}

Expand Down Expand Up @@ -310,9 +311,9 @@ func (gcWl *GasCurrencyWhitelist) retrieveWhitelist() []common.Address {

returnList := []common.Address{}

gasCurrencyWhiteListAddress := gcWl.regAdd.GetRegisteredAddress(params.GasCurrencyWhitelistRegistryId)
if gasCurrencyWhiteListAddress == nil {
log.Error("Can't get the gas currency whitelist smart contract address from the registry")
gasCurrencyWhiteListAddress, err := gcWl.regAdd.GetRegisteredAddress(params.GasCurrencyWhitelistRegistryId)
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
return returnList
}

Expand Down
6 changes: 5 additions & 1 deletion core/random.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,11 @@ func NewRandom(registeredAddresses *RegisteredAddresses, iEvmH *InternalEVMHandl

func (r *Random) address() *common.Address {
if r.registeredAddresses != nil {
return r.registeredAddresses.GetRegisteredAddress(params.RandomRegistryId)
randomAddress, err := r.registeredAddresses.GetRegisteredAddress(params.RandomRegistryId)
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
}
return randomAddress
} else {
return nil
}
Expand Down
8 changes: 4 additions & 4 deletions core/registeredAddresses.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package core

import (
"errors"
"strings"
"sync"

Expand Down Expand Up @@ -102,7 +103,7 @@ func (ra *RegisteredAddresses) RefreshAddresses() {
ra.registeredAddressesMu.Unlock()
}

func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) *common.Address {
func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) (*common.Address, error) {
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()
}
Expand All @@ -111,10 +112,9 @@ func (ra *RegisteredAddresses) GetRegisteredAddress(registryId string) *common.A
defer ra.registeredAddressesMu.RUnlock()

if address, ok := ra.registeredAddresses[registryId]; !ok {
log.Error("RegisteredAddresses.GetRegisteredAddress - Error in address retrieval for ", "registry", registryId)
return nil
return nil, errors.New("RegisteredAddresses.GetRegisteredAddress - " + registryId + " contract not deployed")
} else {
return &address
return &address, nil
}
}

Expand Down
8 changes: 5 additions & 3 deletions eth/gasprice/access_gasprice.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (

"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
)

Expand Down Expand Up @@ -52,13 +53,14 @@ var (
func GetGasPrice(ctx context.Context, iEvmH *core.InternalEVMHandler, regAdd *core.RegisteredAddresses) (*big.Int, error) {

var gasPrice *big.Int
gasPriceOracleAddress := regAdd.GetRegisteredAddress(params.GasPriceOracleRegistryId)
gasPriceOracleAddress, err := regAdd.GetRegisteredAddress(params.GasPriceOracleRegistryId)

if gasPriceOracleAddress == nil {
if err != nil {
log.Warn("Registry address lookup failed", "err", err)
return big.NewInt(0), errors.New("no gasprice oracle contract address found")
}

_, err := iEvmH.MakeStaticCall(*gasPriceOracleAddress, gasPriceOracleABI, "getGasPriceSuggestion", []interface{}{}, &gasPrice, 2000, nil, nil)
_, err = iEvmH.MakeStaticCall(*gasPriceOracleAddress, gasPriceOracleABI, "getGasPriceSuggestion", []interface{}{}, &gasPrice, 2000, nil, nil)

return gasPrice, err
}

0 comments on commit 4642776

Please sign in to comment.