Merge pull request #404 from nguyenbatam/reduce_sign_tx

reduce number sign transaction
This commit is contained in:
Tuna 2019-01-14 14:25:13 +07:00 committed by GitHub
commit 4409c4c02f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 87 additions and 59 deletions

View file

@ -1,5 +1,7 @@
package common package common
import "math/big"
const ( const (
RewardMasterPercent = 40 RewardMasterPercent = 40
RewardVoterPercent = 50 RewardVoterPercent = 50
@ -15,7 +17,9 @@ const (
BlocksPerYear = uint64(15768000) BlocksPerYear = uint64(15768000)
LimitThresholdNonceInQueue = 10 LimitThresholdNonceInQueue = 10
MinGasPrice = 2500 MinGasPrice = 2500
MergeSignRange = 15
) )
var TIP2019Block = big.NewInt(1050000)
var IsTestnet bool = false var IsTestnet bool = false
var StoreRewardFolder string var StoreRewardFolder string

View file

@ -31,19 +31,19 @@ import (
"time" "time"
"github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts"
"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/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/consensus" "github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/consensus/posv" "github.com/ethereum/go-ethereum/consensus/posv"
"github.com/ethereum/go-ethereum/contracts/blocksigner/contract"
randomizeContract "github.com/ethereum/go-ethereum/contracts/randomize/contract"
"github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/contracts/blocksigner/contract"
randomizeContract "github.com/ethereum/go-ethereum/contracts/randomize/contract"
) )
const ( const (
@ -321,7 +321,6 @@ func GetRewardForCheckpoint(c *posv.Posv, chain consensus.ChainReader, number ui
data := make(map[common.Hash][]common.Address) data := make(map[common.Hash][]common.Address)
for i := startBlockNumber; i <= prevCheckpoint+(rCheckpoint*2)-1; i++ { for i := startBlockNumber; i <= prevCheckpoint+(rCheckpoint*2)-1; i++ {
header := chain.GetHeaderByNumber(i) header := chain.GetHeaderByNumber(i)
if signData, ok := c.BlockSigners.Get(header.Hash()); ok { if signData, ok := c.BlockSigners.Get(header.Hash()); ok {
txs := signData.([]*types.Transaction) txs := signData.([]*types.Transaction)
for _, tx := range txs { for _, tx := range txs {
@ -362,30 +361,32 @@ func GetRewardForCheckpoint(c *posv.Posv, chain consensus.ChainReader, number ui
} }
for i := startBlockNumber; i <= endBlockNumber; i++ { for i := startBlockNumber; i <= endBlockNumber; i++ {
block := chain.GetHeaderByNumber(i) if i%common.MergeSignRange == 0 || !chain.Config().IsTIP2019(big.NewInt(int64(i))) {
addrs := data[block.Hash()] block := chain.GetHeaderByNumber(i)
// Filter duplicate address. addrs := data[block.Hash()]
if len(addrs) > 0 { // Filter duplicate address.
addrSigners := make(map[common.Address]bool) if len(addrs) > 0 {
for _, masternode := range masternodes { addrSigners := make(map[common.Address]bool)
for _, addr := range addrs { for _, masternode := range masternodes {
if addr == masternode { for _, addr := range addrs {
if _, ok := addrSigners[addr]; !ok { if addr == masternode {
addrSigners[addr] = true if _, ok := addrSigners[addr]; !ok {
addrSigners[addr] = true
}
break
} }
break
} }
} }
}
for addr := range addrSigners { for addr := range addrSigners {
_, exist := signers[addr] _, exist := signers[addr]
if exist { if exist {
signers[addr].Sign++ signers[addr].Sign++
} else { } else {
signers[addr] = &rewardLog{1, new(big.Int)} signers[addr] = &rewardLog{1, new(big.Int)}
}
*totalSigner++
} }
*totalSigner++
} }
} }
} }
@ -427,15 +428,15 @@ func GetCandidatesOwnerBySigner(state *state.StateDB, signerAddr common.Address)
return owner return owner
} }
func CalculateRewardForHolders(foundationWalletAddr common.Address, state *state.StateDB, signer common.Address, calcReward *big.Int) (error, map[common.Address]*big.Int) { func CalculateRewardForHolders(foundationWalletAddr common.Address, state *state.StateDB, signer common.Address, calcReward *big.Int, blockNumber uint64) (error, map[common.Address]*big.Int) {
rewards, err := GetRewardBalancesRate(foundationWalletAddr, state, signer, calcReward) rewards, err := GetRewardBalancesRate(foundationWalletAddr, state, signer, calcReward, blockNumber)
if err != nil { if err != nil {
return err, nil return err, nil
} }
return nil, rewards return nil, rewards
} }
func GetRewardBalancesRate(foundationWalletAddr common.Address, state *state.StateDB, masterAddr common.Address, totalReward *big.Int) (map[common.Address]*big.Int, error) { func GetRewardBalancesRate(foundationWalletAddr common.Address, state *state.StateDB, masterAddr common.Address, totalReward *big.Int, blockNumber uint64) (map[common.Address]*big.Int, error) {
owner := GetCandidatesOwnerBySigner(state, masterAddr) owner := GetCandidatesOwnerBySigner(state, masterAddr)
balances := make(map[common.Address]*big.Int) balances := make(map[common.Address]*big.Int)
rewardMaster := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(common.RewardMasterPercent)) rewardMaster := new(big.Int).Mul(totalReward, new(big.Int).SetInt64(common.RewardMasterPercent))
@ -451,6 +452,9 @@ func GetRewardBalancesRate(foundationWalletAddr common.Address, state *state.Sta
// Get voters capacities. // Get voters capacities.
voterCaps := make(map[common.Address]*big.Int) voterCaps := make(map[common.Address]*big.Int)
for _, voteAddr := range voters { for _, voteAddr := range voters {
if _, ok := voterCaps[voteAddr]; ok && common.TIP2019Block.Uint64() <= blockNumber {
continue
}
voterCap := GetVoterCap(state, masterAddr, voteAddr) voterCap := GetVoterCap(state, masterAddr, voteAddr)
totalCap.Add(totalCap, voterCap) totalCap.Add(totalCap, voterCap)
voterCaps[voteAddr] = voterCap voterCaps[voteAddr] = voterCap

View file

@ -36,6 +36,7 @@ import (
"github.com/ethereum/go-ethereum/contracts" "github.com/ethereum/go-ethereum/contracts"
"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" //"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/core/vm"
@ -52,7 +53,6 @@ import (
"github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/params"
"github.com/ethereum/go-ethereum/rlp" "github.com/ethereum/go-ethereum/rlp"
"github.com/ethereum/go-ethereum/rpc" "github.com/ethereum/go-ethereum/rpc"
"github.com/ethereum/go-ethereum/core/state"
) )
type LesServer interface { type LesServer interface {
@ -197,8 +197,10 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
// silently return as this node doesn't have masternode permission to sign block // silently return as this node doesn't have masternode permission to sign block
return nil return nil
} }
if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil { if block.NumberU64()%common.MergeSignRange == 0 || !eth.chainConfig.IsTIP2019(block.Number()) {
return fmt.Errorf("Fail to create tx sign for importing block: %v", err) if err := contracts.CreateTransactionSign(chainConfig, eth.txPool, eth.accountManager, block, chainDb); err != nil {
return fmt.Errorf("Fail to create tx sign for importing block: %v", err)
}
} }
return nil return nil
} }
@ -256,27 +258,29 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
if len(penSigners) > 0 { if len(penSigners) > 0 {
// Loop for each block to check missing sign. // Loop for each block to check missing sign.
for i := prevEpoc; i < blockNumberEpoc; i++ { for i := prevEpoc; i < blockNumberEpoc; i++ {
bheader := chain.GetHeaderByNumber(i) if i%common.MergeSignRange == 0 || !chainConfig.IsTIP2019(big.NewInt(int64(i))) {
bhash := bheader.Hash() bheader := chain.GetHeaderByNumber(i)
block := chain.GetBlock(bhash, i) bhash := bheader.Hash()
if len(penSigners) > 0 { block := chain.GetBlock(bhash, i)
signedMasternodes, err := contracts.GetSignersFromContract(canonicalState, block) if len(penSigners) > 0 {
if err != nil { signedMasternodes, err := contracts.GetSignersFromContract(canonicalState, block)
return nil, err if err != nil {
} return nil, err
if len(signedMasternodes) > 0 { }
// Check signer signed? if len(signedMasternodes) > 0 {
for _, signed := range signedMasternodes { // Check signer signed?
for j, addr := range penSigners { for _, signed := range signedMasternodes {
if signed == addr { for j, addr := range penSigners {
// Remove it from dupSigners. if signed == addr {
penSigners = append(penSigners[:j], penSigners[j+1:]...) // Remove it from dupSigners.
penSigners = append(penSigners[:j], penSigners[j+1:]...)
}
} }
} }
} }
} else {
break
} }
} else {
break
} }
} }
} }
@ -323,7 +327,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) {
voterResults := make(map[common.Address]interface{}) voterResults := make(map[common.Address]interface{})
if len(signers) > 0 { if len(signers) > 0 {
for signer, calcReward := range rewardSigners { for signer, calcReward := range rewardSigners {
err, rewards := contracts.CalculateRewardForHolders(foundationWalletAddr, canonicalState, signer, calcReward) err, rewards := contracts.CalculateRewardForHolders(foundationWalletAddr, canonicalState, signer, calcReward, number)
if err != nil { if err != nil {
log.Crit("Fail to calculate reward for holders.", "error", err) log.Crit("Fail to calculate reward for holders.", "error", err)
} }

View file

@ -865,18 +865,29 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx
var filterSigners []common.Address var filterSigners []common.Address
finality := int32(0) finality := int32(0)
if b.Number().Int64() > 0 { if b.Number().Int64() > 0 {
engine := s.b.GetEngine() curBlockNumber := b.Number().Uint64()
addrBlockSigner := common.HexToAddress(common.BlockSigners) prevBlockNumber := curBlockNumber + (common.MergeSignRange - (curBlockNumber % common.MergeSignRange))
signers, err = contracts.GetSignersByExecutingEVM(addrBlockSigner, client, b.Hash()) latestBlockNumber := s.b.CurrentBlock().Number().Uint64()
if err != nil { if prevBlockNumber >= latestBlockNumber || !s.b.ChainConfig().IsTIP2019(b.Number()) {
log.Error("Fail to get signers from block signer SC.", "error", err) prevBlockNumber = curBlockNumber
} }
// Get block epoc latest. if engine, ok := s.b.GetEngine().(*posv.Posv); ok {
if s.b.ChainConfig().Posv != nil { prevBlock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(prevBlockNumber))
lastCheckpointNumber := rpc.BlockNumber(b.Number().Uint64() - (b.Number().Uint64() % s.b.ChainConfig().Posv.Epoch)) addrBlockSigner := common.HexToAddress(common.BlockSigners)
prevCheckpointBlock, _ := s.b.BlockByNumber(ctx, lastCheckpointNumber) signers, err = contracts.GetSignersByExecutingEVM(addrBlockSigner, client, prevBlock.Hash())
if err != nil {
log.Error("Fail to get signers from block signer SC.", "error", err)
return nil, err
}
validator, _ := engine.RecoverValidator(b.Header())
creator, _ := engine.RecoverSigner(b.Header())
signers = append(signers, validator)
signers = append(signers, creator)
// Get block epoc latest.
lastCheckpointNumber := prevBlockNumber - (prevBlockNumber % s.b.ChainConfig().Posv.Epoch)
prevCheckpointBlock, _ := s.b.BlockByNumber(ctx, rpc.BlockNumber(lastCheckpointNumber))
if prevCheckpointBlock != nil { if prevCheckpointBlock != nil {
masternodes := engine.(*posv.Posv).GetMasternodesFromCheckpointHeader(prevCheckpointBlock.Header(), b.Number().Uint64(), s.b.ChainConfig().Posv.Epoch) masternodes := engine.GetMasternodesFromCheckpointHeader(prevCheckpointBlock.Header(), curBlockNumber, s.b.ChainConfig().Posv.Epoch)
countFinality := 0 countFinality := 0
for _, masternode := range masternodes { for _, masternode := range masternodes {
for _, signer := range signers { for _, signer := range signers {

View file

@ -410,8 +410,10 @@ func (self *worker) wait() {
} }
} }
// Send tx sign to smart contract blockSigners. // Send tx sign to smart contract blockSigners.
if err := contracts.CreateTransactionSign(self.config, self.eth.TxPool(), self.eth.AccountManager(), block, self.chainDb); err != nil { if block.NumberU64()%common.MergeSignRange == 0 || !self.config.IsTIP2019(block.Number()) {
log.Error("Fail to create tx sign for signer", "error", "err") if err := contracts.CreateTransactionSign(self.config, self.eth.TxPool(), self.eth.AccountManager(), block, self.chainDb); err != nil {
log.Error("Fail to create tx sign for signer", "error", "err")
}
} }
} }
} }

View file

@ -213,6 +213,9 @@ func (c *ChainConfig) IsConstantinople(num *big.Int) bool {
return isForked(c.ConstantinopleBlock, num) return isForked(c.ConstantinopleBlock, num)
} }
func (c *ChainConfig) IsTIP2019(num *big.Int) bool {
return isForked(common.TIP2019Block, num)
}
// GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice). // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice).
// //
// The returned GasTable's fields shouldn't, under any circumstances, be changed. // The returned GasTable's fields shouldn't, under any circumstances, be changed.