bsc/consensus/parlia/lubanFork.go
2024-02-02 15:55:18 +08:00

50 lines
1.4 KiB
Go

package parlia
import (
"context"
"math/big"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/core/systemcontracts"
"github.com/ethereum/go-ethereum/internal/ethapi"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rpc"
)
func (p *Parlia) getCurrentValidatorsBeforeLuban(blockHash common.Hash, blockNumber *big.Int) ([]common.Address, error) {
blockNr := rpc.BlockNumberOrHashWithHash(blockHash, false)
// prepare different method
method := "getValidators"
if p.chainConfig.IsEuler(blockNumber) {
method = "getMiningValidators"
}
ctx, cancel := context.WithCancel(context.Background())
// cancel when we are finished consuming integers
defer cancel()
data, err := p.validatorSetABIBeforeLuban.Pack(method)
if err != nil {
log.Error("Unable to pack tx for getValidators", "error", err)
return nil, err
}
// do smart contract call
msgData := (hexutil.Bytes)(data)
toAddress := common.HexToAddress(systemcontracts.ValidatorContract)
gas := (hexutil.Uint64)(uint64(math.MaxUint64 / 2))
result, err := p.ethAPI.Call(ctx, ethapi.TransactionArgs{
Gas: &gas,
To: &toAddress,
Data: &msgData,
}, &blockNr, nil, nil)
if err != nil {
return nil, err
}
var valSet []common.Address
err = p.validatorSetABIBeforeLuban.UnpackIntoInterface(&valSet, method, result)
return valSet, err
}