From 57977dceac7e73e6d037eec8332099a21bb68297 Mon Sep 17 00:00:00 2001 From: moneroexamples Date: Thu, 22 Sep 2016 09:48:29 +0800 Subject: [PATCH] readme fixed --- README.md | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 142 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d7c096c..9a8738c 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,18 @@ -# Onion Monero Prover +# Onion Monero Blockchain Explorer -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: +Curently available Monero blockchain explorer websites have several limitations which are of special importance to privacy-oriented users: - - uses JavaScript and - - not available as hidden services. + - 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. In this example, these limitations are addressed by development of -an Onion Monero Prover. The example not only shows how to use Monero C++ libraries, but also demonstrates how to use: +an Onion Monero Blockchain Explorer. 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 @@ -20,12 +24,33 @@ an Onion Monero Prover. The example not only shows how to use Monero C++ librari Tor users: - - [ggggg](http://xmrblocksvckbwvx.onion) + - [http://xmrblocksvckbwvx.onion](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. @@ -38,6 +63,116 @@ 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; +} ```