void receive_transaction_result(const data_chunk& data, blockchain::fetch_handler_transaction handle_fetch) { std::error_code ec; auto deserial = make_deserializer(data.begin(), data.end()); if (!read_error_code(deserial, data.size(), ec)) return; BITCOIN_ASSERT(deserial.iterator() == data.begin() + 4); transaction_type tx; satoshi_load(deserial.iterator(), data.end(), tx); handle_fetch(ec, tx); }
void attempt_load(const data_chunk& stream) const { Message result; try { satoshi_load(stream.begin(), stream.end(), result); handle_load_(std::error_code(), result); } catch (end_of_stream) { handle_load_(error::bad_stream, Message()); } }
void attempt_load(const data_chunk& stream) const { Message result; try { satoshi_load(stream.begin(), stream.end(), result); handle_load_(error::success, result); } catch (bc::end_of_stream) { // This doesn't invalidate the channel (unlike the invalid header). handle_load_(bc::error::bad_stream, Message()); } }
bool leveldb_common::deserialize_block(leveldb_block_info& blk_info, const std::string& raw_data, bool read_header, bool read_tx_hashes) { // Read the header (if neccessary). // There is always at least one tx in a block. BITCOIN_ASSERT(raw_data.size() >= 80 + 4 + hash_digest_size); BITCOIN_ASSERT((raw_data.size() - 84) % hash_digest_size == 0); if (read_header) satoshi_load(raw_data.begin(), raw_data.begin() + 80, blk_info.header); if (!read_tx_hashes) return true; // Read the tx hashes for this block (if neccessary). auto deserial = make_deserializer(raw_data.begin() + 80, raw_data.end()); uint32_t tx_count = deserial.read_4_bytes(); for (size_t i = 0; i < tx_count; ++i) { const hash_digest& tx_hash = deserial.read_hash(); blk_info.tx_hashes.push_back(tx_hash); } return true; }
bool leveldb_common::get_transaction(leveldb_tx_info& tx_info, const hash_digest& tx_hash, bool read_parent, bool read_tx) { // First we try to read the bytes from the database. std::string value; leveldb::Status status = db_.tx->Get( leveldb::ReadOptions(), slice(tx_hash), &value); if (status.IsNotFound()) return false; else if (!status.ok()) { log_fatal(LOG_BLOCKCHAIN) << "get_transaction(" << tx_hash << "): " << status.ToString(); return false; } // Read the parent block height and our index in that block (if neccessary). BITCOIN_ASSERT(value.size() > 8); if (read_parent) { auto deserial = make_deserializer(value.begin(), value.begin() + 8); tx_info.height = deserial.read_4_bytes(); tx_info.index = deserial.read_4_bytes(); } if (!read_tx) return true; // Read the actual transaction (if neccessary). try { BITCOIN_ASSERT(value.size() > 8); satoshi_load(value.begin() + 8, value.end(), tx_info.tx); } catch (end_of_stream) { return false; } BITCOIN_ASSERT(satoshi_raw_size(tx_info.tx) + 8 == value.size()); BITCOIN_ASSERT(hash_transaction(tx_info.tx) == tx_hash); return true; }