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 }