github.com/aswedchain/aswed@v1.0.1/consensus/congress/systemcontract/validators_v0.go (about) 1 package systemcontract 2 3 import ( 4 "bytes" 5 "errors" 6 "github.com/aswedchain/aswed/accounts/abi" 7 "github.com/aswedchain/aswed/common" 8 "github.com/aswedchain/aswed/consensus/congress/vmcaller" 9 "github.com/aswedchain/aswed/core" 10 "github.com/aswedchain/aswed/core/state" 11 "github.com/aswedchain/aswed/core/types" 12 "github.com/aswedchain/aswed/log" 13 "github.com/aswedchain/aswed/params" 14 "math" 15 "math/big" 16 "sort" 17 ) 18 19 type ValidatorV0 struct { 20 abi abi.ABI 21 contractAddr common.Address 22 } 23 24 func NewValidatorV0() *ValidatorV0 { 25 return &ValidatorV0{ 26 abi: abiMap[ValidatorsContractName], 27 contractAddr: ValidatorsContractAddr, 28 } 29 } 30 31 func (v *ValidatorV0) GetTopValidators(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) ([]common.Address, error) { 32 method := "getTopValidators" 33 data, err := v.abi.Pack(method) 34 if err != nil { 35 log.Error("Can't pack data for getTopValidators", "error", err) 36 return []common.Address{}, err 37 } 38 39 msg := types.NewMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 40 41 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 42 if err != nil { 43 return []common.Address{}, err 44 } 45 46 // unpack data 47 ret, err := v.abi.Unpack(method, result) 48 if err != nil { 49 return []common.Address{}, err 50 } 51 if len(ret) != 1 { 52 return []common.Address{}, errors.New("invalid params length") 53 } 54 validators, ok := ret[0].([]common.Address) 55 if !ok { 56 return []common.Address{}, errors.New("invalid validators format") 57 } 58 sort.Slice(validators, func(i, j int) bool { 59 return bytes.Compare(validators[i][:], validators[j][:]) < 0 60 }) 61 return validators, err 62 } 63 64 func (v *ValidatorV0) GetValidatorFeeAddr(val common.Address, statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (common.Address, error) { 65 method := "getValidatorInfo" 66 data, err := v.abi.Pack(method, val) 67 if err != nil { 68 log.Error("Can't pack data for GetValidatorInfo", "error", err) 69 return common.Address{}, err 70 } 71 msg := types.NewMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false) 72 73 // use parent 74 result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config) 75 if err != nil { 76 return common.Address{}, err 77 } 78 // unpack data 79 ret, err := v.abi.Unpack(method, result) 80 if err != nil { 81 return common.Address{}, err 82 } 83 feeAddr, ok := ret[0].(common.Address) 84 if !ok { 85 return common.Address{}, errors.New("invalid output") 86 } 87 return feeAddr, nil 88 }