mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-17 18:30:45 +00:00
goroutine get signers
This commit is contained in:
parent
e8336d2770
commit
4ab49f2752
2 changed files with 56 additions and 36 deletions
|
|
@ -295,38 +295,57 @@ func GetRewardForCheckpoint(chain consensus.ChainReader, blockSignerAddr common.
|
||||||
masternodes := XDPoS.GetMasternodesFromCheckpointHeader(prevHeaderCheckpoint)
|
masternodes := XDPoS.GetMasternodesFromCheckpointHeader(prevHeaderCheckpoint)
|
||||||
|
|
||||||
if len(masternodes) > 0 {
|
if len(masternodes) > 0 {
|
||||||
for i := startBlockNumber; i <= endBlockNumber; i++ {
|
|
||||||
block := chain.GetHeaderByNumber(i)
|
|
||||||
addrs, err := GetSignersFromContract(blockSignerAddr, client, block.Hash())
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Fail to get signers from smartcontract.", "error", err, "blockNumber", i)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Filter duplicate address.
|
|
||||||
if len(addrs) > 0 {
|
|
||||||
addrSigners := make(map[common.Address]bool)
|
|
||||||
for _, masternode := range masternodes {
|
|
||||||
for _, addr := range addrs {
|
|
||||||
if addr == masternode {
|
|
||||||
if _, ok := addrSigners[addr]; !ok {
|
|
||||||
addrSigners[addr] = true
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for addr := range addrSigners {
|
var wg sync.WaitGroup
|
||||||
_, exist := signers[addr]
|
squeue := make(chan []common.Address, 1)
|
||||||
if exist {
|
wg.Add(900)
|
||||||
signers[addr].Sign++
|
|
||||||
} else {
|
for i := startBlockNumber; i <= endBlockNumber; i++ {
|
||||||
signers[addr] = &rewardLog{1, new(big.Int)}
|
go func(i uint64) {
|
||||||
}
|
block := chain.GetHeaderByNumber(i)
|
||||||
*totalSigner++
|
addrs, err := GetSignersFromContract(blockSignerAddr, client, block.Hash())
|
||||||
}
|
if err != nil {
|
||||||
}
|
log.Crit("Fail to get signers from smartcontract.", "error", err, "blockNumber", i)
|
||||||
}
|
// return nil, err
|
||||||
|
}
|
||||||
|
squeue <- addrs
|
||||||
|
}(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
fsigner := func() {
|
||||||
|
for addrs := range squeue {
|
||||||
|
// Filter duplicate address.
|
||||||
|
if len(addrs) > 0 {
|
||||||
|
addrSigners := make(map[common.Address]bool)
|
||||||
|
for _, masternode := range masternodes {
|
||||||
|
for _, addr := range addrs {
|
||||||
|
if addr == masternode {
|
||||||
|
if _, ok := addrSigners[addr]; !ok {
|
||||||
|
addrSigners[addr] = true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for addr := range addrSigners {
|
||||||
|
_, exist := signers[addr]
|
||||||
|
if exist {
|
||||||
|
signers[addr].Sign++
|
||||||
|
} else {
|
||||||
|
signers[addr] = &rewardLog{1, new(big.Int)}
|
||||||
|
}
|
||||||
|
*totalSigner++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wg.Done()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
go fsigner()
|
||||||
|
|
||||||
|
wg.Wait()
|
||||||
|
fmt.Println("totalSigner", *totalSigner)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
|
log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/consensus/ethash"
|
"github.com/ethereum/go-ethereum/consensus/ethash"
|
||||||
"github.com/ethereum/go-ethereum/consensus/XDPoS"
|
"github.com/ethereum/go-ethereum/consensus/XDPoS"
|
||||||
"github.com/ethereum/go-ethereum/contracts"
|
"github.com/ethereum/go-ethereum/contracts"
|
||||||
// "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/core/bloombits"
|
"github.com/ethereum/go-ethereum/core/bloombits"
|
||||||
"github.com/ethereum/go-ethereum/core/state"
|
"github.com/ethereum/go-ethereum/core/state"
|
||||||
|
|
@ -313,6 +313,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
||||||
|
|
||||||
totalSigner := new(uint64)
|
totalSigner := new(uint64)
|
||||||
signers, err := contracts.GetRewardForCheckpoint(chain, addr, number, rCheckpoint, client, totalSigner)
|
signers, err := contracts.GetRewardForCheckpoint(chain, addr, number, rCheckpoint, client, totalSigner)
|
||||||
|
fmt.Println("Time Get Signers", "block", header.Number.Uint64(), "time", common.PrettyDuration(time.Since(start)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Fail to get signers for reward checkpoint", "error", err)
|
log.Error("Fail to get signers for reward checkpoint", "error", err)
|
||||||
return err, nil
|
return err, nil
|
||||||
|
|
@ -324,7 +325,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
// Get validator.
|
// Get validator.
|
||||||
// validator, err := contract.NewXDCValidator(common.HexToAddress(common.MasternodeVotingSMC), client)
|
validator, err := contract.NewXDCValidator(common.HexToAddress(common.MasternodeVotingSMC), client)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Fail get instance of XDC Validator", "error", err)
|
log.Error("Fail get instance of XDC Validator", "error", err)
|
||||||
return err, nil
|
return err, nil
|
||||||
|
|
@ -332,10 +333,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
|
||||||
// Add reward for coin holders.
|
// Add reward for coin holders.
|
||||||
voterResults := make(map[common.Address]interface{})
|
voterResults := make(map[common.Address]interface{})
|
||||||
if len(signers) > 0 {
|
if len(signers) > 0 {
|
||||||
vmenv := core.NewRuntimeEVM(state)
|
// vmenv := core.NewRuntimeEVM(state)
|
||||||
for signer, calcReward := range rewardSigners {
|
for signer, calcReward := range rewardSigners {
|
||||||
// err, rewards := contracts.CalculateRewardForHolders(foudationWalletAddr, validator, state, signer, calcReward)
|
err, rewards := contracts.CalculateRewardForHolders(foudationWalletAddr, validator, state, signer, calcReward)
|
||||||
err, rewards := contracts.CalculateRewardForHolders2(foudationWalletAddr, vmenv, state, signer, calcReward)
|
// err, rewards := contracts.CalculateRewardForHolders2(foudationWalletAddr, vmenv, state, signer, calcReward)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Fail to calculate reward for holders.", "error", err)
|
log.Error("Fail to calculate reward for holders.", "error", err)
|
||||||
return err, nil
|
return err, nil
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue