Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add block hash saving for non canon blocks #857

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cmd/geth/blocktest.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ func runOneBlockTest(ctx *cli.Context, test *tests.BlockTest) (*eth.Ethereum, er
return ethereum, fmt.Errorf("Block Test load error: %v", err)
}

fmt.Println("chain loaded")
if err := test.ValidatePostState(statedb); err != nil {
return ethereum, fmt.Errorf("post state validation failed: %v", err)
}
Expand Down
50 changes: 16 additions & 34 deletions core/chain_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,7 @@ func CalculateTD(block, parent *types.Block) *big.Int {
if parent == nil {
return block.Difficulty()
}

td := new(big.Int).Add(parent.Td, block.Header().Difficulty)

return td
return new(big.Int).Add(parent.Td, block.Difficulty())
}

func CalcGasLimit(parent *types.Block) *big.Int {
Expand All @@ -77,10 +74,10 @@ type ChainManager struct {
processor types.BlockProcessor
eventMux *event.TypeMux
genesisBlock *types.Block
// Last known total difficulty
mu sync.RWMutex
tsmu sync.RWMutex
mu sync.RWMutex
tsmu sync.RWMutex

// Last known total difficulty
td *big.Int
currentBlock *types.Block
lastBlockHash common.Hash
Expand Down Expand Up @@ -299,7 +296,7 @@ func (bc *ChainManager) Reset() {
}

// Prepare the genesis block
bc.write(bc.genesisBlock)
bc.writeBlock(bc.genesisBlock)
bc.insert(bc.genesisBlock)
bc.currentBlock = bc.genesisBlock
bc.makeCache()
Expand All @@ -321,7 +318,7 @@ func (bc *ChainManager) ResetWithGenesisBlock(gb *types.Block) {

// Prepare the genesis block
bc.genesisBlock = gb
bc.write(bc.genesisBlock)
bc.writeBlock(bc.genesisBlock)
bc.insert(bc.genesisBlock)
bc.currentBlock = bc.genesisBlock
bc.makeCache()
Expand Down Expand Up @@ -350,16 +347,19 @@ func (self *ChainManager) Export(w io.Writer) error {
return nil
}

func (bc *ChainManager) insert(block *types.Block) {
func (bc *ChainManager) writeBlockHash(block *types.Block) {
key := append(blockNumPre, block.Number().Bytes()...)
bc.blockDb.Put(key, block.Hash().Bytes())
}

func (bc *ChainManager) insert(block *types.Block) {
bc.writeBlockHash(block)
bc.blockDb.Put([]byte("LastBlock"), block.Hash().Bytes())
bc.currentBlock = block
bc.lastBlockHash = block.Hash()
}

func (bc *ChainManager) write(block *types.Block) {
func (bc *ChainManager) writeBlock(block *types.Block) {
enc, _ := rlp.EncodeToBytes((*types.StorageBlock)(block))
key := append(blockHashPre, block.Hash().Bytes()...)
bc.blockDb.Put(key, enc)
Expand Down Expand Up @@ -461,26 +461,6 @@ func (bc *ChainManager) setTotalDifficulty(td *big.Int) {
bc.td = td
}

func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
parent := self.GetBlock(block.Header().ParentHash)
if parent == nil {
return nil, fmt.Errorf("Unable to calculate total diff without known parent %x", block.Header().ParentHash)
}

parentTd := parent.Td

uncleDiff := new(big.Int)
for _, uncle := range block.Uncles() {
uncleDiff = uncleDiff.Add(uncleDiff, uncle.Difficulty)
}

td := new(big.Int)
td = td.Add(parentTd, uncleDiff)
td = td.Add(td, block.Header().Difficulty)

return td, nil
}

func (bc *ChainManager) Stop() {
close(bc.quit)

Expand Down Expand Up @@ -537,7 +517,7 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
}

block.Td = new(big.Int)
// Do not penelise on future block. We'll need a block queue eventually that will queue
// Do not penalize on future block. We'll need a block queue eventually that will queue
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please correct properly. Do not favour American English over correct English ;-) (i.e. penalise)

// future block for future use
if err == BlockFutureErr {
block.SetQueued(true)
Expand Down Expand Up @@ -567,12 +547,14 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
cblock := self.currentBlock
// Write block to database. Eventually we'll have to improve on this and throw away blocks that are
// not in the canonical chain.
self.write(block)
self.writeBlockHash(block)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wrong! Do not write canonical hashes BEFORE you check the TD.

This means insert everything regardless of TD.

self.writeBlock(block)
// Compare the TD of the last known block in the canonical chain to make sure it's greater.
// At this point it's possible that a different chain (fork) becomes the new canonical chain.
if block.Td.Cmp(self.td) > 0 {
// Check for chain forks. If H(block.num - 1) != block.parent, we're on a fork and need to do some merging
if previous := self.getBlockByNumber(block.NumberU64() - 1); previous.Hash() != block.ParentHash() {
previous := self.getBlockByNumber(block.NumberU64() - 1)
if previous.Hash() != block.ParentHash() {
chash := cblock.Hash()
hash := block.Hash()

Expand Down
4 changes: 2 additions & 2 deletions core/chain_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func testChain(chainB types.Blocks, bman *BlockProcessor) (*big.Int, error) {

bman.bc.mu.Lock()
{
bman.bc.write(block)
bman.bc.writeBlock(block)
}
bman.bc.mu.Unlock()
}
Expand Down Expand Up @@ -342,7 +342,7 @@ func TestGetAncestors(t *testing.T) {
}

for _, block := range chain {
chainMan.write(block)
chainMan.writeBlock(block)
}

ancestors := chainMan.GetAncestors(chain[len(chain)-1], 4)
Expand Down