Merge pull request #20 from moneroexamples/check_new_tx_pusher_archives

New reading of unsigned and signed tx data for tx pusher
master
moneroexamples 8 years ago committed by GitHub
commit c8b8249390

@ -8,7 +8,6 @@ Curently available Monero blockchain explorer websites have several limitations
- 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, or private tx key,
- do not support Monero testnet, i.e., they dont work with RingCT transactions
@ -36,10 +35,12 @@ i2p users (main Monero network):
- [http://monerotools.i2p](http://monerotools.i2p)
Non tor users, can use its clearnet version (thanks to [Gingeropolous](https://github.com/Gingeropolous)):
Non tor users, can use its clearnet versions:
- [http://explore.MoneroWorld.com](http://explore.moneroworld.com)
- [https://explorer.xmr.my/](https://explorer.xmr.my/)
Note: clearnet version might be not as up to date as the onion version.
## Onion Monero Blockchain Explorer features
@ -69,7 +70,7 @@ The key features of the Onion Monero Blockchain Explorer are:
Everything here was done and tested using Monero 0.9.4 on Ubuntu 16.04 x86_64.
Instruction for Monero 0.10 compilation and Monero headers and libraries setup are
Instruction for Monero 0.10.1 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)

@ -1,129 +1,155 @@
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
oBgAgIzuiRraUsZzVG1yYbhJi/m86d17/N23IzEh/rGuPm32Ct6C8acFk8TMtTGqggpHU5/CUKZy
FMn0RzqWAc5E/zTDrrXUBw4QCQQWAAfVAzw3NzdjZmY0ZTEzODZhNjNkODA0YmJjOGQ4YmQzOTY3
ODNiMWNlYmZiOGYyY2YwNDgwYWIyYTRiYjM3ZTMxMzQ1PiA8MjQ2YzVhMTkwMzNkMjM2ZDNkYTAx
MGQ0ZGU3YjgzOTZjNjM5NzhiYzI2ZmExYmNhNzNhYmJkNjU5NDNmNjU0Yj4gPDJkMzM0MjY0Mzkz
MThlZjQ4MmI4ZTdmMDhlOTU0NTQ5MzNkZGU5NGI4Y2VhOTNhNzEyZDgxYTQwOTQ5YmI3NjY+IDw0
YjNjNzE1N2IxMzlhYmNhNGJkY2ZlMDUyYTIzM2QzYTUyOGU1MmNhZTdmZmQ0MDdmM2I2NDEwMThj
MDJlZTAyPiA8MTFkN2ExNTM1NWYyNGYxYjlhZGU1N2EyMDNhY2Q5MWNjZmEzM2Y0NWY1N2JlZDRh
YjljNDQ4OTFhM2ZhY2ZmZj4gPDk3NmJlZThjOTBiYzdlYTY1MWY2ZWZiOTZhZDM2NTRmZjA1YTU4
NThkYmE1NDAwN2ZlNGNiMzc2ZmQ3YjNlMTA+IDwwMmVjMzc1MDlmZjhkZDk3NzU3MjZjZmYyMjYz
Nzc2N2VjNzZmMmZlODk5NzkyMzY2NzZlZTcxMjZkOTdhZmMwPiABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAGAlOvcAwfJ58FU/qfg+m1LUVYOqSJoe0/f0Kw5T6X/9BORSixDQW1+8m7V
oWXtVQJJ7TAUKeWTJLhSGcO8Ca/uBczC5YYHBQK3lQEihjYdMuFY3yrWvIk0R8kxzIdMRv7PFz/L
ktxgueP2lP41tplEQQ6vgVvc0KTXHvn8ZoZIrUN0OwNa7SwXwTh6AovZAc0A6eTZ69iDL2qA4h3Q
h1031vyKy23zSzsQzRQVFwhc/jW2mURBDq+BW9zQpNce+fxmhkitQ3Q7A1rtLBfBOHoCxb8CxWC7
Z68wCg4a6yiI9bgBwaksDFpB9xW05qZ83UeRqTz+NbaZREEOr4Fb3NCk1x75/GaGSK1DdDsDWu0s
F8E4egKiigNWJ25r3vjA3kxRzY89ZzJuRY7P6OYIvpHQiK31VYkKH/41tplEQQ6vgVvc0KTXHvn8
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
3e9Hhw5mAjphnBXqRqq4GVlHfLk=

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

@ -9,8 +9,8 @@
#define BLOCKCHAIN_DB DB_LMDB
#define UNSIGNED_TX_PREFIX "Monero unsigned tx set\002"
#define SIGNED_TX_PREFIX "Monero signed tx set\002"
#define UNSIGNED_TX_PREFIX "Monero unsigned tx set\003"
#define SIGNED_TX_PREFIX "Monero signed tx set\003"
#define KEY_IMAGE_EXPORT_FILE_MAGIC "Monero key image export\002"
#define OUTPUT_EXPORT_FILE_MAGIC "Monero output export\003"

@ -1513,6 +1513,8 @@ public:
const size_t magiclen = strlen(UNSIGNED_TX_PREFIX);
string data_prefix = xmreg::make_printable(decoded_raw_tx_data.substr(0, magiclen));
bool unsigned_tx_given {false};
if (strncmp(decoded_raw_tx_data.c_str(), UNSIGNED_TX_PREFIX, magiclen) == 0)
@ -1525,17 +1527,32 @@ public:
{"testnet" , testnet},
{"unsigned_tx_given" , unsigned_tx_given},
{"have_raw_tx" , true},
{"data_prefix" , data_prefix},
{"txs" , mstch::array{}}
};
if (unsigned_tx_given)
{
bool r {false};
string s = decoded_raw_tx_data.substr(magiclen);
::tools::wallet2::unsigned_tx_set exported_txs;
bool r = serialization::parse_binary(std::string(
decoded_raw_tx_data.c_str() + magiclen,
decoded_raw_tx_data.size() - magiclen),
exported_txs);
try
{
std::istringstream iss(s);
boost::archive::portable_binary_iarchive ar(iss);
ar >> exported_txs;
r = true;
}
catch (...)
{
cerr << "Failed to parse unsigned tx data " << endl;
}
if (r)
{
mstch::array& txs = boost::get<mstch::array>(context["txs"]);
@ -1773,18 +1790,37 @@ public:
const size_t magiclen = strlen(SIGNED_TX_PREFIX);
string data_prefix = xmreg::make_printable(decoded_raw_tx_data.substr(0, magiclen));
if (strncmp(decoded_raw_tx_data.c_str(), SIGNED_TX_PREFIX, magiclen) != 0)
{
cout << "The data is neither unsigned nor signed tx!" << endl;
return string( "The data is neither unsigned nor signed tx!");
string msg = fmt::format("The data is neither unsigned nor signed tx! Its prefix is: {:s}",
data_prefix);
cout << msg << endl;
return string(msg);
}
context["data_prefix"] = data_prefix;
bool r {false};
string s = decoded_raw_tx_data.substr(magiclen);
::tools::wallet2::signed_tx_set signed_txs;
bool r = serialization::parse_binary(std::string(
decoded_raw_tx_data.c_str() + magiclen,
decoded_raw_tx_data.size() - magiclen),
signed_txs);
try
{
std::istringstream iss(s);
boost::archive::portable_binary_iarchive ar(iss);
ar >> signed_txs;
r = true;
}
catch (...)
{
cerr << "Failed to parse signed tx data " << endl;
}
if (!r)
{
@ -2028,12 +2064,15 @@ public:
const size_t magiclen = strlen(SIGNED_TX_PREFIX);
string data_prefix = xmreg::make_printable(decoded_raw_tx_data.substr(0, magiclen));
// initalize page template context map
mstch::map context {
{"testnet" , testnet},
{"have_raw_tx" , true},
{"has_error" , false},
{"error_msg" , string {}},
{"data_prefix" , data_prefix},
{"txs" , mstch::array{}}
};
@ -2047,7 +2086,8 @@ public:
if (strncmp(decoded_raw_tx_data.c_str(), SIGNED_TX_PREFIX, magiclen) != 0)
{
string error_msg = fmt::format("The data does not appear to be signed raw tx!");
string error_msg = fmt::format("The data does not appear to be signed raw tx! Data prefix: {:s}",
data_prefix);
context["has_error"] = true;
context["error_msg"] = error_msg;
@ -2067,12 +2107,25 @@ public:
return mstch::render(full_page, context);
}
bool r {false};
string s = decoded_raw_tx_data.substr(magiclen);
::tools::wallet2::signed_tx_set signed_txs;
bool r = serialization::parse_binary(std::string(
decoded_raw_tx_data.c_str() + magiclen,
decoded_raw_tx_data.size() - magiclen),
signed_txs);
try
{
std::istringstream iss(s);
boost::archive::portable_binary_iarchive ar(iss);
ar >> signed_txs;
r = true;
}
catch (...)
{
cerr << "Failed to parse signed tx data " << endl;
}
if (!r)
{
@ -2281,6 +2334,10 @@ public:
const size_t magiclen = strlen(KEY_IMAGE_EXPORT_FILE_MAGIC);
string data_prefix = xmreg::make_printable(decoded_raw_data.substr(0, magiclen));
context["data_prefix"] = data_prefix;
if (!strncmp(decoded_raw_data.c_str(), KEY_IMAGE_EXPORT_FILE_MAGIC, magiclen) == 0)
{
string error_msg = fmt::format("This does not seem to be key image export data.");
@ -2636,6 +2693,10 @@ public:
const size_t magiclen = strlen(OUTPUT_EXPORT_FILE_MAGIC);
string data_prefix = xmreg::make_printable(decoded_raw_data.substr(0, magiclen));
context["data_prefix"] = data_prefix;
if (!strncmp(decoded_raw_data.c_str(), OUTPUT_EXPORT_FILE_MAGIC, magiclen) == 0)
{
string error_msg = fmt::format("This does not seem to be output keys export data.");

@ -22,6 +22,8 @@
</div>
<h3>Data file prefix: {{data_prefix}}</h3>
{{#has_error}}
<h4 style="color:red">Attempt failed</h4>
<h4>{{error_msg}}</h4>

@ -21,6 +21,7 @@
<h4 style="font-size: 15px; margin: 0px">(no javascript - no cookies - no web analytics trackers - no images - open sourced)</h4>
</div>
<h3>Data file prefix: {{data_prefix}}</h3>
{{#has_error}}
<h4 style="color:red">Attempt failed</h4>

@ -22,6 +22,9 @@
</div>
<div class="center">
<h3>Data file prefix: {{data_prefix}}</h3>
{{#unsigned_tx_given}}
<h3>Details of unsigned raw tx data given</h3>

@ -1245,5 +1245,43 @@ make_tx_from_json(const string& json_str, transaction& tx)
return true;
}
string
make_printable(const string& in_s)
{
string output;
for (char c: in_s)
{
if (isprint(c))
{
output += c;
}
else
{
switch(c){
case '\000': output += "\\000";break;
case '\001': output += "\\001";break;
case '\002': output += "\\002";break;
case '\003': output += "\\003";break;
case '\004': output += "\\004";break;
case '\005': output += "\\005";break;
case '\006': output += "\\006";break;
case '\007': output += "\\007";break;
// there are more case but for now its ok
default:
stringstream ss;
ss << std::hex << (int)c;
output += "0x" + ss.str();
break;
}
}
}
return output;
}
}

@ -297,6 +297,8 @@ void chunks(Iterator begin,
bool
make_tx_from_json(const string& json_str, transaction& tx);
string
make_printable(const string& in_s);
}
#endif //XMREG01_TOOLS_H

Loading…
Cancel
Save