read signing data from blocks

This commit is contained in:
Nguyen Sy Thanh Son 2019-01-11 07:00:46 +00:00
parent e50c789c77
commit 5e8df83303
2 changed files with 53 additions and 68 deletions

View file

@ -1059,23 +1059,8 @@ func (c *Posv) CacheData(header *types.Header, txs []*types.Transaction, receipt
return nil return nil
} }
func (c *Posv) GetSignData(chain consensus.ChainReader, startBlockNumber uint64, endBlockNumber uint64) (map[common.Hash][]common.Address, error) { func (c *Posv) GetDb() ethdb.Database {
data := make(map[common.Hash][]common.Address) return c.db
for i := startBlockNumber; i < chain.CurrentHeader().Number.Uint64(); i++ {
block := chain.GetHeaderByNumber(i)
if signData, ok := c.BlockSigners.Get(block.Hash()); ok {
txs := signData.([]*types.Transaction)
for _, tx := range txs {
blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:])
from := *tx.From()
data[blkHash] = append(data[blkHash], from)
}
} else {
return nil, errors.New("Failed get blocksigners from cache " + block.Hash().String() + " " + block.Number.String())
}
}
return data, nil
} }
// Extract validators from byte array. // Extract validators from byte array.

View file

@ -317,71 +317,71 @@ func GetRewardForCheckpoint(c *posv.Posv, chain consensus.ChainReader, blockSign
if len(masternodes) > 0 { if len(masternodes) > 0 {
if !c.EnableCache { data := make(map[common.Hash][]common.Address)
for i := startBlockNumber; i <= endBlockNumber; i++ { for i := startBlockNumber; i <= chain.CurrentHeader().Number.Uint64(); i++ {
block := chain.GetHeaderByNumber(i) header := chain.GetHeaderByNumber(i)
addrs, err := GetSignersFromContract(blockSignerAddr, client, block.Hash())
if err != nil { if signData, ok := c.BlockSigners.Get(header.Hash()); ok {
log.Error("Fail to get signers from smartcontract.", "error", err, "blockNumber", i) txs := signData.([]*types.Transaction)
return nil, err for _, tx := range txs {
blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:])
from := *tx.From()
data[blkHash] = append(data[blkHash], from)
} }
// Filter duplicate address. } else {
if len(addrs) > 0 { log.Info("Failed get from cached", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
addrSigners := make(map[common.Address]bool) block := chain.GetBlock(header.Hash(), i)
for _, masternode := range masternodes { txs := block.Transactions()
for _, addr := range addrs { receipts := core.GetBlockReceipts(c.GetDb(), header.Hash(), i)
if addr == masternode {
if _, ok := addrSigners[addr]; !ok { for _, tx := range txs {
addrSigners[addr] = true if tx.IsSigningTransaction() {
} var b uint
for _, r := range receipts {
if r.TxHash == tx.Hash() {
b = r.Status
break break
} }
} }
}
for addr := range addrSigners { if b == types.ReceiptStatusFailed {
_, exist := signers[addr] continue
if exist {
signers[addr].Sign++
} else {
signers[addr] = &rewardLog{1, new(big.Int)}
} }
*totalSigner++
blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:])
from := *tx.From()
data[blkHash] = append(data[blkHash], from)
} }
} }
}
} else {
data, err := c.GetSignData(chain, startBlockNumber, endBlockNumber)
if err != nil {
log.Crit("Fail to get signers from cache.", "startBlockNumber", startBlockNumber, "endBlockNumber", endBlockNumber, "error", err)
}
for i := startBlockNumber; i <= endBlockNumber; i++ { }
block := chain.GetHeaderByNumber(i) }
addrs := data[block.Hash()]
// Filter duplicate address. for i := startBlockNumber; i <= endBlockNumber; i++ {
if len(addrs) > 0 { block := chain.GetHeaderByNumber(i)
addrSigners := make(map[common.Address]bool) addrs := data[block.Hash()]
for _, masternode := range masternodes { // Filter duplicate address.
for _, addr := range addrs { if len(addrs) > 0 {
if addr == masternode { addrSigners := make(map[common.Address]bool)
if _, ok := addrSigners[addr]; !ok { for _, masternode := range masternodes {
addrSigners[addr] = true for _, addr := range addrs {
} if addr == masternode {
break if _, ok := addrSigners[addr]; !ok {
addrSigners[addr] = true
} }
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++
} }
} }
} }