0diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
1index 47beac674c..7062735067 100644
2--- a/src/node/blockstorage.cpp
3+++ b/src/node/blockstorage.cpp
4@@ -1046,10 +1046,10 @@ bool BlockManager::ReadBlock(CBlock& block, const CBlockIndex& index) const
5
6 bool BlockManager::ReadRawBlock(std::vector<std::byte>& block, const FlatFilePos& pos) const
7 {
8- return ReadRawBlockPart(block, pos, std::nullopt, std::nullopt);
9+ return ReadRawBlockPart(block, pos, 0, std::nullopt);
10 }
11
12-bool BlockManager::ReadRawBlockPart(std::vector<std::byte>& data, const FlatFilePos& pos, std::optional<size_t> part_offset, std::optional<size_t> part_size) const
13+bool BlockManager::ReadRawBlockPart(std::vector<std::byte>& data, const FlatFilePos& pos, size_t part_offset, std::optional<size_t> part_size) const
14 {
15 if (pos.nPos < STORAGE_HEADER_BYTES) {
16 // If nPos is less than STORAGE_HEADER_BYTES, we can't read the header that precedes the block data
17@@ -1082,16 +1082,12 @@ bool BlockManager::ReadRawBlockPart(std::vector<std::byte>& data, const FlatFile
18 return false;
19 }
20
21- size_t offset = 0;
22- if (part_offset.has_value()) {
23- if (*part_offset > blk_size) {
24- LogError("Read from block file failed: invalid offset: %u", *part_offset);
25- return false;
26- }
27- offset = *part_offset;
28+ if (part_offset > blk_size) {
29+ LogError("Read from block file failed: invalid offset: %u", part_offset);
30+ return false;
31 }
32
33- size_t size = blk_size - offset;
34+ size_t size = blk_size - part_offset;
35 if (part_size.has_value()) {
36 if (*part_size > size || *part_size == 0) {
37 LogError("Read from block file failed: invalid size: %u", *part_size);
38@@ -1102,7 +1098,7 @@ bool BlockManager::ReadRawBlockPart(std::vector<std::byte>& data, const FlatFile
39
40
41 data.resize(size); // Zeroing of memory is intentional here
42- filein.seek(offset, SEEK_CUR);
43+ if (part_offset > 0) filein.seek(part_offset, SEEK_CUR);
44 filein.read(data);
45 } catch (const std::exception& e) {
46 LogError("Read from block file failed: %s for %s while reading raw block", e.what(), pos.ToString());
47diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h
48index 61128942b3..9f33d826a1 100644
49--- a/src/node/blockstorage.h
50+++ b/src/node/blockstorage.h
51@@ -414,7 +414,7 @@ public:
52 bool ReadBlock(CBlock& block, const FlatFilePos& pos, const std::optional<uint256>& expected_hash) const;
53 bool ReadBlock(CBlock& block, const CBlockIndex& index) const;
54 bool ReadRawBlock(std::vector<std::byte>& block, const FlatFilePos& pos) const;
55- bool ReadRawBlockPart(std::vector<std::byte>& data, const FlatFilePos& pos, std::optional<size_t> part_offset, std::optional<size_t> part_size) const;
56+ bool ReadRawBlockPart(std::vector<std::byte>& data, const FlatFilePos& pos, size_t part_offset, std::optional<size_t> part_size) const;
57
58 bool ReadBlockUndo(CBlockUndo& blockundo, const CBlockIndex& index) const;
59
60diff --git a/src/rest.cpp b/src/rest.cpp
61index f3edc69d09..294337a24b 100644
62--- a/src/rest.cpp
63+++ b/src/rest.cpp
64@@ -399,7 +399,7 @@ static bool rest_block(const std::any& context,
65 HTTPRequest* req,
66 const std::string& uri_part,
67 std::optional<TxVerbosity> tx_verbosity,
68- std::optional<size_t> part_offset,
69+ size_t part_offset,
70 std::optional<size_t> part_size)
71 {
72 if (!CheckWarmup(req))
73@@ -475,23 +475,25 @@ static bool rest_block(const std::any& context,
74
75 static bool rest_block_extended(const std::any& context, HTTPRequest* req, const std::string& uri_part)
76 {
77- return rest_block(context, req, uri_part, TxVerbosity::SHOW_DETAILS_AND_PREVOUT, /*part_offset=*/std::nullopt, /*part_size=*/std::nullopt);
78+ return rest_block(context, req, uri_part, TxVerbosity::SHOW_DETAILS_AND_PREVOUT, /*part_offset=*/0, /*part_size=*/std::nullopt);
79 }
80
81 static bool rest_block_notxdetails(const std::any& context, HTTPRequest* req, const std::string& uri_part)
82 {
83- return rest_block(context, req, uri_part, TxVerbosity::SHOW_TXID, /*part_offset=*/std::nullopt, /*part_size=*/std::nullopt);
84+ return rest_block(context, req, uri_part, TxVerbosity::SHOW_TXID, /*part_offset=*/0, /*part_size=*/std::nullopt);
85 }
86
87 static bool rest_block_part(const std::any& context, HTTPRequest* req, const std::string& uri_part)
88 {
89- std::optional<size_t> part_offset{};
90+ size_t part_offset{0};
91 std::optional<size_t> part_size{};
92 try {
93 const auto part_offset_str = req->GetQueryParameter("offset");
94 if (part_offset_str.has_value()) {
95- part_offset = ToIntegral<size_t>(*part_offset_str);
96- if (!part_offset.has_value()) {
97+ auto opt = ToIntegral<size_t>(*part_offset_str);
98+ if (opt.has_value()) {
99+ part_offset = opt.value();
100+ } else {
101 return RESTERR(req, HTTP_BAD_REQUEST, strprintf("Block part offset is invalid: %s", *part_offset_str));
102 }
103 }