aboutsummaryrefslogtreecommitdiffstats
path: root/chain
diff options
context:
space:
mode:
Diffstat (limited to 'chain')
-rw-r--r--chain/block_manager.go30
-rw-r--r--chain/chain_manager.go70
-rw-r--r--chain/error.go13
3 files changed, 36 insertions, 77 deletions
diff --git a/chain/block_manager.go b/chain/block_manager.go
index 4d8d8dae6..c1a28e423 100644
--- a/chain/block_manager.go
+++ b/chain/block_manager.go
@@ -185,6 +185,7 @@ func (sm *BlockManager) Process(block *Block) (td *big.Int, msgs state.Messages,
defer sm.mutex.Unlock()
if sm.bc.HasBlock(block.Hash()) {
+ fmt.Println("already having this block")
return nil, nil, nil
}
@@ -211,7 +212,7 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
fmt.Printf("## %x %x ##\n", block.Hash(), block.Number)
}
- receipts, err := sm.ApplyDiff(state, parent, block)
+ _, err = sm.ApplyDiff(state, parent, block)
if err != nil {
return
}
@@ -222,11 +223,13 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
return
}
- receiptSha := DeriveSha(receipts)
- if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
- err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
- return
- }
+ /*
+ receiptSha := DeriveSha(receipts)
+ if bytes.Compare(receiptSha, block.ReceiptSha) != 0 {
+ err = fmt.Errorf("validating receipt root. received=%x got=%x", block.ReceiptSha, receiptSha)
+ return
+ }
+ */
// Block validation
if err = sm.ValidateBlock(block, parent); err != nil {
@@ -239,12 +242,14 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
return
}
- block.receipts = receipts // although this isn't necessary it be in the future
- rbloom := CreateBloom(receipts)
- if bytes.Compare(rbloom, block.LogsBloom) != 0 {
- err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
- return
- }
+ /*
+ block.receipts = receipts // although this isn't necessary it be in the future
+ rbloom := CreateBloom(receipts)
+ if bytes.Compare(rbloom, block.LogsBloom) != 0 {
+ err = fmt.Errorf("unable to replicate block's bloom=%x", rbloom)
+ return
+ }
+ */
state.Update(ethutil.Big0)
@@ -266,6 +271,7 @@ func (sm *BlockManager) ProcessWithParent(block, parent *Block) (td *big.Int, me
sm.transState = state.Copy()
sm.eth.TxPool().RemoveSet(block.Transactions())
+ fmt.Println("TD", td)
return td, messages, nil
} else {
diff --git a/chain/chain_manager.go b/chain/chain_manager.go
index 75c8b22a2..3448b02dd 100644
--- a/chain/chain_manager.go
+++ b/chain/chain_manager.go
@@ -326,9 +326,14 @@ func (self *ChainManager) InsertChain(chain Blocks) error {
for _, block := range chain {
td, messages, err := self.Ethereum.BlockManager().Process(block)
if err != nil {
+ if IsKnownBlockErr(err) {
+ continue
+ }
+
return err
}
+ fmt.Println(td, messages, err)
self.add(block)
self.SetTotalDifficulty(td)
self.Ethereum.EventMux().Post(NewBlockEvent{block})
@@ -337,68 +342,3 @@ func (self *ChainManager) InsertChain(chain Blocks) error {
return nil
}
-
-/*
-// This function assumes you've done your checking. No checking is done at this stage anymore
-func (self *ChainManager) InsertChain(chain *BlockChain) {
- for e := chain.Front(); e != nil; e = e.Next() {
- link := e.Value.(*link)
-
- self.add(link.block)
- self.SetTotalDifficulty(link.td)
- self.Ethereum.EventMux().Post(NewBlockEvent{link.block})
- self.Ethereum.EventMux().Post(link.messages)
- }
-
- b, e := chain.Front(), chain.Back()
- if b != nil && e != nil {
- front, back := b.Value.(*link).block, e.Value.(*link).block
- chainlogger.Infof("Imported %d blocks. #%v (%x) / %#v (%x)", chain.Len(), front.Number, front.Hash()[0:4], back.Number, back.Hash()[0:4])
- }
-}
-*/
-
-/*
-func (self *ChainManager) TestChain(chain *BlockChain) (td *big.Int, err error) {
- self.workingChain = chain
- defer func() { self.workingChain = nil }()
-
- for e := chain.Front(); e != nil; e = e.Next() {
- var (
- l = e.Value.(*link)
- block = l.block
- parent = self.GetBlock(block.PrevHash)
- )
-
- //fmt.Println("parent", parent)
- //fmt.Println("current", block)
-
- if parent == nil {
- err = fmt.Errorf("incoming chain broken on hash %x\n", block.PrevHash[0:4])
- return
- }
-
- var messages state.Messages
- td, messages, err = self.Ethereum.BlockManager().ProcessWithParent(block, parent)
- if err != nil {
- chainlogger.Infoln(err)
- chainlogger.Debugf("Block #%v failed (%x...)\n", block.Number, block.Hash()[0:4])
- chainlogger.Debugln(block)
-
- err = fmt.Errorf("incoming chain failed %v\n", err)
- return
- }
- l.td = td
- l.messages = messages
- }
-
- if td.Cmp(self.TD) <= 0 {
- err = &TDError{td, self.TD}
- return
- }
-
- self.workingChain = nil
-
- return
-}
-*/
diff --git a/chain/error.go b/chain/error.go
index 540eda95a..7dce2b608 100644
--- a/chain/error.go
+++ b/chain/error.go
@@ -126,3 +126,16 @@ func IsTDError(e error) bool {
_, ok := e.(*TDError)
return ok
}
+
+type KnownBlockError struct {
+ number uint64
+ hash []byte
+}
+
+func (self *KnownBlockError) Error() string {
+ return fmt.Sprintf("block %d already known (%x)", self.number, self.hash[0:4])
+}
+func IsKnownBlockErr(e error) bool {
+ _, ok := e.(*KnownBlockError)
+ return ok
+}