diff --git a/README.md b/README.md index 9cc7f07..5649a74 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # Onion Monero Blockchain Explorer -Two Monero blockchain explorer exist in the clearnet. Although useful, +Monero blockchain explorer websites exist in the clearnet. Although useful, their limitations are that they use JavaScript, have images ([might be used for coockless tracking](http://lucb1e.com/rp/cookielesscookies/)), track users activates through google analytics, are not open sourced, and are not available as hidden services. These things are of importance for privacy-oriented users. - In this example, these limitations are addressed. Specifically, - an Onion Monero Blockchain Explorer is developed. It is build in C++, + In this example, these limitations are addressed by development of + an Onion Monero Blockchain Explorer. It is build in C++, and it not only shows how to use Monero C++ libraries, but also demonstrates how to use: @@ -20,20 +20,168 @@ track users activates through google analytics, are not open sourced, and are no ## Onion Monero Blockchain Explorer features - - no javascript, no web analytics trackers, no images, i.e., no user tracking - - open source which allows everyone to check its source code, fork it, contribute - - made fully in C++ allowing for seamless integration with Monero - - does not use RPC calls, except to get mempool data, which improves its performance - and enables to fetch more information from the blockchain - - index page lists recent transactions in the blockchain and in the memory pool, - rather than only recent blocks, allowing for fast overview of recent activity in Monero + - no javascript, no web analytics trackers, no images + - open source + - made fully in C++ + - the only explorer showing encrypted payments ID + - the only explorer with the ability to search by encrypted payments ID, tx public + keys, outputs public keys, input key images + - the only explorer showing ring signatures for inputs +## Prerequisite +Everything here was done and tested using Monero 0.9.4 on +Xubuntu 16.04 x86_64. +Instruction for Monero 0.9 compilation and Monero headers and libraries setup are +as shown here: + - [Compile Monero 0.9 on Ubuntu 16.04 x64](https://github.com/moneroexamples/compile-monero-09-on-ubuntu-16-04) + - [lmdbcpp-monero](https://github.com/moneroexamples/lmdbcpp-monero.git) + +## C++ code +```c++ +int main(int ac, const char* av[]) { + + // get command line options + xmreg::CmdLineOptions opts {ac, av}; + auto help_opt = opts.get_option("help"); + // if help was chosen, display help text and finish + if (*help_opt) + { + return EXIT_SUCCESS; + } + + auto port_opt = opts.get_option("port"); + auto bc_path_opt = opts.get_option("bc-path"); + auto custom_db_path_opt = opts.get_option("custom-db-path"); + auto deamon_url_opt = opts.get_option("deamon-url"); + + //cast port number in string to uint16 + uint16_t app_port = boost::lexical_cast(*port_opt); + + // get blockchain path + path blockchain_path; + + if (!xmreg::get_blockchain_path(bc_path_opt, blockchain_path)) + { + cerr << "Error getting blockchain path." << endl; + return EXIT_FAILURE; + } + + // enable basic monero log output + xmreg::enable_monero_log(); + + // create instance of our MicroCore + // and make pointer to the Blockchain + xmreg::MicroCore mcore; + cryptonote::Blockchain* core_storage; + + // initialize mcore and core_storage + if (!xmreg::init_blockchain(blockchain_path.string(), + mcore, core_storage)) + { + cerr << "Error accessing blockchain." << endl; + return EXIT_FAILURE; + } + + // create instance of page class which + // contains logic for the website + xmreg::page xmrblocks(&mcore, core_storage, *deamon_url_opt); + + // crow instance + crow::SimpleApp app; + + CROW_ROUTE(app, "/") + ([&]() { + return xmrblocks.index2(); + }); + + CROW_ROUTE(app, "/page/") + ([&](size_t page_no) { + return xmrblocks.index2(page_no); + }); + + CROW_ROUTE(app, "/block/") + ([&](size_t block_height) { + return xmrblocks.show_block(block_height); + }); + + CROW_ROUTE(app, "/block/") + ([&](string block_hash) { + return xmrblocks.show_block(block_hash); + }); + + CROW_ROUTE(app, "/tx/") + ([&](string tx_hash) { + return xmrblocks.show_tx(tx_hash); + }); + + CROW_ROUTE(app, "/tx//") + ([&](string tx_hash, uint with_ring_signatures) { + return xmrblocks.show_tx(tx_hash, with_ring_signatures); + }); + + + CROW_ROUTE(app, "/search").methods("GET"_method) + ([&](const crow::request& req) { + return xmrblocks.search(string(req.url_params.get("value"))); + }); + + CROW_ROUTE(app, "/autorefresh") + ([&]() { + uint64_t page_no {0}; + bool refresh_page {true}; + return xmrblocks.index2(page_no, refresh_page); + }); + + // run the crow http server + app.port(app_port).multithreaded().run(); + + return EXIT_SUCCESS; +} +``` + + + + + +## Compile this example +The dependencies are same as those for Monero, so I assume Monero compiles +correctly. If so then to download and compile this example, the following +steps can be executed: + +```bash +# download the source code +https://github.com/moneroexamples/onion-monero-blockchain-explorer.git + +# enter the downloaded sourced code folder +cd onion-monero-blockchain-explorer + +# create the makefile +cmake . + +# compile +make +``` + + +## Other examples +Other examples can be found on [github](https://github.com/moneroexamples?tab=repositories). +Please know that some of the examples/repositories are not +finished and may not work as intended. + +## How can you help? + +Constructive criticism, code and website edits are always good. They can be made through github. + +Some Monero are also welcome: +``` +48daf1rG3hE1Txapcsxh6WXNe9MLNKtu7W7tKTivtSoVLHErYzvdcpea2nSTgGkz66RFP4GKVAsTV14v6G3oddBTHfxP6tU +``` diff --git a/src/page.h b/src/page.h index 6565a24..bd915f7 100644 --- a/src/page.h +++ b/src/page.h @@ -938,6 +938,7 @@ namespace xmreg { {"blk_timestamp" , blk_timestamp}, {"delta_time" , age.first}, {"inputs_no" , txd.input_key_imgs.size()}, + {"has_inputs" , !txd.input_key_imgs.empty()}, {"outputs_no" , txd.output_pub_keys.size()}, {"has_payment_id" , txd.payment_id != null_hash}, {"has_payment_id8" , txd.payment_id8 != null_hash8}, diff --git a/src/templates/header.html b/src/templates/header.html index 48dc6cb..6ade0a4 100644 --- a/src/templates/header.html +++ b/src/templates/header.html @@ -27,12 +27,17 @@ padding: 10px;*/ } - tr, li { + tr, li, #pages { font-family: "Lucida Console", Monaco, monospace; font-size : 12px; height: 22px; } + #pages + { + margin-top: 15px; + } + td { text-align: center; } @@ -85,7 +90,7 @@
-
+ diff --git a/src/templates/index2.html b/src/templates/index2.html index 3c0e65a..2b223e0 100644 --- a/src/templates/index2.html +++ b/src/templates/index2.html @@ -49,7 +49,7 @@ {{/txs}} -
+
{{^is_page_zero}} previous page | first page | diff --git a/src/templates/tx.html b/src/templates/tx.html index 904f367..60183a7 100644 --- a/src/templates/tx.html +++ b/src/templates/tx.html @@ -57,6 +57,7 @@
+{{#has_inputs}}

Inputs' mixins time scale (from genesis till {{server_time}}; resolution: {{timescales_scale}} days)

@@ -134,6 +135,6 @@
- + {{/has_inputs}}