Moved the TD method from block processor.

This commit is contained in:
obscuren 2015-01-09 22:42:36 +01:00
parent 351516c57c
commit 491c23a728
3 changed files with 29 additions and 39 deletions

View File

@ -2,7 +2,6 @@ package core
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"math/big" "math/big"
"sync" "sync"
@ -217,44 +216,21 @@ func (sm *BlockProcessor) ProcessWithParent(block, parent *types.Block) (td *big
return return
} }
// Calculate the new total difficulty and sync back to the db // Calculate the td for this block
if td, ok := sm.CalculateTD(block); ok { td = CalculateTD(block, parent)
// Sync the current block's state to the database and cancelling out the deferred Undo // Sync the current block's state to the database and cancelling out the deferred Undo
state.Sync() state.Sync()
// Set the block hashes for the current messages
state.Manifest().SetHash(block.Hash())
messages = state.Manifest().Messages
// Reset the manifest XXX We need this?
state.Manifest().Reset()
// Remove transactions from the pool
sm.txpool.RemoveSet(block.Transactions())
state.Manifest().SetHash(block.Hash()) chainlogger.Infof("processed block #%d (%x...)\n", header.Number, block.Hash()[0:4])
messages := state.Manifest().Messages return td, messages, nil
state.Manifest().Reset()
chainlogger.Infof("processed block #%d (%x...)\n", header.Number, block.Hash()[0:4])
sm.txpool.RemoveSet(block.Transactions())
return td, messages, nil
} else {
return nil, nil, errors.New("total diff failed")
}
}
func (sm *BlockProcessor) CalculateTD(block *types.Block) (*big.Int, bool) {
uncleDiff := new(big.Int)
for _, uncle := range block.Uncles() {
uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
}
// TD(genesis_block) = 0 and TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty
td := new(big.Int)
td = td.Add(sm.bc.Td(), uncleDiff)
td = td.Add(td, block.Header().Difficulty)
// The new TD will only be accepted if the new difficulty is
// is greater than the previous.
if td.Cmp(sm.bc.Td()) > 0 {
return td, true
}
return nil, false
} }
// Validates the current block. Returns an error if the block was invalid, // Validates the current block. Returns an error if the block was invalid,

View File

@ -34,6 +34,20 @@ func CalcDifficulty(block, parent *types.Block) *big.Int {
return diff return diff
} }
func CalculateTD(block, parent *types.Block) *big.Int {
uncleDiff := new(big.Int)
for _, uncle := range block.Uncles() {
uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
}
// TD(genesis_block) = 0 and TD(B) = TD(B.parent) + sum(u.difficulty for u in B.uncles) + B.difficulty
td := new(big.Int)
td = td.Add(parent.Td, uncleDiff)
td = td.Add(td, block.Header().Difficulty)
return td
}
func CalcGasLimit(parent, block *types.Block) *big.Int { func CalcGasLimit(parent, block *types.Block) *big.Int {
if block.Number().Cmp(big.NewInt(0)) == 0 { if block.Number().Cmp(big.NewInt(0)) == 0 {
return ethutil.BigPow(10, 6) return ethutil.BigPow(10, 6)
@ -360,7 +374,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) error {
cblock := self.currentBlock cblock := self.currentBlock
if td.Cmp(self.td) > 0 { if td.Cmp(self.td) > 0 {
if block.Header().Number.Cmp(new(big.Int).Add(cblock.Header().Number, ethutil.Big1)) < 0 { if block.Header().Number.Cmp(new(big.Int).Add(cblock.Header().Number, ethutil.Big1)) < 0 {
chainlogger.Infof("Split detected. New head #%v (%x), was #%v (%x)\n", block.Header().Number, block.Hash()[:4], cblock.Header().Number, cblock.Hash()[:4]) chainlogger.Infof("Split detected. New head #%v (%x) TD=%v, was #%v (%x) TD=%v\n", block.Header().Number, block.Hash()[:4], td, cblock.Header().Number, cblock.Hash()[:4], self.td)
} }
self.setTotalDifficulty(td) self.setTotalDifficulty(td)

View File

@ -81,7 +81,7 @@ func RunVmTest(p string, t *testing.T) {
for name, test := range tests { for name, test := range tests {
/* /*
helper.Logger.SetLogLevel(5) helper.Logger.SetLogLevel(5)
if name != "jump0_jumpdest2" { if name != "createNameRegistratorZeroMem" {
continue continue
} }
*/ */