From 67d44519ce4344d5ee5f7cf37dd785ead70e8453 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 18 May 2015 10:49:09 +0200 Subject: core: bugfix test 2. set => hash map --- core/block_processor.go | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/core/block_processor.go b/core/block_processor.go index 97ac4ce24..0652d217f 100644 --- a/core/block_processor.go +++ b/core/block_processor.go @@ -15,7 +15,6 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/ethereum/go-ethereum/pow" "github.com/ethereum/go-ethereum/rlp" - "gopkg.in/fatih/set.v0" ) const ( @@ -329,40 +328,50 @@ func AccumulateRewards(statedb *state.StateDB, block *types.Block) { } func (sm *BlockProcessor) VerifyUncles(statedb *state.StateDB, block, parent *types.Block) error { - ancestors := set.New() - uncles := set.New() + //ancestors := set.New() + //uncles := set.New() + ancestors := make(map[common.Hash]struct{}) + uncles := make(map[common.Hash]struct{}) ancestorHeaders := make(map[common.Hash]*types.Header) for _, ancestor := range sm.bc.GetAncestors(block, 7) { ancestorHeaders[ancestor.Hash()] = ancestor.Header() - ancestors.Add(ancestor.Hash()) + //ancestors.Add(ancestor.Hash()) + ancestors[ancestor.Hash()] = struct{}{} // Include ancestors uncles in the uncle set. Uncles must be unique. for _, uncle := range ancestor.Uncles() { - uncles.Add(uncle.Hash()) + //uncles.Add(uncle.Hash()) + uncles[uncle.Hash()] = struct{}{} } } - uncles.Add(block.Hash()) + //uncles.Add(block.Hash()) + uncles[block.Hash()] = struct{}{} for i, uncle := range block.Uncles() { hash := uncle.Hash() - if uncles.Has(hash) { + //if uncles.Has(hash) { + if _, has := uncles[hash]; has { // Error not unique return UncleError("uncle[%d](%x) not unique", i, hash[:4]) } - uncles.Add(hash) + uncles[hash] = struct{}{} - if ancestors.Has(hash) { + //if ancestors.Has(hash) { + if _, has := ancestors[hash]; has { var branch string - ancestors.Each(func(item interface{}) bool { - branch += fmt.Sprintf(" O - %x\n |\n", item.(common.Hash)) - return true - }) + //ancestors.Each(func(item interface{}) bool { + for hash := range ancestors { + branch += fmt.Sprintf(" O - %x\n |\n", hash) + //return true + } + //}) branch += fmt.Sprintf(" O - %x\n |\n", block.Hash()) glog.Infoln(branch) return UncleError("uncle[%d](%x) is ancestor", i, hash[:4]) } - if !ancestors.Has(uncle.ParentHash) { + //if !ancestors.Has(uncle.ParentHash) { + if _, has := ancestors[uncle.ParentHash]; !has { return UncleError("uncle[%d](%x)'s parent unknown (%x)", i, hash[:4], uncle.ParentHash[0:4]) } -- cgit v1.2.3