From 4df7298a0d03d2229e425586bd8ec2ebc922c438 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Fri, 10 May 2019 13:15:15 +0200 Subject: [PATCH 1/7] Externalized some API templates --- libraries/app/api.cpp | 11 +++++++++++ libraries/app/database_api.cpp | 4 ++++ libraries/app/include/graphene/app/api.hpp | 12 ++++++++++++ libraries/app/include/graphene/app/database_api.hpp | 2 ++ libraries/wallet/include/graphene/wallet/wallet.hpp | 2 ++ libraries/wallet/wallet.cpp | 3 +++ 6 files changed, 34 insertions(+) diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 29a4edf93..138e0560e 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -40,8 +40,19 @@ #include #include +#include #include +template class fc::api; +template class fc::api; +template class fc::api; +template class fc::api; +template class fc::api; +template class fc::api; +template class fc::api; +template class fc::api; + + namespace graphene { namespace app { login_api::login_api(application& a) diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index c7d63ad52..b49e1b357 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -31,6 +31,8 @@ #include #include +#include +#include #include #include @@ -45,6 +47,8 @@ typedef std::map< std::pair, std::vector > market_queue_type; +template class fc::api; + namespace graphene { namespace app { class database_api_impl : public std::enable_shared_from_this diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index d40dde6e3..9e468dca9 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -357,7 +357,17 @@ namespace graphene { namespace app { graphene::chain::database& _db; graphene::app::database_api database_api; }; +} } // graphene::app +extern template class fc::api; +extern template class fc::api; +extern template class fc::api; +extern template class fc::api; +extern template class fc::api; +extern template class fc::api; +extern template class fc::api; + +namespace graphene { namespace app { /** * @brief The login_api class implements the bottom layer of the RPC API * @@ -419,6 +429,8 @@ namespace graphene { namespace app { }} // graphene::app +extern template class fc::api; + FC_REFLECT( graphene::app::network_broadcast_api::transaction_confirmation, (id)(block_num)(trx_num)(trx) ) FC_REFLECT( graphene::app::verify_range_result, diff --git a/libraries/app/include/graphene/app/database_api.hpp b/libraries/app/include/graphene/app/database_api.hpp index 00f51a44e..378a4aeae 100644 --- a/libraries/app/include/graphene/app/database_api.hpp +++ b/libraries/app/include/graphene/app/database_api.hpp @@ -715,6 +715,8 @@ class database_api } } +extern template class fc::api; + FC_REFLECT( graphene::app::order, (price)(quote)(base) ); FC_REFLECT( graphene::app::order_book, (base)(quote)(bids)(asks) ); FC_REFLECT( graphene::app::market_ticker, (base)(quote)(latest)(lowest_ask)(highest_bid)(percent_change)(base_volume)(quote_volume) ); diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index d60825648..7c1960eee 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -1927,6 +1927,8 @@ class wallet_api } } +extern template class fc::api; + FC_REFLECT( graphene::wallet::key_label, (label)(key) ) FC_REFLECT( graphene::wallet::blind_balance, (amount)(from)(to)(one_time_key)(blinding_factor)(commitment)(used) ) FC_REFLECT( graphene::wallet::blind_confirmation::output, (label)(pub_key)(decrypted_memo)(confirmation)(auth)(confirmation_receipt) ) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 27eac2371..bdb756c23 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,8 @@ # include #endif +template class fc::api; + #define BRAIN_KEY_WORD_COUNT 16 namespace graphene { namespace wallet { From 71d8bfd8439d7ca1386cd3b882c9a7d44dd01c65 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sat, 11 May 2019 12:39:15 +0200 Subject: [PATCH 2/7] Externalize serialization of blocks, tx, ops --- .../include/graphene/chain/block_database.hpp | 2 ++ .../include/graphene/chain/protocol/block.hpp | 5 +++ .../graphene/chain/protocol/transaction.hpp | 5 +++ .../include/graphene/chain/protocol/types.hpp | 28 +++++++++++++++- libraries/chain/protocol/account.cpp | 3 ++ libraries/chain/protocol/asset_ops.cpp | 2 ++ libraries/chain/protocol/block.cpp | 5 +++ libraries/chain/protocol/custom.cpp | 2 ++ libraries/chain/protocol/operations.cpp | 1 + libraries/chain/protocol/proposal.cpp | 2 ++ libraries/chain/protocol/transaction.cpp | 4 +++ libraries/chain/protocol/transfer.cpp | 2 ++ .../chain/protocol/withdraw_permission.cpp | 2 ++ libraries/egenesis/egenesis_none.cpp | 2 ++ libraries/net/CMakeLists.txt | 1 + .../net/include/graphene/net/message.hpp | 18 +++++++---- .../include/graphene/net/peer_connection.hpp | 3 -- .../include/graphene/net/peer_database.hpp | 8 +++-- libraries/net/message.cpp | 32 +++++++++++++++++++ libraries/net/node.cpp | 1 + libraries/net/peer_connection.cpp | 2 +- libraries/net/peer_database.cpp | 11 +++++++ .../wallet/include/graphene/wallet/wallet.hpp | 6 ++-- libraries/wallet/wallet.cpp | 12 +++---- 24 files changed, 135 insertions(+), 24 deletions(-) create mode 100644 libraries/net/message.cpp diff --git a/libraries/chain/include/graphene/chain/block_database.hpp b/libraries/chain/include/graphene/chain/block_database.hpp index d902cd1bc..c5cf5df9e 100644 --- a/libraries/chain/include/graphene/chain/block_database.hpp +++ b/libraries/chain/include/graphene/chain/block_database.hpp @@ -25,6 +25,8 @@ #include #include +#include + namespace graphene { namespace chain { class index_entry; diff --git a/libraries/chain/include/graphene/chain/protocol/block.hpp b/libraries/chain/include/graphene/chain/protocol/block.hpp index 46ac0f6d2..ad5b03279 100644 --- a/libraries/chain/include/graphene/chain/protocol/block.hpp +++ b/libraries/chain/include/graphene/chain/protocol/block.hpp @@ -69,3 +69,8 @@ FC_REFLECT( graphene::chain::block_header, (extensions) ) FC_REFLECT_DERIVED( graphene::chain::signed_block_header, (graphene::chain::block_header), (witness_signature) ) FC_REFLECT_DERIVED( graphene::chain::signed_block, (graphene::chain::signed_block_header), (transactions) ) + + +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::block_header) +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_block_header) +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_block) diff --git a/libraries/chain/include/graphene/chain/protocol/transaction.hpp b/libraries/chain/include/graphene/chain/protocol/transaction.hpp index 95c399613..2a9909a56 100644 --- a/libraries/chain/include/graphene/chain/protocol/transaction.hpp +++ b/libraries/chain/include/graphene/chain/protocol/transaction.hpp @@ -230,3 +230,8 @@ FC_REFLECT( graphene::chain::transaction, (ref_block_num)(ref_block_prefix)(expi // Note: not reflecting signees field for backward compatibility; in addition, it should not be in p2p messages FC_REFLECT_DERIVED( graphene::chain::signed_transaction, (graphene::chain::transaction), (signatures) ) FC_REFLECT_DERIVED( graphene::chain::processed_transaction, (graphene::chain::signed_transaction), (operation_results) ) + + +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::transaction) +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::signed_transaction) +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::chain::processed_transaction) diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index c2c92ca31..8cd38ea58 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -33,7 +33,8 @@ #include #include #include -#include +#include +#include #include #include #include @@ -46,6 +47,31 @@ #include #include +#define GRAPHENE_EXTERNAL_SERIALIZATION(ext, type) \ +namespace fc { \ + ext template void from_variant( const variant& v, type& vo, uint32_t max_depth ); \ + ext template void to_variant( const type& v, variant& vo, uint32_t max_depth ); \ +namespace raw { \ + ext template void pack< datastream, type >( datastream& s, const type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ + ext template void pack< datastream, type >( datastream& s, const type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ + ext template void unpack< datastream, type >( datastream& s, type& tx, uint32_t _max_depth=FC_PACK_MAX_DEPTH ); \ +} } // fc::raw + +#define FC_REFLECT_DERIVED_NO_TYPENAME( TYPE, INHERITS, MEMBERS ) \ +namespace fc { \ +template<> struct reflector {\ + typedef TYPE type; \ + typedef fc::true_type is_defined; \ + typedef fc::false_type is_enum; \ + enum member_count_enum { \ + local_member_count = 0 BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_MEMBER_COUNT, +, MEMBERS ),\ + total_member_count = local_member_count BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_BASE_MEMBER_COUNT, +, INHERITS )\ + }; \ + FC_REFLECT_DERIVED_IMPL_INLINE( TYPE, INHERITS, MEMBERS ) \ +}; \ +} // fc + + namespace graphene { namespace chain { using namespace graphene::db; diff --git a/libraries/chain/protocol/account.cpp b/libraries/chain/protocol/account.cpp index cf592d5ca..66dcdb90c 100644 --- a/libraries/chain/protocol/account.cpp +++ b/libraries/chain/protocol/account.cpp @@ -24,6 +24,9 @@ #include #include #include + +#include + namespace graphene { namespace chain { /** diff --git a/libraries/chain/protocol/asset_ops.cpp b/libraries/chain/protocol/asset_ops.cpp index e4942aa43..9c5518828 100644 --- a/libraries/chain/protocol/asset_ops.cpp +++ b/libraries/chain/protocol/asset_ops.cpp @@ -24,6 +24,8 @@ #include #include +#include + namespace graphene { namespace chain { /** diff --git a/libraries/chain/protocol/block.cpp b/libraries/chain/protocol/block.cpp index d32365dd0..725ea3a78 100644 --- a/libraries/chain/protocol/block.cpp +++ b/libraries/chain/protocol/block.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include #include #include #include @@ -90,3 +91,7 @@ namespace graphene { namespace chain { } } } + +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::block_header) +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_block_header) +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_block) diff --git a/libraries/chain/protocol/custom.cpp b/libraries/chain/protocol/custom.cpp index b69243bee..be03419fb 100644 --- a/libraries/chain/protocol/custom.cpp +++ b/libraries/chain/protocol/custom.cpp @@ -23,6 +23,8 @@ */ #include +#include + namespace graphene { namespace chain { void custom_operation::validate()const diff --git a/libraries/chain/protocol/operations.cpp b/libraries/chain/protocol/operations.cpp index 40a37eba3..57831b8f7 100644 --- a/libraries/chain/protocol/operations.cpp +++ b/libraries/chain/protocol/operations.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/protocol/proposal.cpp b/libraries/chain/protocol/proposal.cpp index 069824af7..bca0c4164 100644 --- a/libraries/chain/protocol/proposal.cpp +++ b/libraries/chain/protocol/proposal.cpp @@ -25,6 +25,8 @@ #include #include +#include + namespace graphene { namespace chain { proposal_create_operation proposal_create_operation::committee_proposal(const chain_parameters& global_params, fc::time_point_sec head_block_time ) diff --git a/libraries/chain/protocol/transaction.cpp b/libraries/chain/protocol/transaction.cpp index a11e3335d..e9e60d50e 100644 --- a/libraries/chain/protocol/transaction.cpp +++ b/libraries/chain/protocol/transaction.cpp @@ -390,3 +390,7 @@ void signed_transaction::verify_authority( } FC_CAPTURE_AND_RETHROW( (*this) ) } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::transaction) +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::signed_transaction) +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::chain::processed_transaction) diff --git a/libraries/chain/protocol/transfer.cpp b/libraries/chain/protocol/transfer.cpp index 3dfe4eb72..3ec78237c 100644 --- a/libraries/chain/protocol/transfer.cpp +++ b/libraries/chain/protocol/transfer.cpp @@ -23,6 +23,8 @@ */ #include +#include + namespace graphene { namespace chain { share_type transfer_operation::calculate_fee( const fee_parameters_type& schedule )const diff --git a/libraries/chain/protocol/withdraw_permission.cpp b/libraries/chain/protocol/withdraw_permission.cpp index 33b40c856..ec7b36f8d 100644 --- a/libraries/chain/protocol/withdraw_permission.cpp +++ b/libraries/chain/protocol/withdraw_permission.cpp @@ -23,6 +23,8 @@ */ #include +#include + namespace graphene { namespace chain { void withdraw_permission_update_operation::validate()const diff --git a/libraries/egenesis/egenesis_none.cpp b/libraries/egenesis/egenesis_none.cpp index 825f7f83f..c7a0dcdde 100644 --- a/libraries/egenesis/egenesis_none.cpp +++ b/libraries/egenesis/egenesis_none.cpp @@ -24,6 +24,8 @@ #include +#include + namespace graphene { namespace egenesis { using namespace graphene::chain; diff --git a/libraries/net/CMakeLists.txt b/libraries/net/CMakeLists.txt index 7aa617d77..955012e41 100644 --- a/libraries/net/CMakeLists.txt +++ b/libraries/net/CMakeLists.txt @@ -5,6 +5,7 @@ set(SOURCES node.cpp core_messages.cpp peer_database.cpp peer_connection.cpp + message.cpp message_oriented_connection.cpp) add_library( graphene_net ${SOURCES} ${HEADERS} ) diff --git a/libraries/net/include/graphene/net/message.hpp b/libraries/net/include/graphene/net/message.hpp index cfef15198..5557383b1 100644 --- a/libraries/net/include/graphene/net/message.hpp +++ b/libraries/net/include/graphene/net/message.hpp @@ -22,12 +22,16 @@ * THE SOFTWARE. */ #pragma once +#include + +#include + #include #include #include -#include +#include #include -#include +#include namespace graphene { namespace net { @@ -108,10 +112,10 @@ namespace graphene { namespace net { } }; - - - } } // graphene::net -FC_REFLECT( graphene::net::message_header, (size)(msg_type) ) -FC_REFLECT_DERIVED( graphene::net::message, (graphene::net::message_header), (data) ) +FC_REFLECT_TYPENAME( graphene::net::message_header ) +FC_REFLECT_TYPENAME( graphene::net::message ) + +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message_header) +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message) diff --git a/libraries/net/include/graphene/net/peer_connection.hpp b/libraries/net/include/graphene/net/peer_connection.hpp index 6f9a4b207..5c5f40d50 100644 --- a/libraries/net/include/graphene/net/peer_connection.hpp +++ b/libraries/net/include/graphene/net/peer_connection.hpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include @@ -35,9 +34,7 @@ #include #include #include -#include #include -#include #include #include diff --git a/libraries/net/include/graphene/net/peer_database.hpp b/libraries/net/include/graphene/net/peer_database.hpp index d0a06dd9c..ff7f40368 100644 --- a/libraries/net/include/graphene/net/peer_database.hpp +++ b/libraries/net/include/graphene/net/peer_database.hpp @@ -24,13 +24,14 @@ #pragma once #include +#include + #include #include #include #include #include #include -#include namespace graphene { namespace net { @@ -118,5 +119,6 @@ namespace graphene { namespace net { } } // end namespace graphene::net -FC_REFLECT_ENUM(graphene::net::potential_peer_last_connection_disposition, (never_attempted_to_connect)(last_connection_failed)(last_connection_rejected)(last_connection_handshaking_failed)(last_connection_succeeded)) -FC_REFLECT(graphene::net::potential_peer_record, (endpoint)(last_seen_time)(last_connection_disposition)(last_connection_attempt_time)(number_of_successful_connection_attempts)(number_of_failed_connection_attempts)(last_error) ) +FC_REFLECT_TYPENAME( graphene::net::potential_peer_record ) + +GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::potential_peer_record) diff --git a/libraries/net/message.cpp b/libraries/net/message.cpp new file mode 100644 index 000000000..74c04eba0 --- /dev/null +++ b/libraries/net/message.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#include + +#include + +FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::message_header, BOOST_PP_SEQ_NIL, (size)(msg_type) ) +FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::message, (graphene::net::message_header), (data) ) + +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message_header) +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message) diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index 14d93d500..d5ffa0ad5 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include diff --git a/libraries/net/peer_connection.cpp b/libraries/net/peer_connection.cpp index 4dd151b59..b77b34f9d 100644 --- a/libraries/net/peer_connection.cpp +++ b/libraries/net/peer_connection.cpp @@ -25,8 +25,8 @@ #include #include #include -#include +#include #include #include diff --git a/libraries/net/peer_database.cpp b/libraries/net/peer_database.cpp index 2b20364e3..76ae9c8c1 100644 --- a/libraries/net/peer_database.cpp +++ b/libraries/net/peer_database.cpp @@ -274,3 +274,14 @@ namespace graphene { namespace net { } } } // end namespace graphene::net + +FC_REFLECT_ENUM( graphene::net::potential_peer_last_connection_disposition, + (never_attempted_to_connect) + (last_connection_failed)(last_connection_rejected) + (last_connection_handshaking_failed)(last_connection_succeeded) ) +FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::potential_peer_record, BOOST_PP_SEQ_NIL, + (endpoint)(last_seen_time)(last_connection_disposition) + (last_connection_attempt_time)(number_of_successful_connection_attempts) + (number_of_failed_connection_attempts)(last_error) ) + +GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::potential_peer_record) diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index 7c1960eee..c456f7e14 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -229,12 +229,13 @@ struct worker_vote_delta flat_set vote_abstain; }; -struct signed_block_with_info : public signed_block +struct signed_block_with_info { signed_block_with_info(); signed_block_with_info( const signed_block& block ); signed_block_with_info( const signed_block_with_info& block ) = default; + signed_block block; block_id_type block_id; public_key_type signing_key; vector< transaction_id_type > transaction_ids; @@ -1978,8 +1979,7 @@ FC_REFLECT( graphene::wallet::worker_vote_delta, (vote_abstain) ) -FC_REFLECT_DERIVED( graphene::wallet::signed_block_with_info, (graphene::chain::signed_block), - (block_id)(signing_key)(transaction_ids) ) +FC_REFLECT( graphene::wallet::signed_block_with_info, (block_id)(signing_key)(transaction_ids) ) FC_REFLECT_DERIVED( graphene::wallet::vesting_balance_object_with_info, (graphene::chain::vesting_balance_object), (allowed_withdraw)(allowed_withdraw_time) ) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index bdb756c23..2bbb9d9bc 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -6191,13 +6191,13 @@ std::vector wallet_api::get_all_matched_bets_for_bettor(acco } // default ctor necessary for FC_REFLECT -signed_block_with_info::signed_block_with_info( const signed_block& block ) - : signed_block( block ) +signed_block_with_info::signed_block_with_info( const signed_block& _block ) + : block( _block ) { - block_id = id(); - signing_key = signee(); - transaction_ids.reserve( transactions.size() ); - for( const processed_transaction& tx : transactions ) + block_id = _block.id(); + signing_key = _block.signee(); + transaction_ids.reserve( _block.transactions.size() ); + for( const processed_transaction& tx : _block.transactions ) transaction_ids.push_back( tx.id() ); } From b3d6058485cc880f33104992c76030a8f4eb331a Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 14 May 2019 00:18:12 +0200 Subject: [PATCH 3/7] Externalized db objects --- libraries/chain/CMakeLists.txt | 1 + libraries/chain/account_object.cpp | 9 ++- libraries/chain/asset_object.cpp | 11 ++- .../include/graphene/chain/account_object.hpp | 8 ++- .../include/graphene/chain/asset_object.hpp | 62 +++++++++------- .../include/graphene/chain/balance_object.hpp | 2 + .../graphene/chain/block_summary_object.hpp | 4 ++ .../graphene/chain/budget_record_object.hpp | 17 ++--- .../include/graphene/chain/buyback_object.hpp | 2 + .../graphene/chain/chain_property_object.hpp | 4 +- .../chain/committee_member_object.hpp | 5 +- .../graphene/chain/confidential_object.hpp | 9 +-- .../include/graphene/chain/fba_object.hpp | 5 +- .../graphene/chain/global_property_object.hpp | 4 +- .../chain/immutable_chain_parameters.hpp | 7 +- .../include/graphene/chain/market_object.hpp | 4 ++ .../chain/operation_history_object.hpp | 9 +-- .../graphene/chain/proposal_object.hpp | 5 +- .../chain/special_authority_object.hpp | 2 + .../graphene/chain/transaction_object.hpp | 4 +- .../graphene/chain/vesting_balance_object.hpp | 6 +- .../chain/withdraw_permission_object.hpp | 2 + .../include/graphene/chain/witness_object.hpp | 4 +- .../chain/witness_schedule_object.hpp | 5 +- .../include/graphene/chain/worker_object.hpp | 5 +- libraries/chain/proposal_object.cpp | 4 +- libraries/chain/protocol/memo.cpp | 1 + libraries/chain/protocol/tournament.cpp | 1 + libraries/chain/small_objects.cpp | 71 +++++++++++++++++++ libraries/chain/vesting_balance_object.cpp | 6 ++ .../net/include/graphene/net/message.hpp | 4 +- libraries/net/message.cpp | 3 - libraries/net/node.cpp | 2 +- libraries/net/peer_connection.cpp | 3 +- 34 files changed, 212 insertions(+), 79 deletions(-) create mode 100644 libraries/chain/small_objects.cpp diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index a8d9e5db8..649f641a2 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -93,6 +93,7 @@ add_library( graphene_chain fba_object.cpp proposal_object.cpp vesting_balance_object.cpp + small_objects.cpp block_database.cpp diff --git a/libraries/chain/account_object.cpp b/libraries/chain/account_object.cpp index 466f7a6fc..71ee28de8 100644 --- a/libraries/chain/account_object.cpp +++ b/libraries/chain/account_object.cpp @@ -22,9 +22,9 @@ * THE SOFTWARE. */ #include -#include #include -#include + +#include #include namespace graphene { namespace chain { @@ -320,3 +320,8 @@ const account_balance_object* balances_by_account_index::get_account_balance( co } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_statistics_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::pending_dividend_payout_balance_for_holder_object ) diff --git a/libraries/chain/asset_object.cpp b/libraries/chain/asset_object.cpp index ea3879326..88e5dfcab 100644 --- a/libraries/chain/asset_object.cpp +++ b/libraries/chain/asset_object.cpp @@ -24,10 +24,9 @@ #include #include +#include #include -#include - using namespace graphene::chain; share_type asset_bitasset_data_object::max_force_settlement_volume(share_type current_supply) const @@ -296,3 +295,11 @@ void sweeps_vesting_balance_object::adjust_balance( const asset& delta ) FC_ASSERT( delta.asset_id == asset_id ); balance += delta.amount.value; } + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dynamic_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_bitasset_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dividend_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::total_distributed_dividend_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::lottery_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::sweeps_vesting_balance_object ) diff --git a/libraries/chain/include/graphene/chain/account_object.hpp b/libraries/chain/include/graphene/chain/account_object.hpp index 94a1b98e0..5f24adebf 100644 --- a/libraries/chain/include/graphene/chain/account_object.hpp +++ b/libraries/chain/include/graphene/chain/account_object.hpp @@ -22,8 +22,9 @@ * THE SOFTWARE. */ #pragma once -#include +#include #include +#include #include namespace graphene { namespace chain { @@ -574,4 +575,7 @@ FC_REFLECT_DERIVED( graphene::chain::pending_dividend_payout_balance_for_holder_ (graphene::db::object), (owner)(dividend_holder_asset_type)(dividend_payout_asset_type)(pending_balance) ) - +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_statistics_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::pending_dividend_payout_balance_for_holder_object ) diff --git a/libraries/chain/include/graphene/chain/asset_object.hpp b/libraries/chain/include/graphene/chain/asset_object.hpp index cba33bb85..8978a6d15 100644 --- a/libraries/chain/include/graphene/chain/asset_object.hpp +++ b/libraries/chain/include/graphene/chain/asset_object.hpp @@ -22,10 +22,11 @@ * THE SOFTWARE. */ #pragma once +#include +#include +#include #include #include -#include -#include /** * @defgroup prediction_market Prediction Market @@ -38,11 +39,10 @@ */ namespace graphene { namespace chain { - class account_object; class database; class transaction_evaluation_state; using namespace graphene::db; - + /** * @brief tracks the asset information that changes frequently * @ingroup object @@ -118,9 +118,9 @@ namespace graphene { namespace chain { /// Convert an asset to a textual representation with symbol, i.e. "123.45 USD" string amount_to_pretty_string(const asset &amount)const { FC_ASSERT(amount.asset_id == id); return amount_to_pretty_string(amount.amount); } - + uint32_t get_issuer_num()const - { return issuer.instance.value; } + { return issuer.instance.value; } /// Ticker symbol for this asset, i.e. "USD" string symbol; /// Maximum number of digits after the decimal point (must be <= 12) @@ -138,7 +138,7 @@ namespace graphene { namespace chain { map< account_id_type, vector< uint16_t > > distribute_winners_part( database& db ); void distribute_sweeps_holders_part( database& db ); void end_lottery( database& db ); - + /// Current supply, fee pool, and collected fees are stored in a separate object as they change frequently. asset_dynamic_data_id_type dynamic_asset_data_id; /// Extra data associated with BitAssets. This field is non-null if and only if is_market_issued() returns true @@ -150,7 +150,7 @@ namespace graphene { namespace chain { optional dividend_data_id; asset_id_type get_id()const { return id; } - + void validate()const { // UIAs may not be prediction markets, have force settlement, or global settlements @@ -174,7 +174,7 @@ namespace graphene { namespace chain { { return db.get(dynamic_asset_data_id); } /** - * The total amount of an asset that is reserved for future issuance. + * The total amount of an asset that is reserved for future issuance. */ template share_type reserved( const DB& db )const @@ -254,7 +254,7 @@ namespace graphene { namespace chain { else return current_feed_publication_time + options.feed_lifetime_sec; } - + bool feed_is_expired_before_hardfork_615(time_point_sec current_time)const { return feed_expiration_time() >= current_time; } bool feed_is_expired(time_point_sec current_time)const @@ -378,7 +378,7 @@ namespace graphene { namespace chain { /// This field is reset any time the dividend_asset_options are updated fc::optional last_scheduled_payout_time; - /// The time payouts on this asset were last processed + /// The time payouts on this asset were last processed /// (this should be the maintenance interval at or after last_scheduled_payout_time) /// This can be displayed for the user fc::optional last_payout_time; @@ -405,7 +405,7 @@ namespace graphene { namespace chain { typedef generic_index asset_dividend_data_object_index; - // This tracks the balances in a dividend distribution account at the last time + // This tracks the balances in a dividend distribution account at the last time // pending dividend payouts were calculated (last maintenance interval). // At each maintenance interval, we will compare the current balance to the // balance stored here to see how much was deposited during that interval. @@ -434,9 +434,9 @@ namespace graphene { namespace chain { > > total_distributed_dividend_balance_object_multi_index_type; typedef generic_index total_distributed_dividend_balance_object_index; - - - + + + /** * @ingroup object */ @@ -445,17 +445,17 @@ namespace graphene { namespace chain { public: static const uint8_t space_id = implementation_ids; static const uint8_t type_id = impl_lottery_balance_object_type; - + asset_id_type lottery_id; asset balance; - + asset get_balance()const { return balance; } void adjust_balance(const asset& delta); }; - - + + struct by_owner; - + /** * @ingroup object_index */ @@ -468,13 +468,13 @@ namespace graphene { namespace chain { > > > lottery_balance_index_type; - + /** * @ingroup object_index */ typedef generic_index lottery_balance_index; - - + + class sweeps_vesting_balance_object : public abstract_object { public: @@ -486,7 +486,7 @@ namespace graphene { namespace chain { uint64_t balance; asset_id_type asset_id; time_point_sec last_claim_date; - + uint64_t get_balance()const { return balance; } void adjust_balance(const asset& delta); asset available_for_claim() const { return asset( balance / SWEEPS_VESTING_BALANCE_MULTIPLIER , asset_id ); } @@ -528,10 +528,10 @@ FC_REFLECT_DERIVED( graphene::chain::asset_bitasset_data_object, (graphene::db:: (asset_cer_updated) (feed_cer_updated) ) - + FC_REFLECT_DERIVED( graphene::chain::asset_dividend_data_object, (graphene::db::object), (options) - (last_scheduled_payout_time) + (last_scheduled_payout_time) (last_payout_time ) (last_scheduled_distribution_time) (last_distribution_time) @@ -561,3 +561,13 @@ FC_REFLECT_DERIVED( graphene::chain::lottery_balance_object, (graphene::db::obje FC_REFLECT_DERIVED( graphene::chain::sweeps_vesting_balance_object, (graphene::db::object), (owner)(balance)(asset_id)(last_claim_date) ) + + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dynamic_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_bitasset_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dividend_data_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::total_distributed_dividend_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::lottery_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::sweeps_vesting_balance_object ) + diff --git a/libraries/chain/include/graphene/chain/balance_object.hpp b/libraries/chain/include/graphene/chain/balance_object.hpp index 8d531d0c5..38a1a6494 100644 --- a/libraries/chain/include/graphene/chain/balance_object.hpp +++ b/libraries/chain/include/graphene/chain/balance_object.hpp @@ -73,3 +73,5 @@ namespace graphene { namespace chain { FC_REFLECT_DERIVED( graphene::chain::balance_object, (graphene::db::object), (owner)(balance)(vesting_policy)(last_claim_date) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::balance_object ) diff --git a/libraries/chain/include/graphene/chain/block_summary_object.hpp b/libraries/chain/include/graphene/chain/block_summary_object.hpp index f002c030b..9f79d43e9 100644 --- a/libraries/chain/include/graphene/chain/block_summary_object.hpp +++ b/libraries/chain/include/graphene/chain/block_summary_object.hpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #pragma once +#include #include namespace graphene { namespace chain { @@ -47,4 +48,7 @@ namespace graphene { namespace chain { } } + FC_REFLECT_DERIVED( graphene::chain::block_summary_object, (graphene::db::object), (block_id) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::block_summary_object ) diff --git a/libraries/chain/include/graphene/chain/budget_record_object.hpp b/libraries/chain/include/graphene/chain/budget_record_object.hpp index 49544793a..e3f6d06e4 100644 --- a/libraries/chain/include/graphene/chain/budget_record_object.hpp +++ b/libraries/chain/include/graphene/chain/budget_record_object.hpp @@ -23,7 +23,6 @@ */ #pragma once #include -#include #include namespace graphene { namespace chain { @@ -54,8 +53,6 @@ struct budget_record share_type supply_delta = 0; }; -class budget_record_object; - class budget_record_object : public graphene::db::abstract_object { public: @@ -68,8 +65,7 @@ class budget_record_object : public graphene::db::abstract_object buyback_index; } } // graphene::chain FC_REFLECT_DERIVED( graphene::chain::buyback_object, (graphene::db::object), (asset_to_buy) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::buyback_object ) diff --git a/libraries/chain/include/graphene/chain/chain_property_object.hpp b/libraries/chain/include/graphene/chain/chain_property_object.hpp index 3d2c82a68..3c7a77ff1 100644 --- a/libraries/chain/include/graphene/chain/chain_property_object.hpp +++ b/libraries/chain/include/graphene/chain/chain_property_object.hpp @@ -27,8 +27,6 @@ namespace graphene { namespace chain { -class chain_property_object; - /** * Contains invariants which are set at genesis and never changed. */ @@ -48,3 +46,5 @@ FC_REFLECT_DERIVED( graphene::chain::chain_property_object, (graphene::db::objec (chain_id) (immutable_parameters) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::chain_property_object ) diff --git a/libraries/chain/include/graphene/chain/committee_member_object.hpp b/libraries/chain/include/graphene/chain/committee_member_object.hpp index 7b0d8e754..fe7968d36 100644 --- a/libraries/chain/include/graphene/chain/committee_member_object.hpp +++ b/libraries/chain/include/graphene/chain/committee_member_object.hpp @@ -29,8 +29,6 @@ namespace graphene { namespace chain { using namespace graphene::db; - class account_object; - /** * @brief tracks information about a committee_member account. * @ingroup object @@ -73,5 +71,8 @@ namespace graphene { namespace chain { using committee_member_index = generic_index; } } // graphene::chain + FC_REFLECT_DERIVED( graphene::chain::committee_member_object, (graphene::db::object), (committee_member_account)(vote_id)(total_votes)(url) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_object ) diff --git a/libraries/chain/include/graphene/chain/confidential_object.hpp b/libraries/chain/include/graphene/chain/confidential_object.hpp index f98e20a9a..acdb0ba5d 100644 --- a/libraries/chain/include/graphene/chain/confidential_object.hpp +++ b/libraries/chain/include/graphene/chain/confidential_object.hpp @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -50,8 +49,6 @@ class blinded_balance_object : public graphene::db::abstract_object - -#include - #include +#include namespace graphene { namespace chain { @@ -47,3 +44,5 @@ FC_REFLECT( graphene::chain::immutable_chain_parameters, (num_special_accounts) (num_special_assets) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::immutable_chain_parameters ) diff --git a/libraries/chain/include/graphene/chain/market_object.hpp b/libraries/chain/include/graphene/chain/market_object.hpp index b56f4e9ca..4bd3e0487 100644 --- a/libraries/chain/include/graphene/chain/market_object.hpp +++ b/libraries/chain/include/graphene/chain/market_object.hpp @@ -217,3 +217,7 @@ FC_REFLECT_DERIVED( graphene::chain::force_settlement_object, (graphene::db::object), (owner)(balance)(settlement_date) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::force_settlement_object ) diff --git a/libraries/chain/include/graphene/chain/operation_history_object.hpp b/libraries/chain/include/graphene/chain/operation_history_object.hpp index d8b90b585..b35b171f9 100644 --- a/libraries/chain/include/graphene/chain/operation_history_object.hpp +++ b/libraries/chain/include/graphene/chain/operation_history_object.hpp @@ -22,8 +22,10 @@ * THE SOFTWARE. */ #pragma once + #include #include + #include namespace graphene { namespace chain { @@ -94,9 +96,6 @@ namespace graphene { namespace chain { operation_history_id_type operation_id; uint32_t sequence = 0; /// the operation position within the given account account_transaction_history_id_type next; - - //std::pair account_op()const { return std::tie( account, operation_id ); } - //std::pair account_seq()const { return std::tie( account, sequence ); } }; struct by_id; @@ -132,6 +131,8 @@ typedef generic_index #include +#include namespace graphene { namespace chain { - + class database; /** * @brief tracks the approval of a partially approved transaction @@ -97,3 +98,5 @@ FC_REFLECT_DERIVED( graphene::chain::proposal_object, (graphene::chain::object), (expiration_time)(review_period_time)(proposed_transaction)(required_active_approvals) (available_active_approvals)(required_owner_approvals)(available_owner_approvals) (available_key_approvals)(proposer)(fail_reason)) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_object ) diff --git a/libraries/chain/include/graphene/chain/special_authority_object.hpp b/libraries/chain/include/graphene/chain/special_authority_object.hpp index da9ecc5e0..75093f3a3 100644 --- a/libraries/chain/include/graphene/chain/special_authority_object.hpp +++ b/libraries/chain/include/graphene/chain/special_authority_object.hpp @@ -68,3 +68,5 @@ FC_REFLECT_DERIVED( (graphene::db::object), (account) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::special_authority_object ) diff --git a/libraries/chain/include/graphene/chain/transaction_object.hpp b/libraries/chain/include/graphene/chain/transaction_object.hpp index 4f76d6bef..aaaa31f16 100644 --- a/libraries/chain/include/graphene/chain/transaction_object.hpp +++ b/libraries/chain/include/graphene/chain/transaction_object.hpp @@ -22,12 +22,10 @@ * THE SOFTWARE. */ #pragma once -#include #include #include #include -#include #include #include @@ -72,3 +70,5 @@ namespace graphene { namespace chain { } } FC_REFLECT_DERIVED( graphene::chain::transaction_object, (graphene::db::object), (trx)(trx_id) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transaction_object ) diff --git a/libraries/chain/include/graphene/chain/vesting_balance_object.hpp b/libraries/chain/include/graphene/chain/vesting_balance_object.hpp index 56b0ac1a1..b03b8f7b0 100644 --- a/libraries/chain/include/graphene/chain/vesting_balance_object.hpp +++ b/libraries/chain/include/graphene/chain/vesting_balance_object.hpp @@ -38,8 +38,6 @@ namespace graphene { namespace chain { using namespace graphene::db; - class vesting_balance_object; - struct vesting_policy_context { vesting_policy_context( @@ -234,3 +232,7 @@ FC_REFLECT_DERIVED(graphene::chain::vesting_balance_object, (graphene::db::objec (policy) (balance_type) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::linear_vesting_policy ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::cdd_vesting_policy ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_object ) diff --git a/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp b/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp index 000573bd3..a6fee0c59 100644 --- a/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp +++ b/libraries/chain/include/graphene/chain/withdraw_permission_object.hpp @@ -114,3 +114,5 @@ FC_REFLECT_DERIVED( graphene::chain::withdraw_permission_object, (graphene::db:: (expiration) (claimed_this_period) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_object ) diff --git a/libraries/chain/include/graphene/chain/witness_object.hpp b/libraries/chain/include/graphene/chain/witness_object.hpp index 2d1b76662..7928b46ef 100644 --- a/libraries/chain/include/graphene/chain/witness_object.hpp +++ b/libraries/chain/include/graphene/chain/witness_object.hpp @@ -29,8 +29,6 @@ namespace graphene { namespace chain { using namespace graphene::db; - class witness_object; - class witness_object : public abstract_object { public: @@ -85,3 +83,5 @@ FC_REFLECT_DERIVED( graphene::chain::witness_object, (graphene::db::object), (total_missed) (last_confirmed_block_num) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_object ) diff --git a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp index e4c4bb513..1702212d4 100644 --- a/libraries/chain/include/graphene/chain/witness_schedule_object.hpp +++ b/libraries/chain/include/graphene/chain/witness_schedule_object.hpp @@ -30,8 +30,6 @@ namespace graphene { namespace chain { -class witness_schedule_object; - typedef hash_ctr_rng< /* HashClass = */ fc::sha256, /* SeedLength = */ GRAPHENE_RNG_SEED_LENGTH @@ -96,3 +94,6 @@ FC_REFLECT_DERIVED( (recent_slots_filled) (current_shuffled_witnesses) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_scheduler ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_schedule_object ) diff --git a/libraries/chain/include/graphene/chain/worker_object.hpp b/libraries/chain/include/graphene/chain/worker_object.hpp index 1219fc1c6..5e23f0b88 100644 --- a/libraries/chain/include/graphene/chain/worker_object.hpp +++ b/libraries/chain/include/graphene/chain/worker_object.hpp @@ -22,8 +22,9 @@ * THE SOFTWARE. */ #pragma once -#include +#include #include +#include namespace graphene { namespace chain { @@ -175,3 +176,5 @@ FC_REFLECT_DERIVED( graphene::chain::worker_object, (graphene::db::object), (name) (url) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_object ) diff --git a/libraries/chain/proposal_object.cpp b/libraries/chain/proposal_object.cpp index 343edce2b..1d5a87069 100644 --- a/libraries/chain/proposal_object.cpp +++ b/libraries/chain/proposal_object.cpp @@ -37,7 +37,7 @@ bool proposal_object::is_authorized_to_execute(database& db) const [&]( account_id_type id ){ return &id(db).active; }, [&]( account_id_type id ){ return &id(db).owner; }, db.get_global_properties().parameters.max_authority_depth, - true, /* allow committeee */ + true, /* allow committee */ available_active_approvals, available_owner_approvals ); } @@ -90,3 +90,5 @@ void required_approval_index::object_removed( const object& obj ) } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::proposal_object ) diff --git a/libraries/chain/protocol/memo.cpp b/libraries/chain/protocol/memo.cpp index e04b5e430..8ced0e1ba 100644 --- a/libraries/chain/protocol/memo.cpp +++ b/libraries/chain/protocol/memo.cpp @@ -23,6 +23,7 @@ */ #include #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/protocol/tournament.cpp b/libraries/chain/protocol/tournament.cpp index 57e80bf33..78ab4c01a 100644 --- a/libraries/chain/protocol/tournament.cpp +++ b/libraries/chain/protocol/tournament.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/small_objects.cpp b/libraries/chain/small_objects.cpp new file mode 100644 index 000000000..6b8af3d94 --- /dev/null +++ b/libraries/chain/small_objects.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2019 BitShares Blockchain Foundation, and contributors. + * + * The MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::block_summary_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::budget_record ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::budget_record_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::buyback_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::immutable_chain_parameters ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::force_settlement_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::chain_property_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blinded_balance_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fba_accumulator_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::dynamic_global_property_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::global_property_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::operation_history_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transaction_history_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::special_authority_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transaction_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_scheduler ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_schedule_object ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_object ) diff --git a/libraries/chain/vesting_balance_object.cpp b/libraries/chain/vesting_balance_object.cpp index afba2557a..4674c9742 100644 --- a/libraries/chain/vesting_balance_object.cpp +++ b/libraries/chain/vesting_balance_object.cpp @@ -24,6 +24,8 @@ #include +#include + namespace graphene { namespace chain { inline bool sum_below_max_shares(const asset& a, const asset& b) @@ -248,3 +250,7 @@ asset vesting_balance_object::get_allowed_withdraw(const time_point_sec& now)con } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::linear_vesting_policy ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::cdd_vesting_policy ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_object ) diff --git a/libraries/net/include/graphene/net/message.hpp b/libraries/net/include/graphene/net/message.hpp index 5557383b1..686fea24a 100644 --- a/libraries/net/include/graphene/net/message.hpp +++ b/libraries/net/include/graphene/net/message.hpp @@ -114,8 +114,8 @@ namespace graphene { namespace net { } } // graphene::net -FC_REFLECT_TYPENAME( graphene::net::message_header ) -FC_REFLECT_TYPENAME( graphene::net::message ) +FC_REFLECT( graphene::net::message_header, (size)(msg_type) ) +FC_REFLECT_DERIVED( graphene::net::message, (graphene::net::message_header), (data) ) GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message_header) GRAPHENE_EXTERNAL_SERIALIZATION(extern, graphene::net::message) diff --git a/libraries/net/message.cpp b/libraries/net/message.cpp index 74c04eba0..6d35bfe57 100644 --- a/libraries/net/message.cpp +++ b/libraries/net/message.cpp @@ -25,8 +25,5 @@ #include -FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::message_header, BOOST_PP_SEQ_NIL, (size)(msg_type) ) -FC_REFLECT_DERIVED_NO_TYPENAME( graphene::net::message, (graphene::net::message_header), (data) ) - GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message_header) GRAPHENE_EXTERNAL_SERIALIZATION(/*not extern*/, graphene::net::message) diff --git a/libraries/net/node.cpp b/libraries/net/node.cpp index d5ffa0ad5..0fc61dde9 100644 --- a/libraries/net/node.cpp +++ b/libraries/net/node.cpp @@ -66,7 +66,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/libraries/net/peer_connection.cpp b/libraries/net/peer_connection.cpp index b77b34f9d..9b753e6c3 100644 --- a/libraries/net/peer_connection.cpp +++ b/libraries/net/peer_connection.cpp @@ -25,8 +25,9 @@ #include #include #include +#include -#include +#include #include #include From 2358149e469733dea4f2801da7fc87e0860bf9a4 Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 14 May 2019 11:10:21 +0200 Subject: [PATCH 4/7] Externalized genesis serialization --- libraries/chain/genesis_state.cpp | 69 ++++++++++++++++ .../include/graphene/chain/genesis_state.hpp | 82 +++++++------------ 2 files changed, 98 insertions(+), 53 deletions(-) diff --git a/libraries/chain/genesis_state.cpp b/libraries/chain/genesis_state.cpp index a278b6800..533110125 100644 --- a/libraries/chain/genesis_state.cpp +++ b/libraries/chain/genesis_state.cpp @@ -36,3 +36,72 @@ chain_id_type genesis_state_type::compute_chain_id() const } } } // graphene::chain + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_account_type, BOOST_PP_SEQ_NIL, (name)(owner_key)(active_key)(is_lifetime_member)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type, BOOST_PP_SEQ_NIL, + (symbol)(issuer_name)(description)(precision)(max_supply)(accumulated_fees)(is_bitasset)(collateral_records)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position, BOOST_PP_SEQ_NIL, + (owner)(collateral)(debt)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_balance_type, BOOST_PP_SEQ_NIL, + (owner)(asset_symbol)(amount)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_vesting_balance_type, BOOST_PP_SEQ_NIL, + (owner)(asset_symbol)(amount)(begin_timestamp)(vesting_cliff_seconds)(vesting_duration_seconds)(begin_balance)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_witness_type, BOOST_PP_SEQ_NIL, (owner_name)(block_signing_key)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_committee_member_type, BOOST_PP_SEQ_NIL, (owner_name)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_worker_type, BOOST_PP_SEQ_NIL, (owner_name)(daily_pay)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority, BOOST_PP_SEQ_NIL, + (weight_threshold) + (account_auths) + (key_auths) + (address_auths)) +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy, BOOST_PP_SEQ_NIL, + (vesting_seconds) + (coin_seconds_earned) + (start_claim) + (coin_seconds_earned_last_update)) +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy, BOOST_PP_SEQ_NIL, + (begin_timestamp) + (vesting_cliff_seconds) + (vesting_duration_seconds) + (begin_balance)) +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance, BOOST_PP_SEQ_NIL, + (asset_symbol) + (amount) + (policy_type) + (policy)) +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type, BOOST_PP_SEQ_NIL, + (name) + (owner_authority) + (active_authority) + (core_balance) + (vesting_balances)) + +FC_REFLECT_DERIVED_NO_TYPENAME(graphene::chain::genesis_state_type, BOOST_PP_SEQ_NIL, + (initial_timestamp)(max_core_supply)(initial_parameters)(initial_bts_accounts)(initial_accounts)(initial_assets)(initial_balances) + (initial_vesting_balances)(initial_active_witnesses)(initial_witness_candidates) + (initial_committee_candidates)(initial_worker_candidates) + (initial_chain_id) + (immutable_parameters)) + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_account_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_asset_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_balance_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_vesting_balance_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_witness_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_committee_member_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_worker_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type::initial_bts_account_type) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::genesis_state_type) diff --git a/libraries/chain/include/graphene/chain/genesis_state.hpp b/libraries/chain/include/graphene/chain/genesis_state.hpp index ebd153b67..2d8598423 100644 --- a/libraries/chain/include/graphene/chain/genesis_state.hpp +++ b/libraries/chain/include/graphene/chain/genesis_state.hpp @@ -169,56 +169,32 @@ struct genesis_state_type { } } // namespace graphene::chain -FC_REFLECT(graphene::chain::genesis_state_type::initial_account_type, (name)(owner_key)(active_key)(is_lifetime_member)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type, - (symbol)(issuer_name)(description)(precision)(max_supply)(accumulated_fees)(is_bitasset)(collateral_records)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position, - (owner)(collateral)(debt)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_balance_type, - (owner)(asset_symbol)(amount)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_vesting_balance_type, - (owner)(asset_symbol)(amount)(begin_timestamp)(vesting_cliff_seconds)(vesting_duration_seconds)(begin_balance)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_witness_type, (owner_name)(block_signing_key)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_committee_member_type, (owner_name)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_worker_type, (owner_name)(daily_pay)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority, - (weight_threshold) - (account_auths) - (key_auths) - (address_auths)) -FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy, - (vesting_seconds) - (coin_seconds_earned) - (start_claim) - (coin_seconds_earned_last_update)) -FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy, - (begin_timestamp) - (vesting_cliff_seconds) - (vesting_duration_seconds) - (begin_balance)) -FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance, - (asset_symbol) - (amount) - (policy_type) - (policy)) -FC_REFLECT(graphene::chain::genesis_state_type::initial_bts_account_type, - (name) - (owner_authority) - (active_authority) - (core_balance) - (vesting_balances)) - -FC_REFLECT(graphene::chain::genesis_state_type, - (initial_timestamp)(max_core_supply)(initial_parameters)(initial_bts_accounts)(initial_accounts)(initial_assets)(initial_balances) - (initial_vesting_balances)(initial_active_witnesses)(initial_witness_candidates) - (initial_committee_candidates)(initial_worker_candidates) - (initial_chain_id) - (immutable_parameters)) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_account_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_balance_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_vesting_balance_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_witness_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_committee_member_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_worker_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type::initial_bts_account_type) +FC_REFLECT_TYPENAME(graphene::chain::genesis_state_type) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_account_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_asset_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_balance_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_vesting_balance_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_witness_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_committee_member_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_worker_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_authority) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_cdd_vesting_policy) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_linear_vesting_policy) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type::initial_vesting_balance) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type::initial_bts_account_type) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::genesis_state_type) From 854119233ae1b89705db7a4115de37bfd476550b Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Sun, 19 May 2019 11:38:40 +0200 Subject: [PATCH 5/7] Externalized serialization in protocol library --- libraries/app/database_api.cpp | 2 + libraries/chain/CMakeLists.txt | 1 + libraries/chain/balance_evaluator.cpp | 1 + .../include/graphene/chain/genesis_state.hpp | 1 + .../graphene/chain/protocol/account.hpp | 13 +++++- .../graphene/chain/protocol/address.hpp | 12 +++--- .../graphene/chain/protocol/assert.hpp | 3 ++ .../include/graphene/chain/protocol/asset.hpp | 4 ++ .../graphene/chain/protocol/asset_ops.hpp | 27 ++++++++++++ .../graphene/chain/protocol/authority.hpp | 3 ++ .../graphene/chain/protocol/balance.hpp | 4 ++ .../include/graphene/chain/protocol/base.hpp | 5 +++ .../graphene/chain/protocol/buyback.hpp | 2 + .../chain/protocol/chain_parameters.hpp | 4 +- .../chain/protocol/committee_member.hpp | 7 +++ .../graphene/chain/protocol/confidential.hpp | 7 +++ .../graphene/chain/protocol/custom.hpp | 3 ++ .../include/graphene/chain/protocol/ext.hpp | 1 + .../include/graphene/chain/protocol/fba.hpp | 3 ++ .../graphene/chain/protocol/fee_schedule.hpp | 2 + .../graphene/chain/protocol/market.hpp | 11 ++++- .../include/graphene/chain/protocol/memo.hpp | 3 ++ .../graphene/chain/protocol/operations.hpp | 2 + .../graphene/chain/protocol/proposal.hpp | 8 ++++ .../chain/protocol/special_authority.hpp | 2 + .../graphene/chain/protocol/transfer.hpp | 6 +++ .../include/graphene/chain/protocol/types.hpp | 2 +- .../graphene/chain/protocol/vesting.hpp | 6 +++ .../include/graphene/chain/protocol/vote.hpp | 9 ++-- .../chain/protocol/withdraw_permission.hpp | 10 +++++ .../graphene/chain/protocol/witness.hpp | 6 +++ .../graphene/chain/protocol/worker.hpp | 3 ++ .../include/graphene/chain/pts_address.hpp | 11 ++++- libraries/chain/protocol/account.cpp | 12 ++++++ libraries/chain/protocol/address.cpp | 5 ++- libraries/chain/protocol/assert.cpp | 10 ++++- libraries/chain/protocol/asset.cpp | 5 +++ libraries/chain/protocol/asset_ops.cpp | 27 ++++++++++++ libraries/chain/protocol/authority.cpp | 3 ++ libraries/chain/protocol/committee_member.cpp | 10 +++++ libraries/chain/protocol/confidential.cpp | 13 +++--- libraries/chain/protocol/custom.cpp | 3 ++ libraries/chain/protocol/fee_schedule.cpp | 4 ++ libraries/chain/protocol/market.cpp | 9 ++++ libraries/chain/protocol/memo.cpp | 3 ++ libraries/chain/protocol/operations.cpp | 3 ++ libraries/chain/protocol/proposal.cpp | 7 +++ libraries/chain/protocol/small_ops.cpp | 43 +++++++++++++++++++ libraries/chain/protocol/transaction.cpp | 1 + libraries/chain/protocol/transfer.cpp | 5 +++ libraries/chain/protocol/vote.cpp | 2 + .../chain/protocol/withdraw_permission.cpp | 9 +++- libraries/chain/protocol/witness.cpp | 6 +++ libraries/chain/protocol/worker.cpp | 4 ++ libraries/chain/pts_address.cpp | 11 ++++- libraries/chain/special_authority.cpp | 5 +++ 56 files changed, 354 insertions(+), 30 deletions(-) create mode 100644 libraries/chain/protocol/small_ops.cpp diff --git a/libraries/app/database_api.cpp b/libraries/app/database_api.cpp index b49e1b357..3987f192b 100644 --- a/libraries/app/database_api.cpp +++ b/libraries/app/database_api.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 649f641a2..07f1ea0a8 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -60,6 +60,7 @@ add_library( graphene_chain protocol/confidential.cpp protocol/vote.cpp protocol/tournament.cpp + protocol/small_ops.cpp genesis_state.cpp get_config.cpp diff --git a/libraries/chain/balance_evaluator.cpp b/libraries/chain/balance_evaluator.cpp index 8d29c01d0..817d736f2 100644 --- a/libraries/chain/balance_evaluator.cpp +++ b/libraries/chain/balance_evaluator.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/include/graphene/chain/genesis_state.hpp b/libraries/chain/include/graphene/chain/genesis_state.hpp index 2d8598423..b2f761183 100644 --- a/libraries/chain/include/graphene/chain/genesis_state.hpp +++ b/libraries/chain/include/graphene/chain/genesis_state.hpp @@ -23,6 +23,7 @@ */ #pragma once +#include #include #include #include diff --git a/libraries/chain/include/graphene/chain/protocol/account.hpp b/libraries/chain/include/graphene/chain/protocol/account.hpp index 5f4c730a1..76f7df7c1 100644 --- a/libraries/chain/include/graphene/chain/protocol/account.hpp +++ b/libraries/chain/include/graphene/chain/protocol/account.hpp @@ -317,5 +317,16 @@ FC_REFLECT( graphene::chain::account_whitelist_operation::fee_parameters_type, ( FC_REFLECT( graphene::chain::account_update_operation::fee_parameters_type, (fee)(price_per_kbyte) ) FC_REFLECT( graphene::chain::account_upgrade_operation::fee_parameters_type, (membership_annual_fee)(membership_lifetime_fee) ) FC_REFLECT( graphene::chain::account_transfer_operation::fee_parameters_type, (fee) ) - FC_REFLECT( graphene::chain::account_transfer_operation, (fee)(account_id)(new_owner)(extensions) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_whitelist_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_upgrade_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_whitelist_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_upgrade_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::account_transfer_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/address.hpp b/libraries/chain/include/graphene/chain/protocol/address.hpp index b225b42ca..8bf0fab66 100644 --- a/libraries/chain/include/graphene/chain/protocol/address.hpp +++ b/libraries/chain/include/graphene/chain/protocol/address.hpp @@ -25,14 +25,10 @@ #include #include +#include -#include #include - -namespace fc { namespace ecc { - class public_key; - typedef fc::array public_key_data; -} } // fc::ecc +#include namespace graphene { namespace chain { @@ -51,7 +47,7 @@ namespace graphene { namespace chain { class address { public: - address(); ///< constructs empty / null address + address(){} ///< constructs empty / null address explicit address( const std::string& base58str ); ///< converts to binary, validates checksum address( const fc::ecc::public_key& pub ); ///< converts to binary explicit address( const fc::ecc::public_key_data& pub ); ///< converts to binary @@ -97,3 +93,5 @@ namespace std #include FC_REFLECT( graphene::chain::address, (addr) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::address ) diff --git a/libraries/chain/include/graphene/chain/protocol/assert.hpp b/libraries/chain/include/graphene/chain/protocol/assert.hpp index c9f3b2774..ce7588623 100644 --- a/libraries/chain/include/graphene/chain/protocol/assert.hpp +++ b/libraries/chain/include/graphene/chain/protocol/assert.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -112,3 +113,5 @@ FC_REFLECT( graphene::chain::block_id_predicate, (id) ) FC_REFLECT_TYPENAME( graphene::chain::predicate ) FC_REFLECT( graphene::chain::assert_operation, (fee)(fee_paying_account)(predicates)(required_auths)(extensions) ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::assert_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::assert_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/asset.hpp b/libraries/chain/include/graphene/chain/protocol/asset.hpp index a938129ac..60bd3cd0b 100644 --- a/libraries/chain/include/graphene/chain/protocol/asset.hpp +++ b/libraries/chain/include/graphene/chain/protocol/asset.hpp @@ -218,3 +218,7 @@ FC_REFLECT( graphene::chain::price, (base)(quote) ) (core_exchange_rate) FC_REFLECT( graphene::chain::price_feed, GRAPHENE_PRICE_FEED_FIELDS ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::price ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::price_feed ) diff --git a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp index a567c5a1d..ae5dc2118 100644 --- a/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp +++ b/libraries/chain/include/graphene/chain/protocol/asset_ops.hpp @@ -764,3 +764,30 @@ FC_REFLECT( graphene::chain::asset_reserve_operation, FC_REFLECT( graphene::chain::asset_fund_fee_pool_operation, (fee)(from_account)(asset_id)(amount)(extensions) ); FC_REFLECT( graphene::chain::asset_dividend_distribution_operation, (fee)(dividend_asset_id)(account_id)(amounts)(extensions) ); + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::bitasset_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_global_settle_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_fund_fee_pool_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_dividend_distribution_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_claim_fees_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_bitasset_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_feed_producers_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_publish_feed_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_issue_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_reserve_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_global_settle_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_settle_cancel_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_fund_fee_pool_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_claim_fees_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_bitasset_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_update_feed_producers_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_publish_feed_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_issue_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::asset_reserve_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/authority.hpp b/libraries/chain/include/graphene/chain/protocol/authority.hpp index 70b674b36..d279402df 100644 --- a/libraries/chain/include/graphene/chain/protocol/authority.hpp +++ b/libraries/chain/include/graphene/chain/protocol/authority.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -134,3 +135,5 @@ void add_authority_accounts( FC_REFLECT( graphene::chain::authority, (weight_threshold)(account_auths)(key_auths)(address_auths) ) // FC_REFLECT_TYPENAME( graphene::chain::authority::classification ) FC_REFLECT_ENUM( graphene::chain::authority::classification, (owner)(active)(key) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::authority ) diff --git a/libraries/chain/include/graphene/chain/protocol/balance.hpp b/libraries/chain/include/graphene/chain/protocol/balance.hpp index f60087a71..9d0b252f3 100644 --- a/libraries/chain/include/graphene/chain/protocol/balance.hpp +++ b/libraries/chain/include/graphene/chain/protocol/balance.hpp @@ -23,6 +23,8 @@ */ #pragma once #include +#include +#include namespace graphene { namespace chain { @@ -57,3 +59,5 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::balance_claim_operation::fee_parameters_type, ) FC_REFLECT( graphene::chain::balance_claim_operation, (fee)(deposit_to_account)(balance_to_claim)(balance_owner_key)(total_claimed) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::balance_claim_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/base.hpp b/libraries/chain/include/graphene/chain/protocol/base.hpp index 52240b934..23c285d31 100644 --- a/libraries/chain/include/graphene/chain/protocol/base.hpp +++ b/libraries/chain/include/graphene/chain/protocol/base.hpp @@ -27,8 +27,13 @@ #include #include +#include + namespace graphene { namespace chain { + struct asset; + struct authority; + /** * @defgroup operations Operations * @ingroup transactions Transactions diff --git a/libraries/chain/include/graphene/chain/protocol/buyback.hpp b/libraries/chain/include/graphene/chain/protocol/buyback.hpp index 6adad52d1..4a51e8c75 100644 --- a/libraries/chain/include/graphene/chain/protocol/buyback.hpp +++ b/libraries/chain/include/graphene/chain/protocol/buyback.hpp @@ -50,3 +50,5 @@ struct buyback_account_options } } FC_REFLECT( graphene::chain::buyback_account_options, (asset_to_buy)(asset_to_buy_issuer)(markets) ); + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::buyback_account_options ) diff --git a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp index 93098c219..091da0c9f 100644 --- a/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp +++ b/libraries/chain/include/graphene/chain/protocol/chain_parameters.hpp @@ -28,6 +28,7 @@ #include #include <../hardfork.d/GPOS.hf> +#include namespace graphene { namespace chain { struct fee_schedule; } } @@ -147,7 +148,6 @@ FC_REFLECT( graphene::chain::parameter_extension, (min_bet_multiplier) (max_bet_multiplier) (betting_rake_fee_percentage) - (permitted_betting_odds_increments) (live_betting_delay_time) (sweeps_distribution_percentage) (sweeps_distribution_asset) @@ -203,3 +203,5 @@ FC_REFLECT( graphene::chain::chain_parameters, (maximum_tournament_number_of_wins) (extensions) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::chain_parameters ) diff --git a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp index 771883672..8aaed7487 100644 --- a/libraries/chain/include/graphene/chain/protocol/committee_member.hpp +++ b/libraries/chain/include/graphene/chain/protocol/committee_member.hpp @@ -104,3 +104,10 @@ FC_REFLECT( graphene::chain::committee_member_create_operation, FC_REFLECT( graphene::chain::committee_member_update_operation, (fee)(committee_member)(committee_member_account)(new_url) ) FC_REFLECT( graphene::chain::committee_member_update_global_parameters_operation, (fee)(new_parameters) ); + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_global_parameters_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::committee_member_update_global_parameters_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/confidential.hpp b/libraries/chain/include/graphene/chain/protocol/confidential.hpp index 763006ae6..697ef35b6 100644 --- a/libraries/chain/include/graphene/chain/protocol/confidential.hpp +++ b/libraries/chain/include/graphene/chain/protocol/confidential.hpp @@ -281,3 +281,10 @@ FC_REFLECT( graphene::chain::blind_transfer_operation, FC_REFLECT( graphene::chain::transfer_to_blind_operation::fee_parameters_type, (fee)(price_per_output) ) FC_REFLECT( graphene::chain::transfer_from_blind_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::blind_transfer_operation::fee_parameters_type, (fee)(price_per_output) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_to_blind_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_from_blind_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::blind_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_to_blind_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_from_blind_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::blind_transfer_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/custom.hpp b/libraries/chain/include/graphene/chain/protocol/custom.hpp index e5701a4b2..5596aaad1 100644 --- a/libraries/chain/include/graphene/chain/protocol/custom.hpp +++ b/libraries/chain/include/graphene/chain/protocol/custom.hpp @@ -56,3 +56,6 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::custom_operation::fee_parameters_type, (fee)(price_per_kbyte) ) FC_REFLECT( graphene::chain::custom_operation, (fee)(payer)(required_auths)(id)(data) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::custom_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::custom_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/ext.hpp b/libraries/chain/include/graphene/chain/protocol/ext.hpp index 31f665060..6c9746305 100644 --- a/libraries/chain/include/graphene/chain/protocol/ext.hpp +++ b/libraries/chain/include/graphene/chain/protocol/ext.hpp @@ -24,6 +24,7 @@ #pragma once #include +#include #include namespace graphene { namespace chain { diff --git a/libraries/chain/include/graphene/chain/protocol/fba.hpp b/libraries/chain/include/graphene/chain/protocol/fba.hpp index 7460ca8df..dc672436f 100644 --- a/libraries/chain/include/graphene/chain/protocol/fba.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fba.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -45,3 +46,5 @@ struct fba_distribute_operation : public base_operation FC_REFLECT( graphene::chain::fba_distribute_operation::fee_parameters_type, ) FC_REFLECT( graphene::chain::fba_distribute_operation, (fee)(account_id)(fba_id)(amount) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fba_distribute_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp index e250ab173..5afa1b217 100644 --- a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp @@ -85,3 +85,5 @@ namespace graphene { namespace chain { FC_REFLECT_TYPENAME( graphene::chain::fee_parameters ) FC_REFLECT( graphene::chain::fee_schedule, (parameters)(scale) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fee_schedule ) diff --git a/libraries/chain/include/graphene/chain/protocol/market.hpp b/libraries/chain/include/graphene/chain/protocol/market.hpp index 56352c604..2bff8c560 100644 --- a/libraries/chain/include/graphene/chain/protocol/market.hpp +++ b/libraries/chain/include/graphene/chain/protocol/market.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -165,9 +166,15 @@ FC_REFLECT( graphene::chain::limit_order_cancel_operation::fee_parameters_type, FC_REFLECT( graphene::chain::call_order_update_operation::fee_parameters_type, (fee) ) /// THIS IS THE ONLY VIRTUAL OPERATION THUS FAR... FC_REFLECT( graphene::chain::fill_order_operation::fee_parameters_type, ) - - FC_REFLECT( graphene::chain::limit_order_create_operation,(fee)(seller)(amount_to_sell)(min_to_receive)(expiration)(fill_or_kill)(extensions)) FC_REFLECT( graphene::chain::limit_order_cancel_operation,(fee)(fee_paying_account)(order)(extensions) ) FC_REFLECT( graphene::chain::call_order_update_operation, (fee)(funding_account)(delta_collateral)(delta_debt)(extensions) ) FC_REFLECT( graphene::chain::fill_order_operation, (fee)(order_id)(account_id)(pays)(receives) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_cancel_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::limit_order_cancel_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::call_order_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::fill_order_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/memo.hpp b/libraries/chain/include/graphene/chain/protocol/memo.hpp index b126d3a7d..6c5b69fba 100644 --- a/libraries/chain/include/graphene/chain/protocol/memo.hpp +++ b/libraries/chain/include/graphene/chain/protocol/memo.hpp @@ -89,3 +89,6 @@ namespace graphene { namespace chain { FC_REFLECT( graphene::chain::memo_message, (checksum)(text) ) FC_REFLECT( graphene::chain::memo_data, (from)(to)(nonce)(message) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::memo_message ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::memo_data ) diff --git a/libraries/chain/include/graphene/chain/protocol/operations.hpp b/libraries/chain/include/graphene/chain/protocol/operations.hpp index bce0e201e..cb9a83a11 100644 --- a/libraries/chain/include/graphene/chain/protocol/operations.hpp +++ b/libraries/chain/include/graphene/chain/protocol/operations.hpp @@ -167,3 +167,5 @@ namespace graphene { namespace chain { FC_REFLECT_TYPENAME( graphene::chain::operation ) FC_REFLECT( graphene::chain::op_wrapper, (op) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::op_wrapper ) diff --git a/libraries/chain/include/graphene/chain/protocol/proposal.hpp b/libraries/chain/include/graphene/chain/protocol/proposal.hpp index 3383b6cfd..141ec35fe 100644 --- a/libraries/chain/include/graphene/chain/protocol/proposal.hpp +++ b/libraries/chain/include/graphene/chain/protocol/proposal.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { /** @@ -179,3 +180,10 @@ FC_REFLECT( graphene::chain::proposal_update_operation, (fee)(fee_paying_account (active_approvals_to_add)(active_approvals_to_remove)(owner_approvals_to_add)(owner_approvals_to_remove) (key_approvals_to_add)(key_approvals_to_remove)(extensions) ) FC_REFLECT( graphene::chain::proposal_delete_operation, (fee)(fee_paying_account)(using_owner_authority)(proposal)(extensions) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_delete_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::proposal_delete_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/special_authority.hpp b/libraries/chain/include/graphene/chain/protocol/special_authority.hpp index 3ee6f15fd..05a80719c 100644 --- a/libraries/chain/include/graphene/chain/protocol/special_authority.hpp +++ b/libraries/chain/include/graphene/chain/protocol/special_authority.hpp @@ -48,3 +48,5 @@ void validate_special_authority( const special_authority& auth ); FC_REFLECT( graphene::chain::no_special_authority, ) FC_REFLECT( graphene::chain::top_holders_special_authority, (asset)(num_top_holders) ) FC_REFLECT_TYPENAME( graphene::chain::special_authority ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::top_holders_special_authority ) diff --git a/libraries/chain/include/graphene/chain/protocol/transfer.hpp b/libraries/chain/include/graphene/chain/protocol/transfer.hpp index f4417bb74..5366a7abf 100644 --- a/libraries/chain/include/graphene/chain/protocol/transfer.hpp +++ b/libraries/chain/include/graphene/chain/protocol/transfer.hpp @@ -24,6 +24,7 @@ #pragma once #include #include +#include namespace graphene { namespace chain { @@ -105,3 +106,8 @@ FC_REFLECT( graphene::chain::override_transfer_operation::fee_parameters_type, ( FC_REFLECT( graphene::chain::override_transfer_operation, (fee)(issuer)(from)(to)(amount)(memo)(extensions) ) FC_REFLECT( graphene::chain::transfer_operation, (fee)(from)(to)(amount)(memo)(extensions) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::override_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::transfer_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::override_transfer_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/types.hpp b/libraries/chain/include/graphene/chain/protocol/types.hpp index 8cd38ea58..8ea3a8aff 100644 --- a/libraries/chain/include/graphene/chain/protocol/types.hpp +++ b/libraries/chain/include/graphene/chain/protocol/types.hpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -43,7 +44,6 @@ #include #include #include -#include #include #include diff --git a/libraries/chain/include/graphene/chain/protocol/vesting.hpp b/libraries/chain/include/graphene/chain/protocol/vesting.hpp index 2a861b2ae..1d83b90fa 100644 --- a/libraries/chain/include/graphene/chain/protocol/vesting.hpp +++ b/libraries/chain/include/graphene/chain/protocol/vesting.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -133,3 +134,8 @@ FC_REFLECT(graphene::chain::cdd_vesting_policy_initializer, (start_claim)(vestin FC_REFLECT_TYPENAME( graphene::chain::vesting_policy_initializer ) FC_REFLECT_ENUM( graphene::chain::vesting_balance_type, (normal)(gpos) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_withdraw_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vesting_balance_withdraw_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/vote.hpp b/libraries/chain/include/graphene/chain/protocol/vote.hpp index 67536f7a3..7d733e45d 100644 --- a/libraries/chain/include/graphene/chain/protocol/vote.hpp +++ b/libraries/chain/include/graphene/chain/protocol/vote.hpp @@ -24,12 +24,7 @@ #pragma once -#include -#include -#include - -#include -#include +#include namespace graphene { namespace chain { @@ -150,3 +145,5 @@ FC_REFLECT_TYPENAME( fc::flat_set ) FC_REFLECT_ENUM( graphene::chain::vote_id_type::vote_type, (witness)(committee)(worker)(VOTE_TYPE_COUNT) ) FC_REFLECT( graphene::chain::vote_id_type, (content) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::vote_id_type ) diff --git a/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp b/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp index 7bc905acc..7963e99f9 100644 --- a/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp +++ b/libraries/chain/include/graphene/chain/protocol/withdraw_permission.hpp @@ -24,6 +24,7 @@ #pragma once #include #include +#include namespace graphene { namespace chain { @@ -179,3 +180,12 @@ FC_REFLECT( graphene::chain::withdraw_permission_update_operation, (fee)(withdra FC_REFLECT( graphene::chain::withdraw_permission_claim_operation, (fee)(withdraw_permission)(withdraw_from_account)(withdraw_to_account)(amount_to_withdraw)(memo) ); FC_REFLECT( graphene::chain::withdraw_permission_delete_operation, (fee)(withdraw_from_account)(authorized_account) (withdrawal_permission) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_claim_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_delete_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_claim_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::withdraw_permission_delete_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/witness.hpp b/libraries/chain/include/graphene/chain/protocol/witness.hpp index b096e826f..2b5e88b04 100644 --- a/libraries/chain/include/graphene/chain/protocol/witness.hpp +++ b/libraries/chain/include/graphene/chain/protocol/witness.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -84,3 +85,8 @@ FC_REFLECT( graphene::chain::witness_create_operation, (fee)(witness_account)(ur FC_REFLECT( graphene::chain::witness_update_operation::fee_parameters_type, (fee) ) FC_REFLECT( graphene::chain::witness_update_operation, (fee)(witness)(witness_account)(new_url)(new_signing_key)(new_initial_secret) ) + +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::witness_update_operation ) diff --git a/libraries/chain/include/graphene/chain/protocol/worker.hpp b/libraries/chain/include/graphene/chain/protocol/worker.hpp index 9e6eef359..11e0aa051 100644 --- a/libraries/chain/include/graphene/chain/protocol/worker.hpp +++ b/libraries/chain/include/graphene/chain/protocol/worker.hpp @@ -23,6 +23,7 @@ */ #pragma once #include +#include namespace graphene { namespace chain { @@ -104,3 +105,5 @@ FC_REFLECT( graphene::chain::worker_create_operation::fee_parameters_type, (fee) FC_REFLECT( graphene::chain::worker_create_operation, (fee)(owner)(work_begin_date)(work_end_date)(daily_pay)(name)(url)(initializer) ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( extern, graphene::chain::worker_create_operation ) diff --git a/libraries/chain/include/graphene/chain/pts_address.hpp b/libraries/chain/include/graphene/chain/pts_address.hpp index 636e2f114..c0bc80ff7 100644 --- a/libraries/chain/include/graphene/chain/pts_address.hpp +++ b/libraries/chain/include/graphene/chain/pts_address.hpp @@ -24,6 +24,8 @@ #pragma once #include +#include +#include #include namespace fc { namespace ecc { class public_key; } } @@ -75,4 +77,11 @@ namespace fc { void to_variant( const graphene::chain::pts_address& var, fc::variant& vo, uint32_t max_depth = 1 ); void from_variant( const fc::variant& var, graphene::chain::pts_address& vo, uint32_t max_depth = 1 ); -} +namespace raw { + extern template void pack( datastream& s, const graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); + extern template void pack( datastream& s, const graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); + extern template void unpack( datastream& s, graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); +} } // fc::raw diff --git a/libraries/chain/protocol/account.cpp b/libraries/chain/protocol/account.cpp index 66dcdb90c..e77552a40 100644 --- a/libraries/chain/protocol/account.cpp +++ b/libraries/chain/protocol/account.cpp @@ -322,3 +322,15 @@ void account_transfer_operation::validate()const } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_whitelist_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_upgrade_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_whitelist_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_upgrade_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::account_transfer_operation ) diff --git a/libraries/chain/protocol/address.cpp b/libraries/chain/protocol/address.cpp index 19bb4df56..f0edbd490 100644 --- a/libraries/chain/protocol/address.cpp +++ b/libraries/chain/protocol/address.cpp @@ -27,9 +27,10 @@ #include #include +#include + namespace graphene { namespace chain { - address::address(){} address::address( const std::string& base58str ) { @@ -110,3 +111,5 @@ namespace fc vo = graphene::chain::address( var.as_string() ); } } + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::address ) diff --git a/libraries/chain/protocol/assert.cpp b/libraries/chain/protocol/assert.cpp index 60f26e3f0..5ce61e45d 100644 --- a/libraries/chain/protocol/assert.cpp +++ b/libraries/chain/protocol/assert.cpp @@ -21,7 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include +#include +#include +#include + +#include namespace graphene { namespace chain { @@ -62,5 +66,7 @@ share_type assert_operation::calculate_fee(const fee_parameters_type& k)const return k.fee * predicates.size(); } - } } // namespace graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::assert_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::assert_operation ) diff --git a/libraries/chain/protocol/asset.cpp b/libraries/chain/protocol/asset.cpp index c47d88e30..525e193b2 100644 --- a/libraries/chain/protocol/asset.cpp +++ b/libraries/chain/protocol/asset.cpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace graphene { namespace chain { typedef boost::multiprecision::uint128_t uint128_t; @@ -206,3 +207,7 @@ const int64_t scaled_precision_lut[19] = }; } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::price ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::price_feed ) diff --git a/libraries/chain/protocol/asset_ops.cpp b/libraries/chain/protocol/asset_ops.cpp index 9c5518828..5dfd09ee8 100644 --- a/libraries/chain/protocol/asset_ops.cpp +++ b/libraries/chain/protocol/asset_ops.cpp @@ -290,3 +290,30 @@ void lottery_asset_options::validate() const } } } // namespace graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::bitasset_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_global_settle_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_fund_fee_pool_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_claim_fees_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_bitasset_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_feed_producers_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_publish_feed_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_issue_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_reserve_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_global_settle_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_settle_cancel_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_fund_fee_pool_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_claim_fees_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_dividend_distribution_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_bitasset_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_update_feed_producers_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_publish_feed_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_issue_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::asset_reserve_operation ) diff --git a/libraries/chain/protocol/authority.cpp b/libraries/chain/protocol/authority.cpp index 97470d332..6cfed2ecb 100644 --- a/libraries/chain/protocol/authority.cpp +++ b/libraries/chain/protocol/authority.cpp @@ -23,6 +23,7 @@ */ #include +#include namespace graphene { namespace chain { @@ -36,3 +37,5 @@ void add_authority_accounts( } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::authority ) diff --git a/libraries/chain/protocol/committee_member.cpp b/libraries/chain/protocol/committee_member.cpp index 4c8c5d259..e468936cf 100644 --- a/libraries/chain/protocol/committee_member.cpp +++ b/libraries/chain/protocol/committee_member.cpp @@ -22,6 +22,9 @@ * THE SOFTWARE. */ #include +#include + +#include namespace graphene { namespace chain { @@ -45,3 +48,10 @@ void committee_member_update_global_parameters_operation::validate() const } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_global_parameters_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::committee_member_update_global_parameters_operation ) diff --git a/libraries/chain/protocol/confidential.cpp b/libraries/chain/protocol/confidential.cpp index 603befa12..2e8fbc68b 100644 --- a/libraries/chain/protocol/confidential.cpp +++ b/libraries/chain/protocol/confidential.cpp @@ -27,7 +27,6 @@ #include #include -#include namespace graphene { namespace chain { @@ -141,9 +140,6 @@ share_type blind_transfer_operation::calculate_fee( const fee_parameters_type& k return k.fee + outputs.size() * k.price_per_output; } - - - /** * Packs *this then encodes as base58 encoded string. */ @@ -159,6 +155,11 @@ stealth_confirmation::stealth_confirmation( const std::string& base58 ) *this = fc::raw::unpack( fc::from_base58( base58 ) ); } - - } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_to_blind_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_from_blind_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blind_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_to_blind_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_from_blind_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::blind_transfer_operation ) diff --git a/libraries/chain/protocol/custom.cpp b/libraries/chain/protocol/custom.cpp index be03419fb..72f8dd44a 100644 --- a/libraries/chain/protocol/custom.cpp +++ b/libraries/chain/protocol/custom.cpp @@ -37,3 +37,6 @@ share_type custom_operation::calculate_fee(const fee_parameters_type& k)const } } } + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::custom_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::custom_operation ) diff --git a/libraries/chain/protocol/fee_schedule.cpp b/libraries/chain/protocol/fee_schedule.cpp index 138d801ec..6d494e37d 100644 --- a/libraries/chain/protocol/fee_schedule.cpp +++ b/libraries/chain/protocol/fee_schedule.cpp @@ -35,6 +35,8 @@ namespace fc //template const graphene::chain::fee_schedule& smart_ref::operator*() const; } +#include + #define MAX_FEE_STABILIZATION_ITERATION 4 namespace graphene { namespace chain { @@ -208,3 +210,5 @@ namespace graphene { namespace chain { } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fee_schedule ) diff --git a/libraries/chain/protocol/market.cpp b/libraries/chain/protocol/market.cpp index 923f4763f..ae0a3a68b 100644 --- a/libraries/chain/protocol/market.cpp +++ b/libraries/chain/protocol/market.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { @@ -46,3 +47,11 @@ void call_order_update_operation::validate()const } FC_CAPTURE_AND_RETHROW((*this)) } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_cancel_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::limit_order_cancel_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::call_order_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fill_order_operation ) diff --git a/libraries/chain/protocol/memo.cpp b/libraries/chain/protocol/memo.cpp index 8ced0e1ba..afa0b486a 100644 --- a/libraries/chain/protocol/memo.cpp +++ b/libraries/chain/protocol/memo.cpp @@ -89,3 +89,6 @@ memo_message memo_message::deserialize(const string& serial) } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_message ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::memo_data ) diff --git a/libraries/chain/protocol/operations.cpp b/libraries/chain/protocol/operations.cpp index 57831b8f7..fb766b3db 100644 --- a/libraries/chain/protocol/operations.cpp +++ b/libraries/chain/protocol/operations.cpp @@ -23,6 +23,7 @@ */ #include #include +#include namespace graphene { namespace chain { @@ -86,3 +87,5 @@ void operation_get_required_authorities( const operation& op, } } } // namespace graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::op_wrapper ) diff --git a/libraries/chain/protocol/proposal.cpp b/libraries/chain/protocol/proposal.cpp index bca0c4164..c77e71e4b 100644 --- a/libraries/chain/protocol/proposal.cpp +++ b/libraries/chain/protocol/proposal.cpp @@ -107,3 +107,10 @@ void proposal_update_operation::get_required_owner_authorities( flat_set +#include +#include +#include +#include +#include + +#include + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::balance_claim_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::buyback_account_options ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::fba_distribute_operation ) + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_withdraw_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vesting_balance_withdraw_operation ) + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::chain_parameters ) diff --git a/libraries/chain/protocol/transaction.cpp b/libraries/chain/protocol/transaction.cpp index e9e60d50e..093e7833c 100644 --- a/libraries/chain/protocol/transaction.cpp +++ b/libraries/chain/protocol/transaction.cpp @@ -27,6 +27,7 @@ #include #include #include +#include namespace graphene { namespace chain { diff --git a/libraries/chain/protocol/transfer.cpp b/libraries/chain/protocol/transfer.cpp index 3ec78237c..0fb0aefa1 100644 --- a/libraries/chain/protocol/transfer.cpp +++ b/libraries/chain/protocol/transfer.cpp @@ -63,3 +63,8 @@ void override_transfer_operation::validate()const } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::override_transfer_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::transfer_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::override_transfer_operation ) diff --git a/libraries/chain/protocol/vote.cpp b/libraries/chain/protocol/vote.cpp index f78f2b4f1..68f476f55 100644 --- a/libraries/chain/protocol/vote.cpp +++ b/libraries/chain/protocol/vote.cpp @@ -49,3 +49,5 @@ void from_variant( const variant& var, graphene::chain::vote_id_type& vo, uint32 } } // fc + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::vote_id_type ) diff --git a/libraries/chain/protocol/withdraw_permission.cpp b/libraries/chain/protocol/withdraw_permission.cpp index ec7b36f8d..b36c378df 100644 --- a/libraries/chain/protocol/withdraw_permission.cpp +++ b/libraries/chain/protocol/withdraw_permission.cpp @@ -67,6 +67,13 @@ void withdraw_permission_delete_operation::validate() const FC_ASSERT( withdraw_from_account != authorized_account ); } - } } // graphene::chain +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_claim_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_delete_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_update_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_claim_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::withdraw_permission_delete_operation ) diff --git a/libraries/chain/protocol/witness.cpp b/libraries/chain/protocol/witness.cpp index 82fa462af..90583cd84 100644 --- a/libraries/chain/protocol/witness.cpp +++ b/libraries/chain/protocol/witness.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { @@ -39,3 +40,8 @@ void witness_update_operation::validate() const } } } // graphene::chain + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_update_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_create_operation ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::witness_update_operation ) diff --git a/libraries/chain/protocol/worker.cpp b/libraries/chain/protocol/worker.cpp index eb133da07..932148ec1 100644 --- a/libraries/chain/protocol/worker.cpp +++ b/libraries/chain/protocol/worker.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #include +#include namespace graphene { namespace chain { @@ -36,3 +37,6 @@ void worker_create_operation::validate() const } } } + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_create_operation::fee_parameters_type ) +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::worker_create_operation ) diff --git a/libraries/chain/pts_address.cpp b/libraries/chain/pts_address.cpp index 27f3d256c..c6d74f58b 100644 --- a/libraries/chain/pts_address.cpp +++ b/libraries/chain/pts_address.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include namespace graphene { namespace chain { @@ -97,4 +98,12 @@ namespace fc { vo = graphene::chain::pts_address( var.as_string() ); } -} + +namespace raw { + template void pack( datastream& s, const graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); + template void pack( datastream& s, const graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); + template void unpack( datastream& s, graphene::chain::pts_address& tx, + uint32_t _max_depth=FC_PACK_MAX_DEPTH ); +} } // fc::raw diff --git a/libraries/chain/special_authority.cpp b/libraries/chain/special_authority.cpp index ca974f308..74889f806 100644 --- a/libraries/chain/special_authority.cpp +++ b/libraries/chain/special_authority.cpp @@ -25,6 +25,8 @@ #include #include +#include + namespace graphene { namespace chain { struct special_authority_validate_visitor @@ -68,3 +70,6 @@ void evaluate_special_authority( const database& db, const special_authority& a } } } // graphene::chain + + +GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::top_holders_special_authority ) From 25458c294da1650cea979cc9b5cd3174b061f81d Mon Sep 17 00:00:00 2001 From: Peter Conrad Date: Tue, 4 Jun 2019 13:36:21 +0200 Subject: [PATCH 6/7] Undo superfluous change --- libraries/wallet/include/graphene/wallet/wallet.hpp | 6 +++--- libraries/wallet/wallet.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/wallet/include/graphene/wallet/wallet.hpp b/libraries/wallet/include/graphene/wallet/wallet.hpp index c456f7e14..7c1960eee 100644 --- a/libraries/wallet/include/graphene/wallet/wallet.hpp +++ b/libraries/wallet/include/graphene/wallet/wallet.hpp @@ -229,13 +229,12 @@ struct worker_vote_delta flat_set vote_abstain; }; -struct signed_block_with_info +struct signed_block_with_info : public signed_block { signed_block_with_info(); signed_block_with_info( const signed_block& block ); signed_block_with_info( const signed_block_with_info& block ) = default; - signed_block block; block_id_type block_id; public_key_type signing_key; vector< transaction_id_type > transaction_ids; @@ -1979,7 +1978,8 @@ FC_REFLECT( graphene::wallet::worker_vote_delta, (vote_abstain) ) -FC_REFLECT( graphene::wallet::signed_block_with_info, (block_id)(signing_key)(transaction_ids) ) +FC_REFLECT_DERIVED( graphene::wallet::signed_block_with_info, (graphene::chain::signed_block), + (block_id)(signing_key)(transaction_ids) ) FC_REFLECT_DERIVED( graphene::wallet::vesting_balance_object_with_info, (graphene::chain::vesting_balance_object), (allowed_withdraw)(allowed_withdraw_time) ) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 2bbb9d9bc..bdb756c23 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -6191,13 +6191,13 @@ std::vector wallet_api::get_all_matched_bets_for_bettor(acco } // default ctor necessary for FC_REFLECT -signed_block_with_info::signed_block_with_info( const signed_block& _block ) - : block( _block ) +signed_block_with_info::signed_block_with_info( const signed_block& block ) + : signed_block( block ) { - block_id = _block.id(); - signing_key = _block.signee(); - transaction_ids.reserve( _block.transactions.size() ); - for( const processed_transaction& tx : _block.transactions ) + block_id = id(); + signing_key = signee(); + transaction_ids.reserve( transactions.size() ); + for( const processed_transaction& tx : transactions ) transaction_ids.push_back( tx.id() ); } From 40c2fd8783e4d6bb02da8636111f89151e420ebb Mon Sep 17 00:00:00 2001 From: gladcow Date: Mon, 2 Dec 2019 17:41:13 +0300 Subject: [PATCH 7/7] fix compilation issues --- .../graphene/chain/protocol/fee_schedule.hpp | 1 + libraries/chain/protocol/committee_member.cpp | 3 ++- libraries/chain/protocol/operations.cpp | 1 + libraries/chain/protocol/small_ops.cpp | 1 + libraries/chain/small_objects.cpp | 1 + programs/build_helpers/cat-parts | Bin 474216 -> 0 bytes 6 files changed, 6 insertions(+), 1 deletion(-) delete mode 100755 programs/build_helpers/cat-parts diff --git a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp index 5afa1b217..9baaffc7f 100644 --- a/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp +++ b/libraries/chain/include/graphene/chain/protocol/fee_schedule.hpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ #pragma once +#include #include namespace graphene { namespace chain { diff --git a/libraries/chain/protocol/committee_member.cpp b/libraries/chain/protocol/committee_member.cpp index e468936cf..1824870a9 100644 --- a/libraries/chain/protocol/committee_member.cpp +++ b/libraries/chain/protocol/committee_member.cpp @@ -21,8 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -#include +#include #include +#include #include diff --git a/libraries/chain/protocol/operations.cpp b/libraries/chain/protocol/operations.cpp index fb766b3db..7db51078c 100644 --- a/libraries/chain/protocol/operations.cpp +++ b/libraries/chain/protocol/operations.cpp @@ -21,6 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ +#include #include #include #include diff --git a/libraries/chain/protocol/small_ops.cpp b/libraries/chain/protocol/small_ops.cpp index cba4b1b73..8ab7cf436 100644 --- a/libraries/chain/protocol/small_ops.cpp +++ b/libraries/chain/protocol/small_ops.cpp @@ -22,6 +22,7 @@ * THE SOFTWARE. */ +#include #include #include #include diff --git a/libraries/chain/small_objects.cpp b/libraries/chain/small_objects.cpp index 6b8af3d94..a74fa116e 100644 --- a/libraries/chain/small_objects.cpp +++ b/libraries/chain/small_objects.cpp @@ -44,6 +44,7 @@ #include #include +#include GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::balance_object ) GRAPHENE_EXTERNAL_SERIALIZATION( /*not extern*/, graphene::chain::block_summary_object ) diff --git a/programs/build_helpers/cat-parts b/programs/build_helpers/cat-parts deleted file mode 100755 index 2bcd1c8ae6bb1d90d70ed00c6a53e973d2ae70c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 474216 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%0Do{xO~4&*YOzYxDH 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