|
|
|
@ -9,6 +9,7 @@ import ( |
|
|
|
|
"strconv" |
|
|
|
|
"testing" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common" |
|
|
|
|
"github.com/ethereum/go-ethereum/core/state" |
|
|
|
|
"github.com/ethereum/go-ethereum/core/types" |
|
|
|
|
"github.com/ethereum/go-ethereum/ethdb" |
|
|
|
@ -44,7 +45,7 @@ func testFork(t *testing.T, bman *BlockProcessor, i, N int, f func(td1, td2 *big |
|
|
|
|
// extend the fork
|
|
|
|
|
parent := bman2.bc.CurrentBlock() |
|
|
|
|
chainB := makeChain(bman2, parent, N, db, ForkSeed) |
|
|
|
|
err = bman2.bc.InsertChain(chainB) |
|
|
|
|
_, err = bman2.bc.InsertChain(chainB) |
|
|
|
|
if err != nil { |
|
|
|
|
t.Fatal("Insert chain error for fork:", err) |
|
|
|
|
} |
|
|
|
@ -108,7 +109,7 @@ func loadChain(fn string, t *testing.T) (types.Blocks, error) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func insertChain(done chan bool, chainMan *ChainManager, chain types.Blocks, t *testing.T) { |
|
|
|
|
err := chainMan.InsertChain(chain) |
|
|
|
|
_, err := chainMan.InsertChain(chain) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Println(err) |
|
|
|
|
t.FailNow() |
|
|
|
@ -369,11 +370,8 @@ func makeChainWithDiff(genesis *types.Block, d []int, seed byte) []*types.Block |
|
|
|
|
return chain |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestReorg(t *testing.T) { |
|
|
|
|
db, _ := ethdb.NewMemDatabase() |
|
|
|
|
func chm(genesis *types.Block, db common.Database) *ChainManager { |
|
|
|
|
var eventMux event.TypeMux |
|
|
|
|
|
|
|
|
|
genesis := GenesisBlock(db) |
|
|
|
|
bc := &ChainManager{blockDb: db, stateDb: db, genesisBlock: genesis, eventMux: &eventMux} |
|
|
|
|
bc.cache = NewBlockCache(100) |
|
|
|
|
bc.futureBlocks = NewBlockCache(100) |
|
|
|
@ -381,6 +379,14 @@ func TestReorg(t *testing.T) { |
|
|
|
|
bc.ResetWithGenesisBlock(genesis) |
|
|
|
|
bc.txState = state.ManageState(bc.State()) |
|
|
|
|
|
|
|
|
|
return bc |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestReorgLongest(t *testing.T) { |
|
|
|
|
db, _ := ethdb.NewMemDatabase() |
|
|
|
|
genesis := GenesisBlock(db) |
|
|
|
|
bc := chm(genesis, db) |
|
|
|
|
|
|
|
|
|
chain1 := makeChainWithDiff(genesis, []int{1, 2, 4}, 10) |
|
|
|
|
chain2 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 11) |
|
|
|
|
|
|
|
|
@ -394,3 +400,22 @@ func TestReorg(t *testing.T) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestReorgShortest(t *testing.T) { |
|
|
|
|
db, _ := ethdb.NewMemDatabase() |
|
|
|
|
genesis := GenesisBlock(db) |
|
|
|
|
bc := chm(genesis, db) |
|
|
|
|
|
|
|
|
|
chain1 := makeChainWithDiff(genesis, []int{1, 2, 3, 4}, 10) |
|
|
|
|
chain2 := makeChainWithDiff(genesis, []int{1, 10}, 11) |
|
|
|
|
|
|
|
|
|
bc.InsertChain(chain1) |
|
|
|
|
bc.InsertChain(chain2) |
|
|
|
|
|
|
|
|
|
prev := bc.CurrentBlock() |
|
|
|
|
for block := bc.GetBlockByNumber(bc.CurrentBlock().NumberU64() - 1); block.NumberU64() != 0; prev, block = block, bc.GetBlockByNumber(block.NumberU64()-1) { |
|
|
|
|
if prev.ParentHash() != block.Hash() { |
|
|
|
|
t.Errorf("parent hash mismatch %x - %x", prev.ParentHash(), block.Hash()) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|