/usr/include/bitcoin/transaction_indexer.hpp is in libbitcoin-dev 2.0-2.4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | /*
* Copyright (c) 2011-2013 libbitcoin developers (see AUTHORS)
*
* This file is part of libbitcoin.
*
* libbitcoin is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License with
* additional permissions to the one published by the Free Software
* Foundation, either version 3 of the License, or (at your option)
* any later version. For more information see LICENSE.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef LIBBITCOIN_TRANSACTION_INDEXER_HPP
#define LIBBITCOIN_TRANSACTION_INDEXER_HPP
#include <unordered_map>
#include <forward_list>
#include <system_error>
#include <bitcoin/address.hpp>
#include <bitcoin/primitives.hpp>
#include <bitcoin/threadpool.hpp>
#include <bitcoin/types.hpp>
#include <bitcoin/blockchain/blockchain.hpp>
namespace libbitcoin {
// output_info_type is defined in <bitcoin/transaction.hpp>
struct spend_info_type
{
input_point point;
output_point previous_output;
};
typedef std::vector<spend_info_type> spend_info_list;
class transaction_indexer
{
public:
typedef std::function<void (const std::error_code&)> completion_handler;
typedef std::function<void (const std::error_code& ec,
const output_info_list& outputs, const spend_info_list& spends)>
query_handler;
transaction_indexer(threadpool& pool);
/// Non-copyable class
transaction_indexer(const transaction_indexer&) = delete;
/// Non-copyable class
void operator=(const transaction_indexer&) = delete;
/**
* Query all transactions indexed that are related to a Bitcoin address.
*
* @param[in] payaddr Bitcoin address to lookup.
* @param[in] handle_query Completion handler for fetch operation.
* @code
* void handle_query(
* const std::error_code& ec, // Status of operation
* const output_info_list& outputs, // Outputs
* const spend_info_list& spends // Inputs
* );
* @endcode
* @code
* struct output_info_type
* {
* output_point point;
* uint64_t value;
* };
*
* struct spend_info_type
* {
* input_point point;
* output_point previous_output;
* };
* @endcode
*/
void query(const payment_address& payaddr,
query_handler handle_query);
/**
* Index a transaction.
*
* @param[in] tx Transaction to index.
* @param[in] handle_index Completion handler for index operation.
* @code
* void handle_index(
* const std::error_code& ec // Status of operation
* );
* @endcode
*/
void index(const transaction_type& tx,
completion_handler handle_index);
/**
* Deindex (remove from index) a transaction.
*
* @param[in] tx Transaction to deindex.
* @param[in] handle_index Completion handler for deindex operation.
* @code
* void handle_deindex(
* const std::error_code& ec // Status of operation
* );
* @endcode
*/
void deindex(const transaction_type& tx,
completion_handler handle_deindex);
private:
// addr -> spend
typedef std::unordered_multimap<payment_address, spend_info_type>
spends_multimap;
// addr -> output
typedef std::unordered_multimap<payment_address, output_info_type>
outputs_multimap;
void do_query(const payment_address& payaddr,
query_handler handle_query);
void do_index(const transaction_type& tx,
completion_handler handle_index);
void do_deindex(const transaction_type& tx,
completion_handler handle_deindex);
async_strand strand_;
spends_multimap spends_map_;
outputs_multimap outputs_map_;
};
void fetch_history(blockchain& chain, transaction_indexer& indexer,
const payment_address& address,
blockchain::fetch_handler_history handle_fetch, size_t from_height=0);
} // namespace libbitcoin
#endif
|