Fixed add reward balance for candidate owner not coinbase address.

This commit is contained in:
dinhln89 2018-06-29 16:53:52 +07:00
parent fb46af9f02
commit cb993ece47
3 changed files with 37 additions and 810 deletions

View file

@ -31,7 +31,7 @@ const (
HashLength = 32 HashLength = 32
AddressLength = 20 AddressLength = 20
BlockSigners = "0x0000000000000000000000000000000000000089" BlockSigners = "0x0000000000000000000000000000000000000089"
Validator = "0x0000000000000000000000000000000000000088" TomoValidator = "0x0000000000000000000000000000000000000088"
) )
var ( var (

View file

@ -6,6 +6,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/contracts/blocksigner/contract" "github.com/ethereum/go-ethereum/contracts/blocksigner/contract"
contract2 "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/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
@ -111,9 +112,25 @@ func GetRewardForCheckpoint(blockSignerAddr common.Address, number uint64, rChec
} }
} }
// Get Owner for signers.
owners := make(map[common.Address]*rewardLog)
if len(signers) > 0 {
for addr, log := range signers {
owner, err := GetCandidatesOwnerByAddress(client, addr)
if err != nil {
owner = addr
}
if _, ok := owners[owner]; ok {
owners[owner].Sign = owners[owner].Sign + log.Sign
} else {
owners[owner] = log
}
}
}
log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber) log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
return signers, nil return owners, nil
} }
// Calculate reward for signers. // Calculate reward for signers.
@ -138,3 +155,21 @@ func CalculateReward(chainReward *big.Int, signers map[common.Address]*rewardLog
return resultSigners, nil return resultSigners, nil
} }
// Get candidate owner by address.
func GetCandidatesOwnerByAddress(client bind.ContractBackend, addr common.Address) (common.Address, error) {
owner := common.Address{}
validator, err := contract2.NewTomoValidator(common.HexToAddress(common.TomoValidator), client)
if err != nil {
log.Error("Fail get instance of IValidator", "error", err)
return owner, err
}
opts := new(bind.CallOpts)
owner, err = validator.GetCandidateOwner(opts, addr)
if err != nil {
log.Error("Fail get candidate owner", "error", err)
return owner, err
}
return owner, nil
}

File diff suppressed because one or more lines are too long