diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake index 161a5b8fa690764c43d26f5e2f027b1c8119834c..df005742c04124f02e6a8ecb47b3b9218d828b79 100644 --- a/cmake/OS_Detection.cmake +++ b/cmake/OS_Detection.cmake @@ -79,19 +79,19 @@ if(UNIX) if (LINUX) if(DAP_DEBUG) - set(_CCOPT "-DDAP_DEBUG -Wall -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing") + set(_CCOPT "-DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -pg -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing") set(_LOPT "-pg") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg") else() - set(_CCOPT "-Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11") + set(_CCOPT "-Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -Wl,--gc-sections -Wl,--strip-all -std=gnu11") endif() elseif (DARWIN) if(DAP_DEBUG) - set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing -std=c11") + set(_CCOPT "-L/usr/local/lib -I/usr/local/include -DDAP_DEBUG -Wall -Wno-address-of-packed-member -Wno-unused-command-line-argument -Wno-deprecated-declarations -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -g3 -ggdb -fno-eliminate-unused-debug-symbols -fno-strict-aliasing -std=c11") set(_LOPT "-L/usr/local/lib ") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}") else() - set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=c11") + set(_CCOPT "-L /usr/local/lib -I/usr/local/include -Wno-address-of-packed-member -Wno-deprecated-declarations -Wno-unused-command-line-argument -Wno-unused-local-typedefs -Wno-unused-function -Wno-implicit-fallthrough -Wno-unused-variable -Wno-unused-parameter -O3 -fPIC -fno-strict-aliasing -fno-ident -ffast-math -ftree-vectorize -fno-asynchronous-unwind-tables -ffunction-sections -std=c11") set(_LOPT "-L /usr/local/lib") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/local/lib") endif() diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h index 606a7e684a961314162471efe4145f4b9358d156..1423f6f39dd291f4424761724c8859ab8b6f3e3a 100755 --- a/dap-sdk/core/include/dap_math_ops.h +++ b/dap-sdk/core/include/dap_math_ops.h @@ -8,66 +8,108 @@ typedef __int128 int128_t; typedef __uint128 uint128_t; #else -typedef struct uint128 { - uint64_t hi; - uint64_t lo; -} uint128_t; +typedef union uint128 { + struct { + uint64_t hi; + uint64_t lo; + } DAP_ALIGN_PACKED; + uint64_t u64[2]; + uint32_t u32[4]; +} DAP_ALIGN_PACKED uint128_t; #endif typedef struct unsign256 { uint128_t hi; uint128_t lo; -} unsign256_t; - -const uint128_t two_power_64={ .hi = 1, .lo = 0}; - -const uint64_t lo_32=0xffffffff; -const uint64_t hi_32=0xffffffff00000000; -const uint64_t ones_64=0xffffffffffffffff; - - -static inline int SUM_64_64(uint64_t a_64_bit,uint64_t b_64_bit,uint64_t* c_64_bit ) { - -int overflow_flag; -*c_64_bit=a_64_bit+b_64_bit; -overflow_flag=(*c_64_bit<a_64_bit); -return overflow_flag;} +} DAP_ALIGN_PACKED uint256_t; + +static const uint128_t two_power_64={ .hi = 1, .lo = 0}; + +static const uint64_t lo_32=0xffffffff; +static const uint64_t hi_32=0xffffffff00000000; +static const uint64_t ones_64=0xffffffffffffffff; + +/** + * @brief SUM_64_64 + * @param a_arg1 + * @param a_arg2 + * @param a_result + * @return + */ +static inline int SUM_64_64(uint64_t a_arg1,uint64_t a_arg2,uint64_t* a_result ) +{ + int overflow_flag; + *a_result=a_arg1+a_arg2; + overflow_flag=(*a_result<a_arg1); + return overflow_flag; +} -//!!!!This function returns void because THERE CANNOT BE OVERFLOW IN A (64,64)->128 SUM!!!! -static inline void SUM_64_128(uint64_t a_64_bit,uint64_t b_64_bit,uint128_t* c_128_bit ) { -int overflow_flag; -c_128_bit->lo=a_64_bit+b_64_bit; -c_128_bit->hi=(c_128_bit->lo<a_64_bit);} +/** + * @brief SUM_64_128 + * @details !!! This function returns void because THERE CANNOT BE OVERFLOW IN A (64,64)->128 SUM!!!! + * @param a_arg1 + * @param a_arg2 + * @param a_result + */ +static inline void SUM_64_128(uint64_t a_arg1,uint64_t a_arg2,uint128_t* a_result ) +{ + int overflow_flag; + a_result->lo=a_arg1+a_arg2; + a_result->hi=(a_result->lo<a_arg1); +} -//Mixed precision: add a uint64_t into a unsign128_t -static inline int ADD_64_INTO_128(uint64_t a_64_bit,uint128_t* c_128_bit ) { +/** + * @brief ADD_64_INTO_128 + * @details Mixed precision: add a uint64_t into a unsign128_t + * @param a_arg + * @param a_proc_value + * @return + */ +static inline int ADD_64_INTO_128(uint64_t a_arg,uint128_t* a_proc_value ) +{ int overflow_flag; uint64_t overflow_64; uint64_t temp; - temp=c_128_bit->lo; - overflow_flag=SUM_64_64(a_64_bit,temp,&c_128_bit->lo); + temp=a_proc_value->lo; + overflow_flag=SUM_64_64(a_arg,temp,&a_proc_value->lo); overflow_64=overflow_flag; - temp=c_128_bit->hi; - overflow_flag=SUM_64_64(overflow_64,temp,&c_128_bit->hi); - return overflow_flag;} + temp=a_proc_value->hi; + overflow_flag=SUM_64_64(overflow_64,temp,&a_proc_value->hi); + return overflow_flag; +} -static inline int SUM_128_128(uint128_t a_128_bit,uint128_t b_128_bit,uint128_t* c_128_bit){ +/** + * @brief SUM_128_128 + * @param a_arg1 + * @param a_arg2 + * @param a_result + * @return + */ +static inline int SUM_128_128(uint128_t a_arg1,uint128_t a_arg2,uint128_t* a_result) +{ int overflow_flag; - overflow_flag=SUM_64_64(a_128_bit.lo,b_128_bit.lo,&c_128_bit->lo); + overflow_flag=SUM_64_64(a_arg1.lo,a_arg2.lo,&a_result->lo); uint64_t carry_in_64=overflow_flag; uint64_t intermediate_value=0; overflow_flag=0; - overflow_flag=SUM_64_64(a_128_bit.hi,b_128_bit.hi,&intermediate_value); + overflow_flag=SUM_64_64(a_arg1.hi,a_arg2.hi,&intermediate_value); carry_in_64=overflow_flag; overflow_flag=0; - overflow_flag=SUM_64_64(carry_in_64,intermediate_value,&c_128_bit->hi); + overflow_flag=SUM_64_64(carry_in_64,intermediate_value,&a_result->hi); return overflow_flag; } - -static inline int SUM_256_256(unsign256_t a_256_bit,unsign256_t b_256_bit,unsign256_t* c_256_bit){ +/** + * @brief SUM_256_256 + * @param a_arg1 + * @param a_arg2 + * @param a_result + * @return + */ +static inline int SUM_256_256(uint256_t a_arg1,uint256_t a_arg2,uint256_t* a_result) +{ int overflow_flag; - overflow_flag=SUM_128_128(a_256_bit.lo,b_256_bit.lo,&c_256_bit->lo); + overflow_flag=SUM_128_128(a_arg1.lo,a_arg2.lo,&a_result->lo); uint128_t carry_in_128; carry_in_128.hi=0; carry_in_128.lo=overflow_flag; @@ -75,32 +117,86 @@ static inline int SUM_256_256(unsign256_t a_256_bit,unsign256_t b_256_bit,unsig intermediate_value.hi=0; intermediate_value.lo=0; overflow_flag=0; - overflow_flag=SUM_128_128(carry_in_128,a_256_bit.hi,&intermediate_value); + overflow_flag=SUM_128_128(carry_in_128,a_arg1.hi,&intermediate_value); //we store overflow_flag in case there is already overflow int overflow_flag_bis=0; - overflow_flag_bis=SUM_128_128(intermediate_value,b_256_bit.hi,&c_256_bit->hi); + overflow_flag_bis=SUM_128_128(intermediate_value,a_arg2.hi,&a_result->hi); overflow_flag=overflow_flag||overflow_flag_bis; - return overflow_flag;} + return overflow_flag; +} +/** + * @brief dap_uint128_add + * @param a_arg1 + * @param a_arg2 + * @return + */ +static inline uint128_t dap_uint128_add (uint128_t a_arg1, uint128_t a_arg2) +{ + uint128_t l_ret; + memset(&l_ret,0,sizeof(l_ret)); + + SUM_128_128(a_arg1, a_arg2, & l_ret); + return l_ret; +} -static inline bool dap_unsign128_t_check_equal(uint128_t a_128_bit, uint128_t b_128_bit) +/** + * @brief dap_uint128_substract + * @param a + * @param b + * @return + */ +static inline uint128_t dap_uint128_substract(uint128_t a, uint128_t b) { #ifdef DAP_GLOBAL_IS_INT128 - return a_128_bit == b_128_bit; + if (a < b) { + _log_it("dap_math_ops",L_WARNING, "Substract result overflow"); + return 0; + } + return a - b; #else - return a_128_bit.lo==b_128_bit.lo && a_128_bit.hi==b_128_bit.hi; + uint128_t l_ret = {}; + if (a.u64[0] < b.u64[0] || (a.u64[0] == b.u64[0] && a.u64[1] < b.u64[1])) { + _log_it("dap_math_ops",L_WARNING, "Substract result overflow"); + return l_ret; + } + l_ret.u64[0] = a.u64[0] - b.u64[0]; + l_ret.u64[1] = a.u64[1] - b.u64[1]; + if (a.u64[1] < b.u64[1]) + l_ret.u64[0]--; + return l_ret; #endif + } -static inline bool dap_unsign256_t_check_equal(unsign256_t a_256_bit, unsign256_t b_256_bit) +/** + * @brief dap_uint128_check_equal + * @param a_arg1 + * @param a_arg2 + * @return + */ +static inline bool dap_uint128_check_equal(uint128_t a_arg1, uint128_t a_arg2) { - return a_256_bit.lo.lo==b_256_bit.lo.lo && - a_256_bit.lo.hi==b_256_bit.lo.hi && - a_256_bit.hi.lo==b_256_bit.hi.lo && - a_256_bit.hi.hi==b_256_bit.hi.hi; +#ifdef DAP_GLOBAL_IS_INT128 + return a_128_bit == b_128_bit; +#else + return a_arg1.lo==a_arg2.lo && a_arg1.hi==a_arg2.hi; +#endif } - +/** + * @brief dap_unsign256_t_check_equal + * @param a_arg1 + * @param a_arg2 + * @return + */ +static inline bool dap_unsign256_t_check_equal(uint256_t a_arg1, uint256_t a_arg2) +{ + return a_arg1.lo.lo==a_arg2.lo.lo && + a_arg1.lo.hi==a_arg2.lo.hi && + a_arg1.hi.lo==a_arg2.hi.lo && + a_arg1.hi.hi==a_arg2.hi.hi; +} diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index f5f6cad96fe314737b8a18574e8b5150665fadfa..4d501aeb19aa7f1266048d60ba2c9a05700e3449 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -2569,8 +2569,11 @@ uint128_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c if(l_out_item_count >= MAX_OUT_ITEMS) { if(s_debug_more) log_it(L_ERROR, "Too many 'out' items=%d in transaction (max=%d)", l_out_item_count, MAX_OUT_ITEMS); - if (l_out_item_count >= MAX_OUT_ITEMS) - return 0; + if (l_out_item_count >= MAX_OUT_ITEMS){ + uint128_t l_ret; + memset(&l_ret,0,sizeof(l_ret)); + return l_ret; + } } int l_out_idx_tmp = 0; for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) { diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 19333779c7551ff7fbb3bc61de8fa31d9ca24aa1..807079680d020d03bfe04f03c0a750c25e7ef697 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -246,7 +246,7 @@ DAP_STATIC_INLINE uint128_t dap_chain_uint128_from(uint64_t a_from) #ifdef DAP_GLOBAL_IS_INT128 return (uint128_t)a_from; #else - uint128_t l_ret = { .0, a_from}; + uint128_t l_ret = {{ .0, a_from}}; return l_ret; #endif } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 3885d764a163a0adedc5d79cbe6e1608c427e218..c528c8dd5b18b326294653931ade2469b3a08af7 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -1023,14 +1023,16 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); dap_string_append_printf(l_str_out, - " total_supply: %.0llf(%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n", - l_token->header_public.total_supply / DATOSHI_LD, + " total_supply: %s (%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n", + l_balance, l_token->header_public.total_supply, l_token->header_public.flags, l_token->header_public.premine_supply, l_addr ? l_addr : "-"); DAP_DELETE(l_addr); + DAP_DELETE(l_balance); } break; default: @@ -1147,14 +1149,16 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger break; case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC: { char *l_addr = dap_chain_addr_to_str(&l_token->header_public.premine_address); + char * l_balance = dap_chain_balance_to_coins(l_token->header_public.total_supply); dap_string_append_printf(l_str_out, - " total_supply: %.0llf(%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n", - l_token->header_public.total_supply / DATOSHI_LD, + " total_supply: %s (%llu), flags: 0x%x\n, premine_supply: %llu, premine_address '%s'\n", + l_balance, l_token->header_public.total_supply, l_token->header_public.flags, l_token->header_public.premine_supply, l_addr ? l_addr : "-"); DAP_DELETE(l_addr); + DAP_DELETE(l_balance); } break; default: