diff --git a/README.md b/README.md index 9a8738c..d7c096c 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,14 @@ -# Onion Monero Blockchain Explorer +# Onion Monero Prover -Curently available Monero blockchain explorer websites have several limitations which are of special importance to privacy-oriented users: +Currently, to prove to someone that you send them some monero, you can use this: [checktx](http://xmr.llcoins.net/checktx.html). Altought its useful, it is limited +in that it: - - they use JavaScript, - - have images which might be used for [cookieless tracking](http://lucb1e.com/rp/cookielesscookies/), - - track users activates through google analytics, - - are closed sourced, - - are not available as hidden services, - - provide only basic search capabilities, - - can't identify users outputs based on provided Monero address and viewkey. + - uses JavaScript and + - not available as hidden services. In this example, these limitations are addressed by development of -an Onion Monero Blockchain Explorer. The example not only shows how to use Monero C++ libraries, but also demonstrates how to use: +an Onion Monero Prover. The example not only shows how to use Monero C++ libraries, but also demonstrates how to use: - [crow](https://github.com/ipkn/crow) - C++ micro web framework - [lmdb++](https://github.com/bendiken/lmdbxx) - C++ wrapper for the LMDB @@ -24,33 +20,12 @@ an Onion Monero Blockchain Explorer. The example not only shows how to use Moner Tor users: - - [http://xmrblocksvckbwvx.onion](http://xmrblocksvckbwvx.onion) + - [ggggg](http://xmrblocksvckbwvx.onion) Non tor users, can use its clearnet version (thanks to [Gingeropolous](https://github.com/Gingeropolous)): - [http://explore.MoneroWorld.com](http://explore.moneroworld.com) - -## Onion Monero Blockchain Explorer features - -The key features of the Onion Monero Blockchain Explorer are - - - available as a hidden service, - - no javascript, no cookies, no web analytics trackers, no images, - - open sourced, - - 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, stealth addresses, input key images, - output amount index and its amount, - - the only explorer showing ring signatures, - - the only explorer showing transaction extra field, - - the only explorer showing public components of Monero addresses, - - the only explorer that can show which outputs belong to the given Monero address and viewkey, - - the only explorer showing detailed information about mixins, such as, mixins' - age, timescale, mixin of mixins, - - the only explorer showing number of amount output indices. - ## Prerequisite Everything here was done and tested using Monero 0.9.4 on Ubuntu 16.04 x86_64. @@ -63,116 +38,6 @@ as shown here: ## 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, "/myoutputs").methods("GET"_method) - ([&](const crow::request& req) { - - string tx_hash = string(req.url_params.get("tx_hash")); - string xmr_address = string(req.url_params.get("xmr_address")); - string viewkey = string(req.url_params.get("viewkey")); - - return xmrblocks.show_my_outputs(tx_hash, xmr_address, viewkey); - }); - - 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; -} ``` diff --git a/src/templates/my_outputs.html b/src/templates/my_outputs.html index 8c09346..5c22693 100644 --- a/src/templates/my_outputs.html +++ b/src/templates/my_outputs.html @@ -41,7 +41,16 @@ {{output_idx}}: {{out_pub_key}} {{amount}} + {{#mine_output}} + + + {{mine_output}} + + + {{/mine_output}} + {{^mine_output}} {{mine_output}} + {{/mine_output}} {{/outputs}}