diff --git a/dap-sdk/core/include/dap_math_ops.h b/dap-sdk/core/include/dap_math_ops.h index 339ec574e76cb902cf55c7f9a26ad5553f445ed5..6fb636202c63fa1658012e10cf324a3b2867a2b7 100755 --- a/dap-sdk/core/include/dap_math_ops.h +++ b/dap-sdk/core/include/dap_math_ops.h @@ -68,7 +68,7 @@ typedef struct uint512_t { //////////////////////////////////////////////////////////////////////////////////////////////// -#ifndef DAP_GLOBAL_IS_INT128 +#if 0 const uint128_t two_power_64={ .hi = 1, .lo = 0}; const uint128_t lo_64={ .hi = 0, .lo = 0xffffffffffffffff}; @@ -141,7 +141,7 @@ static inline uint256_t AND_256(uint256_t a_256_bit,uint256_t b_256_bit){ return output; #else - uint256_t output={ .hi = zero_128, .lo = zero_128}; + uint256_t output={ .hi = {}, .lo = {}}; output.hi= AND_128(a_256_bit.hi, b_256_bit.hi); output.lo= AND_128(a_256_bit.lo, b_256_bit.lo); return output; @@ -158,7 +158,7 @@ static inline uint256_t OR_256(uint256_t a_256_bit,uint256_t b_256_bit){ return output; #else - uint256_t output={ .hi = zero_128, .lo = zero_128}; + uint256_t output={ .hi = {}, .lo = {}}; output.hi= OR_128(a_256_bit.hi, b_256_bit.hi); output.lo= OR_128(a_256_bit.lo, b_256_bit.lo); return output; @@ -250,6 +250,7 @@ static inline void LEFT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n #else if (n >= 128) // shifting 64-bit integer by more than 63 bits is not defined { + uint128_t zero_128 = {}; a_256_bit.hi=a_256_bit.lo; a_256_bit.lo=zero_128; LEFT_SHIFT_256(a_256_bit,b_256_bit,n-128); @@ -260,11 +261,11 @@ static inline void LEFT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int n b_256_bit->lo=a_256_bit.lo; } if (n<128) - { uint128_t shift_temp{.hi=0, .lo=0}; + { uint128_t shift_temp={.hi=0, .lo=0}; LEFT_SHIFT_128(a_256_bit.lo,&shift_temp,n); b_256_bit->lo=shift_temp; - uint128_t shift_temp_or_left{.hi=0, .lo=0}; - uint128_t shift_temp_or_right{.hi=0, .lo=0}; + uint128_t shift_temp_or_left={.hi=0, .lo=0}; + uint128_t shift_temp_or_right={.hi=0, .lo=0}; LEFT_SHIFT_128(a_256_bit.hi,&shift_temp_or_left,n); RIGHT_SHIFT_128(a_256_bit.lo,&shift_temp_or_right,128-n); b_256_bit->hi=OR_128(shift_temp_or_left,shift_temp_or_right); @@ -297,7 +298,8 @@ static inline void RIGHT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int #else if (n >= 128) // shifting 64-bit integer by more than 63 bits is not defined - { + { + uint128_t zero_128 = {}; a_256_bit.lo=a_256_bit.hi; a_256_bit.hi=zero_128; RIGHT_SHIFT_256(a_256_bit,b_256_bit,n-128); @@ -308,11 +310,11 @@ static inline void RIGHT_SHIFT_256(uint256_t a_256_bit,uint256_t* b_256_bit,int b_256_bit->lo=a_256_bit.lo; } if (n<128) - { uint128_t shift_temp{.hi=0, .lo=0}; + { uint128_t shift_temp={.hi=0, .lo=0}; RIGHT_SHIFT_128(a_256_bit.hi,&shift_temp,n); b_256_bit->hi=shift_temp; - uint128_t shift_temp_or_left{.hi=0, .lo=0}; - uint128_t shift_temp_or_right{.hi=0, .lo=0}; + uint128_t shift_temp_or_left={.hi=0, .lo=0}; + uint128_t shift_temp_or_right={.hi=0, .lo=0}; RIGHT_SHIFT_128(a_256_bit.lo,&shift_temp_or_left,n); LEFT_SHIFT_128(a_256_bit.hi,&shift_temp_or_right,128-n); b_256_bit->lo=OR_128(shift_temp_or_left,shift_temp_or_right); @@ -359,6 +361,7 @@ static inline void INCR_256(uint256_t* a_256_bit){ #else INCR_128(&a_256_bit->lo); + uint128_t zero_128 = {}; if(EQUAL_128(a_256_bit->lo, zero_128)) { INCR_128(&a_256_bit->hi); @@ -396,7 +399,7 @@ return overflow_flag;} //c_128_bit->lo=a_64_bit+b_64_bit; //c_128_bit->hi=(c_128_bit->lo<a_64_bit);} -#ifndef DAP_GLOBAL_IS_INT128 +#if 0 //Mixed precision: add a uint64_t into a uint128_t static inline int ADD_64_INTO_128(uint64_t a_64_bit,uint128_t* c_128_bit ) { int overflow_flag=0; diff --git a/dap-sdk/core/libdap.pri b/dap-sdk/core/libdap.pri index 91e97ea660c918ec1b530a3597fd3ebbf634e823..e3b46af7e822cd9c1efc41ccb6776ff96fd5176b 100755 --- a/dap-sdk/core/libdap.pri +++ b/dap-sdk/core/libdap.pri @@ -73,7 +73,6 @@ HEADERS += $$PWD/include/dap_common.h \ SOURCES += $$PWD/src/dap_common.c \ $$PWD/src/dap_binary_tree.c \ $$PWD/src/dap_config.c \ - $$PWD/src/dap_math_ops.c \ $$PWD/src/dap_file_utils.c \ $$PWD/src/dap_circular_buffer.c \ $$PWD/src/dap_list.c \ diff --git a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h index e0f5c75b64b8096630bd9ff1fd86429da28e3b3c..65faa2b326fe983421a552fd73817fd12312de52 100644 --- a/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h +++ b/dap-sdk/net/server/json_rpc/include/dap_json_rpc_request_handler.h @@ -38,7 +38,7 @@ extern "C"{ #endif -typedef void (handler_func_t)(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +typedef void (handler_func_t)(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); typedef struct dap_json_rpc_request_handler { diff --git a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request_handler.c b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request_handler.c index 593c9c2104cf11600a7c501dcbdbfd2433d22c4e..d84c81576bfb9086f1e278e15c288204cdaea168 100644 --- a/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request_handler.c +++ b/dap-sdk/net/server/json_rpc/src/dap_json_rpc_request_handler.c @@ -50,7 +50,7 @@ void dap_json_rpc_request_handler(dap_json_rpc_request_t *a_request, dap_http_s log_it(L_NOTICE, "Can't processing the request. Handler %s not registration. ", a_request->method); } else { l_response->error = NULL; - l_handler->func(a_request->params, l_response); + l_handler->func(a_request->params, l_response, a_request->method); log_it(L_NOTICE, "Calling handler request name: %s", a_request->method); } dap_json_rpc_response_send(l_response, a_client); diff --git a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h b/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h index 601c9dd1ff4aed16aec43cd25e18f7e1bc051752..d019041e44c27b02433a00892f8143d33cb1cec5 100644 --- a/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h +++ b/modules/chain/btc_rpc/include/dap_chain_btc_rpc_handlers.h @@ -5,80 +5,80 @@ void dap_chain_btc_rpc_registration_handlers(); void dap_chain_btc_rpc_unregistration_handlers(); -void dap_chain_btc_rpc_handler_addmultisigaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_addnode(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_backupwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_createmultisig(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_createrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_decoderawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_dumpprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_dumpwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_encryptwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getaccountaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getaddednodeinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getaddressesbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getbalance(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getbestblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getblockcount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getblocknumber(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getblocktemplate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getconnectioncount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getdifficulty(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_gethashespersec(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getmemorypool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getmininginfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_addmultisigaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_addnode(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_backupwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_createmultisig(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_createrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_decoderawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_dumpprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_dumpwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_encryptwallet(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getaccountaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getaddednodeinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getaddressesbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getbalance(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getbestblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getblockcount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getblockhash(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getblocknumber(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getblocktemplate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getconnectioncount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getdifficulty(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_gethashespersec(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getmemorypool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getmininginfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_getnewaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getpeerinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getrawchangeaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getrawmempool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_gettransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_gettxout(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_gettxoutsetinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_getwork(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_getnewaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getpeerinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getrawchangeaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getrawmempool(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_gettransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_gettxout(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_gettxoutsetinfo(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_getwork(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_help(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_help(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_importprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_invalidateblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_keypoolrefill(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listaccounts(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listaddressgroupings(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_importprivkey(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_invalidateblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_keypoolrefill(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listaccounts(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listaddressgroupings(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listsinceblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listtransactions(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_listlockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_lockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_move(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_listreceivedbyaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listreceivedbyaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listsinceblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listtransactions(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_listlockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_lockunspent(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_move(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_sendfrom(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_sendmany(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_sendrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_sendtoaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_setaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_setgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_settxfee(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_signmessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_signrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_stop(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_submitblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_sendfrom(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_sendmany(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_sendrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_sendtoaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_setaccount(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_setgenerate(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_settxfee(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_signmessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_signrawtransaction(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_stop(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_submitblock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); -void dap_chain_btc_rpc_handler_validateaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_verifymessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_walletlock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_walletpassphrase(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); -void dap_chain_btc_rpc_handler_walletpassphrasechange(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response); +void dap_chain_btc_rpc_handler_validateaddress(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_verifymessage(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_walletlock(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_walletpassphrase(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); +void dap_chain_btc_rpc_handler_walletpassphrasechange(dap_json_rpc_params_t *a_params, dap_json_rpc_response_t *a_response, const char *a_method); diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 462c07ef93255096bd7451fbb2561d27337fc303..753c0e627844a7cef7ea492ff263de6176e44a3b 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -110,15 +110,22 @@ typedef struct dap_chain_ledger_tx_item { time_t ts_created; int n_outs; int n_outs_used; - char token_tiker[10]; + char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // TODO dynamically allocates the memory in order not to limit the number of outputs in transaction dap_chain_hash_fast_t tx_hash_spent_fast[MAX_OUT_ITEMS]; // spent outs list } cache_data; UT_hash_handle hh; } dap_chain_ledger_tx_item_t; +typedef struct dap_chain_ledger_tx_spent_item { + dap_chain_hash_fast_t tx_hash_fast; + char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; + UT_hash_handle hh; +} dap_chain_ledger_tx_spent_item_t; + + typedef struct dap_chain_ledger_tokenizer { - char token_ticker[10]; + char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; uint64_t sum; UT_hash_handle hh; } dap_chain_ledger_tokenizer_t; @@ -164,6 +171,7 @@ typedef struct dap_ledger_private { dap_chain_ledger_token_emission_item_t * treshold_emissions; dap_chain_ledger_tx_item_t *ledger_items; + dap_chain_ledger_tx_spent_item_t *spent_items; dap_chain_ledger_token_item_t *tokens; @@ -185,7 +193,7 @@ typedef struct dap_ledger_private { dap_chain_cell_id_t local_cell_id; /* Cache section */ dap_ledger_cache_item_t last_tx; - dap_ledger_cache_item_t last_thres_tx; + dap_ledger_cache_item_t last_spent_tx; dap_ledger_cache_item_t last_emit; dap_ledger_cache_str_item_t last_ticker; } dap_ledger_private_t; @@ -272,7 +280,7 @@ void dap_chain_ledger_handle_free(dap_ledger_t *a_ledger) void dap_chain_ledger_load_end(dap_ledger_t *a_ledger) { PVT(a_ledger)->last_tx.found = true; - PVT(a_ledger)->last_thres_tx.found = true; + PVT(a_ledger)->last_spent_tx.found = true; PVT(a_ledger)->last_emit.found = true; PVT(a_ledger)->last_ticker.found = true; } @@ -1054,23 +1062,22 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) l_ledger_pvt->last_tx.found = true; } - l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_THRES_STR); + l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR); l_objs_count = 0; l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count); for (size_t i = 0; i < l_objs_count; i++) { - dap_chain_ledger_tx_item_t *l_tx_item = DAP_NEW_Z(dap_chain_ledger_tx_item_t); - dap_chain_hash_fast_from_str(l_objs[i].key, &l_tx_item->tx_hash_fast); - l_tx_item->tx = DAP_NEW_SIZE(dap_chain_datum_tx_t, l_objs[i].value_len); - memcpy(l_tx_item->tx, l_objs[i].value, l_objs[i].value_len); - HASH_ADD(hh, l_ledger_pvt->treshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_item); + dap_chain_ledger_tx_spent_item_t *l_tx_spent_item = DAP_NEW_Z(dap_chain_ledger_tx_spent_item_t); + dap_chain_hash_fast_from_str(l_objs[i].key, &l_tx_spent_item->tx_hash_fast); + strncpy(l_tx_spent_item->token_ticker, (char *)l_objs[i].value, DAP_CHAIN_TICKER_SIZE_MAX); + HASH_ADD(hh, l_ledger_pvt->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_tx_spent_item); if (i == l_objs_count - 1) { - l_ledger_pvt->last_thres_tx.hash = &l_tx_item->tx_hash_fast; + l_ledger_pvt->last_spent_tx.hash = &l_tx_spent_item->tx_hash_fast; } } dap_chain_global_db_objs_delete(l_objs, l_objs_count); DAP_DELETE(l_gdb_group); - if (l_objs_count == 0 || l_ledger_pvt->last_thres_tx.hash == NULL) { - l_ledger_pvt->last_thres_tx.found = true; + if (l_objs_count == 0 || l_ledger_pvt->last_spent_tx.hash == NULL) { + l_ledger_pvt->last_spent_tx.found = true; } l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR); @@ -1364,13 +1371,20 @@ const char* dap_chain_ledger_tx_get_token_ticker_by_hash(dap_ledger_t *a_ledger, if ( dap_hash_fast_is_blank(a_tx_hash) ) return NULL; - dap_chain_ledger_tx_item_t *l_item= NULL; + dap_chain_ledger_tx_item_t *l_item; pthread_rwlock_rdlock(&l_ledger_priv->ledger_rwlock); - HASH_FIND(hh, l_ledger_priv->ledger_items, a_tx_hash, sizeof ( *a_tx_hash), l_item ); + HASH_FIND(hh, l_ledger_priv->ledger_items, a_tx_hash, sizeof (*a_tx_hash), l_item); + if (l_item) { + pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); + return l_item->cache_data.token_ticker; + } + dap_chain_ledger_tx_spent_item_t *l_spent_item; + HASH_FIND(hh, l_ledger_priv->spent_items, a_tx_hash, sizeof (*a_tx_hash), l_spent_item); pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); - return l_item ? l_item->cache_data.token_tiker : NULL; + return l_spent_item ? l_spent_item->token_ticker : NULL; } + /** * @brief dap_chain_ledger_addr_get_token_ticker_all * @param a_addr @@ -1394,7 +1408,7 @@ void dap_chain_ledger_addr_get_token_ticker_all(dap_ledger_t *a_ledger, dap_chai for(size_t i = 0; i < l_tickers_size; i++) { if (l_tickers[i]==NULL) break; - if(l_tickers[i] && strcmp(l_tickers[i], l_tx_item->cache_data.token_tiker) == 0) { + if(l_tickers[i] && strcmp(l_tickers[i], l_tx_item->cache_data.token_ticker) == 0) { l_is_not_in_list = false; break; } @@ -1404,7 +1418,7 @@ void dap_chain_ledger_addr_get_token_ticker_all(dap_ledger_t *a_ledger, dap_chai l_tickers_size += (l_tickers_size / 2); l_tickers = DAP_REALLOC(l_tickers, l_tickers_size); } - l_tickers[l_tickers_pos] = dap_strdup(l_tx_item->cache_data.token_tiker); + l_tickers[l_tickers_pos] = dap_strdup(l_tx_item->cache_data.token_ticker); l_tickers_pos++; } dap_chain_hash_fast_t* l_tx_hash = dap_chain_node_datum_tx_calc_hash(l_tx_item->tx); @@ -1801,7 +1815,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t l_token = NULL; } if (!l_token || !*l_token) { - l_token = l_item_out->cache_data.token_tiker; + l_token = l_item_out->cache_data.token_ticker; } if (! l_token || !*l_token ) { log_it(L_WARNING, "No token ticker found in previous transaction"); @@ -2148,16 +2162,6 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, pthread_rwlock_unlock(&l_ledger_priv->treshold_txs_rwlock); if(s_debug_more) log_it (L_DEBUG, "Tx %s added to threshold", l_tx_hash_str); - // Add it to cache - dap_chain_datum_tx_t *l_tx_cache = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, l_tx_size); - memcpy(l_tx_cache, a_tx, l_tx_size); - char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_THRES_STR); - if (!dap_chain_global_db_gr_set(dap_strdup(l_tx_hash_str), l_tx_cache, l_tx_size, l_gdb_group)) { - if(s_debug_more) - log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_tx_cache); - } - DAP_DELETE(l_gdb_group); } } } else { @@ -2186,8 +2190,8 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, void *l_item_in = *(void **)&bound_item->in; dap_chain_tx_item_type_t l_type = *(uint8_t *)l_item_in; dap_chain_ledger_tx_item_t *l_prev_item_out = bound_item->item_out; - l_ticker_trl = *l_prev_item_out->cache_data.token_tiker - ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_tiker) + l_ticker_trl = *l_prev_item_out->cache_data.token_ticker + ? dap_stpcpy(l_token_ticker, l_prev_item_out->cache_data.token_ticker) : dap_stpcpy(l_token_ticker, bound_item->out.tx_prev_out_ext->token); if (!l_multichannel && l_ticker_old_trl && strcmp(l_token_ticker, l_token_ticker_old)) { l_multichannel = true; @@ -2405,7 +2409,7 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, //} } if (l_ticker_trl && !l_multichannel) - dap_stpcpy(l_item_tmp->cache_data.token_tiker, l_token_ticker); + dap_stpcpy(l_item_tmp->cache_data.token_ticker, l_token_ticker); size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); memcpy(l_item_tmp->tx, a_tx, l_tx_size); @@ -2424,8 +2428,8 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, DAP_DELETE(l_tx_cache); } DAP_DELETE(l_gdb_group); - if (!a_from_threshold) - s_treshold_txs_proc(a_ledger); + //if (!a_from_threshold) + // s_treshold_txs_proc(a_ledger); // TODO process thresholds only for non consensus chains ret = 1; } FIN: @@ -2435,7 +2439,7 @@ FIN: int dap_chain_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) { - if (PVT(a_ledger)->last_tx.found && PVT(a_ledger)->last_thres_tx.found) { + if (PVT(a_ledger)->last_tx.found && PVT(a_ledger)->last_spent_tx.found) { return dap_chain_ledger_tx_add(a_ledger, a_tx, false); } else { dap_chain_hash_fast_t l_tx_hash = {}; @@ -2444,9 +2448,9 @@ int dap_chain_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) !memcmp(PVT(a_ledger)->last_tx.hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t))) { PVT(a_ledger)->last_tx.found = true; } - if (!PVT(a_ledger)->last_thres_tx.found && - !memcmp(PVT(a_ledger)->last_thres_tx.hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t))) { - PVT(a_ledger)->last_thres_tx.found = true; + if (!PVT(a_ledger)->last_spent_tx.found && + !memcmp(PVT(a_ledger)->last_spent_tx.hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t))) { + PVT(a_ledger)->last_spent_tx.found = true; } } return 1; @@ -2466,24 +2470,38 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ dap_chain_ledger_tx_item_t *l_item_tmp; pthread_rwlock_rdlock(&l_ledger_priv->ledger_rwlock); HASH_FIND(hh, l_ledger_priv->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp); - pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); if(l_item_tmp != NULL) { - pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock); HASH_DEL(l_ledger_priv->ledger_items, l_item_tmp); - pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); - // delete transaction - DAP_DELETE(l_item_tmp->tx); - // del struct for hash - DAP_DELETE(l_item_tmp); // Remove it from cache char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); dap_chain_global_db_gr_del(dap_chain_hash_fast_to_str_new(a_tx_hash), l_gdb_group); DAP_DELETE(l_gdb_group); l_ret = 1; + dap_chain_ledger_tx_spent_item_t *l_item_used; + HASH_FIND(hh, l_ledger_priv->spent_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_used); + if (!l_item_used) { // Add it to spent items + l_item_used = DAP_NEW_Z(dap_chain_ledger_tx_spent_item_t); + memcpy(&l_item_used->tx_hash_fast, a_tx_hash, sizeof(dap_chain_hash_fast_t)); + strncpy(l_item_used->token_ticker, l_item_tmp->cache_data.token_ticker, DAP_CHAIN_TICKER_SIZE_MAX); + HASH_ADD(hh, l_ledger_priv->spent_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_used); + // Add it to cache + char *l_cache_data = DAP_NEW_Z_SIZE(char, DAP_CHAIN_TICKER_SIZE_MAX); + strncpy(l_cache_data, l_item_used->token_ticker, DAP_CHAIN_TICKER_SIZE_MAX); + l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR); + if (!dap_chain_global_db_gr_set(dap_hash_fast_to_str_new(a_tx_hash), l_cache_data, -1, l_gdb_group)) { + if(s_debug_more) + log_it(L_WARNING, "Ledger cache mismatch"); + DAP_DELETE(l_cache_data); + } + DAP_DELETE(l_gdb_group); + } + // del struct for hash + DAP_DELETE(l_item_tmp); } else // hash not found in the cache l_ret = -2; + pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock); return l_ret; } @@ -2515,15 +2533,15 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) } DAP_DELETE(l_gdb_group); - // delete threshold txs - l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_THRES_STR); - HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) { - HASH_DEL(l_ledger_priv->treshold_txs, l_item_current); + // delete spent transactions + dap_chain_ledger_tx_spent_item_t *l_spent_item_current, *l_spent_item_tmp; + l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR); + HASH_ITER(hh, l_ledger_priv->spent_items, l_spent_item_current, l_spent_item_tmp) { + HASH_DEL(l_ledger_priv->spent_items, l_spent_item_current); if (!a_preserve_db) { - dap_chain_hash_fast_to_str(&l_item_current->tx_hash_fast, l_hash_str, l_hash_str_size); + dap_chain_hash_fast_to_str(&l_spent_item_current->tx_hash_fast, l_hash_str, l_hash_str_size); dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_gdb_group); } - DAP_DELETE(l_item_current->tx); DAP_DELETE(l_item_current); } DAP_DELETE(l_gdb_group); @@ -2531,6 +2549,7 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) // delete balances dap_ledger_wallet_balance_t *l_balance_current, *l_balance_tmp; l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_BALANCES_STR); + char *l_emissions_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_EMISSIONS_STR); HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) { HASH_DEL(l_ledger_priv->balance_accounts, l_balance_current); if (!a_preserve_db) @@ -2539,21 +2558,9 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) } DAP_DELETE(l_gdb_group); - // delete threshold emissions - dap_chain_ledger_token_emission_item_t *l_emission_current, *l_emission_tmp; - char *l_emissions_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_EMISSIONS_STR); - HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) { - HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current); - if (!a_preserve_db) { - dap_chain_hash_fast_to_str(&l_emission_current->datum_token_emission_hash, l_hash_str, l_hash_str_size); - dap_chain_global_db_gr_del(dap_strdup(l_hash_str), l_emissions_gdb_group); - } - DAP_DELETE(l_emission_current->datum_token_emission); - DAP_DELETE(l_emission_current); - } - // delete tokens & its emissions dap_chain_ledger_token_item_t *l_token_current, *l_token_tmp; + dap_chain_ledger_token_emission_item_t *l_emission_current, *l_emission_tmp; l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TOKENS_STR); HASH_ITER(hh, l_ledger_priv->tokens, l_token_current, l_token_tmp) { HASH_DEL(l_ledger_priv->tokens, l_token_current); @@ -2573,12 +2580,26 @@ void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) DAP_DELETE(l_token_current->datum_token); pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock); DAP_DELETE(l_token_current); - } + } DAP_DELETE(l_gdb_group); DAP_DELETE(l_emissions_gdb_group); + + // delete threshold emissions + HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) { + HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current); + DAP_DELETE(l_emission_current->datum_token_emission); + DAP_DELETE(l_emission_current); + } + // delete threshold transactions + HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) { + HASH_DEL(l_ledger_priv->treshold_txs, l_item_current); + DAP_DELETE(l_item_current->tx); + DAP_DELETE(l_item_current); + } + l_ledger_priv->last_tx.found = true; - l_ledger_priv->last_thres_tx.found = true; + l_ledger_priv->last_spent_tx.found = true; l_ledger_priv->last_emit.found = true; l_ledger_priv->last_ticker.found = true; @@ -2733,7 +2754,7 @@ uint128_t dap_chain_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_c if (l_type == TX_ITEM_TYPE_OUT) { const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; // Check for token name - if (!strcmp(a_token_ticker, l_iter_current->cache_data.token_tiker)) + if (!strcmp(a_token_ticker, l_iter_current->cache_data.token_ticker)) { // if transaction has the out item with requested addr if (!memcmp(a_addr, &l_tx_out->addr, sizeof(dap_chain_addr_t))) { // if 'out' item not used & transaction is valid @@ -2789,8 +2810,8 @@ static dap_chain_ledger_tx_item_t* tx_item_find_by_addr(dap_ledger_t *a_ledger, HASH_ITER(hh, l_ledger_priv->ledger_items , l_iter_current, l_item_tmp) { // If a_token is setup we check if its not our token - miss it - if (a_token && *l_iter_current->cache_data.token_tiker && - dap_strcmp(l_iter_current->cache_data.token_tiker, a_token)) + if (a_token && *l_iter_current->cache_data.token_ticker && + dap_strcmp(l_iter_current->cache_data.token_ticker, a_token)) continue; // Now work with it dap_chain_datum_tx_t *l_tx = l_iter_current->tx; @@ -2946,7 +2967,7 @@ dap_chain_datum_tx_t* dap_chain_ledger_tx_cache_find_out_cond(dap_ledger_t *a_le l_cur_tx = l_tx_tmp; memcpy(a_tx_first_hash, l_tx_hash_tmp, sizeof(dap_chain_hash_fast_t)); if (a_token_ticker) { - strcpy(a_token_ticker, l_iter_current->cache_data.token_tiker); + strcpy(a_token_ticker, l_iter_current->cache_data.token_ticker); } break; } diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 5d6de24f6666dfe727b6770e097da2ac02b0669a..4a979ea82bc6b7433364d816963f63fcd64d04fb 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -75,7 +75,7 @@ typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*); typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * ); typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_t *,size_t*); -typedef dap_chain_datum_tx_t* (*dap_chain_callback_tx_find_by_hash_t)(dap_chain_t * ,dap_chain_hash_fast_t *); +typedef dap_chain_datum_tx_t* (*dap_chain_callback_tx_find_by_hash_t)(dap_chain_t *, dap_chain_hash_fast_t *); typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t* ,size_t**); diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index d1d22d3efc9431fdc8dee52b039c6f6044817971..13892ffc3fc2fadf301b16e66f22e54387554fb7 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -63,7 +63,8 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t #define DAP_CHAIN_LEDGER_TOKENS_STR "tokens" #define DAP_CHAIN_LEDGER_EMISSIONS_STR "emissions" #define DAP_CHAIN_LEDGER_TXS_STR "txs" -#define DAP_CHAIN_LEDGER_TXS_THRES_STR "thres_txs" +#define DAP_CHAIN_LEDGER_TXS_THRES_STR "thres_txs" // obsolete +#define DAP_CHAIN_LEDGER_SPENT_TXS_STR "spent_txs" #define DAP_CHAIN_LEDGER_BALANCES_STR "balances" int dap_chain_ledger_init(); diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index a234a7061507af93dd8b075129ba094ea340db37..4d9343e1e25fc748a568206d5bdcc5bbe79880c3 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -839,12 +839,13 @@ dap_store_obj_t* dap_db_driver_sqlite_read_cond_store_obj(const char *a_group, u if(a_count_out) l_count_out = (int)*a_count_out; char *l_str_query = NULL; - if(l_count_out) + if (l_count_out) { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE id>='%lld' ORDER BY id ASC LIMIT %d", l_table_name, a_id, l_count_out); - else + } else { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE id>='%lld' ORDER BY id ASC", l_table_name, a_id); + } sqlite3 *s_db = s_sqlite_get_connection(); if(!s_db){ if (l_str_query) sqlite3_free(l_str_query); @@ -917,20 +918,22 @@ dap_store_obj_t* dap_db_driver_sqlite_read_store_obj(const char *a_group, const if(a_count_out) l_count_out = *a_count_out; char *l_str_query; - if(a_key) { - if(l_count_out) + if (a_key) { + if (l_count_out) { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE key='%s' ORDER BY id ASC LIMIT %d", l_table_name, a_key, l_count_out); - else + } else { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' WHERE key='%s' ORDER BY id ASC", l_table_name, a_key); + } } else { - if(l_count_out) + if (l_count_out) { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' ORDER BY id ASC LIMIT %d", l_table_name, l_count_out); - else + } else { l_str_query = sqlite3_mprintf("SELECT id,ts,key,value FROM '%s' ORDER BY id ASC", l_table_name); + } } int l_ret = dap_db_driver_sqlite_query(s_db, l_str_query, &l_res, NULL); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index f5648db51df4f49f5987190ae1ca9dc5829a9c0f..700ada9e0322748a51add97389a574c36be3e782 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -124,6 +124,11 @@ struct link_dns_request { uint_fast16_t tries; }; +struct net_link { + dap_chain_node_info_t *link_info; + dap_chain_node_client_t *link; +}; + /** * @struct dap_chain_net_pvt * @details Private part of chain_net dap object @@ -147,12 +152,9 @@ typedef struct dap_chain_net_pvt{ //Active synchronizing link dap_chain_node_client_t *active_link; - // Established links - dap_list_t *links; // Links list - size_t links_connected_count; - // Prepared links - dap_list_t *links_info; // Links info list + dap_list_t *net_links; // Links list + size_t links_connected_count; atomic_uint links_dns_requests; @@ -241,6 +243,9 @@ static void s_net_links_notify(dap_chain_net_t * a_net ); static void s_net_state_link_prepare_success(dap_worker_t * a_worker,dap_chain_node_info_t * a_node_info, void * a_arg); static void s_net_state_link_prepare_error(dap_worker_t * a_worker,dap_chain_node_info_t * a_node_info, void * a_arg, int a_errno); +// Replace link success/error callbacks +static void s_net_state_link_replace_success(dap_worker_t *a_worker,dap_chain_node_info_t *a_node_info, void *a_arg); +static void s_net_state_link_replace_error(dap_worker_t *a_worker,dap_chain_node_info_t *a_node_info, void *a_arg, int a_errno); //static void s_net_proc_kill( dap_chain_net_t * a_net ); int s_net_load(const char * a_net_name, uint16_t a_acl_idx); @@ -426,8 +431,10 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {}; pthread_rwlock_rdlock(&PVT(l_net)->rwlock); - for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { - dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; + for (dap_list_t *l_tmp = PVT(l_net)->net_links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_node_client = ((struct net_link *)l_tmp->data)->link; + if (!l_node_client) + continue; dap_stream_worker_t *l_stream_worker = dap_client_get_stream_worker(l_node_client->client); if (l_stream_worker) continue; @@ -476,17 +483,57 @@ static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chai dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; if (PVT(l_net)->state == NET_STATE_ONLINE) { pthread_rwlock_rdlock(&PVT(l_net)->rwlock); - for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { - dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; - dap_stream_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client); - if(l_worker) - dap_stream_ch_chain_pkt_write_mt(l_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, - l_net->pub.id.uint64, a_chain->id.uint64, a_id.uint64, a_atom, a_atom_size); + for (dap_list_t *l_tmp = PVT(l_net)->net_links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_node_client = ((struct net_link *)l_tmp->data)->link; + if (l_node_client) { + dap_stream_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client); + if(l_worker) + dap_stream_ch_chain_pkt_write_mt(l_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, + l_net->pub.id.uint64, a_chain->id.uint64, a_id.uint64, a_atom, a_atom_size); + } } pthread_rwlock_unlock(&PVT(l_net)->rwlock); } } +static dap_chain_node_info_t *s_get_dns_link_from_cfg(dap_chain_net_t *a_net) +{ + dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); + struct in_addr l_addr = {}; + uint16_t i, l_port; + if (l_net_pvt->seed_aliases_count) { + i = rand() % l_net_pvt->seed_aliases_count; + dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(a_net, l_net_pvt->seed_aliases[i]); + if (l_remote_addr){ + dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(a_net, l_remote_addr); + if(l_remote_node_info){ + l_addr.s_addr = l_remote_node_info ? l_remote_node_info->hdr.ext_addr_v4.s_addr : 0; + DAP_DELETE(l_remote_node_info); + l_port = DNS_LISTEN_PORT; + }else{ + log_it(L_WARNING,"Can't find node info for node addr "NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS(l_remote_addr)); + } + }else{ + log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]); + } + } else if (l_net_pvt->bootstrap_nodes_count) { + i = rand() % l_net_pvt->bootstrap_nodes_count; + l_addr = l_net_pvt->bootstrap_nodes_addrs[i]; + l_port = l_net_pvt->bootstrap_nodes_ports[i]; + } + if (!l_addr.s_addr) + return NULL; + dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); + if(! l_link_node_info){ + log_it(L_CRITICAL,"Can't allocate memory for node link info"); + return NULL; + } + l_link_node_info->hdr.ext_addr_v4 = l_addr; + l_link_node_info->hdr.ext_port = l_port; + return l_link_node_info; +} + /** * @brief s_fill_links_from_root_aliases * @param a_net @@ -497,7 +544,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) uint64_t l_own_addr = dap_chain_net_get_cur_addr_int(a_net); for (size_t i = 0; i < MIN(s_max_links_count, l_pvt_net->seed_aliases_count); i++) { pthread_rwlock_rdlock(&l_pvt_net->rwlock); - if (dap_list_length(l_pvt_net->links_info) >= s_max_links_count) { + if (dap_list_length(l_pvt_net->net_links) >= s_max_links_count) { pthread_rwlock_unlock(&l_pvt_net->rwlock); break; }else @@ -512,8 +559,10 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) } dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(a_net, l_link_addr); if(l_link_node_info) { + struct net_link *l_new_link = DAP_NEW_Z(struct net_link); + l_new_link->link_info = l_link_node_info; pthread_rwlock_wrlock(&l_pvt_net->rwlock); - l_pvt_net->links_info = dap_list_append(l_pvt_net->links_info, l_link_node_info); + l_pvt_net->net_links = dap_list_append(l_pvt_net->net_links, l_new_link); pthread_rwlock_unlock(&l_pvt_net->rwlock); } else { log_it(L_WARNING, "Not found link %s."NODE_ADDR_FP_STR" in the node list", a_net->pub.name, @@ -522,6 +571,94 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) } } +/** + * @brief s_net_state_link_replace_error + * @param a_worker + * @param a_node_info + * @param a_arg + * @param a_errno + */ +static void s_net_state_link_replace_error(dap_worker_t *a_worker, dap_chain_node_info_t *a_node_info, void *a_arg, int a_errno) +{ + UNUSED(a_worker); + struct link_dns_request *l_dns_request = (struct link_dns_request *)a_arg; + dap_chain_net_t *l_net = l_dns_request->net; + char l_node_addr_str[INET_ADDRSTRLEN] = {}; + inet_ntop(AF_INET, &a_node_info->hdr.ext_addr_v4, l_node_addr_str, sizeof (a_node_info->hdr.ext_addr_v4)); + log_it(L_WARNING,"Link " NODE_ADDR_FP_STR " (%s) replace error with code %d", NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address), + l_node_addr_str,a_errno ); + dap_notify_server_send_f_mt("{" + "class:\"NetLinkReplaceError\"," + "net_id:0x%016" DAP_UINT64_FORMAT_X "," + "cell_id:0x%016"DAP_UINT64_FORMAT_X"," + "address:\""NODE_ADDR_FP_STR"\"," + "error: %d" + "}\n", l_net->pub.id.uint64, a_node_info->hdr.cell_id.uint64, + NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address), a_errno); + DAP_DELETE(a_node_info); + dap_chain_node_info_t *l_link_node_info = NULL; + for (int i = 0; i < 1000; i++) { + l_link_node_info = s_get_dns_link_from_cfg(l_net); + if (l_link_node_info) + break; + } + if (!l_link_node_info) { // We have lost this link forever + DAP_DELETE(l_dns_request); + return; + } + if (dap_chain_node_info_dns_request(l_link_node_info->hdr.ext_addr_v4, + l_link_node_info->hdr.ext_port, + l_net->pub.name, + l_link_node_info, // use it twice + s_net_state_link_replace_success, + s_net_state_link_replace_error, + l_dns_request)) { + log_it(L_ERROR, "Can't process node info dns request"); + DAP_DELETE(l_link_node_info); + DAP_DELETE(l_dns_request); + } +} + +/** + * @brief s_net_state_link_repace_success + * @param a_worker + * @param a_node_info + * @param a_arg + */ +static void s_net_state_link_replace_success(dap_worker_t *a_worker, dap_chain_node_info_t *a_node_info, void *a_arg) +{ + if (s_debug_more) { + char l_node_addr_str[INET_ADDRSTRLEN] = {}; + inet_ntop(AF_INET, &a_node_info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); + log_it(L_DEBUG,"Link " NODE_ADDR_FP_STR " (%s) replace success", NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address), + l_node_addr_str); + } + + struct link_dns_request *l_dns_request = (struct link_dns_request *)a_arg; + dap_chain_net_t *l_net = l_dns_request->net; + dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); + uint64_t l_own_addr = dap_chain_net_get_cur_addr_int(l_net); + if (a_node_info->hdr.address.uint64 == l_own_addr) { + s_net_state_link_replace_error(a_worker, a_node_info, a_arg, EWOULDBLOCK); + return; + } + struct net_link *l_new_link = DAP_NEW_Z(struct net_link); + l_new_link->link_info = a_node_info; + l_new_link->link = dap_chain_net_client_create_n_connect(l_net, a_node_info); + pthread_rwlock_wrlock(&l_net_pvt->rwlock); + l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); + pthread_rwlock_unlock(&l_net_pvt->rwlock); + + dap_notify_server_send_f_mt("{" + "class:\"NetLinkReplaceSuccess\"," + "net_id:0x%016" DAP_UINT64_FORMAT_X "," + "cell_id:0x%016"DAP_UINT64_FORMAT_X"," + "address:\""NODE_ADDR_FP_STR"\"" + "}\n", l_net->pub.id.uint64, a_node_info->hdr.cell_id.uint64, + NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address)); + DAP_DELETE(l_dns_request); +} + /** * @brief s_node_link_callback_connected * @param a_node_client @@ -555,28 +692,69 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie } +static void s_node_link_remove(dap_chain_net_pvt_t *a_net_pvt, dap_chain_node_client_t *a_node_client) +{ + for (dap_list_t *it = a_net_pvt->net_links; it; it = it->next) { + if (((struct net_link *)it->data)->link == a_node_client) { + DAP_DELETE(((struct net_link *)it->data)->link_info); + a_net_pvt->net_links = dap_list_delete_link(a_net_pvt->net_links, it); + break; + } + } +} + /** * @brief s_node_link_callback_disconnected * @param a_node_client * @param a_arg */ -static void s_node_link_callback_disconnected(dap_chain_node_client_t * a_node_client, void * a_arg) +static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_client, void * a_arg) { - dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; - dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); + dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; + dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); if (a_node_client->is_connected) { a_node_client->is_connected = false; log_it(L_INFO, "%s."NODE_ADDR_FP_STR" disconnected.%s",l_net->pub.name, NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address), - l_net_pvt->state_target == NET_STATE_OFFLINE ? "" : " Reconnecting back..."); + l_net_pvt->state_target == NET_STATE_OFFLINE ? "" : " Replace it..."); if (l_net_pvt->links_connected_count) l_net_pvt->links_connected_count--; else log_it(L_ERROR, "Links count is zero in disconnected callback, looks smbd decreased it twice or forget to increase on connect/reconnect"); } if (l_net_pvt->state_target != NET_STATE_OFFLINE) { - a_node_client->keep_connection = true; + for (dap_list_t *it = l_net_pvt->net_links; it; it = it->next) { + if (((struct net_link *)it->data)->link == NULL) { // We have a free prepared link + s_node_link_remove(l_net_pvt, a_node_client); + ((struct net_link *)it->data)->link = dap_chain_net_client_create_n_connect(l_net, + ((struct net_link *)it->data)->link_info); + pthread_rwlock_unlock(&l_net_pvt->rwlock); + return; + } + } + dap_chain_node_info_t *l_link_node_info = s_get_dns_link_from_cfg(l_net); + if (!l_link_node_info) { // Try to keep this connection + a_node_client->keep_connection = true; + } else { + struct link_dns_request *l_dns_request = DAP_NEW_Z(struct link_dns_request); + l_dns_request->net = l_net; + if (dap_chain_node_info_dns_request(l_link_node_info->hdr.ext_addr_v4, + l_link_node_info->hdr.ext_port, + l_net->pub.name, + l_link_node_info, // use it twice + s_net_state_link_replace_success, + s_net_state_link_replace_error, + l_dns_request)) { + log_it(L_ERROR, "Can't process node info dns request"); + DAP_DELETE(l_link_node_info); + DAP_DELETE(l_dns_request); + a_node_client->keep_connection = true; + } else { + s_node_link_remove(l_net_pvt, a_node_client); + a_node_client->keep_connection = false; + } + } } pthread_rwlock_unlock(&l_net_pvt->rwlock); } @@ -646,10 +824,10 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, return; } pthread_rwlock_wrlock(&l_net_pvt->rwlock); - for ( dap_list_t * it = l_net_pvt->links; it; it=it->next ){ - if (it->data == a_node_client) { + for ( dap_list_t * it = l_net_pvt->net_links; it; it=it->next ){ + if (((struct net_link *)it->data)->link == a_node_client) { log_it(L_DEBUG,"Replace node client with new one"); - it->data = dap_chain_net_client_create_n_connect(l_net, a_node_client->info); + ((struct net_link *)it->data)->link = dap_chain_net_client_create_n_connect(l_net, a_node_client->info); } } pthread_rwlock_unlock(&l_net_pvt->rwlock); @@ -681,10 +859,12 @@ static void s_net_state_link_prepare_success(dap_worker_t * a_worker,dap_chain_n struct link_dns_request * l_dns_request = (struct link_dns_request *) a_arg; dap_chain_net_t * l_net = l_dns_request->net; dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); - uint64_t l_own_addr =0; + uint64_t l_own_addr = dap_chain_net_get_cur_addr_int(l_net); if (a_node_info->hdr.address.uint64 != l_own_addr) { + struct net_link *l_new_link = DAP_NEW_Z(struct net_link); + l_new_link->link_info = a_node_info; pthread_rwlock_wrlock(&l_net_pvt->rwlock); - l_net_pvt->links_info = dap_list_append(l_net_pvt->links_info, a_node_info); + l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); pthread_rwlock_unlock(&l_net_pvt->rwlock); l_dns_request->tries = 0; } @@ -781,8 +961,8 @@ static void s_net_links_notify(dap_chain_net_t * a_net ) dap_string_t * l_str_reply = dap_string_new("["); size_t i =0; - for (dap_list_t * l_item = l_net_pvt->links; l_item; l_item = l_item->next ) { - dap_chain_node_client_t * l_node_client = l_item->data; + for (dap_list_t * l_item = l_net_pvt->net_links; l_item; l_item = l_item->next ) { + dap_chain_node_client_t * l_node_client = ((struct net_link *)l_item->data)->link; if(l_node_client){ dap_chain_node_info_t * l_info = l_node_client->info; @@ -841,19 +1021,19 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NET_STATE_OFFLINE: { // delete all links l_net_pvt->links_connected_count = 0; - dap_list_t *l_tmp = l_net_pvt->links; + dap_list_t *l_tmp = l_net_pvt->net_links; while (l_tmp) { dap_list_t *l_next = l_tmp->next; - ((dap_chain_node_client_t *)l_tmp->data)->keep_connection = false; - dap_chain_node_client_close(l_tmp->data); + dap_chain_node_client_t *l_link = ((struct net_link *)l_tmp->data)->link; + if (l_link) { + l_link->keep_connection = false; + dap_chain_node_client_close(l_link); + } + DAP_DELETE(((struct net_link *)l_tmp->data)->link_info); DAP_DELETE(l_tmp); l_tmp = l_next; } - l_net_pvt->links = NULL; - if(l_net_pvt->links_info){ - dap_list_free_full(l_net_pvt->links_info, free); - l_net_pvt->links_info = NULL; - } + l_net_pvt->net_links = NULL; if ( l_net_pvt->state_target != NET_STATE_OFFLINE ){ l_net_pvt->state = NET_STATE_LINKS_PREPARE; l_repeat_after_exit = true; @@ -876,7 +1056,9 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64; l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i]; l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i]; - l_net_pvt->links_info = dap_list_append(l_net_pvt->links_info, l_link_node_info); + struct net_link *l_new_link = DAP_NEW_Z(struct net_link); + l_new_link->link_info = l_link_node_info; + l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); } uint64_t l_own_addr = dap_chain_net_get_cur_addr_int(l_net); if (l_net_pvt->node_info) { @@ -885,8 +1067,10 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) if (!l_link_node_info || l_link_node_info->hdr.address.uint64 == l_own_addr) { continue; // Do not link with self } - l_net_pvt->links_info = dap_list_append(l_net_pvt->links_info, l_link_node_info); - if (dap_list_length(l_net_pvt->links_info) >= s_max_links_count) { + struct net_link *l_new_link = DAP_NEW_Z(struct net_link); + l_new_link->link_info = l_link_node_info; + l_net_pvt->net_links = dap_list_append(l_net_pvt->net_links, l_new_link); + if (dap_list_length(l_net_pvt->net_links) >= s_max_links_count) { break; } } @@ -912,73 +1096,42 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NODE_ROLE_MASTER: case NODE_ROLE_LIGHT: default: { + if (!l_net_pvt->seed_aliases_count && ! l_net_pvt->bootstrap_nodes_count){ + log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests"); + if (l_net_pvt->net_links) { // We have other links + l_net_pvt->state = NET_STATE_LINKS_CONNECTING; + l_repeat_after_exit = true; + } + break; + } // Get DNS request result from root nodes as synchronization links bool l_sync_fill_root_nodes = false; - uint32_t l_link_id=0; - if (!l_sync_fill_root_nodes){ - for (size_t n=0; n< s_required_links_count;n++ ) { - struct in_addr l_addr = {}; - uint16_t i, l_port; - if (l_net_pvt->seed_aliases_count) { - i = rand() % l_net_pvt->seed_aliases_count; - dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i]); - if (l_remote_addr){ - dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(l_net, l_remote_addr); - if(l_remote_node_info){ - l_addr.s_addr = l_remote_node_info ? l_remote_node_info->hdr.ext_addr_v4.s_addr : 0; - DAP_DELETE(l_remote_node_info); - l_port = DNS_LISTEN_PORT; - }else{ - log_it(L_WARNING,"Can't find node info for node addr "NODE_ADDR_FP_STR, - NODE_ADDR_FP_ARGS(l_remote_addr)); - } - }else{ - log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]); - } - } else if (l_net_pvt->bootstrap_nodes_count) { - i = rand() % l_net_pvt->bootstrap_nodes_count; - l_addr = l_net_pvt->bootstrap_nodes_addrs[i]; - l_port = l_net_pvt->bootstrap_nodes_ports[i]; - } else { - log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests"); - if (!dap_list_length(l_net_pvt->links_info)) { // No links can be prepared, go offline - l_net_pvt->state_target = NET_STATE_OFFLINE; - } - } - if (l_addr.s_addr) { - dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); - if(! l_link_node_info){ - log_it(L_CRITICAL,"Can't allocate memory for node link info"); - break; - } -/* #ifdef DAP_OS_UNIX - struct in_addr _in_addr = { .s_addr = l_addr.s_addr }; - #else - struct in_addr _in_addr = { { .S_addr = l_addr.S_un.S_addr } }; - #endif -*/ - l_sync_fill_root_nodes = false; - if (l_net_pvt->state_target != NET_STATE_OFFLINE) { - l_net_pvt->links_dns_requests++; - struct link_dns_request * l_dns_request = DAP_NEW_Z(struct link_dns_request); - l_dns_request->net = l_net; - l_dns_request->link_id = l_link_id; - if(dap_chain_node_info_dns_request(l_addr, l_port, l_net->pub.name, l_link_node_info, - s_net_state_link_prepare_success, - s_net_state_link_prepare_error,l_dns_request) != 0 ){ - log_it(L_ERROR, "Can't process node info dns request"); - DAP_DEL_Z(l_link_node_info); - - } - }else{ - DAP_DEL_Z(l_link_node_info); - } + uint32_t l_link_id = 0; + if (!l_sync_fill_root_nodes) { + for (size_t n = 0; l_net_pvt->links_dns_requests < s_max_links_count; n++) { + dap_chain_node_info_t *l_link_node_info = s_get_dns_link_from_cfg(l_net); + if (!l_link_node_info) + continue; + l_net_pvt->links_dns_requests++; + struct link_dns_request *l_dns_request = DAP_NEW_Z(struct link_dns_request); + l_dns_request->net = l_net; + l_dns_request->link_id = l_link_id++; + if (dap_chain_node_info_dns_request(l_link_node_info->hdr.ext_addr_v4, + l_link_node_info->hdr.ext_port, + l_net->pub.name, + l_link_node_info, // use it twice + s_net_state_link_prepare_success, + s_net_state_link_prepare_error, + l_dns_request)) { + log_it(L_ERROR, "Can't process node info dns request"); + DAP_DEL_Z(l_dns_request); + DAP_DEL_Z(l_link_node_info); } - l_link_id++; + if (n > 1000) // It's a problem with link prepare + break; } - } - if (l_sync_fill_root_nodes){ - log_it(L_ATT,"Not found bootstrap addresses, fill seed nodelist from root aliases"); + } else { + log_it(L_ATT, "Not use bootstrap addresses, fill seed nodelist from root aliases"); pthread_rwlock_unlock(&l_net_pvt->rwlock); s_fill_links_from_root_aliases(l_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); @@ -989,12 +1142,13 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NET_STATE_LINKS_CONNECTING: { log_it(L_INFO, "%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name); - for (dap_list_t *l_tmp = l_net_pvt->links_info; l_tmp; l_tmp = dap_list_next(l_tmp)) { - dap_chain_node_info_t *l_link_info = (dap_chain_node_info_t *)l_tmp->data; + int l_used_links = 0; + for (dap_list_t *l_tmp = l_net_pvt->net_links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_info_t *l_link_info = ((struct net_link *)l_tmp->data)->link_info; dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, l_link_info); l_client->keep_connection = true; - l_net_pvt->links = dap_list_append(l_net_pvt->links, l_client); - if (dap_list_length(l_net_pvt->links) == s_required_links_count) + ((struct net_link *)l_tmp->data)->link = l_client; + if (++l_used_links == s_required_links_count) break; } } break; @@ -1030,15 +1184,14 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t pthread_rwlock_rdlock(&l_net_pvt->rwlock); bool l_found = false; if (l_net_pvt->active_link) { - for (dap_list_t *l_links = l_net_pvt->links; l_links; l_links = dap_list_next(l_links)) { - if (l_links->data == l_net_pvt->active_link) { - dap_chain_node_client_t *l_client = (dap_chain_node_client_t *)l_links->data; - if (l_client->state >= NODE_CLIENT_STATE_ESTABLISHED && + for (dap_list_t *l_links = l_net_pvt->net_links; l_links; l_links = dap_list_next(l_links)) { + dap_chain_node_client_t *l_client = ((struct net_link *)l_links->data)->link; + if (l_client == l_net_pvt->active_link && + l_client->state >= NODE_CLIENT_STATE_ESTABLISHED && l_client->state < NODE_CLIENT_STATE_SYNCED && a_client != l_client) { - l_found = true; - break; - } + l_found = true; + break; } } } @@ -1236,7 +1389,7 @@ void s_set_reply_text_node_status(char **a_str_reply, dap_chain_net_t * a_net){ if (PVT(a_net)->state != NET_STATE_OFFLINE) l_sync_current_link_text_block = dap_strdup_printf(", active links %u from %u", PVT(a_net)->links_connected_count, - dap_list_length(PVT(a_net)->links)); + dap_list_length(PVT(a_net)->net_links)); dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" has state %s (target state %s)%s%s", a_net->pub.name, c_net_states[PVT(a_net)->state], @@ -1440,11 +1593,11 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) size_t i =0; dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); pthread_rwlock_rdlock(&l_net_pvt->rwlock ); - size_t l_links_count = dap_list_length(l_net_pvt->links); + size_t l_links_count = dap_list_length(l_net_pvt->net_links); dap_string_t *l_reply = dap_string_new(""); dap_string_append_printf(l_reply,"Links %zu:\n", l_links_count); - for (dap_list_t * l_item = l_net_pvt->links; l_item; l_item = l_item->next ) { - dap_chain_node_client_t * l_node_client = l_item->data; + for (dap_list_t * l_item = l_net_pvt->net_links; l_item; l_item = l_item->next ) { + dap_chain_node_client_t *l_node_client = ((struct net_link *)l_item->data)->link; if(l_node_client){ dap_chain_node_info_t * l_info = l_node_client->info; @@ -2550,7 +2703,7 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap_chain_hash_fast_t * a_tx_hash, dap_chain_net_tx_search_type_t a_search_type) { - dap_ledger_t * l_ledger = dap_chain_ledger_by_net_name( a_net->pub.name ); + dap_ledger_t * l_ledger = a_net->pub.ledger; dap_chain_datum_tx_t * l_tx = NULL; switch (a_search_type) { @@ -2562,7 +2715,7 @@ dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap for ( dap_chain_t * l_chain = a_net->pub.chains; l_chain; l_chain = l_chain->next){ if ( l_chain->callback_tx_find_by_hash ){ // try to find transaction in chain ( inside shard ) - l_tx = l_chain->callback_tx_find_by_hash( l_chain, a_tx_hash ); + l_tx = l_chain->callback_tx_find_by_hash(l_chain, a_tx_hash); if (l_tx) break; } @@ -2572,7 +2725,7 @@ dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap case TX_SEARCH_TYPE_NET_UNSPENT: case TX_SEARCH_TYPE_CELL_UNSPENT:{ - l_tx = dap_chain_ledger_tx_find_by_hash( l_ledger, a_tx_hash ); + l_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, a_tx_hash); }break; } return l_tx; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index d2810653a9b10cd519004dce83f6cc68d49e4b42..cb44195f73a31bb3ba3e52728b6555d8fc20f316 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -90,38 +90,24 @@ static void s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, dap_ledger_t *a_ledger, dap_string_t *a_str_out, const char *a_hash_out_type, - bool save_processed_tx, - dap_chain_tx_hash_processed_ht_t **a_tx_hash_processed, - size_t *l_tx_num) + dap_chain_hash_fast_t *a_tx_hash) { - dap_chain_hash_fast_t l_tx_hash; - dap_hash_fast(a_datum, dap_chain_datum_tx_get_size(a_datum), &l_tx_hash); - if (save_processed_tx){ - dap_chain_tx_hash_processed_ht_t *l_sht = NULL; - HASH_FIND(hh, *a_tx_hash_processed, &l_tx_hash, sizeof(dap_chain_hash_fast_t), l_sht); - if (l_sht != NULL) - return; - l_sht = DAP_NEW_Z(dap_chain_tx_hash_processed_ht_t); - memcpy(&l_sht->hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); - HASH_ADD(hh, *a_tx_hash_processed, hash, sizeof(dap_chain_hash_fast_t), l_sht); - (*l_tx_num)++; - } time_t l_ts_create = (time_t)a_datum->header.ts_created; char *l_hash_str = NULL; if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_hash); + l_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_tx_hash); + l_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash); dap_list_t *l_list_tx_any = dap_chain_datum_tx_items_get(a_datum, TX_ITEM_TYPE_TOKEN, NULL); if(a_ledger == NULL){ - dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_hash_str); + dap_string_append_printf(a_str_out, "transaction:%s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_hash_str); } else { char buf[50]; const char *l_ticker; if (l_list_tx_any) { l_ticker = ((dap_chain_tx_token_t*)l_list_tx_any->data)->header.ticker; } else { - l_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash); + l_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, a_tx_hash); } dap_string_append_printf(a_str_out, "transaction:%s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n", l_list_tx_any ? " (emit)" : "", l_hash_str, dap_ctime_r(&l_ts_create, buf), l_ticker); @@ -897,183 +883,192 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0; while(l_atom && l_atom_size) { - size_t l_datums_count = 0; - dap_chain_datum_t **l_datums = - (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ? - a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : NULL; - if(!l_datums) { - log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); - return NULL ; - } - for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { - // go to next atom - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - continue; + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = + (a_chain->callback_atom_get_datums && l_atom && l_atom_size) ? + a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count) : NULL; + if(!l_datums) { + log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); + return NULL ; } + for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); - size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); - size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; - while(l_atom && l_atom_size) { - dap_chain_datum_t *l_datum = - a_chain->callback_atom_get_datum ? - a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom; - if(!l_datum) { - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); - log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom); - continue; - }*/ - char l_time_str[70]; - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1) - l_time_str[0] = '\0'; - switch (l_datum->header.type_id) { - - // token - case DAP_CHAIN_DATUM_TOKEN_DECL: { - - // no token necessary for addr - if(a_filtr_addr_base58) { - break; + dap_chain_datum_t *l_datum = l_datums[l_datum_n]; + if(!l_datum) { // || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { + // go to next atom + //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + continue; } - dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; - //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ - l_token_num++; - break; - } - if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { - dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); - switch (l_token->type) { - // Simple private token decl - case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: - dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", - l_token->header_private.total_supply / DATOSHI_LD, - l_token->header_private.total_supply, - l_token->header_private.signs_valid, l_token->header_private.signs_total); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", - l_token->header_private_decl.tsd_total_size, - l_token->header_private_decl.flags); - break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: - dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", - l_token->header_private_update.tsd_total_size, - l_token->header_private_update.padding); - 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: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", - //l_token->header_public.total_supply / DATOSHI_LD, - dap_chain_balance_to_coins(l_token->header_public.total_supply), - dap_chain_balance_print(l_token->header_public.total_supply), - l_token->header_public.flags, - dap_chain_balance_print(l_token->header_public.premine_supply), - l_addr ? l_addr : "-"); - DAP_DELETE(l_addr); - DAP_DELETE(l_balance); + /*dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); + size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); + size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; + while(l_atom && l_atom_size) { + dap_chain_datum_t *l_datum = + a_chain->callback_atom_get_datum ? + a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*) l_atom; + if(!l_datum) { + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); + l_atom_size = a_chain->callback_atom_get_size(l_atom); + log_it(L_ERROR, "datum=NULL for atom=0x%x", l_atom); + continue; + }*/ + char l_time_str[70]; + // get time of create datum + if(dap_time_to_str_rfc822(l_time_str, 71, l_datum->header.ts_create) < 1) + l_time_str[0] = '\0'; + switch (l_datum->header.type_id) { + + // token + case DAP_CHAIN_DATUM_TOKEN_DECL: { + + // no token necessary for addr + if(a_filtr_addr_base58) { + break; } + + dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; + //if(a_datum_start < 0 || (l_datum_num >= a_datum_start && l_datum_num < a_datum_end)) + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)){ + l_token_num++; break; - default: - dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); - break; + } + if(!a_filter_token_name || !dap_strcmp(l_token->ticker, a_filter_token_name)) { + dap_string_append_printf(l_str_out, "token %s, created: %s\n", l_token->ticker, l_time_str); + switch (l_token->type) { + // Simple private token decl + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: + dap_string_append_printf(l_str_out, " total_supply: %.0Lf(%"DAP_UINT64_FORMAT_U"), signs: valid/total %02d/%02d \n", + l_token->header_private.total_supply / DATOSHI_LD, + l_token->header_private.total_supply, + l_token->header_private.signs_valid, l_token->header_private.signs_total); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", flags: 0x%x \n", + l_token->header_private_decl.tsd_total_size, + l_token->header_private_decl.flags); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE: + dap_string_append_printf(l_str_out, " tsd_total_size: %"DAP_UINT64_FORMAT_U", padding: 0x%x \n", + l_token->header_private_update.tsd_total_size, + l_token->header_private_update.padding); + 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: %s(%s), flags: 0x%x\n, premine_supply: %s, premine_address '%s'\n", + //l_token->header_public.total_supply / DATOSHI_LD, + dap_chain_balance_to_coins(l_token->header_public.total_supply), + dap_chain_balance_print(l_token->header_public.total_supply), + l_token->header_public.flags, + dap_chain_balance_print(l_token->header_public.premine_supply), + l_addr ? l_addr : "-"); + DAP_DELETE(l_addr); + DAP_DELETE(l_balance); + } + break; + default: + dap_string_append_printf(l_str_out, "unknown token type: 0x%x\n", l_token->type); + break; + } + dap_string_append_printf(l_str_out, "\n"); + l_token_num++; } - dap_string_append_printf(l_str_out, "\n"); - l_token_num++; } - } - break; + break; - // emission - case DAP_CHAIN_DATUM_TOKEN_EMISSION: { - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { - l_token_num++; - break; - } - size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); - dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); - if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) { - char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address)); - // filter for addr - if (a_filtr_addr_base58 && dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { + // emission + case DAP_CHAIN_DATUM_TOKEN_EMISSION: { + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_token_num++; break; } + size_t l_emission_size = dap_chain_datum_emission_get_size(l_datum->data); + dap_chain_datum_token_emission_t *l_token_em = dap_chain_datum_emission_read(l_datum->data, &l_emission_size); + if(!a_filter_token_name || !dap_strcmp(l_token_em->hdr.ticker, a_filter_token_name)) { + char * l_token_emission_address_str = dap_chain_addr_to_str(&(l_token_em->hdr.address)); + // filter for addr + if (a_filtr_addr_base58 && dap_strcmp(a_filtr_addr_base58,l_token_emission_address_str)) { + break; + } - dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", - l_token_em->hdr.value / DATOSHI_LD, l_token_em->hdr.value, l_token_em->hdr.ticker, - c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], - l_token_em->hdr.version); - dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); + dap_string_append_printf(l_str_out, "emission: %.0Lf(%"DAP_UINT64_FORMAT_U") %s, type: %s, version: %d\n", + l_token_em->hdr.value / DATOSHI_LD, l_token_em->hdr.value, l_token_em->hdr.ticker, + c_dap_chain_datum_token_emission_type_str[l_token_em->hdr.type], + l_token_em->hdr.version); + dap_string_append_printf(l_str_out, " to addr: %s\n", l_token_emission_address_str); + + DAP_DELETE(l_token_emission_address_str); + switch (l_token_em->hdr.type) { + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: + dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: + dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: + dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", + l_token_em->data.type_atom_owner.value_start / DATOSHI_LD, + l_token_em->data.type_atom_owner.value_start, + l_token_em->data.type_atom_owner.value_change_algo_codename); + break; + case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { + char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); + // get time of create datum + if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) + l_time_str[0] = '\0'; + dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); + dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); + DAP_DELETE(l_addr); + } + break; + } + dap_string_append_printf(l_str_out, "\n"); + l_emission_num++; + } + DAP_DELETE(l_token_em); + } break; - DAP_DELETE(l_token_emission_address_str); - switch (l_token_em->hdr.type) { - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_UNDEFINED: - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH: - dap_string_append_printf(l_str_out, " signs_count: %d\n", l_token_em->data.type_auth.signs_count); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ALGO: - dap_string_append_printf(l_str_out, " codename: %s\n", l_token_em->data.type_algo.codename); - break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_ATOM_OWNER: - dap_string_append_printf(l_str_out, " value_start: %.0Lf(%"DAP_UINT64_FORMAT_U"), codename: %s\n", - l_token_em->data.type_atom_owner.value_start / DATOSHI_LD, - l_token_em->data.type_atom_owner.value_start, - l_token_em->data.type_atom_owner.value_change_algo_codename); + // transaction + case DAP_CHAIN_DATUM_TX:{ + // datum out of page + if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_tx_num++; break; - case DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_SMART_CONTRACT: { - char *l_addr = dap_chain_addr_to_str(&l_token_em->data.type_presale.addr); - // get time of create datum - if(dap_time_to_str_rfc822(l_time_str, 71, l_token_em->data.type_presale.lock_time) < 1) - l_time_str[0] = '\0'; - dap_string_append_printf(l_str_out, " flags: 0x%x, lock_time: %s\n", l_token_em->data.type_presale.flags, l_time_str); - dap_string_append_printf(l_str_out, " addr: %s\n", l_addr); - DAP_DELETE(l_addr); } + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; + //calc tx hash + dap_chain_hash_fast_t l_tx_hash; + dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); + dap_chain_tx_hash_processed_ht_t *l_sht = NULL; + HASH_FIND(hh, a_tx_hash_processed, &l_tx_hash, sizeof(dap_chain_hash_fast_t), l_sht); + if (l_sht != NULL) break; - } - dap_string_append_printf(l_str_out, "\n"); - l_emission_num++; - } - DAP_DELETE(l_token_em); - } break; - - // transaction - case DAP_CHAIN_DATUM_TX:{ - - // datum out of page - if(a_datum_start >= 0 && (l_datum_num+l_datum_num_global < (size_t)a_datum_start || l_datum_num+l_datum_num_global >= (size_t)a_datum_end)) { + l_sht = DAP_NEW_Z(dap_chain_tx_hash_processed_ht_t); + memcpy(&l_sht->hash, &l_tx_hash, sizeof(dap_chain_hash_fast_t)); + HASH_ADD(hh, a_tx_hash_processed, hash, sizeof(dap_chain_hash_fast_t), l_sht); l_tx_num++; + s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, &l_tx_hash); + } + break; + default: + dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); break; } - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datum->data; - //calc tx hash - s_dap_chain_datum_tx_out_data(l_tx, a_ledger, l_str_out, a_hash_out_type, true, &a_tx_hash_processed, &l_tx_num); - } - break; - default: - dap_string_append_printf(l_str_out, "unknown datum type=%d\n", l_datum->header.type_id); - break; + l_datum_num++; } - l_datum_num++; - } - // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); - //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - //l_atom_size = a_chain->callback_atom_get_size(l_atom); + // go to next transaction + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); + //l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); + //l_atom_size = a_chain->callback_atom_get_size(l_atom); } a_chain->callback_atom_iter_delete(l_atom_iter); //total @@ -1185,7 +1180,8 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_hash_fast_t l_tx_hash; if(l_tx_hash_str) { - if(dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) < 0) { + if (dap_chain_hash_fast_from_str(l_tx_hash_str, &l_tx_hash) && + dap_enc_base58_hex_to_hash(l_tx_hash_str, &l_tx_hash)) { l_tx_hash_str = NULL; dap_chain_node_cli_set_reply_text(a_str_reply, "tx hash not recognized"); return -1; @@ -1281,9 +1277,13 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) int l_sub_cmd = SUBCMD_NONE; if (dap_chain_node_cli_find_option_val(a_argv, 2, 3, "coins", NULL )) l_sub_cmd = SUBCMD_LIST_COIN; + if (l_sub_cmd == SUBCMD_NONE) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'list' requires parmeter -coins"); + return -5; + } dap_chain_node_cli_find_option_val(a_argv, 3, a_argc, "-net", &l_net_str); if (l_net_str == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Command requires key -net"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'list' requires key -net"); return -1; } dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str); @@ -1306,38 +1306,43 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-hash", &l_tx_hash_str); //get net dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); + //get search type + const char *l_unspent_str = NULL; + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-unspent", &l_unspent_str); //check input if (l_tx_hash_str == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "command requires key -hash"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Subcommand 'info' requires key -hash"); return -1; } if (l_net_str == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "command requires key -net"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Subcommand 'info' requires key -net"); return -1; } - dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name(l_net_str); - if (l_ledger == NULL){ - dap_chain_node_cli_set_reply_text(a_str_reply, "Can't get ledger for net %s", l_net_str); + dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); + if (!l_net) { + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find net %s", l_net_str); return -2; } + dap_chain_hash_fast_t *l_tx_hash = DAP_NEW(dap_chain_hash_fast_t); if (dap_chain_hash_fast_from_str(l_tx_hash_str, l_tx_hash) && dap_enc_base58_hex_to_hash(l_tx_hash_str, l_tx_hash)) { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't get hash_fast from %s", l_tx_hash_str); return -2; } - dap_chain_datum_tx_t *l_datum_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, l_tx_hash); + dap_chain_datum_tx_t *l_datum_tx = dap_chain_net_get_tx_by_hash(l_net, l_tx_hash, + l_unspent_str ? TX_SEARCH_TYPE_NET_UNSPENT : TX_SEARCH_TYPE_NET); if (l_datum_tx == NULL){ dap_chain_node_cli_set_reply_text(a_str_reply, "Can't get datum from transaction hash %s", l_tx_hash_str); return -2; } dap_string_t *l_str = dap_string_new(""); - s_dap_chain_datum_tx_out_data(l_datum_tx, l_ledger, l_str, l_hash_out_type, false, NULL, NULL); + s_dap_chain_datum_tx_out_data(l_datum_tx, l_net->pub.ledger, l_str, l_hash_out_type, l_tx_hash); dap_chain_node_cli_set_reply_text(a_str_reply, l_str->str); dap_string_free(l_str, true); } else{ - dap_chain_node_cli_set_reply_text(a_str_reply, "command requires parameter 'list' or 'tx' or 'info'"); + dap_chain_node_cli_set_reply_text(a_str_reply, "Command 'ledger' requires parameter 'list' or 'tx' or 'info'"); return -1; } return 0; diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c index af3c5a5684acea9c28e4fb477d6447249d503f57..419841a1c9e00d0c5f51f1f13b19828c64c2aa1f 100644 --- a/modules/net/dap_chain_node_dns_client.c +++ b/modules/net/dap_chain_node_dns_client.c @@ -219,6 +219,7 @@ int dap_chain_node_info_dns_request(struct in_addr a_addr, uint16_t a_port, char } l_dns_client->dns_request = DAP_NEW_Z(dap_dns_buf_t); if( ! l_dns_client->dns_request){ + DAP_DELETE(l_dns_client->buf); DAP_DELETE(l_dns_client); return -3; } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 42799d60a6dbd6304160e35ffe865fadbe71777d..dca78a4dda1344b474b223e0a7bc57bc2d297cd7 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -55,7 +55,7 @@ typedef struct dap_chain_cs_dag_event_item { dap_chain_hash_fast_t hash; - dap_chain_hash_fast_t hash_event_content; + const char token_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; time_t ts_added; dap_chain_cs_dag_event_t *event; size_t event_size; @@ -96,8 +96,8 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter , dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); -static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_t * a_chain , - dap_chain_hash_fast_t * a_atom_hash); +static dap_chain_datum_tx_t* s_chain_callback_atom_find_by_tx_hash(dap_chain_t *a_chain, + dap_chain_hash_fast_t *a_tx_hash); static dap_chain_datum_t** s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size, size_t *a_datums_count); // Get event(s) from dag @@ -214,7 +214,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) a_chain->callback_atom_iter_get_lasts = s_chain_callback_atom_iter_get_lasts; a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash; - a_chain->callback_tx_find_by_hash = s_chain_callback_atom_iter_find_by_tx_hash; + a_chain->callback_tx_find_by_hash = s_chain_callback_atom_find_by_tx_hash; a_chain->callback_add_datums = s_chain_callback_datums_pool_proc; @@ -357,9 +357,9 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger l_tx_event->ts_added = a_event_item->ts_added; l_tx_event->event = a_event_item->event; l_tx_event->event_size = a_event_item->event_size; - memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) ); + dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_event->hash); int l_err = pthread_rwlock_wrlock(l_events_rwlock); - HASH_ADD(hh,PVT(a_dag)->tx_events, hash, sizeof (l_tx_event->hash), l_tx_event); + HASH_ADD(hh, PVT(a_dag)->tx_events, hash, sizeof(l_tx_event->hash), l_tx_event); if (l_err != EDEADLK) { pthread_rwlock_unlock(l_events_rwlock); } @@ -1212,16 +1212,16 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at } -static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_t * a_chain , - dap_chain_hash_fast_t * a_atom_hash) +static dap_chain_datum_tx_t* s_chain_callback_atom_find_by_tx_hash(dap_chain_t *a_chain, + dap_chain_hash_fast_t *a_tx_hash) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_chain ); dap_chain_cs_dag_event_item_t * l_event_item = NULL; pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); - HASH_FIND(hh, PVT(l_dag)->tx_events,a_atom_hash,sizeof(*a_atom_hash),l_event_item); + HASH_FIND(hh, PVT(l_dag)->tx_events, a_tx_hash, sizeof(*a_tx_hash), l_event_item); pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); if ( l_event_item ){ - dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event, l_event_item->event_size) ; + dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event, l_event_item->event_size); return l_datum ? l_datum->header.data_size ? (dap_chain_datum_tx_t*) l_datum->data : NULL :NULL; }else return NULL;