rpc.gettransactions: fill as_json with partial tx in pruned mode

This commit is contained in:
stoffu 2019-03-27 18:41:18 +09:00
parent fe3403c8f0
commit a299dc96f7
No known key found for this signature in database
GPG Key ID: 41DAB8343A9EC012

View File

@ -646,31 +646,62 @@ namespace cryptonote
e.prunable_hash = epee::string_tools::pod_to_hex(std::get<2>(tx)); e.prunable_hash = epee::string_tools::pod_to_hex(std::get<2>(tx));
if (req.split || req.prune || std::get<3>(tx).empty()) if (req.split || req.prune || std::get<3>(tx).empty())
{ {
// use splitted form with pruned and prunable (filled only when prune=false and the daemon has it), leaving as_hex as empty
e.pruned_as_hex = string_tools::buff_to_hex_nodelimer(std::get<1>(tx)); e.pruned_as_hex = string_tools::buff_to_hex_nodelimer(std::get<1>(tx));
if (!req.prune) if (!req.prune)
e.prunable_as_hex = string_tools::buff_to_hex_nodelimer(std::get<3>(tx)); e.prunable_as_hex = string_tools::buff_to_hex_nodelimer(std::get<3>(tx));
} if (req.decode_as_json)
else
{ {
cryptonote::blobdata tx_data; cryptonote::blobdata tx_data;
if (req.prune)
tx_data = std::get<1>(tx);
else
tx_data = std::get<1>(tx) + std::get<3>(tx);
e.as_hex = string_tools::buff_to_hex_nodelimer(tx_data);
if (req.decode_as_json && !tx_data.empty())
{
cryptonote::transaction t; cryptonote::transaction t;
if (cryptonote::parse_and_validate_tx_from_blob(tx_data, t)) if (req.prune || std::get<3>(tx).empty())
{ {
if (req.prune) // decode pruned tx to JSON
tx_data = std::get<1>(tx);
if (cryptonote::parse_and_validate_tx_base_from_blob(tx_data, t))
{ {
pruned_transaction pruned_tx{t}; pruned_transaction pruned_tx{t};
e.as_json = obj_to_json_str(pruned_tx); e.as_json = obj_to_json_str(pruned_tx);
} }
else else
{
res.status = "Failed to parse and validate pruned tx from blob";
return true;
}
}
else
{
// decode full tx to JSON
tx_data = std::get<1>(tx) + std::get<3>(tx);
if (cryptonote::parse_and_validate_tx_from_blob(tx_data, t))
{
e.as_json = obj_to_json_str(t); e.as_json = obj_to_json_str(t);
} }
else
{
res.status = "Failed to parse and validate tx from blob";
return true;
}
}
}
}
else
{
// use non-splitted form, leaving pruned_as_hex and prunable_as_hex as empty
cryptonote::blobdata tx_data = std::get<1>(tx) + std::get<3>(tx);
e.as_hex = string_tools::buff_to_hex_nodelimer(tx_data);
if (req.decode_as_json)
{
cryptonote::transaction t;
if (cryptonote::parse_and_validate_tx_from_blob(tx_data, t))
{
e.as_json = obj_to_json_str(t);
}
else
{
res.status = "Failed to parse and validate tx from blob";
return true;
}
} }
} }
e.in_pool = pool_tx_hashes.find(tx_hash) != pool_tx_hashes.end(); e.in_pool = pool_tx_hashes.find(tx_hash) != pool_tx_hashes.end();