|
|
|
@ -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.
|
|
|
|
|