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
Commits on Source (4)
......@@ -2,7 +2,7 @@ project(cellframe-sdk C)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_C_STANDARD 11)
set(CELLFRAME_SDK_NATIVE_VERSION "2.6-50")
set(CELLFRAME_SDK_NATIVE_VERSION "2.6-55")
add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
set(DAPSDK_MODULES "")
......
......@@ -45,15 +45,16 @@ typedef enum dap_hash_type {
typedef union dap_chain_hash_fast{
uint8_t raw[DAP_CHAIN_HASH_FAST_SIZE];
} dap_chain_hash_fast_t;
typedef dap_chain_hash_fast_t dap_hash_fast_t;
#ifdef __cplusplus
extern "C" {
#endif
//size_t dap_chain_hash_fast_to_str(dap_chain_hash_fast_t * a_hash, char * a_str, size_t a_str_max);
int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_chain_hash_fast_t * a_hash);
int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_hash_fast_t * a_hash);
static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_chain_hash_fast_t *a_hash_out )
static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_hash_fast_t *a_hash_out )
{
if ( (a_data_in == NULL) || (a_data_in_size == 0) || (a_hash_out == NULL) )
return false;
......@@ -74,18 +75,18 @@ static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size,
* @param a_hash2
* @return
*/
static inline bool dap_hash_fast_compare(dap_chain_hash_fast_t *a_hash1, dap_chain_hash_fast_t *a_hash2)
static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast_t *a_hash2)
{
if(!a_hash1 || !a_hash2)
return false;
if(!memcmp(a_hash1, a_hash2, sizeof(dap_chain_hash_fast_t)))
if(!memcmp(a_hash1, a_hash2, sizeof(dap_hash_fast_t)))
return true;
return false;
}
static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash )
static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash )
{
static dap_chain_hash_fast_t l_blank_hash = { 0};
static dap_hash_fast_t l_blank_hash = { 0};
// uint8_t *l_hast_bytes = (uint8_t*) a_hash;
// for(size_t i = 0; i < sizeof(dap_chain_hash_fast_t); i++) {
// if(l_hast_bytes[i])
......@@ -95,7 +96,7 @@ static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash )
}
DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_hash_fast_t *a_hash, char *a_str, size_t a_str_max )
{
assert(a_str_max >= (DAP_CHAIN_HASH_FAST_SIZE * 2 + 2));
a_str[0] = '0';
......@@ -105,7 +106,11 @@ DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash,
return DAP_CHAIN_HASH_FAST_SIZE * 2 + 2;
}
static inline char *dap_chain_hash_fast_to_str_new(dap_chain_hash_fast_t * a_hash)
DAP_STATIC_INLINE int dap_hash_fast_to_str(dap_hash_fast_t *a_hash, char *a_str, size_t a_str_max){
return dap_chain_hash_fast_to_str(a_hash,a_str,a_str_max);
}
DAP_STATIC_INLINE char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash)
{
const size_t c_hash_str_size = sizeof(*a_hash)*2 +1 /*trailing zero*/ +2 /* heading 0x */+4/*just to be sure*/ ;
char * ret = DAP_NEW_Z_SIZE(char, c_hash_str_size);
......@@ -113,6 +118,10 @@ static inline char *dap_chain_hash_fast_to_str_new(dap_chain_hash_fast_t * a_has
return ret;
}
DAP_STATIC_INLINE char *dap_hash_fast_to_str_new(dap_hash_fast_t * a_hash)
{
return dap_chain_hash_fast_to_str_new(a_hash);
}
#ifdef __cplusplus
}
#endif
......@@ -200,6 +200,7 @@ static void s_http_error(dap_events_socket_t * a_es, int a_errno)
log_it(L_WARNING, "Socket error: %s (code %d)" , l_errbuf, a_errno);
dap_client_http_pvt_t * l_client_http_internal = PVT(a_es);
if(!l_client_http_internal) {
log_it(L_ERROR, "s_http_write: l_client_http_internal is NULL!");
return;
......@@ -221,6 +222,7 @@ static void s_client_http_delete(dap_client_http_pvt_t * a_http_pvt)
{
// call from dap_events_socket_delete(ev_socket, true);
log_it(L_DEBUG, "HTTP client delete");
if(!a_http_pvt) {
log_it(L_ERROR, "s_http_write: l_client_http_internal is NULL!");
return;
......@@ -339,6 +341,8 @@ void* dap_client_http_request_custom(dap_worker_t * a_worker,const char *a_uplin
l_ev_socket->remote_addr.sin_family = AF_INET;
l_ev_socket->remote_addr.sin_port = htons(a_uplink_port);
l_ev_socket->flags |= DAP_SOCK_CONNECTING;
l_ev_socket->flags |= DAP_SOCK_READY_TO_WRITE ;
int l_err = connect(l_socket, (struct sockaddr *) &l_ev_socket->remote_addr, sizeof(struct sockaddr_in));
if (l_err == 0){
log_it(L_DEBUG, "Connected momentaly with %s:%u!", a_uplink_addr, a_uplink_port);
......
......@@ -495,3 +495,34 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not
a_chain->callback_notify = a_callback;
a_chain->callback_notify_arg = a_callback_arg;
}
/**
* @brief dap_chain_get_last_atom_hash
* @param a_chain
* @param a_atom_hash
* @return
*/
bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash)
{
bool l_ret = false;
dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain);
dap_chain_atom_ptr_t * l_lasts_atom;
size_t l_lasts_atom_count=0;
size_t* l_lasts_atom_size =NULL;
l_lasts_atom= a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count,&l_lasts_atom_size);
if (l_lasts_atom&& l_lasts_atom_count){
assert(l_lasts_atom_size[0]);
assert(l_lasts_atom[0]);
if(a_atom_hash){
dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0],a_atom_hash);
if(dap_log_level_get() <= L_DEBUG){
char l_hash_str[128]={[0]='\0'};
dap_chain_hash_fast_to_str(a_atom_hash,l_hash_str,sizeof (l_hash_str)-1);
log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str);
}
}
l_ret = true;
}
a_chain->callback_atom_iter_delete(l_atom_iter);
return l_ret;
}
......@@ -175,3 +175,4 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai
void dap_chain_delete(dap_chain_t * a_chain);
void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg);
dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash);
......@@ -325,11 +325,11 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg)
}
if (l_pkt_copy)
DAP_DELETE(l_pkt_copy);
DAP_DELETE(l_pkt_copy_list);
}else{
// log_it(L_WARNING, "Next pkt copy list is NULL");
}
if (l_pkt_copy_list)
DAP_DELETE(l_pkt_copy_list);
}else
log_it(L_WARNING, "In proc thread got CHAINS stream ch packet with zero data");
dap_proc_thread_assign_on_worker_inter(a_thread, l_ch->stream_worker->worker, l_ch->stream->esocket );
......@@ -464,7 +464,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
size_t l_chain_pkt_data_size = l_ch_pkt->hdr.size - sizeof(l_chain_pkt->hdr);
uint8_t l_acl_idx = dap_chain_net_acl_idx_by_id(l_chain_pkt->hdr.net_id);
if (l_acl_idx == (uint8_t)-1) {
log_it(L_ERROR, "Invalid net id 0x%08x in packet", l_chain_pkt->hdr.net_id);
log_it(L_ERROR, "Invalid net id 0x%016x in packet", l_chain_pkt->hdr.net_id);
if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR) {
if(l_ch_chain->callback_notify_packet_in) {
l_ch_chain->callback_notify_packet_in(l_ch_chain, l_ch_pkt->hdr.type, l_chain_pkt,
......@@ -489,24 +489,24 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
}
switch (l_ch_pkt->hdr.type) {
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL: {
log_it(L_INFO, "In: SYNCED_ALL net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt->hdr.net_id.uint64 ,
log_it(L_INFO, "In: SYNCED_ALL net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB: {
log_it(L_INFO, "In: SYNCED_GLOBAL_DB: net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt->hdr.net_id.uint64 ,
log_it(L_INFO, "In: SYNCED_GLOBAL_DB: net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB_GROUP: {
if (s_debug_chain_sync)
log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt->hdr.net_id.uint64 ,
log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB_GROUP: {
if (s_debug_chain_sync)
log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt->hdr.net_id.uint64 ,
log_it(L_INFO, "In: SYNCED_GLOBAL_DB_GROUP pkt net 0x%016x chain 0x%016x cell 0x%016x", l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
}
break;
......@@ -525,117 +525,138 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: {
char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%08x chain 0x%08x cell 0x%08x between %s and %s", 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_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)");
dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
if(l_chain) {
if(l_ch_chain->state != CHAIN_STATE_IDLE) {
log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state",
l_hash_from_str? l_hash_from_str:"(null)",
l_hash_to_str?l_hash_to_str:"(null)");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_STATE_NOT_IN_IDLE");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
} else {
// fill ids
if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
dap_stream_ch_chain_sync_request_t * l_request =
(dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data;
memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size);
memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
// fill ids
if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
memcpy(&l_ch_chain->request, l_chain_pkt->data, l_chain_pkt_data_size);
memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from);
char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to);
log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", 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_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)");
dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
if(l_chain) {
if(l_ch_chain->state != CHAIN_STATE_IDLE) {
log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state",
l_hash_from_str? l_hash_from_str:"(null)",
l_hash_to_str?l_hash_to_str:"(null)");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_STATE_NOT_IN_IDLE");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
} else {
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter( a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch);
}
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter( a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch);
}
DAP_DELETE(l_hash_from_str);
DAP_DELETE(l_hash_to_str);
}else{
log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PKT_DATA_SIZE" );
}
DAP_DELETE(l_hash_from_str);
DAP_DELETE(l_hash_to_str);
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: {
log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt: net 0x%08x chain 0x%08x cell 0x%08x, range between %u and %u",
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_ch_chain->request.id_start, l_ch_chain->request.id_end );
if(l_ch_chain->state != CHAIN_STATE_IDLE) {
log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_STATE_NOT_IN_IDLE");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
break;
}
// receive the latest global_db revision of the remote node -> go to send mode
if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
dap_stream_ch_chain_sync_request_t * l_request =
(dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data;
memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size);
memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch);
}
else {
log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request",
a_ch->stream->session->id);
log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u",
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_ch_chain->request.id_start, l_ch_chain->request.id_end );
if(l_ch_chain->state != CHAIN_STATE_IDLE) {
log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_STATE_NOT_IN_IDLE");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
break;
}
// receive the latest global_db revision of the remote node -> go to send mode
else {
log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request",
a_ch->stream->session->id);
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch);
}
}else{
log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_SYNC_GLOBAL_DB_REQUEST_BAD");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
"ERROR_CHAIN_PKT_DATA_SIZE" );
}
}
break;
// first packet of data with source node address
case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN: {
log_it(L_INFO, "In: FIRST_CHAIN data_size=%d net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt_data_size,
l_ch_chain->request_hdr.net_id.uint64 ,
l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64);
if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t))
memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, l_chain_pkt_data_size);
if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t)){
log_it(L_INFO, "From "NODE_ADDR_FP_STR": FIRST_CHAIN data_size=%d net 0x%016x chain 0x%016x cell 0x%016x ",
NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr),
l_chain_pkt_data_size, l_ch_chain->request_hdr.net_id.uint64 ,
l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64);
}else{
log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN", l_chain_pkt_data_size);
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PACKET_TYPE_FIRST_CHAIN_INCORRET_DATA_SIZE(%zd/%zd)",l_chain_pkt_data_size, sizeof(dap_chain_node_addr_t));
}
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN: {
if (s_debug_chain_sync)
log_it(L_INFO, "In: CHAIN pkt data_size=%d net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt_data_size,
l_ch_chain->request_hdr.net_id.uint64 ,
l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64);
dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
if(l_chain) {
// Expect atom element in
if(l_chain_pkt_data_size > 0) {
dap_chain_pkt_copy_t *l_pkt_copy = DAP_NEW_Z(dap_chain_pkt_copy_t);
memcpy(&l_pkt_copy->pkt_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
l_pkt_copy->pkt_data = DAP_NEW_Z_SIZE(byte_t, l_chain_pkt_data_size);
memcpy(l_pkt_copy->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size);
l_pkt_copy->pkt_data_size = l_chain_pkt_data_size;
l_ch_chain->pkt_copy_list = dap_list_append(l_ch_chain->pkt_copy_list, l_pkt_copy);
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_chain_pkt_callback, a_ch);
} else {
log_it(L_WARNING, "Empty chain packet");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PACKET_EMPTY");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
if(l_chain_pkt_data_size) {
dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
if(l_chain) {
// Expect atom element in
if(l_chain_pkt_data_size > 0) {
dap_chain_pkt_copy_t *l_pkt_copy = DAP_NEW_Z(dap_chain_pkt_copy_t);
memcpy(&l_pkt_copy->pkt_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr));
l_pkt_copy->pkt_data = DAP_NEW_Z_SIZE(byte_t, l_chain_pkt_data_size);
memcpy(l_pkt_copy->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size);
l_pkt_copy->pkt_data_size = l_chain_pkt_data_size;
l_ch_chain->pkt_copy_list = dap_list_append(l_ch_chain->pkt_copy_list, l_pkt_copy);
if (s_debug_chain_sync){
dap_chain_hash_fast_t l_atom_hash={0};
dap_hash_fast(l_chain_pkt->data, l_chain_pkt_data_size ,&l_atom_hash);
char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_atom_hash);
log_it(L_INFO, "In: CHAIN pkt: atom hash %s (size %zd)", l_atom_hash_str, l_chain_pkt_data_size);
DAP_DELETE(l_atom_hash_str);
}
dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker);
dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_chain_pkt_callback, a_ch);
} else {
log_it(L_WARNING, "Empty chain packet");
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PACKET_EMPTY");
dap_stream_ch_set_ready_to_write_unsafe(a_ch, true);
}
}
}
}
break;
// first packet of data with source node address
case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB: {
log_it(L_INFO, "In: FIRST_GLOBAL_DB data_size=%d net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt_data_size,
l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t))
case DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB:
if(l_chain_pkt_data_size == sizeof(dap_chain_node_addr_t)){
memcpy(&l_ch_chain->request.node_addr, l_chain_pkt->data, l_chain_pkt_data_size);
}
break;
log_it(L_INFO, "In: FIRST_GLOBAL_DB data_size=%d net 0x%016x chain 0x%016x cell 0x%016x from address "NODE_ADDR_FP_STR,
l_chain_pkt_data_size, l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, NODE_ADDR_FP_ARGS_S(l_ch_chain->request.node_addr) );
}else {
log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB", l_chain_pkt_data_size);
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PACKET_TYPE_FIRST_GLOBAL_DB_INCORRET_DATA_SIZE");
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB: {
if(s_debug_chain_sync)
log_it(L_INFO, "In: GLOBAL_DB data_size=%d net 0x%08x chain 0x%08x cell 0x%08x", l_chain_pkt_data_size,l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64);
log_it(L_INFO, "In: GLOBAL_DB data_size=%d ", l_chain_pkt_data_size);
// get transaction and save it to global_db
if(l_chain_pkt_data_size > 0) {
dap_chain_pkt_copy_t *l_pkt_copy = DAP_NEW_Z(dap_chain_pkt_copy_t);
......@@ -661,29 +682,34 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
l_sync_gdb.id_start = dap_db_get_last_id_remote(l_sync_gdb.node_addr.uint64);
dap_chain_net_t *l_net = dap_chain_net_by_id(l_chain_pkt->hdr.net_id);
l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
log_it(L_INFO, "In: SYNC_GLOBAL_DB_RVRS pkt: net 0x%08x chain 0x%08x cell 0x%08x, request gdb sync from %u", l_chain_pkt->hdr.net_id.uint64 ,
log_it(L_INFO, "In: SYNC_GLOBAL_DB_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x, request gdb sync from %u", l_chain_pkt->hdr.net_id.uint64 ,
l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id, l_sync_gdb.id_start );
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_sync_gdb, sizeof(l_sync_gdb));
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: {
dap_stream_ch_chain_sync_request_t l_sync_chains = {};
memcpy(&l_sync_chains, l_chain_pkt->data, l_chain_pkt_data_size);
dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_sync_chains.node_addr.uint64, l_chain);
if (l_hash) {
memcpy(&l_sync_chains.hash_from, l_hash, sizeof(*l_hash));
DAP_DELETE(l_hash);
if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) {
dap_stream_ch_chain_sync_request_t l_request={0};
dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
if( l_chain){
dap_chain_get_atom_last_hash(l_chain,& l_request.hash_from);
if( dap_log_level_get()<= L_INFO){
char l_hash_from_str[70]={[0]='\0'};
dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_from_str,sizeof (l_hash_from_str)-1);
log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%016x chain 0x%016x cell 0x%016x request chains sync from %s",
l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
l_hash_from_str[0] ? l_hash_from_str :"(null)");
}
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_request, sizeof(l_request));
}
}else{
log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request));
dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id,
"ERROR_CHAIN_PKT_DATA_SIZE" );
}
char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_sync_chains.hash_from);
log_it(L_INFO, "In: SYNC_CHAINS_RVRS pkt: net 0x%08x chain 0x%08x cell 0x%08x request chains sync from %s",
l_chain_pkt->hdr.net_id.uint64 , l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64,
l_hash_from_str ? l_hash_from_str :"(null)");
dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_chain_pkt->hdr.net_id,
l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_sync_chains, sizeof(l_sync_chains));
DAP_DELETE(l_hash_from_str);
}
break;
case DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR:
......@@ -796,9 +822,7 @@ static bool s_out_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg)
dap_hash_fast(l_ch_chain->request_atom_iter->cur, l_ch_chain->request_atom_iter->cur_size,&l_atom_hash);
char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_atom_hash);
log_it(L_INFO, "Out CHAIN pkt: net=0x%08x chain=0x%08x cell=0x%08x atom_size=%d atom_hash=%s",
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_ch_chain->request_atom_iter->cur_size,l_atom_hash_str);
log_it(L_INFO, "Out CHAIN pkt: atom hash %s (size %zd) ", l_atom_hash_str, l_ch_chain->request_atom_iter->cur_size);
DAP_DELETE(l_atom_hash_str);
}
dap_stream_ch_chain_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_ch_chain->request_hdr.net_id,
......
......@@ -26,6 +26,7 @@
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
#include "dap_common.h"
#include "dap_chain_common.h"
......@@ -55,9 +56,9 @@
typedef enum dap_stream_ch_chain_state{
CHAIN_STATE_IDLE=0,
CHAIN_STATE_SYNC_CHAINS,
CHAIN_STATE_SYNC_GLOBAL_DB,
CHAIN_STATE_SYNC_ALL
CHAIN_STATE_SYNC_CHAINS=1,
CHAIN_STATE_SYNC_GLOBAL_DB=2,
CHAIN_STATE_SYNC_ALL=3
} dap_stream_ch_chain_state_t;
typedef struct dap_stream_ch_chain_sync_request{
......@@ -106,7 +107,20 @@ size_t dap_stream_ch_chain_pkt_write_mt(dap_stream_worker_t *a_worker, dap_strea
const void * a_data, size_t a_data_size);
inline static size_t dap_stream_ch_chain_pkt_write_error(dap_stream_ch_t *a_ch, dap_chain_net_id_t a_net_id,
dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string )
dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string_format,... )
{
return dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, a_err_string,strlen (a_err_string)+1 );
va_list l_va;
char * l_str;
va_start(l_va, a_err_string_format);
int l_size = vsnprintf(NULL,0,a_err_string_format,l_va);
if(l_size >0){
l_size++;
l_str = DAP_NEW_S_SIZE(char, l_size);
vsnprintf(l_str,l_size,a_err_string_format,l_va);
va_end(l_va);
return dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, l_str,l_size );
}else{
va_end(l_va);
return 0;
}
}
......@@ -415,4 +415,3 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a
}
return l_res;
}
......@@ -48,6 +48,25 @@
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item);
DAP_STATIC_INLINE const char * dap_chain_datum_tx_item_type_to_str(dap_chain_tx_item_type_t a_item_type)
{
switch(a_item_type){
case TX_ITEM_TYPE_IN: return "TX_ITEM_TYPE_IN";
case TX_ITEM_TYPE_OUT: return "TX_ITEM_TYPE_OUT";
case TX_ITEM_TYPE_OUT_EXT: return "TX_ITEM_TYPE_OUT_EXT";
case TX_ITEM_TYPE_PKEY: return "TX_ITEM_TYPE_PKEY";
case TX_ITEM_TYPE_SIG: return "TX_ITEM_TYPE_SIG";
case TX_ITEM_TYPE_TOKEN: return "TX_ITEM_TYPE_TOKEN";
case TX_ITEM_TYPE_TOKEN_EXT: return "TX_ITEM_TYPE_TOKEN_EXT";
case TX_ITEM_TYPE_IN_COND: return "TX_ITEM_TYPE_IN_COND";
case TX_ITEM_TYPE_OUT_COND: return "TX_ITEM_TYPE_OUT_COND";
case TX_ITEM_TYPE_RECEIPT: return "TX_ITEM_TYPE_RECEIPT";
case TX_ITEM_TYPE_OUT_ALL: return "TX_ITEM_TYPE_OUT_ALL";
case TX_ITEM_TYPE_ANY: return "TX_ITEM_TYPE_ANY";
default: return "UNDEFINED";
}
}
/**
* Get item size
......
......@@ -99,8 +99,9 @@
#define LOG_TAG "chain_net"
#define F_DAP_CHAIN_NET_SHUTDOWN ( 1 << 9 )
#define F_DAP_CHAIN_NET_GO_SYNC ( 1 << 10 )
#define F_DAP_CHAIN_NET_SYNC_FROM_ZERO ( 1 << 8 )
#define F_DAP_CHAIN_NET_SHUTDOWN ( 1 << 9 )
#define F_DAP_CHAIN_NET_GO_SYNC ( 1 << 10 )
// maximum number of connections
static size_t s_max_links_count = 5;// by default 5
......@@ -554,6 +555,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
default:
log_it(L_INFO, "Node sync error %d",l_res);
}
/*
dap_chain_node_client_reset(l_node_client);
l_res = dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB_RVRS, a_net->pub.id,
l_chain_id, a_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb));
......@@ -568,6 +570,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
default:
log_it(L_INFO, "Node reverse sync error %d",l_res);
}
*/
l_tmp = dap_list_next(l_tmp);
}
if (!l_pvt_net->links) {
......@@ -597,12 +600,18 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
int l_res = 0;
DL_FOREACH (a_net->pub.chains, l_chain) {
dap_chain_node_client_reset(l_node_client);
dap_stream_ch_chain_sync_request_t l_request = {};
dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain);
if (l_hash) {
memcpy(&l_request.hash_from, l_hash, sizeof(*l_hash));
DAP_DELETE(l_hash);
}
dap_stream_ch_chain_sync_request_t l_request = {0};
dap_chain_get_atom_last_hash(l_chain,&l_request.hash_from);
if ( !dap_hash_fast_is_blank(&l_request.hash_from) ){
if(dap_log_level_get() <= L_DEBUG){
char l_hash_str[128]={[0]='\0'};
dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_str,sizeof (l_hash_str)-1);
log_it(L_DEBUG,"Send sync chain request to"NODE_ADDR_FP_STR" for %s:%s from %s to infinity",
NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr) ,a_net->pub.name, l_chain->name, l_hash_str);
}
}else
log_it(L_DEBUG,"Send sync chain request for all the chains for addr "NODE_ADDR_FP_STR,
NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr));
dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, a_net->pub.id,
l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request));
// wait for finishing of request
......@@ -620,7 +629,10 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
default:
log_it(L_ERROR, "Sync of chain '%s' error %d", l_chain->name,l_res);
}
dap_chain_node_client_reset(l_node_client);
l_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net);
dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS, a_net->pub.id,
l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request));
......@@ -642,6 +654,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
default:
log_it(L_ERROR, "Reverse sync of chain '%s' error %d", l_chain->name,l_res);
}
}
l_tmp = dap_list_next(l_tmp);
}
......@@ -1112,6 +1125,12 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply)
}
} else if( l_sync_str) {
const char * l_sync_mode_str = "updates";
dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-mode", &l_sync_mode_str);
if ( !dap_strcmp(l_sync_mode_str,"all") )
dap_chain_net_get_flag_sync_from_zero(l_net);
if ( strcmp(l_sync_str,"all") == 0 ) {
dap_chain_node_cli_set_reply_text(a_str_reply,
"SYNC_ALL state requested to state machine. Current state: %s\n",
......@@ -2004,6 +2023,29 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net)
return l_node_list;
}
/**
* @brief dap_chain_net_set_flag_sync_from_zero
* @param a_net
* @param a_flag_sync_from_zero
*/
void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero)
{
if( a_flag_sync_from_zero)
PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
else
PVT(a_net)->flags ^= F_DAP_CHAIN_NET_SYNC_FROM_ZERO;
}
/**
* @brief dap_chain_net_get_flag_sync_from_zero
* @param a_net
* @return
*/
bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net)
{
return PVT(a_net)->flags &F_DAP_CHAIN_NET_SYNC_FROM_ZERO ;
}
/**
* @brief dap_chain_net_proc_datapool
* @param a_net
......@@ -2181,6 +2223,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
dap_string_append_printf(a_str_out,"==Datum Token Declaration\n");
dap_string_append_printf(a_str_out, "ticker: %s\n", l_token->ticker);
dap_string_append_printf(a_str_out, "size: %zd\n", l_token_size);
dap_hash_fast_t l_hash ={0};
switch (l_token->type) {
case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{
dap_string_append_printf(a_str_out, "type: SIMPLE\n");
......@@ -2224,7 +2267,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD :
if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){
char *l_hash_str;
if(!dap_strcmp(a_hash_out_type, "hex"))
if(!dap_strcmp(a_hash_out_type, "hex") || !dap_strcmp(a_hash_out_type, "content_hash") )
l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data);
else
l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data);
......@@ -2236,7 +2279,7 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE :
if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){
char *l_hash_str;
if(!dap_strcmp(a_hash_out_type,"hex"))
if(!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash"))
l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data);
else
l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data);
......@@ -2359,6 +2402,128 @@ void dap_chain_net_dump_datum(dap_string_t * a_str_out, dap_chain_datum_t * a_da
size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_decl.tsd_total_size;
dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd, l_certs_field_size);
}break;
case DAP_CHAIN_DATUM_TX:{
dap_chain_datum_tx_t * l_tx =(dap_chain_datum_tx_t *) a_datum->data;
char buf[50];
time_t l_ts_created = l_tx->header.ts_created;
dap_string_append_printf(a_str_out,"type: TX\n");
dap_string_append_printf(a_str_out,"type: ts_created: %s \n",ctime_r(&l_ts_created, buf));
int l_items_count = -1;
dap_list_t * l_items = dap_chain_datum_tx_items_get(l_tx,TX_ITEM_TYPE_ANY,&l_items_count);
dap_string_append_printf(a_str_out,"type: items_count: %d \n", l_items_count );
if (l_items_count>0){
size_t n=0;
for( dap_list_t * l_cur = l_items; l_cur; l_cur = l_cur->next ){
dap_string_append_printf(a_str_out,"Item #%zd\n",n);
byte_t *l_tx_item = l_cur->data;
dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(l_tx_item);
dap_string_append_printf(a_str_out,"\ttype: %s \n",
dap_chain_datum_tx_item_type_to_str (l_item_type) );
switch (l_item_type) {
case TX_ITEM_TYPE_IN:{
dap_chain_tx_in_t * l_in = l_cur->data;
dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx );
dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash );
char l_tx_prev_hash_str[70]={[0]='\0'};
dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1);
dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str );
} break;
case TX_ITEM_TYPE_OUT:{
dap_chain_tx_out_t * l_out = l_cur->data;
dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value );
char * l_addr_str = dap_chain_addr_to_str(&l_out->addr);
dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
DAP_DELETE(l_addr_str);
} break;
case TX_ITEM_TYPE_OUT_EXT:{
dap_chain_tx_out_ext_t * l_out_ext = l_cur->data;
dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out_ext->header.value );
char * l_addr_str = dap_chain_addr_to_str(&l_out_ext->addr);
dap_string_append_printf(a_str_out,"\taddr : %s\n", l_addr_str );
dap_string_append_printf(a_str_out,"\ttoken : %s\n", l_out_ext->token );
DAP_DELETE(l_addr_str);
} break;
case TX_ITEM_TYPE_SIG:{
dap_chain_tx_sig_t * l_item_sign = l_cur->data;
dap_sign_t *l_sign = l_item_sign->sig;
dap_hash_fast_t l_sign_hash;
char l_sign_hash_str[70]={[0]='\0'};
dap_string_append_printf(a_str_out,"\tsig_size: %u\n", l_item_sign->header.sig_size );
dap_string_append_printf(a_str_out,"\ttype: %s\n", dap_sign_type_to_str(l_sign->header.type) );
dap_sign_get_pkey_hash(l_sign,&l_sign_hash);
dap_hash_fast_to_str(&l_sign_hash,&l_sign_hash_str,sizeof (l_sign_hash_str)-1);
dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_sign_hash_str );
} break;
case TX_ITEM_TYPE_TOKEN:{
dap_chain_tx_token_t * l_token = l_cur->data;
dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker );
dap_string_append_printf(a_str_out,"\ttoken_emission_chain: 0x%016x\n", l_token->header.token_emission_chain_id );
char l_token_emission_hash_str[70]={ [0]='\0'};
dap_chain_hash_fast_to_str(& l_token->header.token_emission_hash,l_token_emission_hash_str,
sizeof (l_token_emission_hash_str)-1);
dap_string_append_printf(a_str_out,"\ttoken_emission_hash: %s", l_token_emission_hash_str );
} break;
case TX_ITEM_TYPE_TOKEN_EXT:{
dap_chain_tx_token_ext_t * l_token = l_cur->data;
dap_string_append_printf(a_str_out,"\tversion: %u\n",l_token->header.version );
dap_string_append_printf(a_str_out,"\tticker: %s\n", l_token->header.ticker );
dap_string_append_printf(a_str_out,"\text_net: 0x%016x\n",l_token->header.ext_net_id );
dap_string_append_printf(a_str_out,"\text_chain: 0x%016x\n",l_token->header.ext_chain_id );
dap_string_append_printf(a_str_out,"\text_tx_out_idx: %u\n",l_token->header.ext_tx_out_idx );
char l_token_emission_hash_str[70]={ [0]='\0'};
dap_chain_hash_fast_to_str(& l_token->header.ext_tx_hash,l_token_emission_hash_str,
sizeof (l_token_emission_hash_str)-1);
dap_string_append_printf(a_str_out,"\text_tx_hash: %s", l_token_emission_hash_str );
} break;
case TX_ITEM_TYPE_IN_COND:{
dap_chain_tx_in_cond_t * l_in = l_cur->data;
dap_string_append_printf(a_str_out,"\ttx_out_prev_idx: %u\n", l_in->header.tx_out_prev_idx );
dap_string_append_printf(a_str_out,"\ttx_out_prev_idx : %u\n", l_in->header.tx_prev_hash );
dap_string_append_printf(a_str_out,"\treceipt_idx : %u\n", l_in->header.receipt_idx );
char l_tx_prev_hash_str[70]={[0]='\0'};
dap_hash_fast_to_str(&l_in->header.tx_prev_hash, l_tx_prev_hash_str,sizeof (l_tx_prev_hash_str)-1);
dap_string_append_printf(a_str_out,"\ttx_prev_hash : %s\n", l_tx_prev_hash_str );
} break;
case TX_ITEM_TYPE_OUT_COND:{
dap_chain_tx_out_cond_t * l_out = l_cur->data;
dap_string_append_printf(a_str_out,"\tvalue: %u\n", l_out->header.value );
switch ( l_out->header.subtype){
case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY:{
dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY\n");
dap_string_append_printf(a_str_out,"\srv_uid: 0x%016x\n", l_out->subtype.srv_pay.srv_uid.uint64 );
switch (l_out->subtype.srv_pay.unit.enm) {
case SERV_UNIT_UNDEFINED: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNDEFINED\n"); break;
case SERV_UNIT_MB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_MB\n"); break;
case SERV_UNIT_SEC: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_SEC\n"); break;
case SERV_UNIT_DAY: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_DAY\n"); break;
case SERV_UNIT_KB: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_KB\n"); break;
case SERV_UNIT_B : dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_B\n"); break;
default: dap_string_append_printf(a_str_out,"\tunit: SERV_UNIT_UNKNOWN\n"); break;
}
dap_string_append_printf(a_str_out,"\tunit_price_max: %llu\n", l_out->subtype.srv_pay.unit_price_max_datoshi);
char l_pkey_hash_str[70]={[0]='\0'};
dap_chain_hash_fast_to_str(&l_out->subtype.srv_pay.pkey_hash, l_pkey_hash_str, sizeof (l_pkey_hash_str)-1);
dap_string_append_printf(a_str_out,"\tpkey_hash: %s\n", l_pkey_hash_str );
}break;
case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE:{
dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE\n");
}break;
case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE:{
dap_string_append_printf(a_str_out,"\tsubtype: DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE\n");
}break;
}
dap_string_append_printf(a_str_out,"\tparams_size : %u\n", l_out->params_size );
} break;
case TX_ITEM_TYPE_RECEIPT:{} break;
default:{}
}
n++;
}
}
dap_list_free(l_items);
}break;
case DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC:{
dap_string_append_printf(a_str_out,"type: PUBLIC\n");
......
......@@ -2053,17 +2053,17 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a
for(size_t i = 0; i < l_objs_size; i++) {
dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
char buf[50];
char * l_key;
if(!dap_strcmp(a_hash_out_type,"hex"))
// hex format
l_key = dap_strdup(l_objs[i].key);
else
// base58 format
l_key = dap_enc_base58_from_hex_str_to_str(l_objs[i].key);
char * l_key = dap_strdup(l_objs[i].key);
time_t l_ts_create = (time_t) l_datum->header.ts_create;
dap_string_append_printf(a_str_tmp, "hash %s: type_id=%s data_size=%u ts_create=%s", // \n included in timestamp
dap_hash_fast_t l_data_hash;
char l_data_hash_str[70]={[0]='\0'};
dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_data_hash);
dap_hash_fast_to_str(&l_data_hash,l_data_hash_str,sizeof (l_data_hash_str)-1);
dap_string_append_printf(a_str_tmp, "hash %s: type_id=%s data_size=%u data_hash=%s ts_create=%s", // \n included in timestamp
l_key, c_datum_type_str[l_datum->header.type_id],
l_datum->header.data_size, ctime_r(&l_ts_create, buf));
l_datum->header.data_size, l_data_hash_str, ctime_r(&l_ts_create, buf));
DAP_DELETE(l_key);
dap_chain_net_dump_datum(a_str_tmp, l_datum, a_hash_out_type);
}
......@@ -2088,15 +2088,8 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply
dap_chain_t * l_chain = NULL;
dap_chain_net_t * l_net = NULL;
const char * l_hash_out_type = NULL;
const char * l_hash_out_type = "hex";
dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-H", &l_hash_out_type);
if(!l_hash_out_type)
l_hash_out_type = "hex";
if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) {
dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>");
return -1;
}
dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
if(!l_net)
return -1;
......
......@@ -85,6 +85,9 @@ inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_c
void dap_chain_net_delete( dap_chain_net_t * a_net);
void dap_chain_net_proc_mempool (dap_chain_net_t * a_net);
void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero);
bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net);
dap_chain_net_t * dap_chain_net_by_name( const char * a_name);
dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);
......
......@@ -54,6 +54,7 @@
typedef struct dap_chain_cs_dag_event_item {
dap_chain_hash_fast_t hash;
dap_chain_hash_fast_t hash_event_content;
time_t ts_added;
dap_chain_cs_dag_event_t *event;
size_t event_size;
......@@ -68,6 +69,7 @@ typedef struct dap_chain_cs_dag_pvt {
pthread_rwlock_t events_rwlock;
dap_chain_cs_dag_event_item_t * events;
dap_chain_cs_dag_event_item_t * events_tmp; // Tmp value for HASH_ITER
dap_chain_cs_dag_event_item_t * tx_events;
dap_chain_cs_dag_event_item_t * events_treshold;
......@@ -960,8 +962,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_
}
dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_atom_iter->chain);
dap_chain_cs_dag_pvt_t *l_dag_pvt = l_dag ? PVT(l_dag) : NULL;
a_atom_iter->cur_item = l_dag_pvt->events;
a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_dag_pvt->events ? l_dag_pvt->events->event : NULL);
l_dag_pvt->events_tmp = NULL;
dap_chain_cs_dag_event_item_t * l_cur_item = NULL;
HASH_ITER(hh,l_dag_pvt->events, l_cur_item, l_dag_pvt->events_tmp);
a_atom_iter->cur_item = l_cur_item;
a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_cur_item ? l_cur_item->event : NULL);
a_atom_iter->cur_size = l_dag_pvt->events ? l_dag_pvt->events->event_size : 0;
// a_atom_iter->cur = a_atom_iter->cur ?
......@@ -1329,8 +1334,8 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
}
}
//if (l_event_hash_str)
// dap_chain_str_to_hash_fast(l_event_hash_str,&l_event_hash);
if (l_event_hash_hex_str)
dap_chain_hash_fast_from_str(l_event_hash_hex_str,&l_event_hash);
switch ( l_event_subcmd ){
case SUBCMD_EVENT_CREATE:{
......@@ -1452,7 +1457,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
else {
ret = -23;
dap_chain_node_cli_set_reply_text(a_str_reply,
"Can't find events in events_last table\n");
"Can't find event %s in events_last table\n", l_event_hash_str);
break;
}
}else if ( strcmp(l_from_events_str,"events") == 0){
......@@ -1465,7 +1470,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply)
else {
ret = -24;
dap_chain_node_cli_set_reply_text(a_str_reply,
"Can't find events in events table\n");
"Can't find event %s in events table\n", l_event_hash_str);
break;
}
......