diff --git a/include/bitcoin/database/impl/query/archive/wire_writer.ipp b/include/bitcoin/database/impl/query/archive/wire_writer.ipp index 4e4c9392..b73a146d 100644 --- a/include/bitcoin/database/impl/query/archive/wire_writer.ipp +++ b/include/bitcoin/database/impl/query/archive/wire_writer.ipp @@ -35,7 +35,9 @@ code CLASS::set_code(const tx_link& tx_fk, const transaction_view& tx, using namespace system; using ix = linkage; - if (tx.is_empty()) + // View parser treats empty as invalid, so there is no empty state. + // As a result this condition should never be hit (deserialization fails). + if (!tx.is_valid()) return error::tx_empty; const auto inputs = possible_narrow_cast(tx.inputs()); diff --git a/include/bitcoin/database/tables/archives/output.hpp b/include/bitcoin/database/tables/archives/output.hpp index 65530eac..c29da69f 100644 --- a/include/bitcoin/database/tables/archives/output.hpp +++ b/include/bitcoin/database/tables/archives/output.hpp @@ -249,7 +249,7 @@ struct output { const auto start = source.get_read_position(); const auto value = source.read_8_bytes_little_endian(); - source.skip_bytes(value_size + source.read_size()); + source.skip_bytes(source.read_size()); const auto output_size = source.get_read_position() - start; outputs += variable_size(value) + output_size; } @@ -261,6 +261,18 @@ struct output inline bool to_data(flipper& sink) const NOEXCEPT { + using namespace system; + auto stream = tx_.get_outputs_stream(); + read::bytes::fast source{ stream }; + for (size_t out{}; out < tx_.outputs(); ++out) + { + // tx view output writer not used due to variable value. + sink.write_little_endian(parent_fk); + sink.write_variable(source.read_8_bytes_little_endian()); + sink.write_bytes(source.read_bytes(source.read_size())); + } + + BC_ASSERT(!sink || sink.get_write_position() == count()); return sink; }