github.com/DxChainNetwork/dxc@v0.8.1-0.20220824085222-1162e304b6e7/consensus/dpos/systemcontract/validators.go (about)

     1  package systemcontract
     2  
     3  import (
     4  	"github.com/DxChainNetwork/dxc/accounts/abi"
     5  	"github.com/DxChainNetwork/dxc/common"
     6  	"github.com/DxChainNetwork/dxc/consensus/dpos/vmcaller"
     7  	"github.com/DxChainNetwork/dxc/core"
     8  	"github.com/DxChainNetwork/dxc/core/state"
     9  	"github.com/DxChainNetwork/dxc/core/types"
    10  	"github.com/DxChainNetwork/dxc/log"
    11  	"github.com/DxChainNetwork/dxc/params"
    12  	"math"
    13  	"math/big"
    14  )
    15  
    16  type Validators struct {
    17  	abi          abi.ABI
    18  	contractAddr common.Address
    19  }
    20  
    21  func NewValidators() *Validators {
    22  	return &Validators{
    23  		abi:          abiMap[ValidatorsContractName],
    24  		contractAddr: ValidatorsContractAddr,
    25  	}
    26  }
    27  
    28  type Validator struct {
    29  	Status                  uint8
    30  	Deposit                 *big.Int
    31  	Rate                    uint8
    32  	Name                    string
    33  	Details                 string
    34  	Votes                   *big.Int
    35  	UnstakeLockingEndBlock  *big.Int
    36  	RateSettLockingEndBlock *big.Int
    37  }
    38  
    39  func (v *Validators) GetCurrentEpochValidators(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) ([]common.Address, error) {
    40  	method := "getCurEpochValidators"
    41  	data, err := v.abi.Pack(method)
    42  	if err != nil {
    43  		log.Error("Validators Pack error", "method", method, "error", err)
    44  		return []common.Address{}, err
    45  	}
    46  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
    47  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
    48  	if err != nil {
    49  		log.Error("Validators contract execute error", "method", method, "error", err)
    50  		return []common.Address{}, err
    51  	}
    52  
    53  	ret, err := v.abi.Unpack(method, result)
    54  	if err != nil {
    55  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
    56  		return []common.Address{}, err
    57  	}
    58  
    59  	vals, ok := ret[0].([]common.Address)
    60  	if !ok {
    61  		log.Error("Validators contract format result error", "method", method, "error", err)
    62  		return []common.Address{}, err
    63  	}
    64  
    65  	return vals, nil
    66  }
    67  
    68  func (v *Validators) GetEffictiveValidatorsWithPage(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, page *big.Int, size *big.Int) ([]common.Address, error) {
    69  	method := "getEffictiveValidatorsWithPage"
    70  	data, err := v.abi.Pack(method, page, size)
    71  	if err != nil {
    72  		log.Error("Validators Pack error", "method", method, "error", err)
    73  		return []common.Address{}, err
    74  	}
    75  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
    76  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
    77  	if err != nil {
    78  		log.Error("Validators contract execute error", "method", method, "error", err)
    79  		return []common.Address{}, err
    80  	}
    81  
    82  	ret, err := v.abi.Unpack(method, result)
    83  	if err != nil {
    84  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
    85  		return []common.Address{}, err
    86  	}
    87  	vals, ok := ret[0].([]common.Address)
    88  	if !ok {
    89  		log.Error("Validators contract format result error", "method", method, "error", err)
    90  		return []common.Address{}, err
    91  	}
    92  
    93  	return vals, nil
    94  }
    95  
    96  // GetValidatorVoters get the address voters
    97  func (v *Validators) GetValidatorVoters(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address, page *big.Int, size *big.Int) ([]common.Address, error) {
    98  	method := "getValidatorVoters"
    99  	data, err := v.abi.Pack(method, addr, page, size)
   100  	if err != nil {
   101  		log.Error("Validators Pack error", "method", method, "error", err)
   102  		return []common.Address{}, err
   103  	}
   104  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   105  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   106  	if err != nil {
   107  		log.Error("Validators contract execute error", "method", method, "error", err)
   108  		return []common.Address{}, err
   109  	}
   110  
   111  	ret, err := v.abi.Unpack(method, result)
   112  	if err != nil {
   113  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   114  		return []common.Address{}, err
   115  	}
   116  	voters, ok := ret[0].([]common.Address)
   117  	if !ok {
   118  		log.Error("Validators contract format result error", "method", method, "error", err)
   119  		return []common.Address{}, err
   120  	}
   121  
   122  	return voters, nil
   123  }
   124  
   125  // GetInvalidValidatorsWithPage get invalid validators
   126  func (v *Validators) GetInvalidValidatorsWithPage(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, page *big.Int, size *big.Int) ([]common.Address, error) {
   127  	method := "getInvalidValidatorsWithPage"
   128  	data, err := v.abi.Pack(method, page, size)
   129  	if err != nil {
   130  		log.Error("Validators Pack error", "method", method, "error", err)
   131  		return []common.Address{}, err
   132  	}
   133  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   134  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   135  	if err != nil {
   136  		log.Error("Validators contract execute error", "method", method, "error", err)
   137  		return []common.Address{}, err
   138  	}
   139  
   140  	ret, err := v.abi.Unpack(method, result)
   141  	if err != nil {
   142  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   143  		return []common.Address{}, err
   144  	}
   145  	vals, ok := ret[0].([]common.Address)
   146  	if !ok {
   147  		log.Error("Validators contract format result error", "method", method, "error", err)
   148  		return []common.Address{}, err
   149  	}
   150  
   151  	return vals, nil
   152  }
   153  
   154  // GetCancelQueueValidators get canceling queue validators
   155  func (v *Validators) GetCancelQueueValidators(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) ([]common.Address, error) {
   156  	method := "getCancelQueueValidators"
   157  	data, err := v.abi.Pack(method)
   158  	if err != nil {
   159  		log.Error("Validators Pack error", "method", method, "error", err)
   160  		return []common.Address{}, err
   161  	}
   162  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   163  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   164  	if err != nil {
   165  		log.Error("Validators contract execute error", "method", method, "error", err)
   166  		return []common.Address{}, err
   167  	}
   168  
   169  	ret, err := v.abi.Unpack(method, result)
   170  	if err != nil {
   171  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   172  		return []common.Address{}, err
   173  	}
   174  	vals, ok := ret[0].([]common.Address)
   175  	if !ok {
   176  		log.Error("Validators contract format result error", "method", method, "error", err)
   177  		return []common.Address{}, err
   178  	}
   179  
   180  	return vals, nil
   181  }
   182  
   183  // EffictiveValsLength function EffictiveValsLength
   184  func (v *Validators) EffictiveValsLength(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (*big.Int, error) {
   185  	method := "effictiveValsLength"
   186  	data, err := v.abi.Pack(method)
   187  
   188  	if err != nil {
   189  		log.Error("Validators Pack error", "method", method, "error", err)
   190  		return big.NewInt(0), err
   191  	}
   192  
   193  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   194  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   195  	if err != nil {
   196  		log.Error("Validators contract execute error", "method", method, "error", err)
   197  		return big.NewInt(0), err
   198  	}
   199  
   200  	ret, err := v.abi.Unpack(method, result)
   201  	if err != nil {
   202  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   203  		return big.NewInt(0), err
   204  	}
   205  	count, ok := ret[0].(*big.Int)
   206  	if !ok {
   207  		log.Error("Validators contract format result error", "method", method, "error", err)
   208  		return big.NewInt(0), err
   209  	}
   210  	return count, nil
   211  
   212  }
   213  
   214  // InvalidValsLength function InvalidValsLength
   215  func (v *Validators) InvalidValsLength(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (*big.Int, error) {
   216  	method := "invalidValsLength"
   217  	data, err := v.abi.Pack(method)
   218  
   219  	if err != nil {
   220  		log.Error("Validators Pack error", "method", method, "error", err)
   221  		return big.NewInt(0), err
   222  	}
   223  
   224  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   225  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   226  	if err != nil {
   227  		log.Error("Validators contract execute error", "method", method, "error", err)
   228  		return big.NewInt(0), err
   229  	}
   230  
   231  	ret, err := v.abi.Unpack(method, result)
   232  	if err != nil {
   233  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   234  		return big.NewInt(0), err
   235  	}
   236  	count, ok := ret[0].(*big.Int)
   237  	if !ok {
   238  		log.Error("Validators contract format result error", "method", method, "error", err)
   239  		return big.NewInt(0), err
   240  	}
   241  	return count, nil
   242  
   243  }
   244  
   245  // CancelQueueValidatorsLength function CancelQueueValidatorsLength
   246  func (v *Validators) CancelQueueValidatorsLength(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (*big.Int, error) {
   247  	method := "CancelQueueValidatorsLength"
   248  	data, err := v.abi.Pack(method)
   249  
   250  	if err != nil {
   251  		log.Error("Validators Pack error", "method", method, "error", err)
   252  		return big.NewInt(0), err
   253  	}
   254  
   255  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   256  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   257  	if err != nil {
   258  		log.Error("Validators contract execute error", "method", method, "error", err)
   259  		return big.NewInt(0), err
   260  	}
   261  
   262  	ret, err := v.abi.Unpack(method, result)
   263  	if err != nil {
   264  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   265  		return big.NewInt(0), err
   266  	}
   267  	count, ok := ret[0].(*big.Int)
   268  	if !ok {
   269  		log.Error("Validators contract format result error", "method", method, "error", err)
   270  		return big.NewInt(0), err
   271  	}
   272  	return count, nil
   273  
   274  }
   275  
   276  // ValidatorVotersLength function validatorVotersLength
   277  func (v *Validators) ValidatorVotersLength(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address) (*big.Int, error) {
   278  	method := "validatorVotersLength"
   279  	data, err := v.abi.Pack(method, addr)
   280  
   281  	if err != nil {
   282  		log.Error("Validators Pack error", "method", method, "error", err)
   283  		return big.NewInt(0), err
   284  	}
   285  
   286  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   287  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   288  	if err != nil {
   289  		log.Error("Validators contract execute error", "method", method, "error", err)
   290  		return big.NewInt(0), err
   291  	}
   292  
   293  	ret, err := v.abi.Unpack(method, result)
   294  	if err != nil {
   295  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   296  		return big.NewInt(0), err
   297  	}
   298  	count, ok := ret[0].(*big.Int)
   299  	if !ok {
   300  		log.Error("Validators contract format result error", "method", method, "error", err)
   301  		return big.NewInt(0), err
   302  	}
   303  	return count, nil
   304  
   305  }
   306  
   307  // IsEffictiveValidator function IsEffictiveValidator
   308  func (v *Validators) IsEffictiveValidator(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address) (bool, error) {
   309  	method := "isEffictiveValidator"
   310  	data, err := v.abi.Pack(method, addr)
   311  
   312  	if err != nil {
   313  		log.Error("Validators Pack error", "method", method, "error", err)
   314  		return false, err
   315  	}
   316  
   317  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   318  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   319  	if err != nil {
   320  		log.Error("Validators contract execute error", "method", method, "error", err)
   321  		return false, err
   322  	}
   323  
   324  	ret, err := v.abi.Unpack(method, result)
   325  	if err != nil {
   326  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   327  		return false, err
   328  	}
   329  	val, ok := ret[0].(bool)
   330  	if !ok {
   331  		log.Error("Validators contract format result error", "method", method, "error", err)
   332  		return false, err
   333  	}
   334  	return val, nil
   335  
   336  }
   337  
   338  // GetValidator function GetValidator
   339  func (v *Validators) GetValidator(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig, addr common.Address) (*Validator, error) {
   340  	method := "validators"
   341  	data, err := v.abi.Pack(method, addr)
   342  	if err != nil {
   343  		log.Error("Validators Pack error", "method", method, "error", err)
   344  		return &Validator{}, err
   345  	}
   346  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   347  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   348  	if err != nil {
   349  		log.Error("Validators contract execute error", "method", method, "error", err)
   350  		return &Validator{}, err
   351  	}
   352  	val := &Validator{}
   353  	err = v.abi.UnpackIntoInterface(val, method, result)
   354  	if err != nil {
   355  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   356  		return &Validator{}, err
   357  	}
   358  	return val, nil
   359  }
   360  
   361  // TotalDeposit function TotalDeposit
   362  func (v *Validators) TotalDeposit(statedb *state.StateDB, header *types.Header, chainContext core.ChainContext, config *params.ChainConfig) (*big.Int, error) {
   363  	method := "totalDeposit"
   364  	data, err := v.abi.Pack(method)
   365  
   366  	if err != nil {
   367  		log.Error("Validators Pack error", "method", method, "error", err)
   368  		return big.NewInt(0), err
   369  	}
   370  
   371  	msg := vmcaller.NewLegacyMessage(header.Coinbase, &v.contractAddr, 0, new(big.Int), math.MaxUint64, new(big.Int), data, false)
   372  	result, err := vmcaller.ExecuteMsg(msg, statedb, header, chainContext, config)
   373  	if err != nil {
   374  		log.Error("Validators contract execute error", "method", method, "error", err)
   375  		return big.NewInt(0), err
   376  	}
   377  
   378  	ret, err := v.abi.Unpack(method, result)
   379  	if err != nil {
   380  		log.Error("Validators contract Unpack error", "method", method, "error", err, "result", result)
   381  		return big.NewInt(0), err
   382  	}
   383  	deposit, ok := ret[0].(*big.Int)
   384  	if !ok {
   385  		log.Error("Validators contract format result error", "method", method, "error", err)
   386  		return big.NewInt(0), err
   387  	}
   388  	return deposit, nil
   389  
   390  }