|
|
@@ -23,6 +23,7 @@ import (
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
"github.com/ethereum/go-ethereum/core/types"
|
|
|
+ "github.com/ethereum/go-ethereum/crypto"
|
|
|
"github.com/ethereum/go-ethereum/ethdb"
|
|
|
"github.com/ethereum/go-ethereum/log"
|
|
|
"github.com/ethereum/go-ethereum/params"
|
|
|
@@ -173,18 +174,27 @@ func WriteFastTrieProgress(db ethdb.KeyValueWriter, count uint64) {
|
|
|
|
|
|
// ReadHeaderRLP retrieves a block header in its raw RLP database encoding.
|
|
|
func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue {
|
|
|
+ // First try to look up the data in ancient database. Extra hash
|
|
|
+ // comparison is necessary since ancient database only maintains
|
|
|
+ // the canonical data.
|
|
|
data, _ := db.Ancient(freezerHeaderTable, number)
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Get(headerKey(number, hash))
|
|
|
- // In the background freezer is moving data from leveldb to flatten files.
|
|
|
- // So during the first check for ancient db, the data is not yet in there,
|
|
|
- // but when we reach into leveldb, the data was already moved. That would
|
|
|
- // result in a not found error.
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Ancient(freezerHeaderTable, number)
|
|
|
- }
|
|
|
+ if len(data) > 0 && crypto.Keccak256Hash(data) == hash {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ // Then try to look up the data in leveldb.
|
|
|
+ data, _ = db.Get(headerKey(number, hash))
|
|
|
+ if len(data) > 0 {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ // In the background freezer is moving data from leveldb to flatten files.
|
|
|
+ // So during the first check for ancient db, the data is not yet in there,
|
|
|
+ // but when we reach into leveldb, the data was already moved. That would
|
|
|
+ // result in a not found error.
|
|
|
+ data, _ = db.Ancient(freezerHeaderTable, number)
|
|
|
+ if len(data) > 0 && crypto.Keccak256Hash(data) == hash {
|
|
|
+ return data
|
|
|
}
|
|
|
- return data
|
|
|
+ return nil // Can't find the data anywhere.
|
|
|
}
|
|
|
|
|
|
// HasHeader verifies the existence of a block header corresponding to the hash.
|
|
|
@@ -251,18 +261,33 @@ func deleteHeaderWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number
|
|
|
|
|
|
// ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding.
|
|
|
func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue {
|
|
|
+ // First try to look up the data in ancient database. Extra hash
|
|
|
+ // comparison is necessary since ancient database only maintains
|
|
|
+ // the canonical data.
|
|
|
data, _ := db.Ancient(freezerBodiesTable, number)
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Get(blockBodyKey(number, hash))
|
|
|
- // In the background freezer is moving data from leveldb to flatten files.
|
|
|
- // So during the first check for ancient db, the data is not yet in there,
|
|
|
- // but when we reach into leveldb, the data was already moved. That would
|
|
|
- // result in a not found error.
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Ancient(freezerBodiesTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Then try to look up the data in leveldb.
|
|
|
+ data, _ = db.Get(blockBodyKey(number, hash))
|
|
|
+ if len(data) > 0 {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ // In the background freezer is moving data from leveldb to flatten files.
|
|
|
+ // So during the first check for ancient db, the data is not yet in there,
|
|
|
+ // but when we reach into leveldb, the data was already moved. That would
|
|
|
+ // result in a not found error.
|
|
|
+ data, _ = db.Ancient(freezerBodiesTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
}
|
|
|
}
|
|
|
- return data
|
|
|
+ return nil // Can't find the data anywhere.
|
|
|
}
|
|
|
|
|
|
// WriteBodyRLP stores an RLP encoded block body into the database.
|
|
|
@@ -315,18 +340,33 @@ func DeleteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64) {
|
|
|
|
|
|
// ReadTdRLP retrieves a block's total difficulty corresponding to the hash in RLP encoding.
|
|
|
func ReadTdRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue {
|
|
|
+ // First try to look up the data in ancient database. Extra hash
|
|
|
+ // comparison is necessary since ancient database only maintains
|
|
|
+ // the canonical data.
|
|
|
data, _ := db.Ancient(freezerDifficultyTable, number)
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Get(headerTDKey(number, hash))
|
|
|
- // In the background freezer is moving data from leveldb to flatten files.
|
|
|
- // So during the first check for ancient db, the data is not yet in there,
|
|
|
- // but when we reach into leveldb, the data was already moved. That would
|
|
|
- // result in a not found error.
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Ancient(freezerDifficultyTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Then try to look up the data in leveldb.
|
|
|
+ data, _ = db.Get(headerTDKey(number, hash))
|
|
|
+ if len(data) > 0 {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ // In the background freezer is moving data from leveldb to flatten files.
|
|
|
+ // So during the first check for ancient db, the data is not yet in there,
|
|
|
+ // but when we reach into leveldb, the data was already moved. That would
|
|
|
+ // result in a not found error.
|
|
|
+ data, _ = db.Ancient(freezerDifficultyTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
}
|
|
|
}
|
|
|
- return data
|
|
|
+ return nil // Can't find the data anywhere.
|
|
|
}
|
|
|
|
|
|
// ReadTd retrieves a block's total difficulty corresponding to the hash.
|
|
|
@@ -375,18 +415,33 @@ func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool {
|
|
|
|
|
|
// ReadReceiptsRLP retrieves all the transaction receipts belonging to a block in RLP encoding.
|
|
|
func ReadReceiptsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue {
|
|
|
+ // First try to look up the data in ancient database. Extra hash
|
|
|
+ // comparison is necessary since ancient database only maintains
|
|
|
+ // the canonical data.
|
|
|
data, _ := db.Ancient(freezerReceiptTable, number)
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Get(blockReceiptsKey(number, hash))
|
|
|
- // In the background freezer is moving data from leveldb to flatten files.
|
|
|
- // So during the first check for ancient db, the data is not yet in there,
|
|
|
- // but when we reach into leveldb, the data was already moved. That would
|
|
|
- // result in a not found error.
|
|
|
- if len(data) == 0 {
|
|
|
- data, _ = db.Ancient(freezerReceiptTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // Then try to look up the data in leveldb.
|
|
|
+ data, _ = db.Get(blockReceiptsKey(number, hash))
|
|
|
+ if len(data) > 0 {
|
|
|
+ return data
|
|
|
+ }
|
|
|
+ // In the background freezer is moving data from leveldb to flatten files.
|
|
|
+ // So during the first check for ancient db, the data is not yet in there,
|
|
|
+ // but when we reach into leveldb, the data was already moved. That would
|
|
|
+ // result in a not found error.
|
|
|
+ data, _ = db.Ancient(freezerReceiptTable, number)
|
|
|
+ if len(data) > 0 {
|
|
|
+ h, _ := db.Ancient(freezerHashTable, number)
|
|
|
+ if common.BytesToHash(h) == hash {
|
|
|
+ return data
|
|
|
}
|
|
|
}
|
|
|
- return data
|
|
|
+ return nil // Can't find the data anywhere.
|
|
|
}
|
|
|
|
|
|
// ReadRawReceipts retrieves all the transaction receipts belonging to a block.
|