/usr/share/doc/libbitcoin-dev/examples/balance.cpp 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 | /*
* 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/>.
*/
#include <bitcoin/bitcoin.hpp>
using namespace bc;
blockchain* c = nullptr;
std::string addr;
void blockchain_started(const std::error_code& ec);
void history_fetched(const std::error_code& ec,
const blockchain::history_list& history);
void blockchain_started(const std::error_code& ec)
{
if (ec)
{
log_error() << "Blockchain failed to start: " << ec.message();
return;
}
log_info() << "Blockchain started.";
payment_address payaddr;
if (!payaddr.set_encoded(addr))
{
log_fatal() << "Invalid address";
return;
}
c->fetch_history(payaddr, history_fetched);
}
void history_fetched(const std::error_code& ec,
const blockchain::history_list& history)
{
if (ec)
{
log_error() << "Failed to fetch history: " << ec.message();
return;
}
#define LOG_RESULT "result"
uint64_t total_recv = 0, balance = 0;
for (const auto& row: history)
{
uint64_t value = row.value;
BITCOIN_ASSERT(value >= 0);
total_recv += value;
if (row.spend.hash == null_hash)
balance += value;
}
log_debug(LOG_RESULT) << "Queried " << history.size()
<< " outpoints, values and their spends.";
log_debug(LOG_RESULT) << "Total received: " << total_recv;
log_debug(LOG_RESULT) << "Balance: " << balance;
log_info(LOG_RESULT) << "History fetched";
}
int main(int argc, char** argv)
{
if (argc != 2)
{
log_info() << "Usage: balance ADDRESS";
return -1;
}
addr = argv[1];
threadpool pool(1);
leveldb_blockchain chain(pool);
c = &chain;
chain.start("blockchain", blockchain_started);
pool.shutdown();
pool.join();
chain.stop();
return 0;
}
|