Coverity (#28)
* stratum_server: resolve CID 210144 (UNINIT_CTOR)
* stratum_server: resolve CID 210042/210085/210104 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger,
remove_blockchain_update_listener, and any paths involving the logger
(including CATCH_ENTRY_*).
* epee: misc_log_ex: create CATCH_ENTRY_NO_RETURN macro
A temporary substition for what I hope will eventually be a full-fledged
exception-dispatcher (class-based, not macro).
* stratum_server: resolve CID 210080/210084/210089 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger,
remove_protocol_handler, and any paths involving the logger
(including CATCH_ENTRY_*).
* epee: levin_protocol_handler_async: resolve CID 210140/210182/210165 (UNCAUGHT_EXCEPT)
The potential to throw exists within guarded_critical_region_t, and any
paths involving the logger (including CATCH_ENTRY_*).
* epee: levin_protocol_handler_async: resolve CID 210110/210119/210155 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger, del_connection, and any
paths involving the logger (including CATCH_ENTRY_*).
* epee: misc_log_ex: move macros to *top* of file
so they can be used *within* this file.
* daemon: resolve CID 210069/210092/210166 (UNCAUGHT_EXCEPT)
The potential to throw exists within log_space, and any paths involving
the logger (including CATCH_ENTRY_*).
* daemon: return cstdlib proper types in main
* simplewallet: resolve 6 different CIDs (UNCAUGHT_EXCEPT)
CID: 210082
CID: 210086
CID: 210096
CID: 210147
CID: 210149
CID: 210150
The potential to throw exists throughout various paths in main.
* simplewallet: return cstdlib proper types in main
* simplewallet: resolve CID 210128/210160 (UNCAUGHT_EXCEPT)
The potential to throw exists within various paths, and any paths
involving the logger (including CATCH_ENTRY_*).
* conn_tool: resolve 5 different CIDs (UNCAUGHT_EXCEPT)
CID: 210038
CID: 210047
CID: 210108
CID: 210122
CID: 210157
The potential to throw exists throughout various paths in main.
* conn_tool: return cstdlib proper types in main
* miniupnp_helper: resolve CID 210050 (UNCAUGHT_EXCEPT)
The potential to throw exists within deinit, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: profile_tools: resolve CID 210055 (UNCAUGHT_EXCEPT)
The potential to throw exists within boost microsec_clock::localtime(),
and any paths involving the logger (including CATCH_ENTRY_*).
* db_backend_lmdb: resolve CID 210056/210133 (UNCAUGHT_EXCEPT)
The potential to throw exists within close(), including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: misc_log_ex: resolve CID 210060/210124 (UNCAUGHT_EXCEPT)
The potential to throw exists within several paths, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: misc_language: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210064
CID: 210093
CID: 210136
CID: 210139
The potential to throw exists within m_func(), including any paths
involving the logger (including CATCH_ENTRY_*).
* db_abstract_accessor: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210072
CID: 210094
CID: 210116
CID: 210141
The potential to throw exists within m_cache.clear(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: net_helper: resolve CID 210100 (UNCAUGHT_EXCEPT)
The potential to throw exists within shutdown(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: syncobj: resolve CID 210123 (UNCAUGHT_EXCEPT)
The potential to throw exists within unlock(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: profile_tools: resolve CID 210145/210154 (UNCAUGHT_EXCEPT)
The potential to throw exists within various paths, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: http_base: resolve CID 210176 (UNINIT_CTOR)
* p2p: net_node: resolve CID 210173 (UNINIT_CTOR)
* epee: net_helper: resolve CID 210138 (UNINIT_CTOR)
* p2p: net_peerlist: resolve CID 210137 (UNINIT_CTOR)
* currency_basic: resolve CID 210117 (UNINIT_CTOR)
* epee: abstract_tcp_server2: resolve 3 CIDs (UNINIT_CTOR)
CID: 210040
CID: 210090
CID: 210105
* simplewallet: resolve CID 210103 (UNINIT_CTOR)
* epee: levin_protocol_handler_async: resolve CID 210091 (UNINIT_CTOR)
* json_archive: resolve CID 210087 (UNINIT_CTOR)
* epee: levin_protocol_handler_async: resolve CID 210073 (UNINIT_CTOR)
* miniupnp_helper: resolve CID 210037 (UNINIT_CTOR)
* crypto: ge_frombytes_vartime: resolve CID 210142 (CHECKED_RETURN)
* wallet2: resolve CID 210041 (CHECKED_RETURN)
* epee: misc_log_ex: resolve CID 210127 (DEADCODE)
* epee: levin_protocol_handler_sync: resolve 3 CIDs (PASS_BY_VALUE)
CID: 210167
CID: 210170
CID: 210180
* p2p: net_node: resolve CID 210065 (PASS_BY_VALUE)
* epee: levin_abstract_invoke2: resolve CID 210049 (PASS_BY_VALUE)
* epee: abstract_tcp_server2: resolve CID 210045 (PASS_BY_VALUE)
* epee: misc_log_ex: add NESTED_*_ENTRY macros
* simplewallet: use NESTED_*_ENTRY in message_writer dtor
* stratum_protocol_handler_config: use NESTED_*_ENTRY in dtor
* stratum_protocol_handler: use NESTED_*_ENTRY in dtor
* lmdb_db_backend: use NESTED_*_ENTRY in dtor
* epee: abstract_tcp_server2: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210088
CID: 210106
CID: 210164
CID: 210179
The potential to throw exists within various paths, including any
paths involving the logger (including CATCH_ENTRY_*).
* db_abstract_accessor: use NESTED_*_ENTRY in dtor
* miniupnp_helper: use NESTED_*_ENTRY in dtor
* epee: misc_log_ex: use NESTED_*_ENTRY in log_frame dtor
* epee: levin_protocol_handler_async: use NESTED_*_ENTRY in dtors
* epee: net_helper: use NESTED_*_ENTRY in dtor
* epee: profile_tools: use NESTED_*_ENTRY in dtors
* epee: misc_language: use NESTED_*_ENTRY in dtor
* epee: syncobj: use NESTED_*_ENTRY in dtor
* zano: license contact w/ zano.org email instead of sekreta.org email
2019-05-20 09:32:36 +00:00
// Copyright (c) 2014-2019 Zano Project
2018-12-27 18:50:45 +03:00
// Copyright (c) 2014-2018 The Louisdor Project
// Copyright (c) 2012-2013 The Cryptonote developers
// Copyright (c) 2014-2015 The Boolberry developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# pragma once
# include <type_traits>
# include <boost/variant.hpp>
# include <boost/functional/hash/hash.hpp>
# include <boost/mpl/back_inserter.hpp>
# include <boost/mpl/copy.hpp>
# include <boost/mpl/unique.hpp>
# include <boost/mpl/list.hpp>
# include <boost/mpl/equal.hpp>
# include <boost/mpl/vector.hpp>
# include <boost/type_traits/is_same.hpp>
# include <vector>
# include <cstring> // memcmp
# include <sstream>
# include <chrono>
# include "include_base_utils.h"
# include "serialization/binary_archive.h"
# include "serialization/crypto.h"
# include "serialization/stl_containers.h"
# include "serialization/serialization.h"
# include "serialization/variant.h"
# include "serialization/json_archive.h"
# include "serialization/debug_archive.h"
# include "serialization/keyvalue_serialization.h" // epee key-value serialization
# include "string_tools.h"
# include "currency_config.h"
# include "crypto/crypto.h"
# include "crypto/hash.h"
# include "misc_language.h"
# include "block_flags.h"
# include "etc_custom_serialization.h"
namespace currency
{
const static crypto : : hash null_hash = AUTO_VAL_INIT ( null_hash ) ;
const static crypto : : public_key null_pkey = AUTO_VAL_INIT ( null_pkey ) ;
const static crypto : : key_image null_ki = AUTO_VAL_INIT ( null_ki ) ;
const static crypto : : secret_key null_skey = AUTO_VAL_INIT ( null_skey ) ;
const static crypto : : signature null_sig = AUTO_VAL_INIT ( null_sig ) ;
const static crypto : : key_derivation null_derivation = AUTO_VAL_INIT ( null_derivation ) ;
2019-04-03 12:48:09 +03:00
typedef std : : string payment_id_t ;
2018-12-27 18:50:45 +03:00
/************************************************************************/
/* */
/************************************************************************/
//since structure used in blockchain as a key accessor, then be sure that there is no padding inside
# pragma pack(push, 1)
struct account_public_address
{
crypto : : public_key m_spend_public_key ;
crypto : : public_key m_view_public_key ;
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( m_spend_public_key )
FIELD ( m_view_public_key )
END_SERIALIZE ( )
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( m_spend_public_key )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( m_view_public_key )
END_KV_SERIALIZE_MAP ( )
} ;
# pragma pack(pop)
const static account_public_address null_pub_addr = AUTO_VAL_INIT ( null_pub_addr ) ;
typedef std : : vector < crypto : : signature > ring_signature ;
/************************************************************************/
/* extra structures */
/************************************************************************/
struct extra_attachment_info
{
uint64_t sz ;
crypto : : hash hsh ;
uint64_t cnt ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( sz )
FIELD ( hsh )
VARINT_FIELD ( cnt )
END_SERIALIZE ( )
} ;
/* outputs */
// 'mix_attr' possible values
# define CURRENCY_TO_KEY_OUT_RELAXED 0 // the output may be mixed with any fake outputs
# define CURRENCY_TO_KEY_OUT_FORCED_NO_MIX 1 // the output can't be mixed, only direct spend allowed
# define CURRENCY_TO_KEY_OUT_FORCED_MIX_LOWER_BOUND 2 // this and greather values means minimum number of total outputs (fakes + 1) must be mixed together for using that one
# pragma pack(push, 1)
struct txout_to_key
{
txout_to_key ( ) : key ( null_pkey ) , mix_attr ( 0 ) { }
txout_to_key ( const crypto : : public_key & _key ) : key ( _key ) , mix_attr ( 0 ) { }
crypto : : public_key key ;
uint8_t mix_attr ;
} ;
# pragma pack(pop)
/* inputs */
struct txin_gen
{
size_t height ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( height )
END_SERIALIZE ( )
} ;
// ref_by_id is used by txin_to_key to reference an output by source transaction hash and output's internal index,
// rather than amount and global output index (by default). Useful when output global index is unknown or may change.
struct ref_by_id
{
crypto : : hash tx_id ; // source transaction hash
uint32_t n ; // output index in source transaction
BEGIN_SERIALIZE_OBJECT ( )
FIELD ( tx_id )
VARINT_FIELD ( n )
END_SERIALIZE ( )
} ;
typedef boost : : variant < uint64_t , ref_by_id > txout_v ;
struct signed_parts
{
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( n_outs )
VARINT_FIELD ( n_extras )
END_SERIALIZE ( )
uint32_t n_outs ;
uint32_t n_extras ;
} ;
typedef boost : : variant < signed_parts , extra_attachment_info > txin_etc_details_v ;
struct txin_to_key
{
uint64_t amount ;
std : : vector < txout_v > key_offsets ;
crypto : : key_image k_image ; // double spending protection
std : : vector < txin_etc_details_v > etc_details ; //this flag used when TX_FLAG_SIGNATURE_MODE_SEPARATE flag is set, point to which amount of outputs(starting from zero) used in signature
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
FIELD ( key_offsets )
FIELD ( k_image )
FIELD ( etc_details )
END_SERIALIZE ( )
} ;
struct txin_multisig
{
uint64_t amount ;
crypto : : hash multisig_out_id ;
uint32_t sigs_count ; // actual number of signatures that are used to sign this input; needed to calculate tx blob size; must be equal to minimum_sigs of corresponding ms output
std : : vector < txin_etc_details_v > etc_details ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
FIELD ( multisig_out_id )
VARINT_FIELD ( sigs_count )
FIELD ( etc_details )
END_SERIALIZE ( )
} ;
struct txout_multisig
{
uint32_t minimum_sigs ;
std : : vector < crypto : : public_key > keys ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( minimum_sigs )
FIELD ( keys )
END_SERIALIZE ( )
} ;
typedef boost : : variant < txin_gen , txin_to_key , txin_multisig > txin_v ;
typedef boost : : variant < txout_to_key , txout_multisig > txout_target_v ;
//typedef std::pair<uint64_t, txout> out_t;
struct tx_out
{
uint64_t amount ;
txout_target_v target ;
BEGIN_SERIALIZE_OBJECT ( )
VARINT_FIELD ( amount )
FIELD ( target )
END_SERIALIZE ( )
} ;
struct tx_comment
{
std : : string comment ;
BEGIN_SERIALIZE ( )
FIELD ( comment )
END_SERIALIZE ( )
} ;
struct tx_payer
{
account_public_address acc_addr ;
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
struct tx_receiver
{
account_public_address acc_addr ;
BEGIN_SERIALIZE ( )
FIELD ( acc_addr )
END_SERIALIZE ( )
} ;
struct tx_crypto_checksum
{
//we put tx encrypted key_derivation into tx attachment/extra, to let sender decrypt attachments that had been encrypted.
// key_derivation encrypted on sender private send address
crypto : : key_derivation encrypted_key_derivation ;
uint32_t derivation_hash ;
BEGIN_SERIALIZE ( )
FIELD ( encrypted_key_derivation )
FIELD ( derivation_hash )
END_SERIALIZE ( )
} ;
2019-09-27 17:16:18 +02:00
struct tx_derivation_hint
2018-12-27 18:50:45 +03:00
{
std : : string msg ;
BEGIN_SERIALIZE ( )
FIELD ( msg )
2019-09-27 17:16:18 +02:00
END_SERIALIZE ( )
2018-12-27 18:50:45 +03:00
} ;
struct tx_service_attachment
{
std : : string service_id ; //string identifying service which addressed this attachment
std : : string instruction ; //string identifying specific instructions for service/way to interpret data
std : : string body ; //any data identifying service, options etc
std : : vector < crypto : : public_key > security ; //some of commands need proof of owner
uint8_t flags ; //special flags (ex: TX_SERVICE_ATTACHMENT_ENCRYPT_BODY), see below
BEGIN_SERIALIZE ( )
FIELD ( service_id )
FIELD ( instruction )
FIELD ( body )
FIELD ( security )
FIELD ( flags )
END_SERIALIZE ( )
} ;
// applicable flags for tx_service_attachment::flags, can be combined using bitwise OR
# define TX_SERVICE_ATTACHMENT_ENCRYPT_BODY static_cast<uint8_t>(1 << 0)
# define TX_SERVICE_ATTACHMENT_DEFLATE_BODY static_cast<uint8_t>(1 << 1)
//,
struct extra_user_data
{
std : : string buff ;
BEGIN_SERIALIZE ( )
FIELD ( buff )
END_SERIALIZE ( )
} ;
struct extra_alias_entry_base
{
account_public_address m_address ;
std : : string m_text_comment ;
std : : vector < crypto : : secret_key > m_view_key ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
std : : vector < crypto : : signature > m_sign ; // only one or zero elments expected (std::vector is using as memory efficient container for such a case)
//uint8_t flags;
BEGIN_SERIALIZE ( )
FIELD ( m_address )
FIELD ( m_text_comment )
FIELD ( m_view_key )
FIELD ( m_sign )
//FIELD(flags)
END_SERIALIZE ( )
} ;
struct extra_alias_entry : public extra_alias_entry_base
{
std : : string m_alias ;
BEGIN_SERIALIZE ( )
FIELD ( m_alias )
FIELDS ( * static_cast < extra_alias_entry_base * > ( this ) )
END_SERIALIZE ( )
} ;
struct extra_padding
{
std : : vector < uint8_t > buff ; //stub
BEGIN_SERIALIZE ( )
FIELD ( buff )
END_SERIALIZE ( )
} ;
2019-07-22 13:04:01 +02:00
//number of block (or timestamp if v bigger then CURRENCY_MAX_BLOCK_NUMBER), used as a limitation: spend this tx not early then block/time
2018-12-27 18:50:45 +03:00
struct etc_tx_details_unlock_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
2019-07-22 13:04:01 +02:00
//number of block (or timestamp if unlock_time_array[i] bigger then CURRENCY_MAX_BLOCK_NUMBER), used as a limitation: spend this tx not early then block/time
//unlock_time_array[i], i - index of output, unlock_time_array.size() == vout.size()
struct etc_tx_details_unlock_time2
{
std : : vector < uint64_t > unlock_time_array ;
BEGIN_SERIALIZE ( )
2019-07-24 00:37:24 +02:00
FIELD ( unlock_time_array )
2019-07-22 13:04:01 +02:00
END_SERIALIZE ( )
} ;
2018-12-27 18:50:45 +03:00
struct etc_tx_details_expiration_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
/*
this structure used to put real time into PoS block ( or could be other meaning ) , to have more suitable dates in transactions
*/
struct etc_tx_time
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
2019-07-24 00:37:24 +02:00
END_SERIALIZE ( )
2018-12-27 18:50:45 +03:00
} ;
struct etc_tx_details_flags
{
uint64_t v ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( v )
END_SERIALIZE ( )
} ;
2019-09-27 17:16:18 +02:00
struct etc_tx_uint16_t
2018-12-27 18:50:45 +03:00
{
uint16_t v ;
BEGIN_SERIALIZE ( )
FIELD ( v )
END_SERIALIZE ( )
} ;
2019-09-27 17:16:18 +02:00
typedef boost : : mpl : : vector < tx_service_attachment , tx_comment , tx_payer , tx_receiver , tx_derivation_hint , std : : string , tx_crypto_checksum , etc_tx_time , etc_tx_details_unlock_time , etc_tx_details_expiration_time , etc_tx_details_flags , crypto : : public_key , extra_attachment_info , extra_alias_entry , extra_user_data , extra_padding , etc_tx_uint16_t , etc_tx_details_unlock_time2 > all_payload_types ;
2018-12-27 18:50:45 +03:00
typedef boost : : make_variant_over < all_payload_types > : : type attachment_v ;
typedef boost : : make_variant_over < all_payload_types > : : type extra_v ;
typedef boost : : make_variant_over < all_payload_types > : : type payload_items_v ;
class transaction_prefix
{
public :
// tx version information
Coverity (#28)
* stratum_server: resolve CID 210144 (UNINIT_CTOR)
* stratum_server: resolve CID 210042/210085/210104 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger,
remove_blockchain_update_listener, and any paths involving the logger
(including CATCH_ENTRY_*).
* epee: misc_log_ex: create CATCH_ENTRY_NO_RETURN macro
A temporary substition for what I hope will eventually be a full-fledged
exception-dispatcher (class-based, not macro).
* stratum_server: resolve CID 210080/210084/210089 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger,
remove_protocol_handler, and any paths involving the logger
(including CATCH_ENTRY_*).
* epee: levin_protocol_handler_async: resolve CID 210140/210182/210165 (UNCAUGHT_EXCEPT)
The potential to throw exists within guarded_critical_region_t, and any
paths involving the logger (including CATCH_ENTRY_*).
* epee: levin_protocol_handler_async: resolve CID 210110/210119/210155 (UNCAUGHT_EXCEPT)
The potential to throw exists within the logger, del_connection, and any
paths involving the logger (including CATCH_ENTRY_*).
* epee: misc_log_ex: move macros to *top* of file
so they can be used *within* this file.
* daemon: resolve CID 210069/210092/210166 (UNCAUGHT_EXCEPT)
The potential to throw exists within log_space, and any paths involving
the logger (including CATCH_ENTRY_*).
* daemon: return cstdlib proper types in main
* simplewallet: resolve 6 different CIDs (UNCAUGHT_EXCEPT)
CID: 210082
CID: 210086
CID: 210096
CID: 210147
CID: 210149
CID: 210150
The potential to throw exists throughout various paths in main.
* simplewallet: return cstdlib proper types in main
* simplewallet: resolve CID 210128/210160 (UNCAUGHT_EXCEPT)
The potential to throw exists within various paths, and any paths
involving the logger (including CATCH_ENTRY_*).
* conn_tool: resolve 5 different CIDs (UNCAUGHT_EXCEPT)
CID: 210038
CID: 210047
CID: 210108
CID: 210122
CID: 210157
The potential to throw exists throughout various paths in main.
* conn_tool: return cstdlib proper types in main
* miniupnp_helper: resolve CID 210050 (UNCAUGHT_EXCEPT)
The potential to throw exists within deinit, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: profile_tools: resolve CID 210055 (UNCAUGHT_EXCEPT)
The potential to throw exists within boost microsec_clock::localtime(),
and any paths involving the logger (including CATCH_ENTRY_*).
* db_backend_lmdb: resolve CID 210056/210133 (UNCAUGHT_EXCEPT)
The potential to throw exists within close(), including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: misc_log_ex: resolve CID 210060/210124 (UNCAUGHT_EXCEPT)
The potential to throw exists within several paths, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: misc_language: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210064
CID: 210093
CID: 210136
CID: 210139
The potential to throw exists within m_func(), including any paths
involving the logger (including CATCH_ENTRY_*).
* db_abstract_accessor: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210072
CID: 210094
CID: 210116
CID: 210141
The potential to throw exists within m_cache.clear(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: net_helper: resolve CID 210100 (UNCAUGHT_EXCEPT)
The potential to throw exists within shutdown(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: syncobj: resolve CID 210123 (UNCAUGHT_EXCEPT)
The potential to throw exists within unlock(), including any
paths involving the logger (including CATCH_ENTRY_*).
* epee: profile_tools: resolve CID 210145/210154 (UNCAUGHT_EXCEPT)
The potential to throw exists within various paths, including any paths
involving the logger (including CATCH_ENTRY_*).
* epee: http_base: resolve CID 210176 (UNINIT_CTOR)
* p2p: net_node: resolve CID 210173 (UNINIT_CTOR)
* epee: net_helper: resolve CID 210138 (UNINIT_CTOR)
* p2p: net_peerlist: resolve CID 210137 (UNINIT_CTOR)
* currency_basic: resolve CID 210117 (UNINIT_CTOR)
* epee: abstract_tcp_server2: resolve 3 CIDs (UNINIT_CTOR)
CID: 210040
CID: 210090
CID: 210105
* simplewallet: resolve CID 210103 (UNINIT_CTOR)
* epee: levin_protocol_handler_async: resolve CID 210091 (UNINIT_CTOR)
* json_archive: resolve CID 210087 (UNINIT_CTOR)
* epee: levin_protocol_handler_async: resolve CID 210073 (UNINIT_CTOR)
* miniupnp_helper: resolve CID 210037 (UNINIT_CTOR)
* crypto: ge_frombytes_vartime: resolve CID 210142 (CHECKED_RETURN)
* wallet2: resolve CID 210041 (CHECKED_RETURN)
* epee: misc_log_ex: resolve CID 210127 (DEADCODE)
* epee: levin_protocol_handler_sync: resolve 3 CIDs (PASS_BY_VALUE)
CID: 210167
CID: 210170
CID: 210180
* p2p: net_node: resolve CID 210065 (PASS_BY_VALUE)
* epee: levin_abstract_invoke2: resolve CID 210049 (PASS_BY_VALUE)
* epee: abstract_tcp_server2: resolve CID 210045 (PASS_BY_VALUE)
* epee: misc_log_ex: add NESTED_*_ENTRY macros
* simplewallet: use NESTED_*_ENTRY in message_writer dtor
* stratum_protocol_handler_config: use NESTED_*_ENTRY in dtor
* stratum_protocol_handler: use NESTED_*_ENTRY in dtor
* lmdb_db_backend: use NESTED_*_ENTRY in dtor
* epee: abstract_tcp_server2: resolve 4 CIDs (UNCAUGHT_EXCEPT)
CID: 210088
CID: 210106
CID: 210164
CID: 210179
The potential to throw exists within various paths, including any
paths involving the logger (including CATCH_ENTRY_*).
* db_abstract_accessor: use NESTED_*_ENTRY in dtor
* miniupnp_helper: use NESTED_*_ENTRY in dtor
* epee: misc_log_ex: use NESTED_*_ENTRY in log_frame dtor
* epee: levin_protocol_handler_async: use NESTED_*_ENTRY in dtors
* epee: net_helper: use NESTED_*_ENTRY in dtor
* epee: profile_tools: use NESTED_*_ENTRY in dtors
* epee: misc_language: use NESTED_*_ENTRY in dtor
* epee: syncobj: use NESTED_*_ENTRY in dtor
* zano: license contact w/ zano.org email instead of sekreta.org email
2019-05-20 09:32:36 +00:00
size_t version { } ;
2018-12-27 18:50:45 +03:00
//extra
std : : vector < extra_v > extra ;
std : : vector < txin_v > vin ;
std : : vector < tx_out > vout ;
BEGIN_SERIALIZE ( )
VARINT_FIELD ( version )
if ( CURRENT_TRANSACTION_VERSION < version ) return false ;
FIELD ( vin )
FIELD ( vout )
FIELD ( extra )
END_SERIALIZE ( )
protected :
transaction_prefix ( ) { }
} ;
/*
TX_FLAG_SIGNATURE_MODE_SEPARATE - flag that set different signature validation mode .
With this mode each signature sign prefix with it ' s own txin entry only , that allow
construct transaction partially , supposed to be in use to construct multisig - based escrow transaction .
*/
# define TX_FLAG_SIGNATURE_MODE_SEPARATE 0x01
class transaction : public transaction_prefix
{
public :
std : : vector < std : : vector < crypto : : signature > > signatures ; //count signatures always the same as inputs count
std : : vector < attachment_v > attachment ;
transaction ( ) ;
BEGIN_SERIALIZE_OBJECT ( )
FIELDS ( * static_cast < transaction_prefix * > ( this ) )
FIELD ( signatures )
FIELD ( attachment )
END_SERIALIZE ( )
} ;
inline
transaction : : transaction ( )
{
version = 0 ;
vin . clear ( ) ;
vout . clear ( ) ;
extra . clear ( ) ;
signatures . clear ( ) ;
attachment . clear ( ) ;
}
/*
inline
transaction : : ~ transaction ( )
{
//set_null();
}
inline
void transaction : : set_null ( )
{
version = 0 ;
unlock_time = 0 ;
vin . clear ( ) ;
vout . clear ( ) ;
extra . clear ( ) ;
signatures . clear ( ) ;
}
*/
/************************************************************************/
/* */
/************************************************************************/
struct block_header
{
uint8_t major_version ;
uint8_t minor_version ;
uint64_t timestamp ;
crypto : : hash prev_id ;
uint64_t nonce ;
uint8_t flags ;
BEGIN_SERIALIZE ( )
FIELD ( major_version )
2019-08-15 07:15:08 +03:00
if ( major_version > CURRENT_BLOCK_MAJOR_VERSION ) return false ;
2018-12-27 18:50:45 +03:00
FIELD ( nonce )
FIELD ( prev_id )
VARINT_FIELD ( minor_version )
VARINT_FIELD ( timestamp )
FIELD ( flags )
END_SERIALIZE ( )
} ;
struct block : public block_header
{
transaction miner_tx ;
std : : vector < crypto : : hash > tx_hashes ;
BEGIN_SERIALIZE_OBJECT ( )
FIELDS ( * static_cast < block_header * > ( this ) )
FIELD ( miner_tx )
FIELD ( tx_hashes )
END_SERIALIZE ( )
} ;
struct keypair
{
crypto : : public_key pub ;
crypto : : secret_key sec ;
static inline keypair generate ( )
{
keypair k ;
generate_keys ( k . pub , k . sec ) ;
return k ;
}
} ;
//---------------------------------------------------------------
//PoS
//based from ppcoin/novacoin approach
/*
POS PROTOCOL , stake modifier
*/
//-------------------------------------------------------------------------------------------------------------------
# pragma pack(push, 1)
struct stake_modifier_type
{
crypto : : hash last_pow_id ;
crypto : : hash last_pos_kernel_id ;
} ;
struct stake_kernel
{
stake_modifier_type stake_modifier ;
uint64_t block_timestamp ; //this block timestamp
crypto : : key_image kimage ;
} ;
# pragma pack(pop)
struct pos_entry
{
uint64_t amount ;
uint64_t index ;
crypto : : key_image keyimage ;
uint64_t block_timestamp ;
2019-07-24 19:14:35 +02:00
uint64_t stake_unlock_time ;
2018-12-27 18:50:45 +03:00
//not for serialization
uint64_t wallet_index ;
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE ( amount )
KV_SERIALIZE ( index )
2019-07-24 19:14:35 +02:00
KV_SERIALIZE ( stake_unlock_time )
2018-12-27 18:50:45 +03:00
KV_SERIALIZE ( block_timestamp )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( keyimage )
END_KV_SERIALIZE_MAP ( )
} ;
2019-04-03 12:48:09 +03:00
} // namespace currency
2018-12-27 18:50:45 +03:00
POD_MAKE_HASHABLE ( currency , account_public_address ) ;
BLOB_SERIALIZER ( currency : : txout_to_key ) ;
# define SET_VARIANT_TAGS(type_name, id, json_tag) \
VARIANT_TAG ( binary_archive , type_name , id ) ; \
VARIANT_TAG ( json_archive , type_name , json_tag )
// txin_v variant currency
SET_VARIANT_TAGS ( currency : : txin_gen , 0 , " gen " ) ;
SET_VARIANT_TAGS ( currency : : txin_to_key , 1 , " key " ) ;
SET_VARIANT_TAGS ( currency : : txin_multisig , 2 , " multisig " ) ;
// txout_target_v variant definitions
SET_VARIANT_TAGS ( currency : : txout_to_key , 3 , " key " ) ;
SET_VARIANT_TAGS ( currency : : txout_multisig , 4 , " multisig " ) ;
SET_VARIANT_TAGS ( currency : : transaction , 5 , " tx " ) ;
SET_VARIANT_TAGS ( currency : : block , 6 , " block " ) ;
//attachment_v definitions
SET_VARIANT_TAGS ( currency : : tx_comment , 7 , " comment " ) ;
SET_VARIANT_TAGS ( currency : : tx_payer , 8 , " payer " ) ;
SET_VARIANT_TAGS ( std : : string , 9 , " string " ) ;
SET_VARIANT_TAGS ( currency : : tx_crypto_checksum , 10 , " checksum " ) ;
2019-09-27 17:16:18 +02:00
SET_VARIANT_TAGS ( currency : : tx_derivation_hint , 11 , " derivation_hint " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( currency : : tx_service_attachment , 12 , " attachment " ) ;
//SET_VARIANT_TAGS(currency::tx_onetime_secret_key, 13, "sec_key");
SET_VARIANT_TAGS ( currency : : etc_tx_details_unlock_time , 14 , " unlock_time " ) ;
SET_VARIANT_TAGS ( currency : : etc_tx_details_expiration_time , 15 , " expiration_time " ) ;
SET_VARIANT_TAGS ( currency : : etc_tx_details_flags , 16 , " flags " ) ;
//txin_etc_details_v definitions
SET_VARIANT_TAGS ( currency : : signed_parts , 17 , " signed_outs " ) ;
//extra_v definitions
SET_VARIANT_TAGS ( currency : : extra_attachment_info , 18 , " extra_attach_info " ) ;
SET_VARIANT_TAGS ( currency : : extra_user_data , 19 , " user_data " ) ;
SET_VARIANT_TAGS ( currency : : extra_alias_entry , 20 , " alias_entry " ) ;
SET_VARIANT_TAGS ( currency : : extra_padding , 21 , " extra_padding " ) ;
SET_VARIANT_TAGS ( crypto : : public_key , 22 , " pub_key " ) ;
2019-09-27 17:16:18 +02:00
SET_VARIANT_TAGS ( currency : : etc_tx_uint16_t , 23 , " etc_tx_uint16 " ) ;
2018-12-27 18:50:45 +03:00
SET_VARIANT_TAGS ( uint16_t , 24 , " derive_xor " ) ;
//txout_v
SET_VARIANT_TAGS ( currency : : ref_by_id , 25 , " ref_by_id " ) ;
SET_VARIANT_TAGS ( uint64_t , 26 , " uint64_t " ) ;
//etc
SET_VARIANT_TAGS ( currency : : etc_tx_time , 27 , " etc_tx_time " ) ;
SET_VARIANT_TAGS ( uint32_t , 28 , " uint32_t " ) ;
SET_VARIANT_TAGS ( currency : : tx_receiver , 29 , " payer " ) ;
2019-07-22 13:04:01 +02:00
SET_VARIANT_TAGS ( currency : : etc_tx_details_unlock_time2 , 30 , " unlock_time2 " ) ;
2018-12-27 18:50:45 +03:00
# undef SET_VARIANT_TAGS