Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Showing
with 565 additions and 406 deletions
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_stream)
file(GLOB STREAM_SRCS *.c)
......
......@@ -39,6 +39,7 @@
#include "dap_timerfd.h"
#include "dap_events.h"
#include "dap_events.h"
#include "dap_stream.h"
#include "dap_stream_pkt.h"
#include "dap_stream_ch.h"
......@@ -593,7 +594,7 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
bool found_sig=false;
dap_stream_pkt_t * pkt=NULL;
if (!a_stream->esocket)
if (!a_stream || !a_stream->esocket)
return 0;
char *l_buf_in = (char*)a_stream->esocket->buf_in ;
......@@ -645,9 +646,9 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
read_bytes_to=0;
if(a_stream->pkt_buf_in_data_size>=(a_stream->pkt_buf_in->hdr.size + sizeof(dap_stream_pkt_hdr_t)) ){ // If we have all the packet in packet buffer
if(a_stream->pkt_buf_in_data_size > a_stream->pkt_buf_in->hdr.size + sizeof(dap_stream_pkt_hdr_t)){ // If we have little more data then we need for packet buffer
//log_it(L_WARNING,"Prefilled packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-a_stream->pkt_buf_in->hdr.size);
log_it(L_WARNING,"Prefilled packet buffer has %zu bytes more than we need, it's lost",a_stream->pkt_buf_in_data_size-a_stream->pkt_buf_in->hdr.size);
DAP_DEL_Z(a_stream->pkt_buf_in);
a_stream->pkt_buf_in_data_size = 0;
a_stream->pkt_buf_in = NULL;
}
else{
s_stream_proc_pkt_in(a_stream);
......@@ -691,24 +692,24 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
found_sig=true;
//dap_stream_pkt_t *temp_pkt = dap_stream_pkt_detect( (uint8_t*)pkt + 1 ,pkt->hdr.size+sizeof(stream_pkt_hdr_t) );
size_t l_pkt_size = pkt->hdr.size + sizeof(dap_stream_pkt_hdr_t);
if(bytes_left_to_read >= sizeof (dap_stream_pkt_t)){
if(bytes_left_to_read <(pkt->hdr.size+sizeof(dap_stream_pkt_t) )){ // Is all the packet in da buf?
if (bytes_left_to_read < l_pkt_size) { // Is all the packet in da buf?
read_bytes_to=bytes_left_to_read;
}else{
read_bytes_to=pkt->hdr.size+sizeof(dap_stream_pkt_t);
read_bytes_to = l_pkt_size;
}
}
//log_it(L_DEBUG, "Detected packet signature pkt->hdr.size=%u read_bytes_to=%u bytes_left_to_read=%u pkt_offset=%u"
// ,pkt->hdr.size, read_bytes_to, bytes_left_to_read,pkt_offset);
if(read_bytes_to > HEADER_WITH_SIZE_FIELD){ // If we have size field, we can allocate memory
a_stream->pkt_buf_in_size_expected =( pkt->hdr.size+sizeof(dap_stream_pkt_hdr_t));
size_t pkt_buf_in_size_expected=a_stream->pkt_buf_in_size_expected;
a_stream->pkt_buf_in=(dap_stream_pkt_t *) malloc(pkt_buf_in_size_expected);
if(read_bytes_to>(pkt->hdr.size+sizeof(dap_stream_pkt_hdr_t) )){
a_stream->pkt_buf_in_size_expected = l_pkt_size;
a_stream->pkt_buf_in = DAP_NEW_SIZE(struct dap_stream_pkt, l_pkt_size);
if (read_bytes_to > l_pkt_size) {
//log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger than expected pkt length(%u bytes). Dropped %u bytes",
// pkt->hdr.size+sizeof(stream_pkt_hdr_t),read_bytes_to- pkt->hdr.size+sizeof(stream_pkt_hdr_t));
read_bytes_to=(pkt->hdr.size+sizeof(dap_stream_pkt_hdr_t));
read_bytes_to = l_pkt_size;
}
if(read_bytes_to>bytes_left_to_read){
//log_it(L_WARNING,"For some strange reasons we have read_bytes_to=%u is bigger that's left in input buffer (%u bytes). Dropped %u bytes",
......@@ -719,11 +720,11 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
proc_data+=(read_bytes_to + pkt_offset);
bytes_left_to_read-=read_bytes_to;
a_stream->pkt_buf_in_data_size=(read_bytes_to);
if(a_stream->pkt_buf_in_data_size==(pkt->hdr.size + sizeof(dap_stream_pkt_hdr_t))){
if(a_stream->pkt_buf_in_data_size==l_pkt_size){
// log_it(INFO,"All the packet is present in da buffer (hdr.size=%u read_bytes_to=%u buf_in_size=%u)"
// ,sid->pkt_buf_in->hdr.size,read_bytes_to,sid->conn->buf_in_size);
s_stream_proc_pkt_in(a_stream);
}else if(a_stream->pkt_buf_in_data_size>pkt->hdr.size + sizeof(dap_stream_pkt_hdr_t)){
}else if(a_stream->pkt_buf_in_data_size>l_pkt_size){
//log_it(L_WARNING,"Input: packet buffer has %u bytes more than we need, they're lost",a_stream->pkt_buf_in_data_size-pkt->hdr.size);
}else{
//log_it(L_DEBUG,"Input: Not all stream packet in input (hdr.size=%u read_bytes_to=%u)",a_stream->pkt_buf_in->hdr.size,read_bytes_to);
......@@ -820,12 +821,7 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream)
dap_events_socket_write_unsafe(a_stream->esocket, &l_ret_pkt, sizeof(l_ret_pkt));
// Reset client keepalive timer
if (a_stream->keepalive_timer) {
void *l_arg = a_stream->keepalive_timer->callback_arg;
dap_timerfd_delete(a_stream->keepalive_timer);
a_stream->keepalive_timer = dap_timerfd_start_on_worker(a_stream->stream_worker->worker,
STREAM_KEEPALIVE_TIMEOUT * 1000,
(dap_timerfd_callback_t)s_callback_keepalive,
l_arg);
dap_timerfd_reset(a_stream->keepalive_timer);
}
} break;
case STREAM_PKT_TYPE_ALIVE:
......
......@@ -76,7 +76,7 @@ dap_stream_pkt_t * dap_stream_pkt_detect(void * a_data, size_t data_size)
if(memcmp(sig_start,c_dap_stream_sig,sizeof(c_dap_stream_sig))==0){
ret = (dap_stream_pkt_t *)sig_start;
if (length_left < sizeof(dap_stream_ch_pkt_hdr_t)) {
log_it(L_ERROR, "Too small packet size %zu", length_left);
//log_it(L_ERROR, "Too small packet size %zu", length_left); // it's not an error, just random case
ret = NULL;
break;
}
......
......@@ -53,7 +53,8 @@ typedef struct dap_stream {
int id;
dap_stream_session_t * session;
dap_events_socket_t * esocket; // Connection
uint128_t esocket_uuid;
// uint128_t esocket_uuid;
uint64_t esocket_uuid;
dap_stream_worker_t * stream_worker;
struct dap_http_client * conn_http; // HTTP-specific
......
......@@ -38,20 +38,10 @@ if (CELLFRAME_MODULES MATCHES "srv")
endif()
# Consensus type dag
if (CELLFRAME_MODULES MATCHES "cs-dag")
if (CELLFRAME_MODULES MATCHES "cs-dag-")
add_subdirectory(type/dag)
endif()
# Consensus type dag
if (CELLFRAME_MODULES MATCHES "cs-blocks")
add_subdirectory(type/blocks)
endif()
# No consensus
if (CELLFRAME_MODULES MATCHES "cs-none")
add_subdirectory(consensus/none)
endif()
# DAG PoA
if (CELLFRAME_MODULES MATCHES "cs-dag-poa")
add_subdirectory(consensus/dag-poa)
......@@ -62,6 +52,31 @@ if (CELLFRAME_MODULES MATCHES "cs-dag-pos")
add_subdirectory(consensus/dag-pos)
endif()
# Consensus type blocks
if (CELLFRAME_MODULES MATCHES "cs-block-")
add_subdirectory(type/blocks)
endif()
# Block PoA
if (CELLFRAME_MODULES MATCHES "cs-block-poa")
add_subdirectory(consensus/block-poa)
endif()
# Block PoS
if (CELLFRAME_MODULES MATCHES "cs-block-pos")
add_subdirectory(consensus/block-pos)
endif()
# Block PoW
if (CELLFRAME_MODULES MATCHES "cs-block-pow")
add_subdirectory(consensus/block-pow)
endif()
# No consensus
if (CELLFRAME_MODULES MATCHES "cs-none")
add_subdirectory(consensus/none)
endif()
# Service App
if (CELLFRAME_MODULES MATCHES "srv-app")
add_subdirectory(service/app)
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_app_cli)
file(GLOB DAP_APP_CLI_SRCS *.c)
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_chain)
file(GLOB DAP_CHAIN_SRCS *.c)
......
project(dap_chain_btc_rpc C)
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
add_definitions ("-D_GNU_SOURCE")
add_definitions("-Dfpic")
......
......@@ -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);
......@@ -213,7 +213,7 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path)
unsigned long l_read = fread(l_element, 1, l_el_size, l_f);
if(l_read == l_el_size) {
dap_chain_atom_verify_res_t l_res = a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!!
if (l_res == ATOM_PASS && l_res == ATOM_REJECT) {
if (l_res == ATOM_PASS || l_res == ATOM_REJECT) {
DAP_DELETE(l_element);
}
++q;
......
This diff is collapsed.
......@@ -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**);
......
......@@ -42,7 +42,7 @@ typedef struct dap_ledger {
void *_internal;
} dap_ledger_t;
typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx);
typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx, bool a_owner);
// Checks the emission of the token, usualy on zero chain
#define DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION 0x0001
......@@ -57,11 +57,14 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t
#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS -111
// Error code for no emission for a transaction (candidate to threshold)
#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION -112
// Error code for no token for an emission (candidate to threshold)
#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_TOKEN -113
#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();
......@@ -127,16 +130,13 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger);
/**
* Add token emission datum
*/
int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger,
const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size);
int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger,
const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size);
int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size);
int dap_chain_ledger_token_emission_load(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size);
// Check if it addable
int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger,
const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size);
int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_token_emission, size_t a_token_emission_size);
dap_chain_datum_token_emission_t * dap_chain_ledger_token_emission_find(dap_ledger_t *a_ledger,
dap_chain_datum_token_emission_t *dap_chain_ledger_token_emission_find(dap_ledger_t *a_ledger,
const char *a_token_ticker, const dap_chain_hash_fast_t *a_token_emission_hash);
const char* dap_chain_ledger_tx_get_token_ticker_by_hash(dap_ledger_t *a_ledger,dap_chain_hash_fast_t *a_tx_hash);
......@@ -162,7 +162,12 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
/**
* Delete all transactions from the cache
*/
void dap_chain_ledger_purge(dap_ledger_t *a_ledger);
void dap_chain_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db);
/**
* End of load mode with no chackes for incoming datums
*/
void dap_chain_ledger_load_end(dap_ledger_t *a_ledger);
/**
* Return number transactions from the cache
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_stream_ch_chain_net_srv)
file(GLOB DAP_STREAM_CH_CHAIN_NET_SRV_SRCS *.c)
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_stream_ch_chain_net)
file(GLOB DAP_STREAM_CH_CHAIN_NET_SRCS *.c)
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_stream_ch_chain)
file(GLOB DAP_STREAM_CH_CHAIN_SRCS *.c)
......
......@@ -113,6 +113,9 @@ static void s_gdb_in_pkt_error_worker_callback(dap_worker_t *a_thread, void *a_a
static bool s_debug_more=false;
static uint_fast16_t s_update_pack_size=100; // Number of hashes packed into the one packet
static uint_fast16_t s_skip_in_reactor_count=50; // Number of hashes packed to skip in one reactor loop callback out packet
static uint16_t s_size_ban_groups = 0;
static char **s_list_ban_groups = NULL;
/**
* @brief dap_stream_ch_chain_init
* @return
......@@ -124,6 +127,7 @@ int dap_stream_ch_chain_init()
s_stream_ch_packet_out);
s_debug_more = dap_config_get_item_bool_default(g_config,"stream_ch_chain","debug_more",false);
s_update_pack_size = dap_config_get_item_int16_default(g_config,"stream_ch_chain","update_pack_size",100);
s_list_ban_groups = dap_config_get_array_str(g_config, "stream_ch_chain", "ban_list_sync_groups", &s_size_ban_groups);
return 0;
}
......@@ -146,7 +150,7 @@ void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg)
UNUSED(a_arg);
a_ch->internal = DAP_NEW_Z(dap_stream_ch_chain_t);
dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch);
l_ch_chain->ch = a_ch;
l_ch_chain->_inheritor = a_ch;
}
/**
......@@ -334,7 +338,7 @@ static void s_sync_out_gdb_first_worker_callback(dap_worker_t *a_worker, void *a
l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
if (s_debug_more )
log_it(L_INFO,"Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB");
dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain->ch , DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB,
dap_stream_ch_chain_pkt_write_unsafe(DAP_STREAM_CH(l_ch_chain), DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, &l_node_addr, sizeof(dap_chain_node_addr_t));
if(l_ch_chain->callback_notify_packet_out)
......@@ -366,7 +370,7 @@ static void s_sync_out_gdb_last_worker_callback(dap_worker_t *a_worker, void *a_
if (s_debug_more )
log_it(L_INFO,"Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB");
dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain->ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB,
dap_stream_ch_chain_pkt_write_unsafe(DAP_STREAM_CH(l_ch_chain), DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
l_ch_chain->state = CHAIN_STATE_IDLE;
......@@ -495,7 +499,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg)
if (s_debug_more){
char l_atom_hash_str[72]={[0]='\0'};
dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 );
log_it(L_WARNING,"Atom with hash %s for %s:%s not accepted (code ATOM_PASS, already present)", l_atom_hash_str, l_chain->net_name, l_chain->name);
log_it(L_INFO, "%s atom with hash %s for %s:%s", l_atom_add_res == ATOM_ACCEPT ? "Accepted" : "Thresholded",
l_atom_hash_str, l_chain->net_name, l_chain->name);
}
dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash);
DAP_DELETE(l_atom_copy);
......@@ -652,6 +657,16 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
for (size_t i = 0; i < l_data_obj_count; i++) {
// obj to add
dap_store_obj_t *l_obj = l_store_obj + i;
if (s_list_ban_groups) {
int l_ret = 0;
for (int i = 0; i < s_size_ban_groups; i++) {
if (!dap_fnmatch(s_list_ban_groups[i], l_obj->group, FNM_NOESCAPE)) {
l_ret = -1;
break;
}
}
if (l_ret == -1) continue;
}
l_group_changed = strcmp(l_last_group, l_obj->group) || l_last_type != l_obj->type;
// Send remote side notification about received obj
if (l_sync_request->request.node_addr.uint64 &&
......@@ -669,7 +684,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
//check whether to apply the received data into the database
bool l_apply = false;
// timestamp for exist obj
time_t l_timestamp_cur = 0;
uint64_t l_timestamp_cur = 0;
if (dap_chain_global_db_driver_is(l_obj->group, l_obj->key)) {
dap_store_obj_t *l_read_obj = dap_chain_global_db_driver_read(l_obj->group, l_obj->key, NULL);
if (l_read_obj) {
......@@ -678,7 +693,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
}
}
// check the applied object newer that we have stored or erased
if (l_obj->timestamp > global_db_gr_del_get_timestamp(l_obj->group, l_obj->key) &&
if (l_obj->timestamp > (uint64_t)global_db_gr_del_get_timestamp(l_obj->group, l_obj->key) &&
l_obj->timestamp > l_timestamp_cur) {
l_apply = true;
}
......@@ -705,7 +720,8 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
}
}
// save data to global_db
if(!dap_chain_global_db_obj_save(dap_store_obj_copy(l_obj, 1), 1)) {
dap_store_obj_t *l_obj_copy = dap_store_obj_copy(l_obj, 1);
if(!dap_chain_global_db_obj_save(l_obj_copy, 1)) {
struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request);
dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id,
s_gdb_in_pkt_error_worker_callback, l_sync_req_err);
......@@ -713,6 +729,8 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
if (s_debug_more)
log_it(L_DEBUG, "Added new GLOBAL_DB synchronization record");
}
DAP_DELETE(l_obj_copy->group);
DAP_DELETE(l_obj_copy);
}
if(l_store_obj) {
dap_store_obj_free(l_store_obj, l_data_obj_count);
......@@ -753,6 +771,53 @@ static void s_stream_ch_write_error_unsafe(dap_stream_ch_t *a_ch, uint64_t a_net
dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, a_net_id, a_chain_id, a_cell_id, a_err_string);
}
static bool s_chain_timer_callback(void *a_arg)
{
dap_worker_t *l_worker = dap_events_get_current_worker(dap_events_get_default());
dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_worker), *(dap_stream_ch_uuid_t *)a_arg);
if (!l_ch) {
DAP_DELETE(a_arg);
return false;
}
dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
if (!l_ch_chain->was_active) {
if (l_ch_chain->state != CHAIN_STATE_IDLE) {
dap_stream_ch_chain_go_idle(l_ch_chain);
}
DAP_DELETE(a_arg);
l_ch_chain->activity_timer = NULL;
return false;
}
l_ch_chain->was_active = false;
// Sending dumb packet with nothing to inform remote thats we're just skiping atoms of GDB's, nothing freezed
if (l_ch_chain->state == CHAIN_STATE_SYNC_CHAINS)
dap_stream_ch_chain_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_TSD,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
if (l_ch_chain->state == CHAIN_STATE_SYNC_GLOBAL_DB || l_ch_chain->state == CHAIN_STATE_UPDATE_GLOBAL_DB) {
if (s_debug_more)
log_it(L_INFO, "Send one global_db TSD packet (rest=%zu/%zu items)",
dap_db_log_list_get_count_rest(l_ch_chain->request_db_log),
dap_db_log_list_get_count(l_ch_chain->request_db_log));
dap_stream_ch_chain_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_TSD,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
}
return true;
}
static void s_chain_timer_reset(dap_stream_ch_chain_t *a_ch_chain)
{
if (a_ch_chain->state == CHAIN_STATE_IDLE)
return;
if (!a_ch_chain->activity_timer) {
dap_stream_ch_uuid_t *l_uuid = DAP_DUP(&DAP_STREAM_CH(a_ch_chain)->uuid);
a_ch_chain->activity_timer = dap_timerfd_start_on_worker(DAP_STREAM_CH(a_ch_chain)->stream_worker->worker,
3000, s_chain_timer_callback, (void *)l_uuid);
} else
a_ch_chain->was_active = true;
}
/**
* @brief s_stream_ch_packet_in
* @param a_ch
......@@ -776,6 +841,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
sizeof(l_chain_pkt->hdr));
}
s_chain_timer_reset(l_ch_chain);
size_t l_chain_pkt_data_size = l_ch_pkt->hdr.size-sizeof (l_chain_pkt->hdr) ;
uint16_t l_acl_idx = dap_chain_net_acl_idx_by_id(l_chain_pkt->hdr.net_id );
......@@ -1301,7 +1367,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
l_error_str[l_chain_pkt_data_size-1]='\0'; // To be sure that nobody sends us garbage
// without trailing zero
log_it(L_WARNING,"In from remote addr %s chain id 0x%016"DAP_UINT64_FORMAT_x" got error on his side: '%s'",
l_ch_chain->ch->stream->esocket->remote_addr_str ? l_ch_chain->ch->stream->esocket->remote_addr_str: "<no addr>",
DAP_STREAM_CH(l_ch_chain)->stream->esocket->remote_addr_str ? DAP_STREAM_CH(l_ch_chain)->stream->esocket->remote_addr_str: "<no addr>",
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt_data_size > 1 ? l_error_str:"<empty>");
} break;
......@@ -1369,26 +1435,32 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
return;
dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch);
s_chain_timer_reset(l_ch_chain);
switch (l_ch_chain->state) {
// Update list of global DB records to remote
case CHAIN_STATE_UPDATE_GLOBAL_DB: {
dap_stream_ch_chain_update_element_t l_data[s_update_pack_size];
uint_fast16_t i;
dap_db_log_list_obj_t *l_obj = NULL;
for (i = 0; i < s_update_pack_size; i++) {
dap_db_log_list_obj_t *l_obj = dap_db_log_list_get(l_ch_chain->request_db_log);
if (!l_obj)
l_obj = dap_db_log_list_get(l_ch_chain->request_db_log);
if (!l_obj || DAP_POINTER_TO_INT(l_obj) == 1)
break;
memcpy(&l_data[i].hash, &l_obj->hash, sizeof(dap_chain_hash_fast_t));
l_data[i].size = l_obj->pkt->data_size;
}
if (i) {
dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain->ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB,
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64,
l_data, i * sizeof(dap_stream_ch_chain_update_element_t));
l_ch_chain->stats_request_gdb_processed += i;
if (s_debug_more)
log_it(L_INFO, "Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB");
} else if (l_obj) {
// We need to return into the write callback
a_ch->stream->esocket->buf_out_zero_count = 0;
} else {
l_ch_chain->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(dap_chain_net_by_id(
l_ch_chain->request_hdr.net_id));
......@@ -1411,8 +1483,10 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
size_t l_pkt_size = 0;
for (uint_fast16_t l_skip_count = 0; l_skip_count < s_skip_in_reactor_count; ) {
l_obj = dap_db_log_list_get(l_ch_chain->request_db_log);
if (!l_obj)
if (!l_obj || DAP_POINTER_TO_INT(l_obj) == 1) {
l_skip_count = s_skip_in_reactor_count;
break;
}
dap_stream_ch_chain_hash_item_t *l_hash_item = NULL;
unsigned l_hash_item_hashv = 0;
HASH_VALUE(&l_obj->hash, sizeof(dap_chain_hash_fast_t), l_hash_item_hashv);
......@@ -1441,7 +1515,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
}
if (l_pkt_size) {
// If request was from defined node_addr we update its state
if( s_debug_more)
if (s_debug_more)
log_it(L_INFO, "Send one global_db packet len=%zu (rest=%zu/%zu items)", l_pkt_size,
dap_db_log_list_get_count_rest(l_ch_chain->request_db_log),
dap_db_log_list_get_count(l_ch_chain->request_db_log));
......@@ -1450,10 +1524,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
l_ch_chain->request_hdr.cell_id.uint64, l_pkt, l_pkt_size);
DAP_DELETE(l_pkt);
} else if (l_obj) {
// Sending dumb packet with nothing to inform remote thats we're just skiping GDBs, nothing freezed
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_TSD,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
// We need to return into the write callback
a_ch->stream->esocket->buf_out_zero_count = 0;
} else {
log_it( L_INFO,"Syncronized database: items syncronyzed %"DAP_UINT64_FORMAT_U" from %zu",
l_ch_chain->stats_request_gdb_processed, dap_db_log_list_get_count(l_ch_chain->request_db_log));
......@@ -1564,10 +1636,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg)
0, l_ch_chain->callback_notify_arg);
}
if (! l_was_sent_smth ){
// Sending dumb packet with nothing to inform remote thats we're just skiping atoms, nothing freezed
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_TSD,
l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64,
l_ch_chain->request_hdr.cell_id.uint64, NULL, 0);
// We need to return into the write callback
a_ch->stream->esocket->buf_out_zero_count = 0;
}
} break;
default: break;
......
......@@ -58,7 +58,7 @@ typedef struct dap_stream_ch_chain_hash_item{
typedef struct dap_stream_ch_chain {
dap_stream_ch_t * ch;
void *_inheritor;
dap_stream_ch_chain_state_t state;
dap_chain_node_client_t * node_client; // Node client associated with stream
......@@ -75,12 +75,16 @@ typedef struct dap_stream_ch_chain {
dap_stream_ch_chain_pkt_hdr_t request_hdr;
dap_list_t *request_db_iter;
bool was_active;
dap_timerfd_t *activity_timer;
dap_stream_ch_chain_callback_packet_t callback_notify_packet_out;
dap_stream_ch_chain_callback_packet_t callback_notify_packet_in;
void *callback_notify_arg;
} dap_stream_ch_chain_t;
#define DAP_STREAM_CH_CHAIN(a) ((dap_stream_ch_chain_t *) ((a)->internal) )
#define DAP_STREAM_CH(a) ((dap_stream_ch_t *)((a)->_inheritor))
#define DAP_CHAIN_PKT_EXPECT_SIZE 7168
int dap_stream_ch_chain_init(void);
......
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.10)
project (dap_chain_common)
file(GLOB DAP_CHAIN_COMMON_SRCS *.c)
......
......@@ -290,10 +290,10 @@ uint64_t dap_chain_uint128_to(uint128_t a_from)
}
return (uint64_t)a_from;
#else
if (a_from.u64[0]) {
if (a_from.hi) {
log_it(L_ERROR, "Can't convert balance to uint64_t. It's too big.");
}
return a_from.u64[1];
return a_from.lo;
#endif
}
......@@ -308,21 +308,22 @@ char *dap_chain_balance_print(uint128_t a_balance)
l_value /= 10;
} while (l_value);
#else
uint32_t l_tmp[4] = {l_value.u32.a, l_value.u32.b, l_value.u32.c, l_value.u32.d};
uint64_t t, q;
do {
q = 0;
// Byte order is 1, 0, 3, 2 for little endian
for (int i = 1; i <= 3; ) {
t = q << 32 | l_value.u32[i];
t = q << 32 | l_tmp[i];
q = t % 10;
l_value.u32[i] = t / 10;
l_tmp[i] = t / 10;
if (i == 2) i = 4; // end of cycle
if (i == 3) i = 2;
if (i == 0) i = 3;
if (i == 1) i = 0;
}
l_buf[l_pos++] = q + '0';
} while (l_value.u32[2]);
} while (l_tmp[2]);
#endif
int l_strlen = strlen(l_buf) - 1;
for (int i = 0; i < (l_strlen + 1) / 2; i++) {
......@@ -353,7 +354,7 @@ char *dap_chain_balance_to_coins(uint128_t a_balance)
return l_buf;
}
const union { uint64_t u64[2]; uint32_t u32[4]; } c_pow10[DATOSHI_POW + 1] = {
const union { uint64_t u64[2]; uint32_t u32[4]; } DAP_ALIGN_PACKED c_pow10[DATOSHI_POW + 1] = {
{ .u64 = {0, 1ULL} }, // 0
{ .u64 = {0, 10ULL} }, // 1
{ .u64 = {0, 100ULL} }, // 2
......@@ -420,36 +421,36 @@ uint128_t dap_chain_balance_scan(char *a_balance)
log_it(L_WARNING, "Input number is too big");
return l_nul;
}
l_tmp = (l_tmp << 64) + c_pow10[i].u64[1] * l_digit;
l_tmp = (l_tmp << 64) + (uint128_t)c_pow10[i].u64[1] * l_digit;
l_ret = dap_uint128_add(l_ret, l_tmp);
if (l_ret == l_nul)
return l_nul;
#else
uint128_t l_tmp;
l_tmp.u64[0] = 0;
l_tmp.u64[1] = c_pow10[i].u32[2] * l_digit;
l_tmp.hi = 0;
l_tmp.lo = (uint64_t)c_pow10[i].u32[2] * l_digit;
l_ret = dap_uint128_add(l_ret, l_tmp);
if (l_ret.u64[0] == 0 && l_ret.u64[1] == 0)
if (l_ret.hi == 0 && l_ret.lo == 0)
return l_nul;
uint64_t l_mul = c_pow10[i].u32[3] * l_digit;
l_tmp.u64[1] = l_mul << 32;
l_tmp.u64[0] = l_mul >> 32;
uint64_t l_mul = (uint64_t)c_pow10[i].u32[3] * l_digit;
l_tmp.lo = l_mul << 32;
l_tmp.hi = l_mul >> 32;
l_ret = dap_uint128_add(l_ret, l_tmp);
if (l_ret.u64[0] == 0 && l_ret.u64[1] == 0)
if (l_ret.hi == 0 && l_ret.lo == 0)
return l_nul;
l_tmp.u64[1] = 0;
l_tmp.u64[0] = c_pow10[i].u32[0] * l_digit;
l_tmp.lo = 0;
l_tmp.hi = (uint64_t)c_pow10[i].u32[0] * l_digit;
l_ret = dap_uint128_add(l_ret, l_tmp);
if (l_ret.u64[0] == 0 && l_ret.u64[1] == 0)
if (l_ret.hi == 0 && l_ret.lo == 0)
return l_nul;
l_mul = c_pow10[i].u32[1] * l_digit;
l_mul = (uint64_t)c_pow10[i].u32[1] * l_digit;
if (l_mul >> 32) {
log_it(L_WARNING, "Input number is too big");
return l_nul;
}
l_tmp.u64[0] = l_mul << 32;
l_tmp.hi = l_mul << 32;
l_ret = dap_uint128_add(l_ret, l_tmp);
if (l_ret.u64[0] == 0 && l_ret.u64[1] == 0)
if (l_ret.hi == 0 && l_ret.lo == 0)
return l_nul;
#endif
}
......