mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 02:42:27 +00:00
read signing data from blocks
This commit is contained in:
parent
e50c789c77
commit
5e8df83303
2 changed files with 53 additions and 68 deletions
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -317,43 +317,44 @@ 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:])
|
||||||
// Filter duplicate address.
|
from := *tx.From()
|
||||||
if len(addrs) > 0 {
|
data[blkHash] = append(data[blkHash], from)
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
log.Info("Failed get from cached", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
|
||||||
|
block := chain.GetBlock(header.Hash(), i)
|
||||||
|
txs := block.Transactions()
|
||||||
|
receipts := core.GetBlockReceipts(c.GetDb(), header.Hash(), i)
|
||||||
|
|
||||||
|
for _, tx := range txs {
|
||||||
|
if tx.IsSigningTransaction() {
|
||||||
|
var b uint
|
||||||
|
for _, r := range receipts {
|
||||||
|
if r.TxHash == tx.Hash() {
|
||||||
|
b = r.Status
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if b == types.ReceiptStatusFailed {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
for addr := range addrSigners {
|
blkHash := common.BytesToHash(tx.Data()[len(tx.Data())-32:])
|
||||||
_, exist := signers[addr]
|
from := *tx.From()
|
||||||
if exist {
|
data[blkHash] = append(data[blkHash], from)
|
||||||
signers[addr].Sign++
|
|
||||||
} else {
|
|
||||||
signers[addr] = &rewardLog{1, new(big.Int)}
|
|
||||||
}
|
|
||||||
*totalSigner++
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} 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++ {
|
for i := startBlockNumber; i <= endBlockNumber; i++ {
|
||||||
|
|
@ -385,7 +386,6 @@ func GetRewardForCheckpoint(c *posv.Posv, chain consensus.ChainReader, blockSign
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
|
log.Info("Calculate reward at checkpoint", "startBlock", startBlockNumber, "endBlock", endBlockNumber)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue