Add rollback flag command for rollback chain at block hash.

This commit is contained in:
parmarrushabh 2018-12-07 10:36:28 +05:30
parent 95041650e8
commit 0a63f16b00
8 changed files with 97 additions and 8 deletions

View file

@ -156,6 +156,12 @@ func makeConfigNode(ctx *cli.Context) (*node.Node, XDCConfig) {
if ctx.GlobalBool(utils.XDCTestnetFlag.Name) { if ctx.GlobalBool(utils.XDCTestnetFlag.Name) {
common.IsTestnet = true common.IsTestnet = true
} }
// Check rollback hash exist.
if rollbackHash := ctx.GlobalString(utils.RollbackFlag.Name); rollbackHash != "" {
common.RollbackHash = common.HexToHash(rollbackHash)
}
// read passwords from enviroment // read passwords from enviroment
passwords := []string{} passwords := []string{}
for _, env := range cfg.Account.Passwords { for _, env := range cfg.Account.Passwords {

View file

@ -123,6 +123,7 @@ var (
configFileFlag, configFileFlag,
utils.AnnounceTxsFlag, utils.AnnounceTxsFlag,
utils.StoreRewardFlag, utils.StoreRewardFlag,
utils.RollbackFlag,
} }
rpcFlags = []cli.Flag{ rpcFlags = []cli.Flag{

View file

@ -110,6 +110,12 @@ func NewApp(gitCommit, usage string) *cli.App {
// are the same for all commands. // are the same for all commands.
var ( var (
// XDC flags.
RollbackFlag = cli.StringFlag{
Name: "rollback",
Usage: "Rollback chain at hash",
Value: "",
}
// General settings // General settings
AnnounceTxsFlag = cli.BoolFlag{ AnnounceTxsFlag = cli.BoolFlag{
Name: "announce-txs", Name: "announce-txs",

View file

@ -23,3 +23,4 @@ const (
var TIP2019Block = big.NewInt(1050000) var TIP2019Block = big.NewInt(1050000)
var IsTestnet bool = false var IsTestnet bool = false
var StoreRewardFolder string var StoreRewardFolder string
var RollbackHash Hash

View file

@ -1,4 +1,5 @@
package contracts package contracts
// //
//import ( //import (
// "fmt" // "fmt"

View file

@ -2,18 +2,19 @@ package validator
import ( import (
"context" "context"
"encoding/json"
"math/big" "math/big"
"math/rand"
"testing" "testing"
"time" "time"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/contracts" contractValidator "github.com/ethereum/go-ethereum/contracts/validator/contract"
"github.com/ethereum/go-ethereum/contracts/validator/contract"
"github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/crypto"
"math/rand" "github.com/ethereum/go-ethereum/log"
) )
var ( var (
@ -79,7 +80,7 @@ func TestRewardBalance(t *testing.T) {
// validatorAddr, _, baseValidator, err := contract.DeployXDCValidator(transactOpts, contractBackend, big.NewInt(50000), big.NewInt(99), big.NewInt(100), big.NewInt(100)) // validatorAddr, _, baseValidator, err := contract.DeployXDCValidator(transactOpts, contractBackend, big.NewInt(50000), big.NewInt(99), big.NewInt(100), big.NewInt(100))
validatorCap := new(big.Int) validatorCap := new(big.Int)
validatorCap.SetString("50000000000000000000000", 10) validatorCap.SetString("50000000000000000000000", 10)
validatorAddr, _, baseValidator, err := contract.DeployXDCValidator( validatorAddr, _, baseValidator, err := contractValidator.DeployXDCValidator(
transactOpts, transactOpts,
contractBackend, contractBackend,
[]common.Address{addr}, []common.Address{addr},
@ -129,7 +130,7 @@ func TestRewardBalance(t *testing.T) {
foundationAddr := common.HexToAddress(common.FoudationAddr) foundationAddr := common.HexToAddress(common.FoudationAddr)
totalReward := new(big.Int).SetInt64(15 * 1000) totalReward := new(big.Int).SetInt64(15 * 1000)
rewards, err := contracts.GetRewardBalancesRate(foundationAddr, acc3Addr, totalReward, baseValidator) rewards, err := GetRewardBalancesRate(foundationAddr, acc3Addr, totalReward, baseValidator)
if err != nil { if err != nil {
t.Error("Fail to get reward balances rate.", err) t.Error("Fail to get reward balances rate.", err)
} }
@ -160,3 +161,76 @@ func TestRewardBalance(t *testing.T) {
} }
} }
func GetRewardBalancesRate(foudationWalletAddr common.Address, masterAddr common.Address, totalReward *big.Int, validator *contractValidator.XDCValidator) (map[common.Address]*big.Int, error) {
owner := GetCandidatesOwnerBySigner(validator, masterAddr)
balances := make(map[common.Address]*big.Int)
rewardMaster := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(common.RewardMasterPercent))
rewardMaster = new(big.Int).Div(rewardMaster, new(big.Int).SetInt64(100))
balances[owner] = rewardMaster
// Get voters for masternode.
opts := new(bind.CallOpts)
voters, err := validator.GetVoters(opts, masterAddr)
if err != nil {
log.Crit("Fail to get voters", "error", err)
return nil, err
}
if len(voters) > 0 {
totalVoterReward := new(big.Int).Mul(totalReward, new(big.Int).SetUint64(common.RewardVoterPercent))
totalVoterReward = new(big.Int).Div(totalVoterReward, new(big.Int).SetUint64(100))
totalCap := new(big.Int)
// Get voters capacities.
voterCaps := make(map[common.Address]*big.Int)
for _, voteAddr := range voters {
var voterCap *big.Int
voterCap, err = validator.GetVoterCap(opts, masterAddr, voteAddr)
if err != nil {
log.Crit("Fail to get vote capacity", "error", err)
}
totalCap.Add(totalCap, voterCap)
voterCaps[voteAddr] = voterCap
}
if totalCap.Cmp(new(big.Int).SetInt64(0)) > 0 {
for addr, voteCap := range voterCaps {
// Only valid voter has cap > 0.
if voteCap.Cmp(new(big.Int).SetInt64(0)) > 0 {
rcap := new(big.Int).Mul(totalVoterReward, voteCap)
rcap = new(big.Int).Div(rcap, totalCap)
if balances[addr] != nil {
balances[addr].Add(balances[addr], rcap)
} else {
balances[addr] = rcap
}
}
}
}
}
foudationReward := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(common.RewardFoundationPercent))
foudationReward = new(big.Int).Div(foudationReward, new(big.Int).SetInt64(100))
balances[foudationWalletAddr] = foudationReward
jsonHolders, err := json.Marshal(balances)
if err != nil {
log.Error("Fail to parse json holders", "error", err)
return nil, err
}
log.Info("Holders reward", "holders", string(jsonHolders), "master node", masterAddr.String())
return balances, nil
}
func GetCandidatesOwnerBySigner(validator *contractValidator.XDCValidator, signerAddr common.Address) common.Address {
owner := signerAddr
opts := new(bind.CallOpts)
owner, err := validator.GetCandidateOwner(opts, signerAddr)
if err != nil {
log.Error("Fail get candidate owner", "error", err)
return owner
}
return owner
}

View file

@ -10,7 +10,7 @@ import (
) )
var ( var (
slotValidatorMapping = map[string]uint64{ slotValidatorMapping = map[string]uint64{
"withdrawsState": 0, "withdrawsState": 0,
"validatorsState": 1, "validatorsState": 1,
"voters": 2, "voters": 2,

File diff suppressed because one or more lines are too long