@ -118,17 +118,21 @@ func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, compara
var tdPre , tdPost * big . Int
if full {
tdPre = blockchain . GetTdByHash ( blockchain . CurrentBlock ( ) . Hash ( ) )
cur := blockchain . CurrentBlock ( )
tdPre = blockchain . GetTd ( cur . Hash ( ) , cur . NumberU64 ( ) )
if err := testBlockChainImport ( blockChainB , blockchain ) ; err != nil {
t . Fatalf ( "failed to import forked block chain: %v" , err )
}
tdPost = blockchain . GetTdByHash ( blockChainB [ len ( blockChainB ) - 1 ] . Hash ( ) )
last := blockChainB [ len ( blockChainB ) - 1 ]
tdPost = blockchain . GetTd ( last . Hash ( ) , last . NumberU64 ( ) )
} else {
tdPre = blockchain . GetTdByHash ( blockchain . CurrentHeader ( ) . Hash ( ) )
cur := blockchain . CurrentHeader ( )
tdPre = blockchain . GetTd ( cur . Hash ( ) , cur . Number . Uint64 ( ) )
if err := testHeaderChainImport ( headerChainB , blockchain ) ; err != nil {
t . Fatalf ( "failed to import forked header chain: %v" , err )
}
tdPost = blockchain . GetTdByHash ( headerChainB [ len ( headerChainB ) - 1 ] . Hash ( ) )
last := headerChainB [ len ( headerChainB ) - 1 ]
tdPost = blockchain . GetTd ( last . Hash ( ) , last . Number . Uint64 ( ) )
}
// Compare the total difficulties of the chains
comparator ( tdPre , tdPost )
@ -165,7 +169,7 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error {
}
blockchain . chainmu . MustLock ( )
rawdb . WriteTd ( blockchain . db , block . Hash ( ) , block . NumberU64 ( ) , new ( big . Int ) . Add ( block . Difficulty ( ) , blockchain . GetTdByHash ( block . ParentHash ( ) ) ) )
rawdb . WriteTd ( blockchain . db , block . Hash ( ) , block . NumberU64 ( ) , new ( big . Int ) . Add ( block . Difficulty ( ) , blockchain . GetTd ( block . ParentHash ( ) , block . NumberU64 ( ) - 1 ) ) )
rawdb . WriteBlock ( blockchain . db , block )
statedb . Commit ( false )
blockchain . chainmu . Unlock ( )
@ -183,7 +187,7 @@ func testHeaderChainImport(chain []*types.Header, blockchain *BlockChain) error
}
// Manually insert the header into the database, but don't reorganise (allows subsequent testing)
blockchain . chainmu . MustLock ( )
rawdb . WriteTd ( blockchain . db , header . Hash ( ) , header . Number . Uint64 ( ) , new ( big . Int ) . Add ( header . Difficulty , blockchain . GetTdByHash ( header . ParentHash ) ) )
rawdb . WriteTd ( blockchain . db , header . Hash ( ) , header . Number . Uint64 ( ) , new ( big . Int ) . Add ( header . Difficulty , blockchain . GetTd ( header . ParentHash , header . Number . Uint64 ( ) - 1 ) ) )
rawdb . WriteHeader ( blockchain . db , header )
blockchain . chainmu . Unlock ( )
}
@ -436,11 +440,13 @@ func testReorg(t *testing.T, first, second []int64, td int64, full bool) {
// Make sure the chain total difficulty is the correct one
want := new ( big . Int ) . Add ( blockchain . genesisBlock . Difficulty ( ) , big . NewInt ( td ) )
if full {
if have := blockchain . GetTdByHash ( blockchain . CurrentBlock ( ) . Hash ( ) ) ; have . Cmp ( want ) != 0 {
cur := blockchain . CurrentBlock ( )
if have := blockchain . GetTd ( cur . Hash ( ) , cur . NumberU64 ( ) ) ; have . Cmp ( want ) != 0 {
t . Errorf ( "total difficulty mismatch: have %v, want %v" , have , want )
}
} else {
if have := blockchain . GetTdByHash ( blockchain . CurrentHeader ( ) . Hash ( ) ) ; have . Cmp ( want ) != 0 {
cur := blockchain . CurrentHeader ( )
if have := blockchain . GetTd ( cur . Hash ( ) , cur . Number . Uint64 ( ) ) ; have . Cmp ( want ) != 0 {
t . Errorf ( "total difficulty mismatch: have %v, want %v" , have , want )
}
}
@ -676,10 +682,10 @@ func TestFastVsFullChains(t *testing.T) {
for i := 0 ; i < len ( blocks ) ; i ++ {
num , hash := blocks [ i ] . NumberU64 ( ) , blocks [ i ] . Hash ( )
if ftd , atd := fast . GetTdByHash ( hash ) , archive . GetTdByHash ( hash ) ; ftd . Cmp ( atd ) != 0 {
if ftd , atd := fast . GetTd ( hash , num ) , archive . GetTd ( hash , num ) ; ftd . Cmp ( atd ) != 0 {
t . Errorf ( "block #%d [%x]: td mismatch: fastdb %v, archivedb %v" , num , hash , ftd , atd )
}
if antd , artd := ancient . GetTdByHash ( hash ) , archive . GetTdByHash ( hash ) ; antd . Cmp ( artd ) != 0 {
if antd , artd := ancient . GetTd ( hash , num ) , archive . GetTd ( hash , num ) ; antd . Cmp ( artd ) != 0 {
t . Errorf ( "block #%d [%x]: td mismatch: ancientdb %v, archivedb %v" , num , hash , antd , artd )
}
if fheader , aheader := fast . GetHeaderByHash ( hash ) , archive . GetHeaderByHash ( hash ) ; fheader . Hash ( ) != aheader . Hash ( ) {