From 03480488a14237f03d6ea7001ed814afe3587794 Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Mon, 12 Sep 2022 20:38:32 +0200 Subject: [PATCH] Implemented kv-serialization for boost optional, implemented serialization as hed for POD --- .../keyvalue_enable_POD_serialize_as_string.h | 55 +++++++++++++++++++ .../keyvalue_serialization_overloads.h | 27 ++++++++- src/common/crypto_serialization.h | 8 ++- src/wallet/wallet2.h | 2 +- 4 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 contrib/epee/include/serialization/keyvalue_enable_POD_serialize_as_string.h diff --git a/contrib/epee/include/serialization/keyvalue_enable_POD_serialize_as_string.h b/contrib/epee/include/serialization/keyvalue_enable_POD_serialize_as_string.h new file mode 100644 index 00000000..88ff260f --- /dev/null +++ b/contrib/epee/include/serialization/keyvalue_enable_POD_serialize_as_string.h @@ -0,0 +1,55 @@ +// Copyright (c) 2006-2022, Andrey N. Sabelnikov, www.sabelnikov.net +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of the Andrey N. Sabelnikov nor the +// names of its contributors may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +#pragma once + + + +//should be done in global namespace +#define KV_ENABLE_POD_SERIALIZATION_AS_HEX(type_name) \ +namespace epee \ +{ \ + namespace serialization \ + { \ + template \ + bool kv_serialize(const type_name& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) \ + { \ + std::string s = epee::transform_t_pod_to_str(d); \ + return kv_serialize(s, stg, hparent_section, pname); \ + } \ + template \ + bool kv_unserialize(type_name& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) \ + { \ + std::string s; \ + bool r = kv_unserialize(s, stg, hparent_section, pname); \ + if (r) \ + { \ + d = epee::transform_str_to_t_pod(s); \ + } \ + return r; \ + } \ + } \ +} diff --git a/contrib/epee/include/serialization/keyvalue_serialization_overloads.h b/contrib/epee/include/serialization/keyvalue_serialization_overloads.h index d33d5ad1..97ec2be2 100644 --- a/contrib/epee/include/serialization/keyvalue_serialization_overloads.h +++ b/contrib/epee/include/serialization/keyvalue_serialization_overloads.h @@ -429,6 +429,31 @@ namespace epee bool kv_unserialize(std::deque& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) { return kv_serialization_overloads_impl_is_base_serializable_types, typename std::remove_const::type>::value>::kv_unserialize(d, stg, hparent_section, pname); - } + } + //------------------------------------------------------------------------------------------------------------------- + //boost::optional + template + bool kv_serialize(const boost::optional& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) + { + if(d != boost::none) + { + return kv_serialize(*d, stg, hparent_section, pname); + } + return true; + } + //------------------------------------------------------------------------------------------------------------------- + template + bool kv_unserialize(boost::optional& d, t_storage& stg, typename t_storage::hsection hparent_section, const char* pname) + { + d = t_type(); + bool r = kv_unserialize(*d, stg, hparent_section, pname); + if (!r) + { + d = boost::none; + } + return r; + } + + } } \ No newline at end of file diff --git a/src/common/crypto_serialization.h b/src/common/crypto_serialization.h index c5fb5f4c..0ce6b263 100644 --- a/src/common/crypto_serialization.h +++ b/src/common/crypto_serialization.h @@ -20,7 +20,7 @@ #include "crypto/range_proofs.h" #include "crypto/clsag.h" #include "boost_serialization_maps.h" - +#include "serialization/keyvalue_enable_POD_serialize_as_string.h" // // binary serialization // @@ -114,6 +114,12 @@ VARIANT_TAG(debug_archive, crypto::key_image, "key_image"); VARIANT_TAG(debug_archive, crypto::signature, "signature"); +// +// Key-value serialization +// + +KV_ENABLE_POD_SERIALIZATION_AS_HEX(crypto::scalar_t); + // // Boost serialization // diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index 3ff5db39..2f43f0eb 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -400,7 +400,7 @@ namespace tools KV_SERIALIZE(m_spent_height) KV_SERIALIZE(m_flags) KV_SERIALIZE(m_amount) - //KV_SERIALIZE_N(m_opt_blinding_mask, blinding_mask) + KV_SERIALIZE_N(m_opt_blinding_mask, "blinding_mask") KV_SERIALIZE_EPHEMERAL_N(uint64_t, tools::wallet2::transfer_details_base_to_amount, "amount") KV_SERIALIZE_EPHEMERAL_N(std::string, tools::wallet2::transfer_details_base_to_tx_hash, "tx_id") END_KV_SERIALIZE_MAP()