1. 程式人生 > >C++從零開始區塊鏈:區塊鏈業務模組之基於boost的json讀寫

C++從零開始區塊鏈:區塊鏈業務模組之基於boost的json讀寫

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

std::string BlockChain::GetJsonFromBlock(Block &block)
{
    boost::property_tree::ptree item;

    boost::property_tree::ptree lstts;
    {
        std::list<Transactions>::iterator it;
        for
(it = block.lst_ts.begin(); it != block.lst_ts.end(); ++it) { boost::property_tree::ptree ts; ts.put("sender", it->sender); ts.put("recipient", it->recipient); ts.put("amount", it->amount); lstts.push_back(make_pair("", ts)); } } item.put("index"
, block.index); item.put("timestamp", block.timestamp); item.put_child("transactions", lstts); item.put("proof", block.proof); item.put("previous_hash", block.previous_hash); std::stringstream is; boost::property_tree::write_json(is, item); return is.str(); } std::string
BlockChain::GetJsonFromTransactions(Transactions &ts) { boost::property_tree::ptree item; item.put("sender", ts.sender); item.put("recipient", ts.recipient); item.put("amount", ts.amount); std::stringstream is; boost::property_tree::write_json(is, item); return is.str(); } Block BlockChain::GetBlockFromJson(const std::string &json) { Block block; std::stringstream ss(json); boost::property_tree::ptree pt; boost::property_tree::ptree array; boost::property_tree::read_json(ss, pt); block.index = pt.get<int>("index"); block.previous_hash = pt.get<std::string>("previous_hash"); block.proof = pt.get<long int>("proof"); block.timestamp = pt.get<time_t>("timestamp"); array = pt.get_child("transactions"); for (auto v : array) { Transactions ts; ts.sender = v.second.get<std::string>("sender"); ts.recipient = v.second.get<std::string>("recipient"); ts.amount = v.second.get<float>("amount"); block.lst_ts.push_back(ts); } return block; } Transactions BlockChain::GetTransactionsFromJson(const std::string &json) { Transactions ts; std::stringstream ss(json); boost::property_tree::ptree pt; boost::property_tree::read_json(ss, pt); ts.sender = pt.get<std::string>("sender"); ts.recipient = pt.get<std::string>("recipient"); ts.amount = pt.get<float>("amount"); return ts; } std::string BlockChain::GetJsonFromBlockList() { int i = 0; boost::property_tree::ptree item; boost::property_tree::ptree pblock; { std::list<Block>::iterator bit; pthread_mutex_lock(&m_mutexBlock); for (bit = m_lst_block.begin(); bit != m_lst_block.end(); ++bit) { boost::property_tree::ptree b; boost::property_tree::ptree pts; { std::list<Transactions>::iterator tit; for (tit = bit->lst_ts.begin(); tit != bit->lst_ts.end(); ++tit) { boost::property_tree::ptree t; t.put("sender", tit->sender); t.put("recipient", tit->recipient); t.put("amount", tit->amount); pts.push_back(make_pair("", t)); } } b.put("index", bit->index); b.put("timestamp", bit->timestamp); b.put_child("transactions", pts); b.put("proof", bit->proof); b.put("previous_hash", bit->previous_hash); pblock.push_back(make_pair("", b)); ++i; } pthread_mutex_unlock(&m_mutexBlock); } item.put_child("chain", pblock); item.put("length", i); std::stringstream is; boost::property_tree::write_json(is, item); return is.str(); } std::string BlockChain::GetJsonFromTransactionsList() { int i = 0; boost::property_tree::ptree item; boost::property_tree::ptree pts; { std::list<Transactions>::iterator bit; pthread_mutex_lock(&m_mutexTs); for (bit = m_lst_ts.begin(); bit != m_lst_ts.end(); ++bit) { boost::property_tree::ptree b; b.put("sender", bit->sender); b.put("recipient", bit->recipient); b.put("amount", bit->amount); pts.push_back(make_pair("", b)); ++i; } pthread_mutex_unlock(&m_mutexTs); } item.put_child("transactions", pts); item.put("length", i); std::stringstream is; boost::property_tree::write_json(is, item); return is.str(); } std::list<Block> BlockChain::GetBlockListFromJson(const std::string &json) { std::list<Block> lst_block; std::stringstream ss(json); boost::property_tree::ptree pt; boost::property_tree::ptree barray; boost::property_tree::read_json(ss, pt); barray = pt.get_child("chain"); for (auto bv : barray) { Block block; boost::property_tree::ptree tarray; block.index = bv.second.get<int>("index"); block.previous_hash = bv.second.get<std::string>("previous_hash"); block.proof = bv.second.get<long int>("proof"); block.timestamp = bv.second.get<time_t>("timestamp"); tarray = bv.second.get_child("transactions"); for (auto tv : tarray) { Transactions ts; ts.sender = tv.second.get<std::string>("sender"); ts.recipient = tv.second.get<std::string>("recipient"); ts.amount = tv.second.get<float>("amount"); block.lst_ts.push_back(ts); } lst_block.push_back(block); } return lst_block; } void BlockChain::GetTransactionsListFromJson(const std::string &json) { pthread_mutex_lock(&m_mutexTs); m_lst_ts.clear(); pthread_mutex_unlock(&m_mutexTs); std::stringstream ss(json); boost::property_tree::ptree pt; boost::property_tree::ptree array; boost::property_tree::read_json(ss, pt); array = pt.get_child("transactions"); for (auto v : array) { Transactions ts; ts.sender = v.second.get<std::string>("sender"); ts.recipient = v.second.get<std::string>("recipient"); ts.amount = v.second.get<float>("amount"); pthread_mutex_lock(&m_mutexTs); m_lst_ts.push_back(ts); pthread_mutex_unlock(&m_mutexTs); } }