diff --git a/consensus/posv/posv.go b/consensus/posv/posv.go index 7fd611fb85..c0cd72b3a6 100644 --- a/consensus/posv/posv.go +++ b/consensus/posv/posv.go @@ -18,9 +18,7 @@ package posv import ( "bytes" - // "strings" "encoding/json" - // "encoding/hex" "errors" "fmt" "io/ioutil" @@ -32,7 +30,6 @@ import ( "time" "github.com/ethereum/go-ethereum/accounts" - // "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/consensus" @@ -862,47 +859,12 @@ func (c *Posv) Finalize(chain consensus.ChainReader, header *types.Header, state number := header.Number.Uint64() rCheckpoint := chain.Config().Posv.RewardCheckpoint - for _, tx := range txs { - if tx.IsSigningTransaction() { - blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:]) - from := *tx.From() - - var b uint - for _, r := range receipts { - if r.TxHash == tx.Hash() { - b = r.Status - break - } - } - - if b == types.ReceiptStatusFailed { - fmt.Println("Tx receipt status false") - continue - } - - var lAddr []common.Address - if cached, ok := c.BlockSigners.Get(blkHash); ok { - lAddr = cached.([]common.Address) - lAddr = append(lAddr, from) - } else { - lAddr = []common.Address{from} - } - c.BlockSigners.Add(blkHash, lAddr) - } else { - - b, addr := tx.IsVotingTransaction() - if b && addr != nil { - var vote common.Vote - vote.Masternode = *addr - vote.Voter = *tx.From() - - c.Votes.Remove(vote) - } - } - } + start := time.Now() + _ = c.cacheData(txs, receipts) + fmt.Println("Time processed txs", len(txs), "time", common.PrettyDuration(time.Since(start))) if c.HookReward != nil && number%rCheckpoint == 0 { - if !c.EnableCache && c.BlockSigners.Len() >= 2700 { + if !c.EnableCache && uint64(c.BlockSigners.Len()) >= (rCheckpoint*3) { fmt.Println("EnableCache true c.BlockSigners.Len()", c.BlockSigners.Len()) c.EnableCache = true } @@ -1077,6 +1039,52 @@ func (c *Posv) GetMasternodesFromCheckpointHeader(preCheckpointHeader *types.Hea return masternodes } +func (c *Posv) cacheData(txs []*types.Transaction, receipts []*types.Receipt) error { + for _, tx := range txs { + go func(tx *types.Transaction) error { + if tx.IsSigningTransaction() { + blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:]) + from := *tx.From() + + var b uint + for _, r := range receipts { + if r.TxHash == tx.Hash() { + b = r.Status + return nil + } + } + + if b == types.ReceiptStatusFailed { + fmt.Println("Tx receipt status false", tx.Hash().Hex()) + return nil + } + + var lAddr []common.Address + if cached, ok := c.BlockSigners.Get(blkHash); ok { + lAddr = cached.([]common.Address) + lAddr = append(lAddr, from) + } else { + lAddr = []common.Address{from} + } + c.BlockSigners.Add(blkHash, lAddr) + } else { + + b, addr := tx.IsVotingTransaction() + if b && addr != nil { + var vote common.Vote + vote.Masternode = *addr + vote.Voter = *tx.From() + + fmt.Println("Remove from Votes cache", vote.Masternode.String(), vote.Voter.String()) + c.Votes.Remove(vote) + } + } + return nil + }(tx) + } + return nil +} + // Extract validators from byte array. func RemovePenaltiesFromBlock(chain consensus.ChainReader, masternodes []common.Address, epochNumber uint64) []common.Address { if epochNumber <= 0 { diff --git a/contracts/utils.go b/contracts/utils.go index d35e86f1d5..5e353e2616 100644 --- a/contracts/utils.go +++ b/contracts/utils.go @@ -212,7 +212,6 @@ func GetSignersFromContract(c *posv.Posv, addrBlockSigner common.Address, client } else { return caddrs.([]common.Address), nil } - return nil, nil } // Get random from randomize contract. @@ -350,7 +349,7 @@ func GetRewardForCheckpoint(c *posv.Posv, chain consensus.ChainReader, blockSign } else { var wg sync.WaitGroup squeue := make(chan []common.Address, 1) - wg.Add(900) + wg.Add(int(rCheckpoint)) for i := startBlockNumber; i <= endBlockNumber; i++ { go func(i uint64) { @@ -484,14 +483,22 @@ func GetRewardBalancesRate(c *posv.Posv, foudationWalletAddr common.Address, mas vote.Masternode = masterAddr vote.Voter = voteAddr - if vCap, ok := c.Votes.Get(vote); ok { - voterCap = vCap.(*big.Int) + if c != nil { + if vCap, ok := c.Votes.Get(vote); ok { + voterCap = vCap.(*big.Int) + } else { + voterCap, err = validator.GetVoterCap(opts, masterAddr, voteAddr) + if err != nil { + log.Crit("Fail to get vote capacity", "error", err) + } + fmt.Println("Add to Votes cache", vote.Masternode.String(), vote.Voter.String(), voterCap.String()) + c.Votes.Add(vote, voterCap) + } } else { voterCap, err = validator.GetVoterCap(opts, masterAddr, voteAddr) - if err != nil { - log.Crit("Fail to get vote capacity", "error", err) - } - c.Votes.Add(vote, voterCap) + if err != nil { + log.Crit("Fail to get vote capacity", "error", err) + } } totalCap.Add(totalCap, voterCap) diff --git a/contracts/validator/validator_test.go b/contracts/validator/validator_test.go index f3896db4b8..e5df78d42f 100644 --- a/contracts/validator/validator_test.go +++ b/contracts/validator/validator_test.go @@ -144,7 +144,7 @@ func TestRewardBalance(t *testing.T) { foundationAddr := common.HexToAddress(common.FoudationAddr) totalReward := new(big.Int).SetInt64(15 * 1000) - rewards, err := contracts.GetRewardBalancesRate(foundationAddr, acc3Addr, totalReward, baseValidator) + rewards, err := contracts.GetRewardBalancesRate(nil, foundationAddr, acc3Addr, totalReward, baseValidator) if err != nil { t.Error("Fail to get reward balances rate.", err) }