From 13076ee73e5e061f68299a47f20658f24651bcfd Mon Sep 17 00:00:00 2001 From: gladcow Date: Sat, 21 Mar 2020 13:02:41 +0300 Subject: [PATCH] tx and inputs amounts serialization --- .../peerplays_sidechain/bitcoin_utils.cpp | 28 +++++++++++++++++++ .../peerplays_sidechain/bitcoin_utils.hpp | 4 +++ .../bitcoin_utils_test.cpp | 12 ++++++++ 3 files changed, 44 insertions(+) diff --git a/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp b/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp index b81a851c..9457ee61 100644 --- a/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp +++ b/libraries/plugins/peerplays_sidechain/bitcoin_utils.cpp @@ -7,6 +7,8 @@ #include #include +#include + namespace graphene { namespace peerplays_sidechain { static const unsigned char OP_0 = 0x00; @@ -783,4 +785,30 @@ bytes get_weighted_multisig_redeem_script(std::vector &in_amounts) +{ + std::stringstream ss(string_buf); + boost::property_tree::ptree json; + boost::property_tree::read_json(ss, json); + std::string tx_hex = json.get("tx_hex"); + tx.clear(); + tx.resize(tx_hex.size() / 2); + fc::from_hex(tx_hex, (char*)&tx[0], tx.size()); + in_amounts.clear(); + for(auto &v: json.get_child("in_amounts")) + in_amounts.push_back(fc::to_uint64(v.second.data())); +} + +std::string save_tx_data_to_string(const bytes &tx, const std::vector &in_amounts) +{ + std::string res = "{\"tx_hex\":\"" + fc::to_hex((const char*)&tx[0], tx.size()) + "\",\"in_amounts\":["; + for (unsigned int idx = 0; idx < in_amounts.size(); ++idx) { + res += fc::to_string(in_amounts[idx]); + if (idx != in_amounts.size() - 1) + res += ","; + } + res += "]}"; + return res; +} + }} // namespace graphene::peerplays_sidechain diff --git a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin_utils.hpp b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin_utils.hpp index 9cf7f05c..5f7c4f3b 100644 --- a/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin_utils.hpp +++ b/libraries/plugins/peerplays_sidechain/include/graphene/peerplays_sidechain/bitcoin_utils.hpp @@ -68,6 +68,10 @@ bytes add_signatures_to_unsigned_tx(const bytes &unsigned_tx, const std::vector> &signatures, const bytes &redeem_script); +void read_tx_data_from_string(const std::string &string_buf, bytes& tx, std::vector& in_amounts); +std::string save_tx_data_to_string(const bytes& tx, const std::vector& in_amounts); + + struct btc_outpoint { fc::uint256 hash; uint32_t n; diff --git a/tests/peerplays_sidechain/bitcoin_utils_test.cpp b/tests/peerplays_sidechain/bitcoin_utils_test.cpp index c75e12de..cc596664 100644 --- a/tests/peerplays_sidechain/bitcoin_utils_test.cpp +++ b/tests/peerplays_sidechain/bitcoin_utils_test.cpp @@ -28,6 +28,18 @@ BOOST_AUTO_TEST_CASE(tx_serialization) BOOST_CHECK(bintx == buff); } +BOOST_AUTO_TEST_CASE(tx_data_serialization) +{ + bytes source_tx({0, 1, 2, 3, 4, 5}); + std::vector source_ins({6, 7, 8, 9, 10}); + std::string buf = save_tx_data_to_string(source_tx, source_ins); + bytes destination_tx; + std::vector destination_ins; + read_tx_data_from_string(buf, destination_tx, destination_ins); + BOOST_REQUIRE(source_tx == destination_tx); + BOOST_REQUIRE(source_ins == destination_ins); +} + BOOST_AUTO_TEST_CASE(pw_transfer) { // key set for the old Primary Wallet