From 049d439e56cf20caf53e3cb7c58da591e9288fc6 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Sat, 21 Oct 2023 20:08:15 +0000 Subject: [PATCH] feature-6374 --- 3rdparty/crc32c_adler/CMakeLists.txt | 16 - 3rdparty/crc32c_adler/README | 14 - 3rdparty/crc32c_adler/crc32c_adler.c | 504 ----------- 3rdparty/crc32c_adler/crc32c_adler.h | 70 -- 3rdparty/crc32c_adler/example-dht.c | 163 ---- 3rdparty/crc32c_adler/example-stdin.c | 46 - CMakeLists.txt | 6 +- dap-sdk | 2 +- modules/CMakeLists.txt | 10 +- modules/chain/dap_chain.c | 31 +- modules/chain/dap_chain_cell.c | 1 - modules/chain/dap_chain_cs.c | 21 +- modules/chain/dap_chain_ledger.c | 26 +- modules/chain/dap_chain_pvt.c | 79 -- modules/chain/include/dap_chain.h | 20 + modules/chain/include/dap_chain_cs.h | 2 +- modules/chain/include/dap_chain_pvt.h | 62 -- .../dap_stream_ch_chain_net_srv.c | 2 +- .../chain-net/dap_stream_ch_chain_net.c | 340 ++------ .../include/dap_stream_ch_chain_net_pkt.h | 10 +- .../chain-voting/dap_stream_ch_chain_voting.c | 9 +- .../include/dap_stream_ch_chain_voting.h | 2 - modules/channel/chain/dap_stream_ch_chain.c | 203 +---- .../chain/include/dap_stream_ch_chain.h | 4 +- modules/common/dap_chain_datum.c | 12 +- modules/common/include/dap_chain_common.h | 60 +- modules/common/include/dap_chain_datum.h | 2 +- .../block-poa/dap_chain_cs_block_poa.c | 4 +- .../block-pos/dap_chain_cs_block_pos.c | 2 +- .../consensus/dag-poa/dap_chain_cs_dag_poa.c | 16 +- .../consensus/dag-pos/dap_chain_cs_dag_pos.c | 4 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 221 ++--- .../esbocs/include/dap_chain_cs_esbocs.h | 34 +- modules/mempool/dap_chain_mempool.c | 5 +- modules/net/dap_chain_net.c | 792 ++++-------------- modules/net/dap_chain_net_balancer.c | 6 +- modules/net/dap_chain_net_node_list.c | 11 +- modules/net/dap_chain_node.c | 165 +--- modules/net/dap_chain_node_cli_cmd.c | 136 +-- modules/net/dap_chain_node_client.c | 33 +- modules/net/dap_chain_node_dns_client.c | 11 +- modules/net/dap_chain_node_dns_server.c | 3 +- modules/net/include/dap_chain_net.h | 25 +- modules/net/include/dap_chain_node.h | 70 +- modules/net/include/dap_chain_node_cli_cmd.h | 8 - modules/net/srv/dap_chain_net_srv.c | 54 +- modules/net/srv/dap_chain_net_srv_order.c | 15 +- .../service/datum/dap_chain_net_srv_datum.c | 12 +- .../dap_chain_net_srv_stake_pos_delegate.c | 15 +- .../dap_chain_net_srv_stake_pos_delegate.h | 2 +- modules/service/vpn/dap_chain_net_srv_vpn.c | 43 +- .../vpn/dap_chain_net_vpn_client_tun.c | 4 +- .../xchange/dap_chain_net_srv_xchange.c | 3 +- modules/type/blocks/dap_chain_cs_blocks.c | 15 +- .../type/blocks/include/dap_chain_cs_blocks.h | 3 - modules/type/dag/dap_chain_cs_dag.c | 39 +- modules/type/dag/dap_chain_cs_dag_event.c | 38 - modules/type/dag/include/dap_chain_cs_dag.h | 3 - .../type/dag/include/dap_chain_cs_dag_event.h | 68 +- .../{consensus => type}/none/CMakeLists.txt | 0 .../none/dap_chain_cs_none.c | 309 +++---- .../none/include/dap_chain_cs_none.h | 13 +- modules/wallet/CMakeLists.txt | 6 +- modules/wallet/dap_chain_wallet.c | 2 - 64 files changed, 852 insertions(+), 3055 deletions(-) delete mode 100755 3rdparty/crc32c_adler/CMakeLists.txt delete mode 100755 3rdparty/crc32c_adler/README delete mode 100755 3rdparty/crc32c_adler/crc32c_adler.c delete mode 100755 3rdparty/crc32c_adler/crc32c_adler.h delete mode 100755 3rdparty/crc32c_adler/example-dht.c delete mode 100755 3rdparty/crc32c_adler/example-stdin.c delete mode 100644 modules/chain/dap_chain_pvt.c delete mode 100644 modules/chain/include/dap_chain_pvt.h rename modules/{consensus => type}/none/CMakeLists.txt (100%) rename modules/{consensus => type}/none/dap_chain_cs_none.c (54%) rename modules/{consensus => type}/none/include/dap_chain_cs_none.h (76%) diff --git a/3rdparty/crc32c_adler/CMakeLists.txt b/3rdparty/crc32c_adler/CMakeLists.txt deleted file mode 100755 index b660945e80..0000000000 --- a/3rdparty/crc32c_adler/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -# -# DESCRIPTION: A miminal cmake script to be used to produce CRC32 Addler static library -# -# AUTHOR: Ruslan R. Laishev -# -# CREATION DATE: 14-NOV-2022 -# -# MODIFICATION HISTORY: -# -cmake_minimum_required(VERSION 3.10) -project(crc32c_adler) - -set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall" ) -set( SRCS crc32c_adler.c crc32c_adler.h) -add_library(crc32c_adler STATIC ${SRCS}) -target_link_libraries(crc32c_adler pthread) diff --git a/3rdparty/crc32c_adler/README b/3rdparty/crc32c_adler/README deleted file mode 100755 index 23b609d0e8..0000000000 --- a/3rdparty/crc32c_adler/README +++ /dev/null @@ -1,14 +0,0 @@ - -Extended version of CRC32C implementation by Mark Adler, providing both hardware (SSE 4.2) and software algorithms with auto-detection. - -Source: -https://stackoverflow.com/a/17646775 - -According to Ferry Toth, Adler's implementation is 'highly optimized': -https://stackoverflow.com/a/39862799 -https://github.com/htot/crc32c - -Revised software algorithm by Robert Važan: -https://stackoverflow.com/a/21915223 -https://crc32c.machinezoo.com/ -https://bitbucket.org/robertvazan/crc32c-hw/src diff --git a/3rdparty/crc32c_adler/crc32c_adler.c b/3rdparty/crc32c_adler/crc32c_adler.c deleted file mode 100755 index 68e90941aa..0000000000 --- a/3rdparty/crc32c_adler/crc32c_adler.c +++ /dev/null @@ -1,504 +0,0 @@ -/* - CRC32C_ADLER -- Computes CRC32C Checksums - Version 1.2, Date 05/21/18 - Copyright (C) 2013 Mark Adler <madler@alumni.caltech.edu> - Copyright (C) 2018 Fonic <https://github.com/fonic> - - Provides both a hardware-accelerated algorithm (*) and a software algorithm. - Note that this computes CRC32C checksums, not CRC32 (without 'C') checksums - used by Ethernet, gzip, etc. - - (*) CRC instruction on Intel SSE 4.2 processors. SSE 4.2 was first supported - by Nehalem processors introduced in November, 2008. - - Version history: - 1.0 10 Feb 2013 First version - 1.1 1 Aug 2013 Correct comments on why three crc instructions in parallel - 1.2 21 May 2018 Add header file, revise hardware support check, eliminate - pthreads, restructure code, revise comments and description - - Version 1.1 by Mark Adler was originally published here: - https://stackoverflow.com/a/17646775 - - This software is provided 'as-is', without any express or implied - warranty. In no event will the author be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> - -#include "crc32c_adler.h" - -/* CRC32C (iSCSI) polynomial in reversed bit order. */ -#define POLY 0x82f63b78 - - -/****************************************************************************** - * * - * Software Algorithm (1) - Table-driven, 8 Bytes / Iteration * - * * - ******************************************************************************/ - -/* Table for software algorithm. */ -static uint32_t crc32c_table[8][256]; - -/* Flag to indicate if crc32c_init_sw() has been called. */ -static int crc32c_sw_initialized = 0; - -/* Initialize table for software algorithm. */ -static void crc32c_init_sw(void) -{ - uint32_t n, crc, k; - - for (n = 0; n < 256; n++) { - crc = n; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc = crc & 1 ? (crc >> 1) ^ POLY : crc >> 1; - crc32c_table[0][n] = crc; - } - for (n = 0; n < 256; n++) { - crc = crc32c_table[0][n]; - for (k = 1; k < 8; k++) { - crc = crc32c_table[0][crc & 0xff] ^ (crc >> 8); - crc32c_table[k][n] = crc; - } - } - crc32c_sw_initialized = 1; -} - -/* Compute CRC32C checksum. */ -uint32_t crc32c_sw(uint32_t crci, const void *buf, size_t len) -{ - const unsigned char *next = buf; - uint64_t crc; - - if (!crc32c_sw_initialized) - crc32c_init_sw(); - - crc = crci ^ 0xffffffff; - while (len && ((uintptr_t)next & 7) != 0) { - crc = crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8); - len--; - } - while (len >= 8) { - crc ^= *(uint64_t *)next; - crc = crc32c_table[7][crc & 0xff] ^ - crc32c_table[6][(crc >> 8) & 0xff] ^ - crc32c_table[5][(crc >> 16) & 0xff] ^ - crc32c_table[4][(crc >> 24) & 0xff] ^ - crc32c_table[3][(crc >> 32) & 0xff] ^ - crc32c_table[2][(crc >> 40) & 0xff] ^ - crc32c_table[1][(crc >> 48) & 0xff] ^ - crc32c_table[0][crc >> 56]; - next += 8; - len -= 8; - } - while (len) { - crc = crc32c_table[0][(crc ^ *next++) & 0xff] ^ (crc >> 8); - len--; - } - return (uint32_t)crc ^ 0xffffffff; -} - - -/****************************************************************************** - * * - * Software Algorithm (2) - Table-driven, 16 Bytes / Iteration * - * * - ******************************************************************************/ - -/* Table for software algorithm. */ -static uint32_t crc32c_table2[16][256]; - -/* Flag to indicate if crc32c_init_sw2() has been called. */ -static int crc32c_table2_initialized = 0; - -/* Initialize table for software algorithm. */ -static void crc32c_init_sw2(void) -{ - for(int i = 0; i < 256; i++) - { - uint32_t res = (uint32_t)i; - for(int t = 0; t < 16; t++) { - for (int k = 0; k < 8; k++) res = (res & 1) == 1 ? POLY ^ (res >> 1) : (res >> 1); - crc32c_table2[t][i] = res; - } - } - crc32c_table2_initialized = 1; -} - -/* Compute CRC32C checksum. */ -uint32_t crc32c_sw2(uint32_t crci, const void *buf, size_t len) -{ - const unsigned char *next = buf; -#ifdef __x86_64__ - uint64_t crc; -#else - uint32_t crc; -#endif - - if(!crc32c_table2_initialized) - crc32c_init_sw2(); - - crc = crci ^ 0xffffffff; -#ifdef __x86_64__ - while (len && ((uintptr_t)next & 7) != 0) - { - crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8); - --len; - } - while (len >= 16) - { - crc ^= *(uint64_t *)next; - uint64_t high = *(uint64_t *)(next + 8); - crc = crc32c_table2[15][crc & 0xff] - ^ crc32c_table2[14][(crc >> 8) & 0xff] - ^ crc32c_table2[13][(crc >> 16) & 0xff] - ^ crc32c_table2[12][(crc >> 24) & 0xff] - ^ crc32c_table2[11][(crc >> 32) & 0xff] - ^ crc32c_table2[10][(crc >> 40) & 0xff] - ^ crc32c_table2[9][(crc >> 48) & 0xff] - ^ crc32c_table2[8][crc >> 56] - ^ crc32c_table2[7][high & 0xff] - ^ crc32c_table2[6][(high >> 8) & 0xff] - ^ crc32c_table2[5][(high >> 16) & 0xff] - ^ crc32c_table2[4][(high >> 24) & 0xff] - ^ crc32c_table2[3][(high >> 32) & 0xff] - ^ crc32c_table2[2][(high >> 40) & 0xff] - ^ crc32c_table2[1][(high >> 48) & 0xff] - ^ crc32c_table2[0][high >> 56]; - next += 16; - len -= 16; - } -#else - while (len && ((uintptr_t)next & 3) != 0) - { - crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8); - --len; - } - while (len >= 12) - { - crc ^= *(uint32_t *)next; - uint32_t high = *(uint32_t *)(next + 4); - uint32_t high2 = *(uint32_t *)(next + 8); - crc = crc32c_table2[11][crc & 0xff] - ^ crc32c_table2[10][(crc >> 8) & 0xff] - ^ crc32c_table2[9][(crc >> 16) & 0xff] - ^ crc32c_table2[8][crc >> 24] - ^ crc32c_table2[7][high & 0xff] - ^ crc32c_table2[6][(high >> 8) & 0xff] - ^ crc32c_table2[5][(high >> 16) & 0xff] - ^ crc32c_table2[4][high >> 24] - ^ crc32c_table2[3][high2 & 0xff] - ^ crc32c_table2[2][(high2 >> 8) & 0xff] - ^ crc32c_table2[1][(high2 >> 16) & 0xff] - ^ crc32c_table2[0][high2 >> 24]; - next += 12; - len -= 12; - } -#endif - while (len) - { - crc = crc32c_table2[0][(crc ^ *next++) & 0xff] ^ (crc >> 8); - --len; - } - return (uint32_t)crc ^ 0xffffffff; -} - - -/****************************************************************************** - * * - * Hardware Algorithm - SSE 4.2 * - * * - ******************************************************************************/ - -/* Multiply a matrix times a vector over the Galois field of two elements, - GF(2). Each element is a bit in an unsigned integer. mat must have at - least as many entries as the power of two for most significant one bit in - vec. */ -static inline uint32_t gf2_matrix_times(uint32_t *mat, uint32_t vec) -{ - uint32_t sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* Multiply a matrix by itself over GF(2). Both mat and square must have 32 - rows. */ -static inline void gf2_matrix_square(uint32_t *square, uint32_t *mat) -{ - int n; - - for (n = 0; n < 32; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* Construct an operator to apply len zeros to a crc. len must be a power of - two. If len is not a power of two, then the result is the same as for the - largest power of two less than len. The result for len == 0 is the same as - for len == 1. A variant of this routine could be easily written for any - len, but that is not needed for this application. */ -static void crc32c_zeros_op(uint32_t *even, size_t len) -{ - int n; - uint32_t row; - uint32_t odd[32]; /* odd-power-of-two zeros operator */ - - /* Put operator for one zero bit in odd. */ - odd[0] = POLY; /* CRC32C polynomial */ - row = 1; - for (n = 1; n < 32; n++) { - odd[n] = row; - row <<= 1; - } - - /* Put operator for two zero bits in even. */ - gf2_matrix_square(even, odd); - - /* Put operator for four zero bits in odd. */ - gf2_matrix_square(odd, even); - - /* First square will put the operator for one zero byte (eight zero bits), - in even -- next square puts operator for two zero bytes in odd, and so - on, until len has been rotated down to zero. */ - do { - gf2_matrix_square(even, odd); - len >>= 1; - if (len == 0) - return; - gf2_matrix_square(odd, even); - len >>= 1; - } while (len); - - /* Answer ended up in odd -- copy to even. */ - for (n = 0; n < 32; n++) - even[n] = odd[n]; -} - -/* Take a length and build four lookup tables for applying the zeros operator - for that length, byte-by-byte on the operand. */ -static void crc32c_zeros(uint32_t zeros[][256], size_t len) -{ - uint32_t n; - uint32_t op[32]; - - crc32c_zeros_op(op, len); - for (n = 0; n < 256; n++) { - zeros[0][n] = gf2_matrix_times(op, n); - zeros[1][n] = gf2_matrix_times(op, n << 8); - zeros[2][n] = gf2_matrix_times(op, n << 16); - zeros[3][n] = gf2_matrix_times(op, n << 24); - } -} - -/* Apply the zeros operator table to crc. */ -static inline uint32_t crc32c_shift(uint32_t zeros[][256], uint32_t crc) -{ - return zeros[0][crc & 0xff] ^ zeros[1][(crc >> 8) & 0xff] ^ - zeros[2][(crc >> 16) & 0xff] ^ zeros[3][crc >> 24]; -} - -/* Block sizes for three-way parallel crc computation. LONG and SHORT must - both be powers of two. The associated string constants must be set - accordingly, for use in constructing the assembler instructions. */ -#define LONG 8192 -#define LONGx1 "8192" -#define LONGx2 "16384" -#define SHORT 256 -#define SHORTx1 "256" -#define SHORTx2 "512" - -/* Tables for hardware algorithm that shift a crc by LONG and SHORT zeros. */ -static uint32_t crc32c_long[4][256]; -static uint32_t crc32c_short[4][256]; - -/* Flag to indicate if crc32c_init_hw() has been called. */ -static int crc32c_hw_initialized = 0; - - - - -#if defined(__x86_64__) /* @RRL: to compile for ARM */ - - - -static void crc32c_init_hw(void) -{ - crc32c_zeros(crc32c_long, LONG); - crc32c_zeros(crc32c_short, SHORT); - crc32c_hw_initialized = 1; -} - -/* Compute CRC32C checksum. */ -uint32_t crc32c_hw(uint32_t crc, const void *buf, size_t len) -{ - const unsigned char *next = buf; - const unsigned char *end; - uint64_t crc0, crc1, crc2; /* need to be 64 bits for crc32q */ - - /* Populate shift tables the first time through. */ - if (!crc32c_hw_initialized) - crc32c_init_hw(); - - /* Pre-process the crc. */ - crc0 = crc ^ 0xffffffff; - - /* Compute the crc for up to seven leading bytes to bring the data pointer - to an eight-byte boundary. */ - while (len && ((uintptr_t)next & 7) != 0) { - __asm__("crc32b\t" "(%1), %0" - : "=r"(crc0) - : "r"(next), "0"(crc0)); - next++; - len--; - } - - /* Compute the crc on sets of LONG*3 bytes, executing three independent crc - instructions, each on LONG bytes -- this is optimized for the Nehalem, - Westmere, Sandy Bridge, and Ivy Bridge architectures, which have a - throughput of one crc per cycle, but a latency of three cycles. */ - while (len >= LONG*3) { - crc1 = 0; - crc2 = 0; - end = next + LONG; - do { - __asm__("crc32q\t" "(%3), %0\n\t" - "crc32q\t" LONGx1 "(%3), %1\n\t" - "crc32q\t" LONGx2 "(%3), %2" - : "=r"(crc0), "=r"(crc1), "=r"(crc2) - : "r"(next), "0"(crc0), "1"(crc1), "2"(crc2)); - next += 8; - } while (next < end); - crc0 = crc32c_shift(crc32c_long, crc0) ^ crc1; - crc0 = crc32c_shift(crc32c_long, crc0) ^ crc2; - next += LONG*2; - len -= LONG*3; - } - - /* Do the same thing, but now on SHORT*3 blocks for the remaining data less - than a LONG*3 block. */ - while (len >= SHORT*3) { - crc1 = 0; - crc2 = 0; - end = next + SHORT; - do { - __asm__("crc32q\t" "(%3), %0\n\t" - "crc32q\t" SHORTx1 "(%3), %1\n\t" - "crc32q\t" SHORTx2 "(%3), %2" - : "=r"(crc0), "=r"(crc1), "=r"(crc2) - : "r"(next), "0"(crc0), "1"(crc1), "2"(crc2)); - next += 8; - } while (next < end); - crc0 = crc32c_shift(crc32c_short, crc0) ^ crc1; - crc0 = crc32c_shift(crc32c_short, crc0) ^ crc2; - next += SHORT*2; - len -= SHORT*3; - } - - /* Compute the crc on the remaining eight-byte units less than a SHORT*3 - block. */ - end = next + (len - (len & 7)); - while (next < end) { - __asm__("crc32q\t" "(%1), %0" - : "=r"(crc0) - : "r"(next), "0"(crc0)); - next += 8; - } - len &= 7; - - /* Compute the crc for up to seven trailing bytes. */ - while (len) { - __asm__("crc32b\t" "(%1), %0" - : "=r"(crc0) - : "r"(next), "0"(crc0)); - next++; - len--; - } - - /* Return a post-processed crc. */ - return (uint32_t)crc0 ^ 0xffffffff; -} - - - -#endif /* @RRL: to compile for ARM */ - -/****************************************************************************** - * * - * Other Functions * - * * - ******************************************************************************/ - -/* Variables to store information on hardware support. */ -static int crc32c_hardware_support = 0; -static int crc32c_hardware_checked = 0; - -/* Check for hardware support (SSE 4.2). Note that this does not check for - the existence of the cpuid instruction itself, which was introduced on the - 486SL in 1992, so this will fail on earlier x86 processors. cpuid works - on all Pentium and later processors. */ -int crc32c_hw_support() -{ -#if defined(__x86_64__) /* @RRL: to compile for ARM */ - if (!crc32c_hardware_checked) { - do { - uint32_t eax, ecx; - eax = 1; - __asm__("cpuid" - : "=c"(ecx) - : "a"(eax) - : "%ebx", "%edx"); - (crc32c_hardware_support) = (ecx >> 20) & 1; - } while (0); - crc32c_hardware_checked = 1; - } - return crc32c_hardware_support; -#else - return 0; -#endif - -} - -/* Disable hardware algorithm even if supported by hardware. */ -void crc32c_hw_disable() -{ - crc32c_hardware_support = 0; - crc32c_hardware_checked = 1; -} - -/* Compute CRC32C checksum. Use hardware algorithm if supported, - fall back on software algorithm otherwise. */ -uint32_t crc32c(uint32_t crc, const void *buf, size_t len) -{ -#if defined(__x86_64__) /* @RRL: to compile for ARM */ - return crc32c_hw_support() ? crc32c_hw(crc, buf, len) : crc32c_sw(crc, buf, len); -#else - return crc32c_sw(crc, buf, len); -#endif -} diff --git a/3rdparty/crc32c_adler/crc32c_adler.h b/3rdparty/crc32c_adler/crc32c_adler.h deleted file mode 100755 index a983ecfbe1..0000000000 --- a/3rdparty/crc32c_adler/crc32c_adler.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - CRC32C_ADLER -- Computes CRC32C Checksums - Version 1.2, Date 05/21/18 - Copyright (C) 2013 Mark Adler <madler@alumni.caltech.edu> - Copyright (C) 2018 Fonic <https://github.com/fonic> - - Provides both a hardware-accelerated algorithm (*) and a software algorithm. - Note that this computes CRC32C checksums, not CRC32 (without 'C') checksums - used by Ethernet, gzip, etc. - - (*) CRC instruction on Intel SSE 4.2 processors. SSE 4.2 was first supported - by Nehalem processors introduced in November, 2008. - - Version history: - 1.0 10 Feb 2013 First version - 1.1 1 Aug 2013 Correct comments on why three crc instructions in parallel - 1.2 21 May 2018 Add header file, revise hardware support check, eliminate - pthreads, restructure code, revise comments and description - - Version 1.1 by Mark Adler was originally published here: - https://stackoverflow.com/a/17646775 - - This software is provided 'as-is', without any express or implied - warranty. In no event will the author be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#ifndef CRC32C_ADLER_H -#define CRC32C_ADLER_H - -#include <stdint.h> - -#if defined(__cplusplus) -extern "C" { -#endif - -/* Compute CRC32C checksum using software algorithm (1). */ -uint32_t crc32c_sw(uint32_t crci, const void *buf, size_t len); - -/* Compute CRC32C checksum using software algorithm (2). */ -uint32_t crc32c_sw2(uint32_t crci, const void *buf, size_t len); - -/* Compute CRC32C checksum using hardware algorithm. */ -uint32_t crc32c_hw(uint32_t crc, const void *buf, size_t len); - -/* Check if hardware-support (i.e. SSE 4.2) is available. */ -int crc32c_hw_support(); - -/* Disable hardware algorithm even if supported by hardware. */ -void crc32c_hw_disable(); - -/* Compute CRC32C checksum. Use hardware algorithm if supported, - fall back on software algorithm otherwise. */ -uint32_t crc32c(uint32_t crc, const void *buf, size_t len); - -#if defined(__cplusplus) -} -#endif -#endif // CRC32C_ADLER_H diff --git a/3rdparty/crc32c_adler/example-dht.c b/3rdparty/crc32c_adler/example-dht.c deleted file mode 100755 index 5bd05b1e6b..0000000000 --- a/3rdparty/crc32c_adler/example-dht.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - TODO describe example -*/ -#define _GNU_SOURCE /* random, srandom*/ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> -#include <fcntl.h> /* open, close etc. */ -#include <string.h> /* memcpy */ -#include <netinet/in.h> /* AF_INET, INET_ADDRSTRLEN etc. */ -#include <arpa/inet.h> /* inet_ntop */ - -#include "crc32c_adler.h" - -/* Convert id to hex string of formate used in BEP 42. */ -char id_hex_str[20*2+2+1]; /* 20 bytes x 2 characters + 2 x ' ' + '\0' */ -const char* -id_to_hex(const unsigned char *id) -{ - //const char* hex_chr = "0123456789ABCDEF"; - const char* hex_chr = "0123456789abcdef"; - for(int i=0,j=0; i < 20 && j < sizeof(id_hex_str)-2; i++) { - id_hex_str[j++] = hex_chr[ (id[i]>>4) & 0x0F ]; - id_hex_str[j++] = hex_chr[ id[i] & 0x0F ]; - if (i == 2 || i == 18) { - id_hex_str[j++] = ' '; - } - } - id_hex_str[sizeof(id_hex_str)-1] = '\0'; - return id_hex_str; -} - -/* Generate node ID from IP address + predefined rand using example algorithm - provided in BEP 42. - - Parameters: - ip IPv4 or IPv6 address (network byte order) - iplen number of octets to consider in ip (4 or 8) - id resulting node ID - rand predefined random value */ -void crc32c_id(const uint8_t* ip, int iplen, uint8_t id[20], uint32_t rand) -{ - uint8_t v4_mask[] = { 0x03, 0x0f, 0x3f, 0xff }; - uint8_t v6_mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; - uint8_t* mask = iplen == 4 ? v4_mask : v6_mask; - - uint8_t ip_copy[8]; - memcpy(ip_copy, ip, iplen); - - for (int i = 0; i < iplen; ++i) - ip_copy[i] &= mask[i]; - - //uint32_t rand = random() & 0xff; - uint8_t r = rand & 0x7; - ip_copy[0] |= r << 5; - - uint32_t crc = 0; - crc = crc32c(crc, ip_copy, iplen); - - /* only take the top 21 bits from crc */ - id[0] = (crc >> 24) & 0xff; - id[1] = (crc >> 16) & 0xff; - id[2] = ((crc >> 8) & 0xf8) | (random() & 0x7); - for (int i = 3; i < 19; ++i) id[i] = random(); - id[19] = rand; -} - -/* Find how many bits two ids have in common. */ -int common_bits(const unsigned char *id1, const unsigned char *id2) -{ - int i, j; - unsigned char xor; - for(i = 0; i < 20; i++) { - if(id1[i] != id2[i]) - break; - } - - if(i == 20) - return 160; - - xor = id1[i] ^ id2[i]; - - j = 0; - while((xor & 0x80) == 0) { - xor <<= 1; - j++; - } - - return 8 * i + j; -} - -/* Check if a node ID is correct in the sense of BEP 42. */ -int check_id(const uint8_t id1[20], const uint8_t* ip, int iplen, uint32_t rand) -{ - /* Generate ID from IP + rand -> id2. */ - uint8_t id2[20]; - crc32c_id(ip, iplen, id2, rand); - - /* Compare id1 with id2: - - the first 21 bits must match - - the last byte must match rand */ - int cbits = common_bits(id1, id2); - if (cbits < 21) { - printf("Only the first %i bits match (expected: 21)\n", cbits); - return 0; - } - if (id1[19] != id2[19]) { - printf("Last byte does not match (expected: %u, got: %u)\n", id2[19], id1[19]); - return 0; - } - return 1; -} - -/* Main. */ -int main(int argc, char **argv) -{ - (void)argc; - (void)argv; - - /* Print which CRC32C algorithm is used. */ - printf("\nUsing %s algorithm.\n\n", crc32c_hw_support() ? "hardware-accelerated (SSE 4.2)" : "software"); - - /* Seed random. */ - int fd = open("/dev/urandom", O_RDONLY); - if(fd < 0) { - perror("open(random)"); - exit(1); - } - unsigned seed; - read(fd, &seed, sizeof(seed)); - srandom(seed); - close(fd); - - /* Example IP/rand combinations as used in BEP 42. */ - uint8_t ip[5][4] = { - { 124, 31, 75, 21 }, - { 21, 75, 31, 124 }, - { 65, 23, 51, 170 }, - { 84, 124, 73, 14 }, - { 43, 213, 53, 83 } - }; - uint32_t rand[] = { - 1, - 86, - 22, - 65, - 90 - }; - int iplen = 4; - uint8_t id[20]; - - printf("IP rand Node ID Ok?\n"); - printf("=============== ===== ========================================== ====\n"); - for (int i = 0; i < 5; ++i) { - crc32c_id(ip[i], iplen, id, rand[i]); - char ipstr[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, ip[i], ipstr, sizeof(ipstr)); - printf("%-15s %2u %s %s\n", ipstr, rand[i], id_to_hex(id), (check_id(id, ip[i], 4, rand[i]) ? "yes" : "no")); - } - - return 0; -} diff --git a/3rdparty/crc32c_adler/example-stdin.c b/3rdparty/crc32c_adler/example-stdin.c deleted file mode 100755 index d64fdb6a8a..0000000000 --- a/3rdparty/crc32c_adler/example-stdin.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - TODO describe example -*/ -#include <stdio.h> -#include <stdlib.h> -#include <stdint.h> -#include <unistd.h> - -#include "crc32c_adler.h" - -#define SIZE (262144*3) -#define CHUNK SIZE - -int main(int argc, char **argv) -{ - char *buf; - ssize_t got; - size_t off, n; - uint32_t crc; - - (void)argv; - crc = 0; - buf = malloc(SIZE); - if (buf == NULL) { - fputs("out of memory", stderr); - return 1; - } - while ((got = read(0, buf, SIZE)) > 0) { - off = 0; - do { - n = (size_t)got - off; - if (n > CHUNK) - n = CHUNK; - crc = argc > 1 ? crc32c_sw(crc, buf + off, n) : - crc32c(crc, buf + off, n); - off += n; - } while (off < (size_t)got); - } - free(buf); - if (got == -1) { - fputs("read error\n", stderr); - return 1; - } - printf("%08x\n", crc); - return 0; -} diff --git a/CMakeLists.txt b/CMakeLists.txt index 7839fd7e97..9f7200e25d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,7 @@ if(NOT DEFINED CELLFRAME_MODULES) add_subdirectory(dap-sdk) + set(CELLFRAME_SDK_STANDALONE_BUILD ON) endif() message("Cellframe modules: ${CELLFRAME_MODULES}") @@ -81,11 +82,6 @@ if (CELLFRAME_MODULES MATCHES "test-framework") set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_test) endif() -add_subdirectory(3rdparty/crc32c_adler) # https://github.com/fonic/crc32c_adler -include_directories(3rdparty/crc32c_adler) -set(CELLFRAME_LIBS ${CELLFRAME_LIBS} crc32c_adler) - - if (BUILD_WITH_ZIP) add_subdirectory(3rdparty/libzip) include_directories(3rdparty/libzip/lib) diff --git a/dap-sdk b/dap-sdk index 169b47e624..02a8df370b 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 169b47e624b08e3a5907c06d673ae41bb2338803 +Subproject commit 02a8df370be77507ea281fc19d8fcc49114e31f3 diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 353f1a9b41..f5d8b8fd44 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -36,6 +36,11 @@ if (CELLFRAME_MODULES MATCHES "srv") add_subdirectory(channel/chain-net-srv) endif() +# No consensus +if (CELLFRAME_MODULES MATCHES "cs-none") + add_subdirectory(type/none) +endif() + # Consensus type dag if (CELLFRAME_MODULES MATCHES "cs-dag-") add_subdirectory(type/dag) @@ -76,11 +81,6 @@ 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) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index f13ddb8e6c..31b5d86b14 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -30,7 +30,6 @@ #include "dap_chain_common.h" #include "dap_chain_datum.h" #include "dap_chain_datum_decree.h" -#include "dap_chain_pvt.h" #include "dap_common.h" #include "dap_strfuncs.h" #include "dap_file_utils.h" @@ -38,7 +37,7 @@ #include "dap_chain.h" #include "dap_chain_ledger.h" #include "dap_cert.h" -#include "dap_chain_ledger.h" +#include "dap_chain_cell.h" #include "dap_chain_cs.h" #include "dap_cert_file.h" #include <uthash.h> @@ -117,12 +116,20 @@ dap_chain_t *dap_chain_create(const char *a_chain_net_name, const char *a_chain_ .cell_rwlock = PTHREAD_RWLOCK_INITIALIZER, .atom_notifiers = NULL }; - DAP_CHAIN_PVT_LOCAL_NEW(l_ret); - + dap_chain_pvt_t *l_chain_pvt = DAP_NEW_Z(dap_chain_pvt_t); + if (!l_chain_pvt) { + DAP_DEL_Z(l_ret->name); + DAP_DEL_Z(l_ret->net_name); + DAP_DELETE(l_ret); + log_it(L_CRITICAL, "Memory allocation error"); + return NULL; + } + l_ret->_pvt = l_chain_pvt; dap_chain_item_t *l_ret_item = DAP_NEW_Z(dap_chain_item_t); if (!l_ret_item) { - DAP_DELETE(l_ret->name); - DAP_DELETE(l_ret->net_name); + DAP_DEL_Z(l_ret->name); + DAP_DEL_Z(l_ret->net_name); + DAP_DELETE(l_ret->_pvt); DAP_DELETE(l_ret); log_it(L_CRITICAL, "Memory allocation error"); return NULL; @@ -779,3 +786,15 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) const char* dap_chain_get_path(dap_chain_t *a_chain){ return DAP_CHAIN_PVT(a_chain)->file_storage_dir; } + +void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg) +{ + dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t); + if (!l_notifier) { + log_it(L_CRITICAL, "Memory allocation error"); + return; + } + l_notifier->callback = a_callback; + l_notifier->cb_arg = a_cb_arg; + DAP_CHAIN_PVT(a_chain)->mempool_notifires = dap_list_append(DAP_CHAIN_PVT(a_chain)->mempool_notifires, l_notifier); +} diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 290f4d9a0e..22b9da7680 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -26,7 +26,6 @@ #include "dap_chain.h" #include "dap_chain_cell.h" #include "dap_chain_cs.h" -#include "dap_chain_pvt.h" #include "dap_common.h" #include "dap_config.h" #include "dap_strfuncs.h" diff --git a/modules/chain/dap_chain_cs.c b/modules/chain/dap_chain_cs.c index c3c4c9bd11..4780e60b82 100644 --- a/modules/chain/dap_chain_cs.c +++ b/modules/chain/dap_chain_cs.c @@ -26,7 +26,6 @@ #include "uthash.h" #include "utlist.h" #include "dap_chain_cs.h" -#include "dap_chain_pvt.h" #define LOG_TAG "dap_chain_cs" @@ -81,18 +80,13 @@ void dap_chain_cs_type_add (const char * a_cs_str, dap_chain_callback_new_cfg_t * @param a_chain_cfg * @return */ -int dap_chain_cs_type_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) +int dap_chain_cs_type_create(const char *a_type, dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { dap_chain_callback_new_cfg_item_t *l_item = NULL; - - HASH_FIND_STR(s_class_callbacks,dap_config_get_item_str( a_chain_cfg, "chain", "consensus"), l_item ); - if ( l_item ) { - l_item->callback_init( a_chain, a_chain_cfg); - // TODO - return 0; - } else { - return -1; - } + HASH_FIND_STR(s_class_callbacks, a_type, l_item); + if (l_item && l_item->callback_init) + return l_item->callback_init(a_chain, a_chain_cfg); + return -1; } @@ -130,9 +124,10 @@ int dap_chain_cs_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) const char *l_consensus = dap_config_get_item_str( a_chain_cfg, "chain", "consensus"); if(l_consensus) HASH_FIND_STR(s_cs_callbacks, l_consensus, l_item ); - if ( l_item ) { + if (l_item) { log_it(L_NOTICE,"Consensus \"%s\" found, prepare to parse config file",l_item->name ); - l_item->callback_init( a_chain, a_chain_cfg); + if (l_item->callback_init) + l_item->callback_init(a_chain, a_chain_cfg); DAP_CHAIN_PVT(a_chain)->cs_name = l_item->name; return 0; } else { diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index b4d014e3f6..5f8a2aa8a8 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -38,6 +38,7 @@ #include "utlist.h" #include "dap_chain_common.h" +#include "dap_chain_datum.h" #include "dap_events.h" #include "dap_math_ops.h" #include "dap_list.h" @@ -52,7 +53,6 @@ #include "dap_chain_datum_token.h" #include "dap_global_db.h" #include "dap_chain_ledger.h" -#include "dap_chain_pvt.h" #include "json.h" #include "json_object.h" #include "dap_notify_srv.h" @@ -2055,7 +2055,7 @@ dap_list_t *dap_chain_ledger_token_info(dap_ledger_t *a_ledger) || (l_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) { char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply); char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply); - s_datum_token_dump_tsd(l_str_tmp, l_token_item->datum_token, l_token_item->datum_token_size, "hex"); + dap_chain_datum_token_dump_tsd(l_str_tmp, l_token_item->datum_token, l_token_item->datum_token_size, "hex"); size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size; dap_chain_datum_token_certs_dump(l_str_tmp, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size, l_certs_field_size, "hex"); @@ -2232,7 +2232,7 @@ static void s_threshold_emission_free(dap_ledger_t *a_ledger){ * @param a_values * @param a_arg */ -static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -2283,7 +2283,7 @@ static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_context_t *a * @param a_values * @param a_arg */ -static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -2320,7 +2320,7 @@ static bool s_load_cache_gdb_loaded_spent_txs_callback(dap_global_db_context_t * * @param a_values * @param a_arg */ -static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -2352,7 +2352,7 @@ static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_context_t *a_glob return true; } -static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -2393,7 +2393,7 @@ static bool s_load_cache_gdb_loaded_stake_lock_callback(dap_global_db_context_t * @param a_arg * @return Always true thats means to clear up a_values */ -static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -2445,7 +2445,7 @@ static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_context_t * * @param a_values * @param a_arg */ -static bool s_load_cache_gdb_loaded_tokens_callback(dap_global_db_context_t *a_global_db_context, +static bool s_load_cache_gdb_loaded_tokens_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -3505,10 +3505,10 @@ bool s_tx_match_sign(dap_chain_datum_token_emission_t *a_datum_emission, dap_cha return false; } -static int s_callback_sign_compare(const void *a_list_elem, const void *a_sign_elem) +static int s_callback_sign_compare(dap_list_t *a_list_elem, dap_list_t *a_sign_elem) { - dap_pkey_t* l_key = (dap_pkey_t*)((dap_list_t*)a_list_elem)->data; - dap_sign_t* l_sign = (dap_sign_t*)((dap_list_t*)a_sign_elem)->data; + dap_pkey_t *l_key = (dap_pkey_t *)a_list_elem->data; + dap_sign_t *l_sign = (dap_sign_t *)a_sign_elem->data; if (!l_key || !l_sign) { log_it(L_CRITICAL, "Invalid argument"); return -1; @@ -4610,7 +4610,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d .value = l_tx_cache, .value_len = l_tx_cache_sz, .group = l_ledger_cache_group, - .type = DAP_DB$K_OPTYPE_ADD + .type = DAP_GLOBAL_DB_OPTYPE_ADD }; l_cache_used_outs[i].timestamp = dap_nanotime_now(); } @@ -4789,7 +4789,7 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d .value = l_tx_cache, .value_len = l_tx_cache_sz, .group = l_ledger_cache_group, - .type = DAP_DB$K_OPTYPE_ADD + .type = DAP_GLOBAL_DB_OPTYPE_ADD }; l_cache_used_outs[0].timestamp = dap_nanotime_now(); // Apply it with single DB transaction diff --git a/modules/chain/dap_chain_pvt.c b/modules/chain/dap_chain_pvt.c deleted file mode 100644 index 0eb4618032..0000000000 --- a/modules/chain/dap_chain_pvt.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net https:/gitlab.com/demlabs - * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2018 - * All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#include <stdio.h> -#include <sys/types.h> -#include <dirent.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "dap_chain_pvt.h" - - -#define LOG_TAG "dap_chain_pvt" - - -void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg) -{ - dap_chain_gdb_notifier_t *l_notifier = DAP_NEW(dap_chain_gdb_notifier_t); - if (!l_notifier) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - l_notifier->callback = a_callback; - l_notifier->cb_arg = a_cb_arg; - DAP_CHAIN_PVT(a_chain)->mempool_notifires = dap_list_append(DAP_CHAIN_PVT(a_chain)->mempool_notifires, l_notifier); -} - -/** - * @brief Sets the last hash of a remote node. - * - * @param a_node_addr a node adress - * @param a_chain a pointer to the chain stucture - * @param a_hash a - * @return true - * @return false - */ -bool dap_chain_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash) -{ - char l_key[DAP_GLOBAL_DB_KEY_MAX]; - - snprintf(l_key, sizeof(l_key) - 1, "%"DAP_UINT64_FORMAT_U"%s%s", a_node_addr, a_chain->net_name, a_chain->name); - return dap_global_db_set(GROUP_LOCAL_NODE_LAST_ID, l_key, a_hash, sizeof(dap_chain_hash_fast_t), false, NULL, NULL ) == 0; -} - -/** - * @brief Gets the last hash of a remote node. - * - * @param a_node_addr a node adress - * @param a_chain a pointer to a chain structure - * @return Returns a hash if successful. - */ -dap_chain_hash_fast_t *dap_chain_db_get_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain) -{ - char l_key[DAP_GLOBAL_DB_KEY_MAX]; - - snprintf(l_key, sizeof(l_key) - 1, "%"DAP_UINT64_FORMAT_U"%s%s", a_node_addr, a_chain->net_name, a_chain->name); - return (dap_chain_hash_fast_t *)dap_global_db_get_sync(GROUP_LOCAL_NODE_LAST_ID, l_key, NULL, NULL, NULL); -} diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 490c9fb689..faaae495e2 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -31,6 +31,7 @@ #include "dap_chain_datum.h" #include "dap_chain_datum_tx.h" #include "dap_cert.h" +#include "dap_global_db_cluster.h" typedef struct dap_chain dap_chain_t; @@ -220,6 +221,24 @@ typedef struct dap_chain_atom_notifier { void *arg; } dap_chain_atom_notifier_t; +typedef struct dap_chain_gdb_notifier { + dap_store_obj_callback_notify_t callback; + void *cb_arg; +} dap_chain_gdb_notifier_t; + +typedef struct dap_chain_pvt +{ + dap_chain_t * chain; + char * file_storage_dir; + char * cs_name; + bool cs_started; + int celled; + dap_list_t *mempool_notifires; + bool need_reorder; +} dap_chain_pvt_t; + +#define DAP_CHAIN_PVT(a) ((dap_chain_pvt_t *)a->_pvt) + #define DAP_CHAIN(a) ( (dap_chain_t *) (a)->_inheritor) DAP_STATIC_INLINE int dap_chain_id_parse(const char *a_id_str, dap_chain_id_t *a_id) @@ -253,3 +272,4 @@ bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_ ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id); int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name); const char* dap_chain_get_path(dap_chain_t *a_chain); +void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); diff --git a/modules/chain/include/dap_chain_cs.h b/modules/chain/include/dap_chain_cs.h index f76d443f57..e29a870cc3 100644 --- a/modules/chain/include/dap_chain_cs.h +++ b/modules/chain/include/dap_chain_cs.h @@ -40,4 +40,4 @@ void dap_chain_cs_add (const char * a_cs_str, dap_chain_callback_new_cfg_t a_ca int dap_chain_cs_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); void dap_chain_cs_type_add (const char * a_cs_str, dap_chain_callback_new_cfg_t a_callback_init); -int dap_chain_cs_type_create(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); +int dap_chain_cs_type_create(const char *a_type, dap_chain_t * a_chain, dap_config_t * a_chain_cfg); diff --git a/modules/chain/include/dap_chain_pvt.h b/modules/chain/include/dap_chain_pvt.h deleted file mode 100644 index 2bc3430154..0000000000 --- a/modules/chain/include/dap_chain_pvt.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net https:/gitlab.com/demlabs - * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2018 - * All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#pragma once -#include <stdio.h> -#include <stdint.h> -#include "dap_chain.h" -#include "dap_chain_cs.h" -#include "dap_chain_cell.h" -#include "dap_common.h" -#include "dap_global_db_remote.h" - -/** - * @struct dap_chain_pvt - * @brief Internal blochain data, mostly aggregated - * - */ -typedef struct dap_chain_pvt -{ - dap_chain_t * chain; - char * file_storage_dir; - char * cs_name; - bool cs_started; - int celled; - dap_list_t *mempool_notifires; - bool need_reorder; -} dap_chain_pvt_t; - -typedef struct dap_chain_gdb_notifier { - dap_store_obj_callback_notify_t callback; - void *cb_arg; -} dap_chain_gdb_notifier_t; - -void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); -bool dap_chain_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash); -dap_chain_hash_fast_t *dap_chain_db_get_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain); - -#define DAP_CHAIN_PVT(a) ((dap_chain_pvt_t *) a->_pvt ) - -#define DAP_CHAIN_PVT_LOCAL(a) dap_chain_pvt_t * l_chain_pvt = DAP_CHAIN_PVT(a) - -#define DAP_CHAIN_PVT_LOCAL_NEW(a) dap_chain_pvt_t * l_chain_pvt = DAP_NEW_Z(dap_chain_pvt_t); a->_pvt = l_chain_pvt diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 4f5c08e3b4..fc4c89d08e 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -1039,7 +1039,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) } l_request->err_code = 0; - strncpy(l_request->ip_send, a_ch->stream->esocket->hostaddr, INET_ADDRSTRLEN - 1); + strncpy(l_request->ip_send, a_ch->stream->esocket->remote_addr_str, INET_ADDRSTRLEN - 1); l_request->ip_send[INET_ADDRSTRLEN - 1] = '\0'; // Compiler warning escape l_request->recv_time2 = dap_nanotime_now(); diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index 4c48527ab9..852e1daa3d 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -47,7 +47,6 @@ #include "uthash.h" #include "dap_http_client.h" #include "dap_global_db.h" -#include "dap_global_db_remote.h" #include "dap_stream.h" #include "dap_stream_ch_pkt.h" #include "dap_stream_ch_proc.h" @@ -63,68 +62,6 @@ static void s_stream_ch_delete(dap_stream_ch_t* ch, void* arg); static void s_stream_ch_packet_in(dap_stream_ch_t* ch, void* arg); static void s_stream_ch_packet_out(dap_stream_ch_t* ch, void* arg); -typedef struct dap_chain_net_session_data { - uint32_t session_id; - dap_chain_node_addr_t addr_remote; - UT_hash_handle hh; -} dap_chain_net_session_data_t; - -// list of active sessions -static dap_chain_net_session_data_t *s_chain_net_data = NULL; -// for separate access to session_data_t -static pthread_mutex_t s_hash_mutex = PTHREAD_MUTEX_INITIALIZER; - - -static dap_chain_net_session_data_t* session_data_find(uint32_t a_id) -{ - dap_chain_net_session_data_t *l_sdata; - pthread_mutex_lock(&s_hash_mutex); - HASH_FIND(hh, s_chain_net_data, &a_id, sizeof(uint32_t), l_sdata); - pthread_mutex_unlock(&s_hash_mutex); - return l_sdata; -} - -static void session_data_del(uint32_t a_id) -{ - dap_chain_net_session_data_t *l_sdata; - pthread_mutex_lock(&s_hash_mutex); - HASH_FIND(hh, s_chain_net_data, &a_id, sizeof(uint32_t), l_sdata); - if(l_sdata) { - // Clang bug at this, l_sdata should change at every loop cycle - HASH_DEL(s_chain_net_data, l_sdata); - DAP_DELETE(l_sdata); - } - pthread_mutex_unlock(&s_hash_mutex); -} - -static void session_data_del_all() -{ - dap_chain_net_session_data_t *l_sdata, *l_sdata_tmp; - pthread_mutex_lock(&s_hash_mutex); - HASH_ITER(hh, s_chain_net_data , l_sdata, l_sdata_tmp) - { - HASH_DEL(s_chain_net_data, l_sdata); - DAP_DELETE(l_sdata); - } - //HASH_CLEAR(hh,s_chain_net_data); - pthread_mutex_unlock(&s_hash_mutex); -} - - - -dap_chain_node_addr_t dap_stream_ch_chain_net_from_session_data_extract_node_addr(uint32_t a_session_id) { - dap_chain_node_addr_t l_addr= {0}; - dap_chain_net_session_data_t *l_sdata, *l_sdata_tmp; - pthread_mutex_lock(&s_hash_mutex); - HASH_ITER(hh, s_chain_net_data , l_sdata, l_sdata_tmp) { - if (l_sdata->session_id == a_session_id) { - l_addr = l_sdata->addr_remote; - } - } - pthread_mutex_unlock(&s_hash_mutex); - return l_addr; -} - /** * @brief dap_stream_ch_chain_net_init * @return always 0 @@ -143,8 +80,6 @@ int dap_stream_ch_chain_net_init() */ void dap_stream_ch_chain_net_deinit() { - //printf("* del all sessions\n"); - session_data_del_all(); } /** @@ -159,22 +94,6 @@ void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch); l_ch_chain_net->ch = a_ch; pthread_mutex_init(&l_ch_chain_net->mutex, NULL); - - // Create chain net session ever it created - dap_chain_net_session_data_t *l_sdata; - pthread_mutex_lock(&s_hash_mutex); - HASH_FIND(hh, s_chain_net_data, &a_ch->stream->session->id, sizeof(uint32_t), l_sdata); - if(l_sdata == NULL) { - l_sdata = DAP_NEW_Z(dap_chain_net_session_data_t); - if (!l_sdata) { - log_it(L_CRITICAL, "Memory allocation error"); - pthread_mutex_unlock(&s_hash_mutex); - return; - } - l_sdata->session_id = a_ch->stream->session->id; - HASH_ADD(hh, s_chain_net_data, session_id, sizeof(uint32_t), l_sdata); - } - pthread_mutex_unlock(&s_hash_mutex); } /** @@ -185,12 +104,6 @@ void s_stream_ch_new(dap_stream_ch_t* a_ch, void* a_arg) void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg) { (void) a_arg; - dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch); - if(l_ch_chain_net) { - pthread_mutex_lock(&l_ch_chain_net->mutex); - session_data_del(a_ch->stream->session->id); - pthread_mutex_unlock(&l_ch_chain_net->mutex); - } DAP_DEL_Z(a_ch->internal); } @@ -202,13 +115,6 @@ void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg) void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) { dap_stream_ch_chain_net_t * l_ch_chain_net = DAP_STREAM_CH_CHAIN_NET(a_ch); - dap_chain_net_session_data_t *l_session_data = session_data_find(a_ch->stream->session->id); - if (l_session_data == NULL) { - log_it(L_ERROR, "Can't find chain net session for stream session %d", a_ch->stream->session->id); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); - return; - } - if(l_ch_chain_net) { pthread_mutex_lock(&l_ch_chain_net->mutex); dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg; @@ -246,169 +152,109 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if (!l_error && l_ch_chain_net_pkt) { size_t l_ch_chain_net_pkt_data_size = l_ch_pkt->hdr.data_size - sizeof(dap_stream_ch_chain_net_pkt_hdr_t); switch (l_ch_pkt->hdr.type) { - // received ping request - > send pong request - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING: { - //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PING"); - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG, - l_ch_chain_net_pkt->hdr.net_id,NULL, 0); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - } - break; - // receive pong request -> send nothing - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG: { - //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PONG"); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); - } + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE: + assert(dap_stream_node_addr_not_null(&a_ch->stream->node)); + dap_chain_net_add_cluster_link(l_net, &a_ch->stream->node); + break; + // received ping request - > send pong request + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING: + //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PING"); + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG, + l_ch_chain_net_pkt->hdr.net_id,NULL, 0); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + break; + // receive pong request -> send nothing + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG: + //log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_PONG"); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); break; - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR: { - log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR"); - if ( l_ch_chain_net_pkt_data_size == sizeof (dap_chain_node_addr_t) ) { - dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data; - if(l_session_data) - memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) ); - log_it(L_NOTICE,"Accepted remote node addr 0x%016"DAP_UINT64_FORMAT_X, l_addr->uint64); - }else { - log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size); - } - dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); - }break; - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE: { - log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE"); - if ( l_ch_chain_net_pkt_data_size == sizeof (dap_chain_node_addr_t) ) { - dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) l_ch_chain_net_pkt->data; - log_it(L_NOTICE,"Leased new node addr 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); - dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); - if ( l_net == NULL){ - char l_err_str[]="ERROR_NET_INVALID_ID"; - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , - l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str)); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - log_it(L_ERROR, "Invalid net id in packet"); - } else { - if (dap_db_set_cur_node_addr_exp( l_addr->uint64, l_net->pub.name )) - log_it(L_NOTICE,"Set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); - else - log_it(L_ERROR,"Can't set up cur node address 0x%016"DAP_UINT64_FORMAT_X,l_addr->uint64); - } - if(l_session_data) - memcpy( &l_session_data->addr_remote,l_addr,sizeof (*l_addr) ); - }else { - log_it(L_WARNING,"Wrong data secion size %zu",l_ch_chain_net_pkt_data_size); - } - dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); - }break; - // get current node address - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST: { - log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST"); - // get cur node addr - dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain_net_pkt->hdr.net_id); - uint64_t l_addr = l_net ? dap_chain_net_get_cur_node_addr_gdb_sync(l_net->pub.name) : 0; - size_t l_send_data_len = sizeof(uint64_t); - // send cur node addr - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR, - l_ch_chain_net_pkt->hdr.net_id, &l_addr, l_send_data_len); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - } break; - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST: { - log_it(L_INFO, "Get STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST"); - // gen node addr - dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); - if ( l_net == NULL){ - char l_err_str[]="ERROR_NET_INVALID_ID"; - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , l_ch_chain_net_pkt->hdr.net_id, - l_err_str,sizeof (l_err_str)); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - } else { - dap_chain_node_addr_t *l_addr_new = dap_chain_node_gen_addr(l_net->pub.id); - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE , - l_ch_chain_net_pkt->hdr.net_id, l_addr_new, sizeof (*l_addr_new)); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - if(l_session_data) - memcpy( &l_session_data->addr_remote,l_addr_new,sizeof (*l_addr_new) ); - DAP_DELETE(l_addr_new); - } - } break; - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{ - log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST"); - dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); - if ( l_net == NULL){ - char l_err_str[]="ERROR_NET_INVALID_ID"; - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , - l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str)); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - log_it(L_ERROR, "Invalid net id in packet"); - } else { - dap_chain_net_srv_order_t * l_orders = NULL; - dap_enc_key_t * enc_key_pvt = NULL; - dap_chain_t *l_chain = NULL; - DL_FOREACH(l_net->pub.chains, l_chain) - if(l_chain->callback_get_signing_certificate != NULL){ - enc_key_pvt = l_chain->callback_get_signing_certificate(l_chain); - if(enc_key_pvt) - break; - } - dap_sign_t *l_sign = NULL; - size_t sign_s = 0; - size_t l_orders_num = 0; - dap_stream_ch_chain_validator_test_t *send = NULL; - dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } }; - dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; - uint256_t l_price_min = {}; - uint256_t l_price_max = {}; - uint8_t flags = 0; - if(enc_key_pvt) + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{ + log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST"); + dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); + if ( l_net == NULL){ + char l_err_str[]="ERROR_NET_INVALID_ID"; + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , + l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str)); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + log_it(L_ERROR, "Invalid net id in packet"); + } else { + dap_chain_net_srv_order_t * l_orders = NULL; + dap_enc_key_t * enc_key_pvt = NULL; + dap_chain_t *l_chain = NULL; + DL_FOREACH(l_net->pub.chains, l_chain) + if(l_chain->callback_get_signing_certificate != NULL){ + enc_key_pvt = l_chain->callback_get_signing_certificate(l_chain); + if(enc_key_pvt) + break; + } + dap_sign_t *l_sign = NULL; + size_t sign_s = 0; + size_t l_orders_num = 0; + dap_stream_ch_chain_validator_test_t *send = NULL; + dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } }; + dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; + uint256_t l_price_min = {}; + uint256_t l_price_max = {}; + uint8_t flags = 0; + + if(enc_key_pvt) + { + flags = flags | F_CERT;//faund sert + l_sign = dap_sign_create(enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data, + l_ch_chain_net_pkt_data_size, 0); + if(l_sign) { - flags = flags | F_CERT;//faund sert - l_sign = dap_sign_create(enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data, - l_ch_chain_net_pkt_data_size, 0); - if(l_sign) - { - sign_s = dap_sign_get_size(l_sign); - flags = flags | D_SIGN;//data signed - } - else - flags = flags & ~D_SIGN;//data doesn't sign + sign_s = dap_sign_get_size(l_sign); + flags = flags | D_SIGN;//data signed } else - flags = flags & ~F_CERT;//Specified certificate not found + flags = flags & ~D_SIGN;//data doesn't sign + } + else + flags = flags & ~F_CERT;//Specified certificate not found - send = DAP_NEW_Z_SIZE(dap_stream_ch_chain_validator_test_t, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s); + send = DAP_NEW_Z_SIZE(dap_stream_ch_chain_validator_test_t, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s); #ifdef DAP_VERSION - strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version)); + strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version)); #endif - send->header.sign_size = sign_s; - //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10); - flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC; + send->header.sign_size = sign_s; + //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10); + flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC; + + dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid, + l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num); + flags = l_orders_num ? flags | F_ORDR : flags & ~F_ORDR; + bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false ); + bool auto_update = false; + if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0)) + auto_update = true; + else + auto_update = false; + flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN; + flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT; + send->header.flags = flags; + //add sign + if(sign_s) + memcpy(send->sign,l_sign,sign_s); + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY , + l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + if(l_sign) + DAP_DELETE(l_sign); + DAP_DELETE(send); + } + } break; - dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid, - l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num); - flags = l_orders_num ? flags | F_ORDR : flags & ~F_ORDR; - bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false ); - bool auto_update = false; - if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0)) - auto_update = true; - else - auto_update = false; - flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN; - flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT; - send->header.flags = flags; - //add sign - if(sign_s) - memcpy(send->sign,l_sign,sign_s); - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY , - l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_stream_ch_chain_validator_test_t) + sign_s); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - if(l_sign) - DAP_DELETE(l_sign); - DAP_DELETE(send); - } - }break; - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{ - log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY"); + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{ + log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY"); + + dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); + } break; - dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); - }break; + default: + log_it(L_ERROR, "Unknown paket type %hhu", l_ch_pkt->hdr.type); + break; } if(l_ch_chain_net->notify_callback) l_ch_chain_net->notify_callback(l_ch_chain_net,l_ch_pkt->hdr.type, l_ch_chain_net_pkt, diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h index 69c7f76238..11dcfcbb32 100644 --- a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h +++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h @@ -30,19 +30,15 @@ #include "dap_chain_node.h" #include "dap_stream_ch.h" -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_REQUEST 0x01 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x01 + #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING 0x02 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG 0x03 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST 0x14 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR 0x11 - -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST 0x17 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE 0x18 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x99 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE 0x44 #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c index 8fb6644105..114aba6dd3 100644 --- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c +++ b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c @@ -8,7 +8,6 @@ #include "dap_stream_ch_chain_voting.h" #include "dap_chain_net.h" #include "dap_client_pvt.h" -#include "dap_proc_queue.h" #include "dap_chain_node_cli.h" #include "dap_chain_cs_blocks.h" @@ -58,7 +57,7 @@ void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch s_pkt_in_callback_count++; } -static bool s_callback_pkt_in_call_all(UNUSED_ARG dap_proc_thread_t *a_thread, void *a_arg) +static bool s_callback_pkt_in_call_all(dap_proc_thread_t UNUSED_ARG *a_thread, void *a_arg) { dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = a_arg; for (size_t i = 0; i < s_pkt_in_callback_count; i++) { @@ -68,7 +67,7 @@ static bool s_callback_pkt_in_call_all(UNUSED_ARG dap_proc_thread_t *a_thread, v &l_voting_pkt->hdr.data_hash, l_voting_pkt->data, l_voting_pkt->hdr.data_size); } } - return true; + return false; } void dap_stream_ch_voting_queue_clear() @@ -122,7 +121,7 @@ void dap_stream_ch_chain_voting_message_write(dap_chain_net_t *a_net, dap_chain_ DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA, a_voting_pkt, l_voting_pkt_size); } else - dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_callback_pkt_in_call_all, + dap_proc_thread_callback_add(NULL, s_callback_pkt_in_call_all, DAP_DUP_SIZE(a_voting_pkt, l_voting_pkt_size)); } @@ -164,7 +163,7 @@ static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) } dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = (dap_stream_ch_chain_voting_pkt_t *)l_ch_pkt->data; - dap_proc_queue_add_callback(a_ch->stream_worker->worker, s_callback_pkt_in_call_all, + dap_proc_thread_callback_add(dap_proc_thread_get(a_ch->stream_worker->worker->id), s_callback_pkt_in_call_all, DAP_DUP_SIZE(l_voting_pkt, l_voting_pkt_size)); dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch); if (l_ch_chain_voting->callback_notify) diff --git a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h index a65b633ff6..bc8c16913a 100644 --- a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h +++ b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h @@ -4,10 +4,8 @@ #include "dap_chain_common.h" #include "dap_chain.h" -#include "dap_global_db_remote.h" #include "dap_chain_node_client.h" #include "dap_list.h" -// #include "dap_stream_ch_chain_pkt.h" #include "uthash.h" #define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA 0x01 diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index f41d4818e4..dba7f2ab16 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -57,7 +57,6 @@ #include "dap_chain_cell.h" #include "dap_global_db.h" -#include "dap_global_db_remote.h" #include "dap_stream.h" #include "dap_stream_pkt.h" @@ -86,7 +85,7 @@ struct sync_request int last_err; union{ struct{ - dap_db_log_list_t *db_log; // db log + //dap_db_log_list_t *db_log; // db log dap_list_t *db_iter; char *sync_group; } gdb; @@ -115,7 +114,7 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg); static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg); -static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_context_t *a_global_db_context, +static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_store_obj_t *a_values, void *a_arg); @@ -325,7 +324,6 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); assert(l_chain); - //pthread_rwlock_rdlock(&l_chain->atoms_rwlock); l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id, 1); size_t l_first_size = 0; dap_chain_atom_ptr_t l_atom = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size); @@ -336,13 +334,11 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a (void ) l_chain->callback_atom_find_by_hash(l_sync_request->chain.request_atom_iter, &l_hash_from, &l_first_size); } - //pthread_rwlock_unlock(&l_chain->atoms_rwlock); - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_chains_first_worker_callback, l_sync_request ); + dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_chains_first_worker_callback, l_sync_request ); } else { - //pthread_rwlock_unlock(&l_chain->atoms_rwlock); - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id,s_sync_out_chains_last_worker_callback, l_sync_request ); + dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id),s_sync_out_chains_last_worker_callback, l_sync_request ); } - return true; + return false; } @@ -426,6 +422,7 @@ static void s_sync_out_gdb_last_worker_callback(dap_worker_t *a_worker, void *a_ */ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) { + /* struct sync_request *l_sync_request = (struct sync_request *)a_arg; dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id); dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid); @@ -450,10 +447,10 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar log_it(L_DEBUG, "Sync out gdb proc, requested %"DAP_UINT64_FORMAT_U" records from address "NODE_ADDR_FP_STR, l_ch_chain->request_db_log->items_number, NODE_ADDR_FP_ARGS_S(l_sync_request->request.node_addr)); l_sync_request->gdb.db_log = l_ch_chain->request_db_log; - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_gdb_first_worker_callback, l_sync_request ); + dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_gdb_first_worker_callback, l_sync_request ); } else { - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_out_gdb_last_worker_callback, l_sync_request ); - } + dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_out_gdb_last_worker_callback, l_sync_request ); + } */ return true; } @@ -479,6 +476,7 @@ static void s_sync_update_gdb_start_worker_callback(dap_worker_t *a_worker, void static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) { + /* struct sync_request *l_sync_request = (struct sync_request *)a_arg; log_it(L_DEBUG, "Prepare request to gdb sync from %s", l_sync_request->request.id_start ? "last sync" : "zero"); dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id); @@ -493,12 +491,6 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a DAP_DELETE(l_sync_request); return true; } - dap_chain_net_add_downlink(l_net, l_ch->stream_worker, l_ch->uuid, l_ch->stream->esocket_uuid, - l_ch->stream->esocket->hostaddr[0] - ? l_ch->stream->esocket->hostaddr : l_ch->stream->esocket->remote_addr_str, - l_ch->stream->esocket->service[0] - ? strtoll(l_ch->stream->esocket->service, NULL, 10) - : l_ch->stream->esocket->remote_addr.sin_port); dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); int l_flags = 0; @@ -512,7 +504,8 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB; l_sync_request->gdb.db_log = l_ch_chain->request_db_log; l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request); + dap_worker_exec_callback_on(dap_events_worker_get(l_sync_request->worker->id), s_sync_update_gdb_start_worker_callback, l_sync_request); + */ return true; } @@ -528,7 +521,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) struct sync_request *l_sync_request = (struct sync_request *) a_arg; if (!l_sync_request) { log_it(L_CRITICAL, "Proc thread received corrupted chain packet!"); - return true; + return false; } dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; dap_chain_hash_fast_t l_atom_hash = {}; @@ -536,7 +529,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_CRITICAL, "In proc thread got CHAINS stream ch packet with zero data"); DAP_DEL_Z(l_pkt_item->pkt_data); DAP_DELETE(l_sync_request); - return true; + return false; } dap_chain_t *l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); if (!l_chain) { @@ -544,7 +537,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_WARNING, "No chain found for DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN"); DAP_DEL_Z(l_pkt_item->pkt_data); DAP_DELETE(l_sync_request); - return true; + return false; } dap_chain_atom_ptr_t l_atom_copy = (dap_chain_atom_ptr_t)l_pkt_item->pkt_data; uint64_t l_atom_copy_size = l_pkt_item->pkt_data_size; @@ -557,14 +550,14 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) if (s_debug_more){ 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); } - dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); DAP_DELETE(l_atom_copy); break; case ATOM_MOVE_TO_THRESHOLD: if (s_debug_more) { log_it(L_INFO, "Thresholded atom with hash %s for %s:%s", l_atom_hash_str, l_chain->net_name, l_chain->name); } - dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); break; case ATOM_ACCEPT: if (s_debug_more) { @@ -574,7 +567,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) if(l_res < 0) { log_it(L_ERROR, "Can't save atom %s to the file", l_atom_hash_str); } else { - dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); + //dap_chain_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); } break; case ATOM_REJECT: { @@ -592,7 +585,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) break; } DAP_DEL_Z(l_sync_request); - return true; + return false; } /** @@ -673,98 +666,6 @@ static void s_gdb_sync_tsd_worker_callback(dap_worker_t *a_worker, void *a_arg) */ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) { - struct sync_request *l_sync_request = (struct sync_request *) a_arg; - dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; - - if(l_pkt_item->pkt_data_size >= sizeof(dap_global_db_pkt_t)) { - - // Validate size of received packet - dap_global_db_pkt_t *l_obj_pkt = (dap_global_db_pkt_t*)l_pkt_item->pkt_data; - size_t l_obj_pkt_size = l_obj_pkt ? l_obj_pkt->data_size + sizeof(dap_global_db_pkt_t) : 0; - if(l_pkt_item->pkt_data_size != l_obj_pkt_size) { - log_it(L_WARNING, "In: s_gdb_in_pkt_proc_callback: received size=%zu is not equal to obj_pkt_size=%zu", - l_pkt_item->pkt_data_size, l_obj_pkt_size); - DAP_DEL_Z(l_pkt_item->pkt_data); - DAP_DELETE(l_sync_request); - return true; - } - - size_t l_data_obj_count = 0; - // deserialize data & Parse data from dap_db_log_pack() - dap_store_obj_t *l_store_obj = dap_global_db_pkt_deserialize(l_obj_pkt, &l_data_obj_count); - if (!l_store_obj) { - debug_if(s_debug_more, L_ERROR, "Invalid synchronization packet format"); - DAP_DEL_Z(l_pkt_item->pkt_data); - DAP_DELETE(l_sync_request); - return true; - } - if (s_debug_more){ - if (l_data_obj_count) - log_it(L_INFO, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", l_data_obj_count = %zu",l_pkt_item->pkt_data_size, l_data_obj_count ); - else if (l_pkt_item->pkt_data){ - log_it(L_WARNING, "In: GLOBAL_DB parse: pkt_data_size=%"DAP_UINT64_FORMAT_U", error=\"No data objs after unpack\"", l_pkt_item->pkt_data_size); - }else - log_it(L_WARNING, "In: GLOBAL_DB parse: packet in list with NULL data(pkt_data_size:%"DAP_UINT64_FORMAT_U")", l_pkt_item->pkt_data_size); - } - /*uint64_t l_last_id = l_store_obj->id; - const char *l_last_group = l_store_obj->group; - uint32_t l_last_type = l_store_obj->type; - bool l_group_changed = false;*/ - uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "global_db", "time_store_limit", 72); - dap_nanotime_t l_time_now = dap_nanotime_now(); - dap_nanotime_t l_time_alowed = l_time_now + dap_nanotime_from_sec(3600 * 24); // to be sure the timestamp is invalid - 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 (l_obj->timestamp >> 32 == 0 || - l_obj->timestamp > l_time_alowed || - l_obj->group == NULL) - continue; // the object is broken - if (s_list_white_groups) { - int l_ret = -1; - for (int i = 0; i < s_size_white_groups; i++) { - if (!dap_fnmatch(s_list_white_groups[i], l_obj->group, FNM_NOESCAPE)) { - l_ret = 0; - break; - } - } - if (l_ret == -1) continue; - } else 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 && - (l_group_changed || i == l_data_obj_count - 1)) { - struct sync_request *l_sync_req_tsd = DAP_DUP(l_sync_request); - l_sync_req_tsd->request.id_end = l_last_id; - l_sync_req_tsd->gdb.sync_group = l_obj->type == DAP_DB$K_OPTYPE_ADD ? dap_strdup(l_last_group) : - dap_strdup_printf("%s.del", l_last_group); - dap_proc_thread_worker_exec_callback_inter(a_thread, l_sync_request->worker->id, - s_gdb_sync_tsd_worker_callback, l_sync_req_tsd); - } - l_last_id = l_obj->id; - l_last_group = l_obj->group; - l_last_type = l_obj->type; - */ - dap_global_db_remote_apply_obj(l_obj, s_gdb_in_pkt_proc_set_raw_callback, DAP_DUP(l_sync_request)); - } - if (l_store_obj) - dap_store_obj_free(l_store_obj, l_data_obj_count); - } else { - log_it(L_WARNING, "In proc thread got GDB stream ch packet with zero data"); - } - if (l_pkt_item->pkt_data) { - DAP_DELETE(l_pkt_item->pkt_data); - } - DAP_DELETE(l_sync_request); return true; } @@ -780,21 +681,11 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) * @param a_values * @param a_arg */ -static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_context_t *a_global_db_context, +static bool s_gdb_in_pkt_proc_set_raw_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_store_obj_t *a_values, void *a_arg) { - struct sync_request *l_sync_req = (struct sync_request*) a_arg; - if(a_rc){ - debug_if(s_debug_more, L_ERROR, "Can't save GlobalDB request, code %d", a_rc); - l_sync_req->last_err = a_rc; - dap_worker_exec_callback_inter(a_global_db_context->queue_worker_callback_input[l_sync_req->worker->id], - s_gdb_in_pkt_error_worker_callback, l_sync_req); - } else { - debug_if(s_debug_more, L_DEBUG, "Added new GLOBAL_DB synchronization record"); - DAP_DELETE(l_sync_req); - } return true; } @@ -834,7 +725,6 @@ static bool s_chain_timer_callback(void *a_arg) dap_worker_t *l_worker = dap_worker_get_current(); 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_chain_net_del_downlink((dap_stream_ch_uuid_t*)a_arg); DAP_DELETE(a_arg); return false; } @@ -864,16 +754,6 @@ static bool s_chain_timer_callback(void *a_arg) l_ch_chain->sent_breaks = 0; l_ch_chain->timer_shots = 0; } - if (l_ch_chain->state == CHAIN_STATE_SYNC_GLOBAL_DB && l_ch_chain->sent_breaks >= 3 * DAP_SYNC_TICKS_PER_SECOND) { - debug_if(s_debug_more, L_INFO, "Send one global_db TSD packet (rest=%zu/%zu items)", - l_ch_chain->request_db_log->items_rest, - l_ch_chain->request_db_log->items_number); - 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); - l_ch_chain->sent_breaks = 0; - l_ch_chain->timer_shots = 0; - } return true; } @@ -932,7 +812,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } else { log_it(L_ERROR, "Invalid request from %s with ext_id %016"DAP_UINT64_FORMAT_x" net id 0x%016"DAP_UINT64_FORMAT_x " chain id 0x%016"DAP_UINT64_FORMAT_x" cell_id 0x%016"DAP_UINT64_FORMAT_x" in packet", - a_ch->stream->esocket->hostaddr, l_chain_pkt->hdr.ext_id, + a_ch->stream->esocket->remote_addr_str, l_chain_pkt->hdr.ext_id, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, @@ -954,7 +834,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1; if (!l_acl) { log_it(L_WARNING, "Unauthorized request attempt from %s to network %s", - a_ch->stream->esocket->hostaddr, + a_ch->stream->esocket->remote_addr_str, dap_chain_net_by_id(l_chain_pkt->hdr.net_id)->pub.name); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, @@ -985,7 +865,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); l_ch_chain->stats_request_gdb_processed = 0; l_ch_chain->request_hdr = l_chain_pkt->hdr; - dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request); + dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request); } break; // Response with metadata organized in TSD @@ -1002,7 +882,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) uint64_t l_last_id = *(uint64_t *)l_data_ptr; l_data_ptr += sizeof(uint64_t); char *l_group = (char *)l_data_ptr; - dap_db_set_last_id_remote(l_node_addr, l_last_id, l_group); + //dap_db_set_last_id_remote(l_node_addr, l_last_id, l_group); if (s_debug_more) { dap_chain_node_addr_t l_addr; l_addr.uint64 = l_node_addr; @@ -1097,7 +977,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if (l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) l_ch_chain->request = *(dap_stream_ch_chain_sync_request_t*)l_chain_pkt->data; struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); - dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_gdb_proc_callback, l_sync_request); + dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_gdb_proc_callback, l_sync_request); }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)); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, @@ -1130,7 +1010,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; l_pkt_item->pkt_data = DAP_DUP_SIZE(l_chain_pkt->data, l_chain_pkt_data_size); l_pkt_item->pkt_data_size = l_chain_pkt_data_size; - dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request); + dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_gdb_in_pkt_proc_callback, l_sync_request); } else { log_it(L_WARNING, "Packet with GLOBAL_DB atom has zero body size"); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, @@ -1220,7 +1100,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if (!l_chain) { log_it(L_ERROR, "Invalid UPDATE_CHAINS_START request from %s with ext_id %016"DAP_UINT64_FORMAT_x" net id 0x%016"DAP_UINT64_FORMAT_x " chain id 0x%016"DAP_UINT64_FORMAT_x" cell_id 0x%016"DAP_UINT64_FORMAT_x" in packet", - a_ch->stream->esocket->hostaddr, l_chain_pkt->hdr.ext_id, + a_ch->stream->esocket->remote_addr_str, l_chain_pkt->hdr.ext_id, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, @@ -1339,7 +1219,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) " 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[0] ? l_hash_from_str : "(null)", l_hash_to_str[0] ? l_hash_to_str : "(null)"); } - dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_chains_proc_callback, l_sync_request); + dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_out_chains_proc_callback, l_sync_request); } 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)); @@ -1387,7 +1267,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_chain_hash_fast_to_str(&l_atom_hash, l_atom_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); log_it(L_INFO, "In: CHAIN pkt: atom hash %s (size %zd)", l_atom_hash_str, l_chain_pkt_data_size); } - if (dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_in_chains_callback, l_sync_request)) + if (dap_proc_thread_callback_add(a_ch->stream_worker->worker->proc_queue_input, s_sync_in_chains_callback, l_sync_request)) log_it(L_ERROR, "System queue overflow with atom trying atom add. All following atoms will be rejected!"); } else { log_it(L_WARNING, "Empty chain packet"); @@ -1469,7 +1349,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'", - DAP_STREAM_CH(l_ch_chain)->stream->esocket->hostaddr, + DAP_STREAM_CH(l_ch_chain)->stream->esocket->remote_addr_str, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt_data_size ? l_error_str : "<empty>"); } break; @@ -1497,22 +1377,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) */ static void s_free_log_list_gdb ( dap_stream_ch_chain_t * a_ch_chain) { - if (a_ch_chain->request_db_log) { - // free log list - debug_if(s_debug_more, L_INFO, "[stm_ch_chain:%p] a_ch_chain->request_db_log:%p --- cleanuping ...", a_ch_chain, a_ch_chain->request_db_log); - dap_db_log_list_delete(a_ch_chain->request_db_log); - a_ch_chain->request_db_log = NULL; - } - if (a_ch_chain->remote_gdbs) { - dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL; - HASH_ITER(hh, a_ch_chain->remote_gdbs, l_hash_item, l_tmp) { - // Clang bug at this, l_hash_item should change at every loop cycle - HASH_DEL(a_ch_chain->remote_gdbs, l_hash_item); - DAP_DELETE(l_hash_item); - } - a_ch_chain->remote_gdbs = NULL; - } } /** @@ -1633,11 +1498,12 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg) switch (l_ch_chain->state) { // Update list of global DB records to remote case CHAIN_STATE_UPDATE_GLOBAL_DB: { +#if 0 size_t i, q = // s_update_pack_size; 0; - dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, /*DAP_STREAM_PKT_SIZE_MAX*/ 0, &q); - dap_stream_ch_chain_update_element_t *l_data = DAP_NEW_Z_COUNT(dap_stream_ch_chain_update_element_t, q); + //dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, DAP_STREAM_PKT_SIZE_MAX, &q); + dap_stream_ch_chain_update_element_t *l_data = DAP_NEW_Z_SIZE(dap_stream_ch_chain_update_element_t, q * sizeof(dap_stream_ch_chain_update_element_t)); for (i = 0; i < q; ++i) { l_data[i].hash = l_objs[i]->hash; l_data[i].size = l_objs[i]->pkt->data_size; @@ -1666,7 +1532,6 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg) debug_if(s_debug_more, L_INFO, "Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END"); l_go_idle = true; } -#if 0 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; @@ -1706,6 +1571,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg) // Synchronize GDB case CHAIN_STATE_SYNC_GLOBAL_DB: { +#if 0 dap_global_db_pkt_t *l_pkt = NULL; size_t l_pkt_size = 0, i, q = 0; dap_db_log_list_obj_t **l_objs = dap_db_log_list_get_multiple(l_ch_chain->request_db_log, DAP_STREAM_PKT_SIZE_MAX, &q); @@ -1756,7 +1622,6 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg) log_it(L_INFO,"Syncronized database: items syncronyzed %"DAP_UINT64_FORMAT_U" of %zu", l_ch_chain->stats_request_gdb_processed, l_ch_chain->request_db_log->items_number); } -#if 0 // Get global DB record dap_global_db_pkt_t *l_pkt = NULL; dap_db_log_list_obj_t *l_obj = NULL; diff --git a/modules/channel/chain/include/dap_stream_ch_chain.h b/modules/channel/chain/include/dap_stream_ch_chain.h index 6a3d9fa188..830725239d 100644 --- a/modules/channel/chain/include/dap_stream_ch_chain.h +++ b/modules/channel/chain/include/dap_stream_ch_chain.h @@ -32,7 +32,7 @@ #include "dap_list.h" #include "dap_stream_ch_chain_pkt.h" #include "uthash.h" -#include "dap_global_db_remote.h" +#include "dap_global_db_cluster.h" #define DAP_CHAIN_NODE_SYNC_TIMEOUT 60 // sec #define DAP_SYNC_TICKS_PER_SECOND 10 @@ -72,7 +72,7 @@ typedef struct dap_stream_ch_chain { // request section dap_chain_atom_iter_t *request_atom_iter; - dap_db_log_list_t *request_db_log; // list of global db records + //dap_db_log_list_t *request_db_log; // list of global db records dap_stream_ch_chain_sync_request_t request; dap_stream_ch_chain_pkt_hdr_t request_hdr; dap_list_t *request_db_iter; diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 48fa8d157b..6681b046e0 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -58,7 +58,7 @@ dap_chain_datum_t *dap_chain_datum_create(uint16_t a_type_id, const void *a_data return l_datum; } -void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type) +void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type) { dap_tsd_t *l_tsd = dap_chain_datum_token_tsd_get(a_token, a_token_size); if (l_tsd == NULL) { @@ -90,7 +90,7 @@ void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_ l_tsd = (dap_tsd_t *) (((byte_t*)l_tsd) + l_tsd_size); l_tsd_size = l_tsd ? dap_tsd_size(l_tsd) : 0; if (l_tsd_size == 0) { - log_it(L_ERROR,"Wrong zero TSD size, exiting s_datum_token_dump_tsd()"); + log_it(L_ERROR,"Wrong zero TSD size, exiting dap_chain_datum_token_dump_tsd()"); return; } else if (l_tsd_size+l_offset > l_tsd_total_size) { log_it(L_WARNING, "<CORRUPTED TSD> too big size %u when left maximum %zu", @@ -599,7 +599,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str); dap_string_append(a_str_out,"flags: "); dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_update.flags); - s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); + dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_private_update.tsd_total_size, l_certs_field_size, a_hash_out_type); @@ -613,7 +613,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str); dap_string_append(a_str_out, "flags: "); dap_chain_datum_token_flags_dump(a_str_out, l_token->header_native_decl.flags); - s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); + dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_decl.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_native_decl.tsd_total_size, l_certs_field_size, a_hash_out_type); @@ -644,7 +644,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str); dap_string_append(a_str_out,"flags: "); dap_chain_datum_token_flags_dump(a_str_out, l_token->header_private_update.flags); - s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); + dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_private_update.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_private_update.tsd_total_size, l_certs_field_size, a_hash_out_type); @@ -658,7 +658,7 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c dap_string_append_printf(a_str_out, "total_supply: %s\n", l_value_str); dap_string_append(a_str_out, "flags: "); dap_chain_datum_token_flags_dump(a_str_out, l_token->header_native_update.flags); - s_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); + dap_chain_datum_token_dump_tsd(a_str_out, l_token, l_token_size, a_hash_out_type); size_t l_certs_field_size = l_token_size - sizeof(*l_token) - l_token->header_native_update.tsd_total_size; dap_chain_datum_token_certs_dump(a_str_out, l_token->data_n_tsd + l_token->header_native_update.tsd_total_size, l_certs_field_size, a_hash_out_type); diff --git a/modules/common/include/dap_chain_common.h b/modules/common/include/dap_chain_common.h index 1745b44a58..cd775e3d20 100644 --- a/modules/common/include/dap_chain_common.h +++ b/modules/common/include/dap_chain_common.h @@ -64,62 +64,6 @@ typedef union dap_chain_cell_id { int dap_id_uint64_parse(const char *a_id_str, uint64_t *a_id); -/** - * @struct Node address - * - */ -typedef union dap_chain_node_addr { - uint64_t uint64; - uint16_t words[sizeof(uint64_t)/2]; - uint8_t raw[sizeof(uint64_t)]; // Access to selected octects -} DAP_ALIGN_PACKED dap_chain_node_addr_t; - -#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -#define NODE_ADDR_FP_STR "%04hX::%04hX::%04hX::%04hX" -#define NODE_ADDR_FP_ARGS(a) a->words[2],a->words[3],a->words[0],a->words[1] -#define NODE_ADDR_FPS_ARGS(a) &a->words[2],&a->words[3],&a->words[0],&a->words[1] -#define NODE_ADDR_FP_ARGS_S(a) a.words[2],a.words[3],a.words[0],a.words[1] -#define NODE_ADDR_FPS_ARGS_S(a) &a.words[2],&a.words[3],&a.words[0],&a.words[1] -#else -#define NODE_ADDR_FP_STR "%04hX::%04hX::%04hX::%04hX" -#define NODE_ADDR_FP_ARGS(a) a->words[3],a->words[2],a->words[1],a->words[0] -#define NODE_ADDR_FPS_ARGS(a) &a->words[3],&a->words[2],&a->words[1],&a->words[0] -#define NODE_ADDR_FP_ARGS_S(a) a.words[3],a.words[2],a.words[1],a.words[0] -#define NODE_ADDR_FPS_ARGS_S(a) &a.words[3],&a.words[2],&a.words[1],&a.words[0] -#endif - -DAP_STATIC_INLINE bool dap_chain_node_addr_str_check(const char *a_addr_str) { - size_t l_str_len = dap_strlen(a_addr_str); - if (l_str_len == 22) { - for (int n =0; n < 22; n+= 6) { - if (!dap_is_xdigit(a_addr_str[n]) || !dap_is_xdigit(a_addr_str[n + 1]) || - !dap_is_xdigit(a_addr_str[n + 2]) || !dap_is_xdigit(a_addr_str[n + 3])) { - return false; - } - } - for (int n = 4; n < 18; n += 6) { - if (a_addr_str[n] != ':' || a_addr_str[n + 1] != ':') - return false; - } - return true; - } - return false; -} - -DAP_STATIC_INLINE int dap_chain_node_addr_from_str(dap_chain_node_addr_t *a_addr, const char *a_addr_str) -{ - if (!a_addr || !a_addr_str){ - return -1; - } - if (sscanf(a_addr_str, NODE_ADDR_FP_STR, NODE_ADDR_FPS_ARGS(a_addr)) == 4) - return 0; - if (sscanf(a_addr_str, "0x%016" DAP_UINT64_FORMAT_x, &a_addr->uint64) == 1) - return 0; - return -1; -} - -DAP_STATIC_INLINE bool dap_chain_node_addr_not_null(dap_chain_node_addr_t * a_addr) { return a_addr->uint64 != 0; } - enum { NODE_ROLE_ROOT_MASTER=0x00, NODE_ROLE_ROOT=0x01, @@ -134,6 +78,10 @@ typedef union dap_chain_node_role{ uint8_t raw[DAP_CHAIN_NODE_ROLE_SIZE]; } DAP_ALIGN_PACKED dap_chain_node_role_t; +typedef dap_stream_node_addr_t dap_chain_node_addr_t; +#define dap_chain_node_addr_str_check dap_stream_node_addr_str_check +#define dap_chain_node_addr_from_str dap_stream_node_addr_from_str +#define dap_chain_node_addr_not_null dap_stream_node_addr_not_null typedef union dap_chain_net_id{ uint64_t uint64; diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index 922688f6d1..bb532c3068 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -153,7 +153,7 @@ DAP_STATIC_INLINE const char *dap_chain_datum_type_id_to_str(uint16_t a_type_id) return l_ret; } -void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type); +void dap_chain_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_token, size_t a_token_size, const char *a_hash_out_type); void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id); bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, const char *a_ticker, diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c index f423dcb840..5c8bde7f51 100644 --- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c +++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c @@ -28,7 +28,6 @@ #include "dap_enc_base58.h" #include "dap_cert.h" #include "dap_chain.h" -#include "dap_chain_pvt.h" #include "dap_chain_block.h" #include "dap_chain_block_cache.h" #include "dap_chain_cs_blocks.h" @@ -41,7 +40,6 @@ #define LOG_TAG "dap_chain_cs_block_poa" - typedef struct dap_chain_cs_dag_poa_pvt { dap_enc_key_t *sign_key; dap_cert_t ** auth_certs; @@ -182,7 +180,7 @@ static int s_cli_block_poa(int argc, char ** argv, char **a_str_reply) */ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { - dap_chain_cs_blocks_new(a_chain, a_chain_cfg); + dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg); dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS( a_chain ); dap_chain_cs_block_poa_t * l_poa = DAP_NEW_Z ( dap_chain_cs_block_poa_t); if (!l_poa) { diff --git a/modules/consensus/block-pos/dap_chain_cs_block_pos.c b/modules/consensus/block-pos/dap_chain_cs_block_pos.c index 094c579620..dc2e90d76b 100644 --- a/modules/consensus/block-pos/dap_chain_cs_block_pos.c +++ b/modules/consensus/block-pos/dap_chain_cs_block_pos.c @@ -79,7 +79,7 @@ void dap_chain_cs_block_pos_deinit(void) */ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) { - dap_chain_cs_blocks_new(a_chain, a_chain_cfg); + dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg); char ** l_tokens_hold = NULL; char ** l_tokens_hold_value_str = NULL; uint16_t l_tokens_hold_size = 0; diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index c2fcd8abb9..cf0749d941 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -37,7 +37,6 @@ #include "dap_timerfd.h" #include "dap_strfuncs.h" #include "dap_enc_base58.h" -#include "dap_chain_pvt.h" #include "dap_chain_net.h" #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" @@ -47,7 +46,6 @@ #include "dap_chain_cs_dag.h" #include "dap_chain_cs_dag_event.h" #include "dap_chain_cs_dag_poa.h" -//#include "dap_chain_net_srv_stake.h" #include "dap_chain_cell.h" #include "dap_global_db.h" #include "dap_cert.h" @@ -111,7 +109,7 @@ static dap_interval_timer_t s_poa_round_timer = NULL; int dap_chain_cs_dag_poa_init() { // Add consensus constructor - dap_chain_cs_add ("dag_poa", s_callback_new ); + dap_chain_cs_add("dag_poa", s_callback_new); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); dap_cli_server_cmd_add ("dag_poa", s_cli_dag_poa, "DAG PoA commands", "dag_poa event sign -net <net_name> -chain <chain_name> -event <event_hash> [-H {hex | base58(default)}]\n" @@ -341,7 +339,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) */ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { - if (dap_chain_cs_dag_new(a_chain,a_chain_cfg)) { + if (dap_chain_cs_type_create("dag", a_chain, a_chain_cfg)) { log_it(L_ERROR, "Couldn't init DAG"); return -1; } @@ -422,7 +420,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) * @param a_values * @param a_arg */ -static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_global_db_context, +static bool s_poa_round_check_callback_round_clean(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -437,7 +435,7 @@ static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_gl continue; if (a_values[i].value_len <= sizeof(dap_chain_cs_dag_event_round_item_t) + sizeof(dap_chain_cs_dag_event_t)) { log_it(L_WARNING, "Too small round item in DAG PoA rounds GDB group"); - dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key); + dap_global_db_del_sync(a_group, a_values[i].key); continue; } dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)a_values[i].value; @@ -453,7 +451,7 @@ static bool s_poa_round_check_callback_round_clean(dap_global_db_context_t *a_gl log_it(L_INFO, "Event %s is from currently active round [id %"DAP_UINT64_FORMAT_U"]", a_values[i].key, l_round_id); continue; } - dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key); + dap_global_db_del_sync(a_group, a_values[i].key); log_it(L_DEBUG, "DAG-PoA: Remove event %s from round %"DAP_UINT64_FORMAT_U" %s.", a_values[i].key, l_round_id, l_time_diff > l_timeuot ? "by timer" : "owing to round completion"); } @@ -582,7 +580,7 @@ static dap_chain_cs_dag_event_round_item_t *s_round_event_choose_dup(dap_list_t * @param a_is_pinned * @param a_arg */ -static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_db_context_t *a_global_db_context, +static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_store_obj_t *a_values, void *a_arg) @@ -791,7 +789,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_size) { - if (a_op_code != DAP_DB$K_OPTYPE_ADD || !a_key || !a_value || !a_value_size) + if (a_op_code != DAP_GLOBAL_DB_OPTYPE_ADD || !a_key || !a_value || !a_value_size) return 0; dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag); diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index 42032fa4d9..440b2fa978 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -79,8 +79,8 @@ void dap_chain_cs_dag_pos_deinit(void) */ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { - dap_chain_cs_dag_new(a_chain,a_chain_cfg); - dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain ); + dap_chain_cs_type_create("dag", a_chain, a_chain_cfg); + dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG ( a_chain ); dap_chain_cs_dag_pos_t *l_pos = DAP_NEW_Z( dap_chain_cs_dag_pos_t); if (!l_pos) { log_it(L_CRITICAL, "Memory allocation error"); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 1b827a2956..ec1fb8d891 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -1,3 +1,26 @@ +/* +* Authors: +* Roman Khlopkov <roman.khlopkov@demlabs.net> +* Cellframe https://cellframe.net +* DeM Labs Inc. https://demlabs.net +* Copyright (c) 2017-2023 +* All rights reserved. + +This file is part of CellFrame SDK the open source project + +CellFrame SDK is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +CellFrame SDK is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. +*/ #include "dap_common.h" #include "utlist.h" #include "dap_timerfd.h" @@ -61,7 +84,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl static uint256_t s_callback_get_minimum_fee(dap_chain_t *a_chain); static dap_enc_key_t *s_callback_get_sign_key(dap_chain_t *a_chain); static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a_new_value); -static void s_db_change_notifier(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void * a_arg); +static void s_db_change_notifier(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void * a_arg); static int s_cli_esbocs(int argc, char ** argv, char **str_reply); @@ -77,7 +100,6 @@ DAP_STATIC_INLINE const char *s_voting_msg_type_to_str(uint8_t a_type) case DAP_CHAIN_ESBOCS_MSG_TYPE_DIRECTIVE: return "DIRECTIVE"; case DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR: return "VOTE_FOR"; case DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST: return "VOTE_AGAINST"; - case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB: return "SEND_DB"; default: return "UNKNOWN"; } } @@ -136,7 +158,7 @@ typedef struct dap_chain_esbocs_pvt { struct sync_params { uint64_t attempt; - dap_hash_fast_t db_hash; + dap_global_db_driver_hash_t db_hash; } DAP_ALIGN_PACKED; DAP_STATIC_INLINE uint16_t s_get_round_skip_timeout(dap_chain_esbocs_session_t *a_session) @@ -161,7 +183,7 @@ void dap_chain_cs_esbocs_deinit(void) static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) { - dap_chain_cs_blocks_new(a_chain, a_chain_cfg); + dap_chain_cs_type_create("blocks", a_chain, a_chain_cfg); dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); int l_ret = 0; @@ -281,104 +303,6 @@ static void s_new_atom_notifier(void *a_arg, UNUSED_ARG dap_chain_t *a_chain, UN pthread_mutex_unlock(&l_session->mutex); } -/* *** Temporary added section for over-consensus sync. Remove this after global DB sync refactoring *** */ - -static bool s_change_db_broadcast(UNUSED_ARG dap_proc_thread_t *a_thread, void *a_arg) -{ - dap_chain_esbocs_session_t *l_session = a_arg; - pthread_mutex_lock(&l_session->mutex); - if (!dap_hash_fast_is_blank(&l_session->db_hash) && l_session->db_serial && l_session->cur_round.all_validators) - s_message_send(l_session, DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB, &l_session->db_hash, l_session->db_serial, - sizeof(*l_session->db_serial) + l_session->db_serial->data_size, l_session->cur_round.all_validators); - pthread_mutex_unlock(&l_session->mutex); - return true; -} - -static void s_session_db_serialize(dap_global_db_context_t *a_context, void *a_arg) -{ - dap_chain_esbocs_session_t *l_session = a_arg; - char *l_sync_group = s_get_penalty_group(l_session->chain->net_id); - uint32_t l_time_store_lim_hours; - dap_global_db_notify_item_t *l_notify_item = dap_global_db_get_notify_group(a_context->instance, l_sync_group); - if (l_notify_item && l_notify_item->ttl) - l_time_store_lim_hours = l_notify_item->ttl; - else - l_time_store_lim_hours = a_context->instance->store_time_limit; - uint64_t l_limit_time = l_time_store_lim_hours ? dap_nanotime_now() - dap_nanotime_from_sec(l_time_store_lim_hours * 3600) : 0; - size_t l_objs_count = 0; - dap_global_db_pkt_t *l_pkt = 0; - dap_store_obj_t *l_objs = dap_global_db_get_all_raw_unsafe(a_context, l_sync_group, &l_objs_count); - for (size_t i = 0; i < l_objs_count; i++) { - dap_store_obj_t *it = l_objs + i; - if (l_notify_item->ttl && it->timestamp < l_limit_time) { - dap_chain_addr_t *l_signing_addr = dap_chain_addr_from_str(it->key); - dap_chain_net_srv_stake_mark_validator_active(l_signing_addr, true); - DAP_DEL_Z(l_signing_addr); - dap_global_db_driver_delete(it, 1); - continue; - } - it->type = DAP_DB$K_OPTYPE_ADD; - dap_global_db_pkt_t *l_pkt_single = dap_global_db_pkt_serialize(it); - dap_global_db_pkt_change_id(l_pkt_single, 0); - l_pkt = dap_global_db_pkt_pack(l_pkt, l_pkt_single); - DAP_DELETE(l_pkt_single); - } - dap_store_obj_free(l_objs, l_objs_count); - - if (l_pkt) - dap_hash_fast(l_pkt->data, l_pkt->data_size, &l_session->db_hash); - else - l_session->db_hash = (dap_hash_fast_t){}; - if (PVT(l_session->esbocs)->debug) { - char l_sync_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(&l_session->db_hash, l_sync_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); - log_it(L_MSG, "DB changes applied, new DB resync hash is %s", l_sync_hash_str); - } - - char *l_del_sync_group = dap_strdup_printf("%s.del", l_sync_group); - l_objs_count = 0; - l_objs = dap_global_db_get_all_raw_unsafe(a_context, l_sync_group, &l_objs_count); - - DAP_DELETE(l_del_sync_group); - for (size_t i = 0; i < l_objs_count; i++) { - dap_store_obj_t *it = l_objs + i; - if (l_limit_time && it->timestamp < l_limit_time) { - dap_global_db_driver_delete(it, 1); - continue; - } - it->type = DAP_DB$K_OPTYPE_DEL; - DAP_DEL_Z(it->group); - it->group = dap_strdup(l_sync_group); - dap_global_db_pkt_t *l_pkt_single = dap_global_db_pkt_serialize(it); - dap_global_db_pkt_change_id(l_pkt_single, 0); - l_pkt = dap_global_db_pkt_pack(l_pkt, l_pkt_single); - DAP_DELETE(l_pkt_single); - } - dap_store_obj_free(l_objs, l_objs_count); - DAP_DELETE(l_sync_group); - DAP_DEL_Z(l_session->db_serial); - l_session->db_serial = l_pkt; - - dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_change_db_broadcast, l_session); -} - -static void s_session_db_clear(UNUSED_ARG dap_global_db_context_t *a_context, void *a_arg) -{ - dap_chain_esbocs_session_t *l_session = a_arg; - char *l_sync_group = s_get_penalty_group(l_session->chain->net_id); - dap_store_obj_t l_obj = { - .group = l_sync_group - }; - dap_global_db_driver_delete(&l_obj, 1); - char *l_del_sync_group = dap_strdup_printf("%s.del", l_sync_group); - DAP_DELETE(l_sync_group); - l_obj.group = l_del_sync_group; - dap_global_db_driver_delete(&l_obj, 1); - DAP_DELETE(l_del_sync_group); -} - -/* *** End of the temporary added section for over-consensus sync. *** */ - static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cfg) { dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); @@ -470,10 +394,20 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf l_esbocs->session = l_session; l_session->my_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); l_session->my_signing_addr = l_my_signing_addr; - dap_global_db_context_exec(s_session_db_clear, l_session); - dap_global_db_add_notify_group_mask(dap_global_db_context_get_default()->instance, - DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX ".*", - s_db_change_notifier, l_session, 72); + char *l_sync_group = s_get_penalty_group(l_net->pub.id); + l_session->db_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_sync_group, l_sync_group, + 72 * 3600, true, + s_db_change_notifier, l_session, + DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_ROLE_AUTONOMIC); + DAP_DELETE(l_sync_group); + + dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_chain->net_id, false); + for (dap_list_t *it = l_validators; it; it = it->next) { + dap_stream_node_addr_t *l_addr = &((dap_chain_net_srv_stake_item_t *)it->data)->node_addr; + dap_global_db_cluster_member_add(l_session->db_cluster, l_addr, DAP_GDB_MEMBER_ROLE_ROOT); + dap_chain_net_add_validator_to_clusters(l_net, l_addr); + } pthread_mutexattr_t l_mutex_attr; pthread_mutexattr_init(&l_mutex_attr); pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE); @@ -667,10 +601,10 @@ static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a a_chain->callback_atom_iter_delete(l_iter); } -static int s_callback_addr_compare(const void *a_list_elem, const void *a_addr_elem) +static int s_callback_addr_compare(dap_list_t *a_list_elem, dap_list_t *a_addr_elem) { - dap_chain_esbocs_validator_t *l_validator = (dap_chain_esbocs_validator_t*)((dap_list_t*)a_list_elem)->data; - dap_chain_addr_t *l_addr = (dap_chain_addr_t*)((dap_list_t*)a_addr_elem)->data; + dap_chain_esbocs_validator_t *l_validator = a_list_elem->data; + dap_chain_addr_t *l_addr = a_addr_elem->data; if (!l_validator || !l_addr) { log_it(L_CRITICAL, "Invalid argument"); return -1; @@ -683,10 +617,10 @@ static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_val return dap_list_find(a_validators, a_addr, s_callback_addr_compare); } -static int s_callback_addr_compare_synced(const void *a_list_elem, const void *a_addr_elem) +static int s_callback_addr_compare_synced(dap_list_t *a_list_elem, dap_list_t *a_addr_elem) { - dap_chain_esbocs_validator_t *l_validator = (dap_chain_esbocs_validator_t*)((dap_list_t*)a_list_elem)->data; - dap_chain_addr_t *l_addr = (dap_chain_addr_t*)((dap_list_t*)a_addr_elem)->data; + dap_chain_esbocs_validator_t *l_validator = a_list_elem->data; + dap_chain_addr_t *l_addr = a_addr_elem->data; if (!l_validator || !l_addr) { log_it(L_CRITICAL, "Invalid argument"); return -1; @@ -715,7 +649,7 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session) dap_string_append_printf(l_addr_list, NODE_ADDR_FP_STR"; ", NODE_ADDR_FP_ARGS_S(((dap_chain_esbocs_validator_t *)it->data)->node_addr)); } - char *l_sync_hash = dap_chain_hash_fast_to_str_new(&a_session->db_hash); + char *l_sync_hash = dap_global_db_driver_hash_print(a_session->db_hash); log_it(L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U"." " Sent START_SYNC pkt, sync attempt %"DAP_UINT64_FORMAT_U" current validators list: %s DB sync hash %s", a_session->chain->net_name, a_session->chain->name, a_session->cur_round.id, @@ -832,8 +766,7 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session) return; } } - dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, true); - l_validators = dap_list_concat(l_validators, dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, false)); + dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_session->chain->net_id, false); a_session->cur_round.all_validators = dap_list_copy_deep(l_validators, s_callback_list_form, NULL); dap_list_free_full(l_validators, NULL); bool l_round_already_started = a_session->round_fast_forward; @@ -961,15 +894,14 @@ static uint64_t s_session_calc_current_round_id(dap_chain_esbocs_session_t *a_se return l_ret ? l_ret : a_session->cur_round.id; } -static int s_signs_sort_callback(const void *a_sign1, const void *a_sign2) +static int s_signs_sort_callback(dap_list_t *a_sign1, dap_list_t *a_sign2) { - dap_sign_t *l_sign1 = (dap_sign_t*)((dap_list_t*)a_sign1)->data, - *l_sign2 = (dap_sign_t*)((dap_list_t*)a_sign2)->data; + dap_sign_t *l_sign1 = a_sign1->data, + *l_sign2 = a_sign2->data; if (!l_sign1 || !l_sign2) { log_it(L_CRITICAL, "Invalid element"); return 0; } - size_t l_size1 = dap_sign_get_size(l_sign1), l_size2 = dap_sign_get_size(l_sign2), l_size_min = MIN(l_size1, l_size2); @@ -1499,7 +1431,7 @@ typedef struct fee_serv_param dap_chain_t * chain; }fee_serv_param_t; -static bool s_check_db_callback_fee_collect (UNUSED_ARG dap_global_db_context_t *a_global_db_context, +static bool s_check_db_callback_fee_collect (UNUSED_ARG dap_global_db_instance_t *a_dbi, UNUSED_ARG int a_rc, UNUSED_ARG const char *a_group, UNUSED_ARG const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -1822,7 +1754,7 @@ static void s_session_directive_process(dap_chain_esbocs_session_t *a_session, d s_message_send(a_session, l_type, a_directive_hash, NULL, 0, a_session->cur_round.all_validators); } -static void s_db_change_notifier(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +static void s_db_change_notifier(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { dap_chain_esbocs_session_t *l_session = a_arg; dap_chain_addr_t *l_validator_addr = dap_chain_addr_from_str(a_obj->key); @@ -1830,9 +1762,9 @@ static void s_db_change_notifier(dap_global_db_context_t *a_context, dap_store_o log_it(L_WARNING, "Unreadable address in esbocs global DB group"); dap_global_db_driver_delete(a_obj, 1); } - if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, a_obj->type != DAP_DB$K_OPTYPE_ADD)) + if (dap_chain_net_srv_stake_mark_validator_active(l_validator_addr, a_obj->type != DAP_GLOBAL_DB_OPTYPE_ADD)) dap_global_db_driver_delete(a_obj, 1); - s_session_db_serialize(a_context, l_session); + l_session->db_hash = dap_global_db_driver_hash_get(a_obj); } static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, dap_hash_fast_t *a_directive_hash) @@ -1975,15 +1907,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod s_session_sync_queue_add(l_session, l_message, a_data_size); goto session_unlock; } - } else if (l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB) { - if (dap_hash_fast_compare(&l_message->hdr.candidate_hash, &l_session->db_hash) && - !dap_hash_fast_is_blank(&l_session->db_hash)) { - debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U"." - " Send DB message with same DB hash is ignored", - l_session->chain->net_name, l_session->chain->name, - l_session->cur_round.id); - goto session_unlock; - } } else if (l_message->hdr.round_id != l_session->cur_round.id) { // round check debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." @@ -2041,7 +1964,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod bool l_not_in_list = false; switch (l_message->hdr.type) { case DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC: - case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB: // Add local sync messages, cause a round clear if (!a_sender_node_addr) s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr); @@ -2081,24 +2003,11 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod l_session->chain->net_name, l_session->chain->name, l_message->hdr.round_id, l_validator_addr_str, l_sync_attempt); if (!PVT(l_session->esbocs)->emergency_mode && - !dap_hash_fast_compare(&((struct sync_params *)l_message_data)->db_hash, &l_session->db_hash)) { + !dap_global_db_driver_hash_compare(((struct sync_params *)l_message_data)->db_hash, l_session->db_hash)) { debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", sync_attempt %"DAP_UINT64_FORMAT_U " SYNC message is rejected cause DB hash mismatch", l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id, l_session->cur_round.sync_attempt); - if (l_session->db_serial) { - dap_chain_esbocs_validator_t *l_validator = DAP_NEW_Z(dap_chain_esbocs_validator_t); - if (!l_validator) { - log_it(L_CRITICAL, "Memory allocation error"); - goto session_unlock; - } - l_validator->node_addr = *dap_chain_net_srv_stake_key_get_node_addr(&l_signing_addr); - l_validator->signing_addr = l_signing_addr; - dap_list_t *l_validator_list = dap_list_append(NULL, l_validator); - s_message_send(l_session, DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB, &l_session->db_hash, l_session->db_serial, - sizeof(*l_session->db_serial) + l_session->db_serial->data_size, l_validator_list); - dap_list_free_full(l_validator_list, NULL); - } break; } if (l_sync_attempt != l_session->cur_round.sync_attempt) { @@ -2153,21 +2062,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod } } break; - case DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB: { - dap_global_db_pkt_t *l_db_pkt = l_message_data; - if (l_db_pkt->data_size + sizeof(*l_db_pkt) != l_message_data_size) { - log_it(L_WARNING, "Wrong send_db message size, have %zu bytes, must be %zu bytes", - l_message_data_size, l_db_pkt->data_size + sizeof(*l_db_pkt)); - break; - } - size_t l_data_objs_count = 0; - dap_store_obj_t *l_store_objs = dap_global_db_pkt_deserialize(l_db_pkt, &l_data_objs_count); - for (size_t i = 0; i < l_data_objs_count; i++) - dap_global_db_remote_apply_obj(l_store_objs + i, NULL, NULL); - if (l_store_objs) - dap_store_obj_free(l_store_objs, l_data_objs_count); - } break; - case DAP_CHAIN_ESBOCS_MSG_TYPE_SUBMIT: { uint8_t *l_candidate = l_message_data; size_t l_candidate_size = l_message_data_size; @@ -2470,8 +2364,7 @@ static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_mess for (dap_list_t *it = a_validators; it; it = it->next) { dap_chain_esbocs_validator_t *l_validator = it->data; if (l_validator->is_synced || - a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC || - a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB) { + a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC) { debug_if(PVT(a_session->esbocs)->debug, L_MSG, "Send pkt type 0x%x to "NODE_ADDR_FP_STR, a_message_type, NODE_ADDR_FP_ARGS_S(l_validator->node_addr)); l_voting_pkt->hdr.receiver_node_addr = l_validator->node_addr; diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index 7a95d9dbf4..f680c1b695 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -1,3 +1,26 @@ +/* +* Authors: +* Roman Khlopkov <roman.khlopkov@demlabs.net> +* Cellframe https://cellframe.net +* DeM Labs Inc. https://demlabs.net +* Copyright (c) 2017-2023 +* All rights reserved. + +This file is part of CellFrame SDK the open source project + +CellFrame SDK is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +CellFrame SDK is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. +*/ #pragma once #include "dap_timerfd.h" @@ -5,7 +28,7 @@ #include "dap_chain_block.h" #include "dap_chain_cs_blocks.h" #include "dap_cert.h" -#include "dap_global_db_remote.h" +#include "dap_global_db_driver.h" #define DAP_CHAIN_ESBOCS_PROTOCOL_VERSION 8 #define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX "esbocs" @@ -19,7 +42,6 @@ #define DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR 0x22 #define DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST 0x24 #define DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC 0x32 -#define DAP_CHAIN_ESBOCS_MSG_TYPE_SEND_DB 0x36 #define DAP_CHAIN_BLOCKS_SESSION_ROUND_ID_SIZE 8 #define DAP_CHAIN_BLOCKS_SESSION_MESSAGE_ID_SIZE 8 @@ -176,12 +198,10 @@ typedef struct dap_chain_esbocs_session { dap_chain_addr_t my_signing_addr; dap_chain_esbocs_penalty_item_t *penalty; - // Temporary sync-over-consensus params - dap_global_db_pkt_t *db_serial; - dap_hash_fast_t db_hash; + dap_global_db_cluster_t *db_cluster; + dap_global_db_driver_hash_t db_hash; - struct dap_chain_esbocs_session *next; - struct dap_chain_esbocs_session *prev; + struct dap_chain_esbocs_session *prev, *next; } dap_chain_esbocs_session_t; #define DAP_CHAIN_ESBOCS(a) ((dap_chain_esbocs_t *)(a)->_inheritor) diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 5e21ae4e98..a7b58980f1 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -70,7 +70,7 @@ #define LOG_TAG "dap_chain_mempool" -static bool s_tx_create_massive_gdb_save_callback(dap_global_db_context_t *a_global_db_context, +static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg); @@ -596,11 +596,12 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a * @param a_values * @param a_arg */ -static bool s_tx_create_massive_gdb_save_callback(dap_global_db_context_t *a_global_db_context, +static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) { + DAP_DELETE(a_values); if(!a_rc) { log_it(L_NOTICE, "%zu transaction are placed in mempool", a_values_total); return true; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 6b0f8ff84f..5a281953a5 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -81,10 +81,10 @@ #include "dap_timerfd.h" #include "dap_stream_worker.h" #include "dap_worker.h" -#include "dap_proc_queue.h" #include "dap_proc_thread.h" #include "dap_enc_http.h" #include "dap_chain_common.h" +#include "dap_chain_cell.h" #include "dap_chain_datum_decree.h" #include "dap_chain_datum_anchor.h" #include "dap_chain_tx.h" @@ -95,7 +95,6 @@ #include "dap_chain_net_decree.h" #include "dap_chain_net_srv.h" #include "dap_chain_net_balancer.h" -#include "dap_chain_pvt.h" #include "dap_chain_node_client.h" #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" @@ -104,8 +103,6 @@ #include "dap_chain_cs_none.h" #include "dap_client_http.h" #include "dap_global_db.h" -#include "dap_global_db_remote.h" - #include "dap_stream_ch_chain_net_pkt.h" #include "dap_stream_ch_chain_net.h" #include "dap_stream_ch_chain.h" @@ -148,16 +145,6 @@ struct net_link { UT_hash_handle hh; }; -struct downlink { - dap_chain_net_t *net; - dap_stream_worker_t *worker; - dap_stream_ch_uuid_t ch_uuid; - dap_events_socket_uuid_t esocket_uuid; - char addr[INET_ADDRSTRLEN]; - int port; - UT_hash_handle hh; -}; - /** * @struct dap_chain_net_pvt * @details Private part of chain_net dap object @@ -168,8 +155,7 @@ typedef struct dap_chain_net_pvt{ uint32_t flags; time_t last_sync; - dap_chain_node_addr_t * node_addr; - dap_chain_node_info_t * node_info; // Current node's info + dap_chain_node_info_t *node_info; // Current node's info atomic_uint balancer_link_requests; bool balancer_http; @@ -181,9 +167,7 @@ typedef struct dap_chain_net_pvt{ bool only_static_links; uint16_t required_links_count; uint16_t max_links_count; - uint16_t reconnect_delay; // sec - - struct downlink *downlinks; // HT of links who sent SYNC REQ, it used for sync broadcasting + uint16_t reconnect_delay; // sec bool load_mode; char ** seed_aliases; @@ -208,15 +192,17 @@ typedef struct dap_chain_net_pvt{ _Atomic(dap_chain_net_state_t) state, state_target; uint16_t acl_idx; - // Main loop timer dap_interval_timer_t main_timer; - pthread_mutex_t uplinks_mutex, downlinks_mutex; - pthread_rwlock_t states_lock; + pthread_mutex_t uplinks_mutex; dap_list_t *gdb_notifiers; - dap_interval_timer_t update_links_timer; + //Global DB clusters for different access groups. + dap_global_db_cluster_t *zerochain_cluster; + dap_global_db_cluster_t *mempool_cluster; + dap_global_db_cluster_t *orders_cluster; + dap_global_db_cluster_t *nodes_cluster; } dap_chain_net_pvt_t; typedef struct dap_chain_net_item{ @@ -273,38 +259,30 @@ static int s_net_init(const char * a_net_name, uint16_t a_acl_idx); static int s_net_load(dap_chain_net_t *a_net); -static int s_net_init_node_addr_cert(); - -// Notify callback for GlobalDB changes -static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); -static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size); static int s_cli_net(int argc, char ** argv, char **str_reply); static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); static void s_prepare_links_from_balancer(dap_chain_net_t *a_net); static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_replace_tries); -//Timer update links - -static void s_update_links_timer_callback(void *a_arg){ +static void s_update_my_link_info_timer_callback(void *a_arg) +{ dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg; - //Updated links - size_t l_count_downlinks = 0,l_blocks_events = 0; - dap_chain_node_addr_t *l_current_addr = dap_chain_net_get_cur_addr(l_net); - dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, l_current_addr); + size_t l_blocks_events = 0; + dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, &g_node_addr); if (!l_node_info) return; - l_node_info->hdr.links_number = l_count_downlinks; dap_chain_t *l_chain; DL_FOREACH(l_net->pub.chains, l_chain) { if(l_chain->callback_count_atom) l_blocks_events += l_chain->callback_count_atom(l_chain); } l_node_info->hdr.blocks_events = l_blocks_events; - char *l_key = dap_chain_node_addr_to_hash_str(l_current_addr); + char *l_key = dap_chain_node_addr_to_hash_str(&g_node_addr); //dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, l_node_info, dap_chain_node_info_get_size(l_node_info), false); DAP_DELETE(l_node_info); } + /** * @brief * init network settings from cellrame-node.cfg file @@ -344,10 +322,6 @@ int dap_chain_net_init() "\tPrint list of PoA cerificates for this network\n"); s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more",false); - if(s_net_init_node_addr_cert()) { - log_it(L_ERROR,"Error init node-addr cert"); - return -1; - } char * l_net_dir_str = dap_strdup_printf("%s/network", dap_config_path()); DIR * l_net_dir = opendir( l_net_dir_str); @@ -435,7 +409,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n //PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO; // TODO set this flag according to -mode argument from command line if (a_new_state == NET_STATE_OFFLINE) return 0; - return dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc, a_net); + return dap_proc_thread_callback_add(NULL, s_net_states_proc, a_net); } dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net) @@ -461,189 +435,7 @@ void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj PVT(a_net)->gdb_notifiers = dap_list_append(PVT(a_net)->gdb_notifiers, l_notifier); } -void dap_chain_net_add_downlink_cb(UNUSED_ARG dap_worker_t *a_worker, void *a_arg) { - struct downlink *l_downlink = (struct downlink*)a_arg; - if (!l_downlink->net) { - DAP_DELETE(l_downlink); - return; - } - dap_chain_net_pvt_t *l_net_pvt = PVT(l_downlink->net); - unsigned a_hash_value; - HASH_VALUE(&l_downlink->ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value); - struct downlink *l_sought_downlink = NULL; - pthread_mutex_lock(&l_net_pvt->downlinks_mutex); - HASH_FIND_BYHASHVALUE(hh, l_net_pvt->downlinks, &l_downlink->ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value, l_sought_downlink); - if (l_sought_downlink) { - pthread_mutex_unlock(&l_net_pvt->downlinks_mutex); - DAP_DELETE(l_downlink); - return; - } - HASH_ADD_BYHASHVALUE(hh, l_net_pvt->downlinks, ch_uuid, sizeof(l_downlink->ch_uuid), a_hash_value, l_downlink); - pthread_mutex_unlock(&l_net_pvt->downlinks_mutex); -} - -void dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_worker, - dap_stream_ch_uuid_t a_ch_uuid, dap_events_socket_uuid_t a_esocket_uuid, - char *a_addr, int a_port) -{ - struct downlink *l_downlink = DAP_NEW_Z(struct downlink); - if (!l_downlink) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - *l_downlink = (struct downlink) { - .net = a_net, - .worker = a_worker, - .ch_uuid = a_ch_uuid, - .esocket_uuid = a_esocket_uuid, - .port = a_port - }; - strncpy(l_downlink->addr, a_addr, INET_ADDRSTRLEN - 1); - dap_worker_exec_callback_on(a_worker->worker, dap_chain_net_add_downlink_cb, l_downlink); -} - -void dap_chain_net_del_downlink(dap_stream_ch_uuid_t *a_ch_uuid) { - unsigned l_hash_value; - HASH_VALUE(a_ch_uuid, sizeof(*a_ch_uuid), l_hash_value); - struct downlink *l_downlink = NULL; - for (dap_chain_net_item_t *l_net_item = s_net_items; l_net_item && !l_downlink; l_net_item = l_net_item->hh.next) { - dap_chain_net_pvt_t *l_net_pvt = PVT(l_net_item->chain_net); - pthread_mutex_lock(&l_net_pvt->downlinks_mutex); - HASH_FIND_BYHASHVALUE(hh, l_net_pvt->downlinks, a_ch_uuid, sizeof(*a_ch_uuid), l_hash_value, l_downlink); - if (l_downlink) { - HASH_DEL(l_net_pvt->downlinks, l_downlink); - log_it(L_MSG, "Remove downlink %s : %d from net ht", l_downlink->addr, l_downlink->port); - DAP_DELETE(l_downlink); - } - pthread_mutex_unlock(&l_net_pvt->downlinks_mutex); - } -} - -/** - * @brief executes, when you add data to gdb and sends it to current network connected nodes - * @param a_arg arguments. Can be network object (dap_chain_net_t) - * @param a_op_code object type (f.e. l_net->type from dap_store_obj) - * @param a_group group, for example "chain-gdb.home21-network.chain-F" - * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93 - * @param a_value buffer with data - * @param a_value_size buffer size - */ -void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) -{ - if (!a_arg || !a_obj || !a_obj->group || !a_obj->key) - return; - // Check object lifetime for broadcasting decision - dap_time_t l_time_diff = dap_nanotime_to_sec(dap_nanotime_now() - a_obj->timestamp); - if (l_time_diff > DAP_BROADCAST_LIFETIME * 60) - return; - - dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg; - dap_global_db_pkt_t *l_data_out = dap_global_db_pkt_serialize(a_obj); - struct downlink *l_link, *l_tmp; - dap_stream_ch_cachet_t *l_active_downs = NULL; - pthread_mutex_lock(&PVT(l_net)->downlinks_mutex); - size_t l_new_count = 0, l_count = HASH_COUNT(PVT(l_net)->downlinks); - l_active_downs = DAP_NEW_Z_COUNT(dap_stream_ch_cachet_t, l_count); - HASH_ITER(hh, PVT(l_net)->downlinks, l_link, l_tmp) { - if (dap_stream_ch_check_uuid_mt(l_link->worker, l_link->ch_uuid)) { - l_active_downs[l_new_count++] = (dap_stream_ch_cachet_t){ .stream_worker = l_link->worker, .uuid = l_link->ch_uuid }; - } - } - pthread_mutex_unlock(&PVT(l_net)->downlinks_mutex); - if (l_new_count < l_count) { - l_active_downs = DAP_REALLOC_COUNT(l_active_downs, l_new_count); - } - if (!dap_stream_ch_chain_pkt_write_multi_mt(l_active_downs, //_inter(a_context->queue_worker_ch_io_input[l_link->worker->worker->id], - l_new_count, - DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64, - 0, 0, l_data_out, - sizeof(dap_global_db_pkt_t) + l_data_out->data_size)) - debug_if(g_debug_reactor, L_ERROR, "Can't broadcast pkt"); - - DAP_DELETE(l_active_downs); - DAP_DELETE(l_data_out); -} - -struct net_broadcast_atoms_args { - dap_chain_atom_ptr_t atom; - size_t atom_size; - dap_chain_net_t *net; - uint64_t chain_id; - uint64_t cell_id; -}; - -static bool s_net_send_atoms(dap_proc_thread_t *a_thread, void *a_arg) -{ - UNUSED(a_thread); - - struct net_broadcast_atoms_args *l_args = a_arg; - dap_chain_net_t *l_net = l_args->net; - struct downlink *l_link, *l_tmp; - dap_stream_ch_cachet_t *l_active_downs = NULL; - pthread_mutex_lock(&PVT(l_net)->downlinks_mutex); - size_t l_new_count = 0, l_count = HASH_COUNT(PVT(l_net)->downlinks); - l_active_downs = DAP_NEW_Z_COUNT(dap_stream_ch_cachet_t, l_count); - HASH_ITER(hh, PVT(l_net)->downlinks, l_link, l_tmp) { - if (dap_stream_ch_check_uuid_mt(l_link->worker, l_link->ch_uuid)) { - l_active_downs[l_new_count++] = (dap_stream_ch_cachet_t){ .stream_worker = l_link->worker, .uuid = l_link->ch_uuid }; - } - } - pthread_mutex_unlock(&PVT(l_net)->downlinks_mutex); - if (l_new_count < l_count) { - l_active_downs = DAP_REALLOC_COUNT(l_active_downs, l_new_count); - } - if(!dap_stream_ch_chain_pkt_write_multi_mt(l_active_downs, l_new_count, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, - l_net->pub.id.uint64, l_args->chain_id, l_args->cell_id, - l_args->atom, l_args->atom_size)) - debug_if(g_debug_reactor, L_ERROR, "Can't broadcast atom"); - DAP_DELETE(l_active_downs); - DAP_DELETE(l_args->atom); - DAP_DELETE(l_args); - return true; -} - -/** - * @brief s_chain_callback_notify - * @param a_arg - * @param a_chain - * @param a_id - */ -static void s_chain_callback_notify(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void* a_atom, size_t a_atom_size) -{ - if (!a_arg || !a_chain || !a_atom) { - log_it(L_ERROR, "Argument is NULL for s_chain_callback_notify"); - return; - } - dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg; - // Check object lifetime for broadcasting decision - dap_time_t l_time_diff = dap_time_now() - a_chain->callback_atom_get_timestamp(a_atom); - if (l_time_diff > DAP_BROADCAST_LIFETIME * 60) - return; - - struct net_broadcast_atoms_args *l_args = DAP_NEW(struct net_broadcast_atoms_args); - if (!l_args) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - l_args->net = l_net; - l_args->atom = DAP_DUP_SIZE(a_atom, a_atom_size); - l_args->atom_size = a_atom_size; - l_args->chain_id = a_chain->id.uint64; - l_args->cell_id = a_id.uint64; - dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_send_atoms, l_args); -} - -/** - * @brief added like callback in dap_global_db_add_sync_group - * - * @param a_arg arguments. Can be network object (dap_chain_net_t) - * @param a_op_code object type (f.e. l_net->type from dap_store_obj) - * @param a_group group, for example "chain-gdb.home21-network.chain-F" - * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93 - * @param a_value buffer with data - * @param a_value_len buffer size - */ -static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +static void s_network_change_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { if (!a_obj || !a_arg) return; @@ -653,7 +445,7 @@ static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, da if (!el) continue; if (el->callback) - el->callback(a_context, a_obj, el->cb_arg); + el->callback(a_dbi, a_obj, el->cb_arg); } dap_chain_t *l_chain; DL_FOREACH(l_net->pub.chains, l_chain) { @@ -667,11 +459,12 @@ static void s_gbd_history_callback_notify(dap_global_db_context_t *a_context, da if (!el) continue; if (el->callback) - el->callback(a_context, a_obj, el->cb_arg); + el->callback(a_dbi, a_obj, el->cb_arg); } } DAP_DELETE(l_gdb_group_str); } + } dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net) @@ -684,26 +477,17 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net) if (l_net_pvt->seed_aliases_count) { do { i = dap_random_uint16() % l_net_pvt->seed_aliases_count; - } while (l_net_pvt->seed_nodes_addrs[i] == l_net_pvt->node_addr->uint64); - - /*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_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); - if(l_link_node_info){ - l_link_node_info->hdr.address.uint64 = l_net_pvt->seed_nodes_addrs[i]; - l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->seed_nodes_addrs_v4[i].s_addr; - l_link_node_info->hdr.ext_port = l_net_pvt->seed_nodes_ports[i]; - return l_link_node_info; - }else{ - log_it(L_WARNING,"Can't allocate memory"); - return NULL; - } - /*} - else{ - log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]); + } while (l_net_pvt->seed_nodes_addrs[i] == g_node_addr.uint64); + dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); + if(l_link_node_info){ + l_link_node_info->hdr.address.uint64 = l_net_pvt->seed_nodes_addrs[i]; + l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->seed_nodes_addrs_v4[i].s_addr; + l_link_node_info->hdr.ext_port = l_net_pvt->seed_nodes_ports[i]; + return l_link_node_info; + }else{ + log_it(L_WARNING,"Can't allocate memory"); return NULL; - }*/ + } } else if (l_net_pvt->bootstrap_nodes_count) { i = dap_random_uint16() % l_net_pvt->bootstrap_nodes_count; l_node_adrr = 0; @@ -721,6 +505,16 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net) return l_link_node_info; } +void dap_chain_net_add_cluster_link(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_node_addr) +{ + dap_return_if_fail(a_net && a_node_addr); + dap_cluster_t *l_links_cluster = dap_cluster_by_mnemonim(a_net->pub.gdb_groups_prefix); + if (l_links_cluster) + dap_cluster_member_add(l_links_cluster, a_node_addr, 0, NULL); + else + log_it(L_ERROR, "Not found links cluster for net %s", a_net->pub.name); +} + /** * @brief Check if the current link is already present or not * @@ -899,8 +693,10 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie if ( s_debug_more ) log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name, NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr)); - pthread_rwlock_wrlock(&l_net_pvt->states_lock); a_node_client->is_connected = true; + dap_stream_t *l_stream = dap_client_get_stream(a_node_client->client); + assert(l_stream); + dap_chain_net_add_cluster_link(l_net, &l_stream->node); struct json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[128] = { }; snprintf(l_err_str, sizeof(l_err_str) @@ -911,9 +707,8 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie json_object_put(l_json); if(l_net_pvt->state == NET_STATE_LINKS_CONNECTING ){ l_net_pvt->state = NET_STATE_LINKS_ESTABLISHED; - dap_proc_queue_add_callback_inter(a_node_client->stream_worker->worker->proc_queue_input,s_net_states_proc,l_net ); + dap_proc_thread_callback_add(a_node_client->stream_worker->worker->proc_queue_input,s_net_states_proc,l_net ); } - pthread_rwlock_unlock(&l_net_pvt->states_lock); } /** @@ -1051,7 +846,7 @@ static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t if (l_net_pvt->state_target != NET_STATE_OFFLINE){ l_net_pvt->state = NET_STATE_LINKS_CONNECTING; } - dap_proc_queue_add_callback_inter(a_worker->proc_queue_input, s_net_states_proc, a_net); + dap_proc_thread_callback_add(a_worker->proc_queue_input, s_net_states_proc, a_net); } } @@ -1338,9 +1133,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) json_object_object_add(l_json, "linksCount" , json_object_new_int(PVT(a_net)->net_links ? HASH_COUNT(PVT(a_net)->net_links) : 0)); json_object_object_add(l_json, "activeLinksCount" , json_object_new_int(s_net_get_active_links_count(a_net))); char l_node_addr_str[24] = {'\0'}; - int l_tmp = PVT(a_net)->node_addr - ? snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(PVT(a_net)->node_addr)) - : 0; + int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr)); json_object_object_add(l_json, "nodeAddress" , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000")); return l_json; } @@ -1394,13 +1187,6 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) DAP_DELETE(l_link); } pthread_mutex_unlock(&l_net_pvt->uplinks_mutex); - pthread_mutex_lock(&l_net_pvt->downlinks_mutex); - HASH_ITER(hh, l_net_pvt->downlinks, l_downlink, l_dltmp) { - HASH_DEL(l_net_pvt->downlinks, l_downlink); - dap_events_socket_delete_mt(l_downlink->worker->worker, l_downlink->esocket_uuid); - DAP_DELETE(l_downlink); - } - pthread_mutex_unlock(&l_net_pvt->downlinks_mutex); l_net_pvt->balancer_link_requests = 0; l_net_pvt->active_link = NULL; dap_list_free(l_net_pvt->links_queue); @@ -1495,7 +1281,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) default: log_it (L_DEBUG, "Unprocessed state"); } s_net_states_notify(l_net); - return !l_repeat_after_exit; + return l_repeat_after_exit; } bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client) @@ -1586,9 +1372,7 @@ static dap_chain_net_t *s_net_new(const char *a_id, const char *a_name, pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&PVT(l_ret)->uplinks_mutex, &l_mutex_attr); pthread_mutex_init(&l_ret->pub.balancer_mutex, &l_mutex_attr); - pthread_mutex_init(&PVT(l_ret)->downlinks_mutex, &l_mutex_attr); pthread_mutexattr_destroy(&l_mutex_attr); - pthread_rwlock_init(&PVT(l_ret)->states_lock, NULL); if (dap_chain_net_id_parse(a_id, &l_ret->pub.id) != 0) { DAP_DELETE(l_ret); return NULL; @@ -1621,12 +1405,10 @@ static dap_chain_net_t *s_net_new(const char *a_id, const char *a_name, * free dap_chain_net_t * a_net object * @param a_net */ -void dap_chain_net_delete( dap_chain_net_t * a_net ) +void dap_chain_net_delete(dap_chain_net_t *a_net) { pthread_mutex_destroy(&PVT(a_net)->uplinks_mutex); - pthread_mutex_destroy(&PVT(a_net)->downlinks_mutex); pthread_mutex_destroy(&a_net->pub.balancer_mutex); - pthread_rwlock_destroy(&PVT(a_net)->states_lock); if(PVT(a_net)->seed_aliases) { DAP_DELETE(PVT(a_net)->seed_aliases); PVT(a_net)->seed_aliases = NULL; @@ -2247,21 +2029,13 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) if (l_return_state) dap_chain_net_start(l_net); } else if (l_list_str && !strcmp(l_list_str, "list")) { - dap_list_t *l_net_keys = NULL; - for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) { - if (!l_chain->callback_get_poa_certs) - continue; - l_net_keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL); - if (l_net_keys) - break; - } - if (!l_net_keys) { + if (!l_net->pub.keys) { dap_cli_server_cmd_set_reply_text(a_str_reply, "No PoA certs found for this network"); return -11; } dap_string_t *l_str_out = dap_string_new("List of network PoA certificates:\n"); int i = 0; - for (dap_list_t *it = l_net_keys; it; it = it->next) { + for (dap_list_t *it = l_net->pub.keys; it; it = it->next) { dap_hash_fast_t l_pkey_hash; char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_pkey_get_hash(it->data, &l_pkey_hash); @@ -2314,10 +2088,10 @@ typedef struct list_priority_{ char * chains_path; } list_priority; -static int callback_compare_prioritity_list(const void *a_item1, const void *a_item2) +static int callback_compare_prioritity_list(dap_list_t *a_item1, dap_list_t *a_item2) { - list_priority *l_item1 = (list_priority*)((dap_list_t*)a_item1)->data, - *l_item2 = (list_priority*)((dap_list_t*)a_item2)->data; + list_priority *l_item1 = a_item1->data, + *l_item2 = a_item2->data; if (!l_item1 || !l_item2) { log_it(L_CRITICAL, "Invalid arg"); return 0; @@ -2381,17 +2155,9 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) return -1; } } - dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); + dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); l_net_pvt->load_mode = true; l_net_pvt->acl_idx = a_acl_idx; - l_net->pub.gdb_groups_prefix = dap_strdup ( - dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix", - dap_config_get_item_str(l_cfg , "general" , "name" ) ) ); - dap_global_db_add_sync_group(l_net->pub.name, "global", s_gbd_history_callback_notify, l_net); - dap_global_db_add_sync_group(l_net->pub.name, l_net->pub.gdb_groups_prefix, s_gbd_history_callback_notify, l_net); - - l_net->pub.gdb_nodes = dap_strdup_printf("%s.nodes",l_net->pub.gdb_groups_prefix); - l_net->pub.gdb_nodes_aliases = dap_strdup_printf("%s.nodes.aliases",l_net->pub.gdb_groups_prefix); // Bridged netwoks allowed to send transactions to uint16_t l_net_ids_count = 0; @@ -2403,69 +2169,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) l_net->pub.bridged_networks = dap_list_append(l_net->pub.bridged_networks, DAP_DUP(&l_id)); } - // nodes for special sync - char **l_gdb_sync_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_addrs", - &l_net_pvt->gdb_sync_nodes_addrs_count); - if(l_gdb_sync_nodes_addrs && l_net_pvt->gdb_sync_nodes_addrs_count > 0) { - l_net_pvt->gdb_sync_nodes_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t, - sizeof(dap_chain_node_addr_t)*l_net_pvt->gdb_sync_nodes_addrs_count); - if (!l_net_pvt->gdb_sync_nodes_addrs) { - log_it(L_CRITICAL, "Memory allocation error"); - dap_config_close(l_cfg); - return -1; - } - for(uint16_t i = 0; i < l_net_pvt->gdb_sync_nodes_addrs_count; i++) { - dap_chain_node_addr_from_str(l_net_pvt->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]); - } - } - // links for special sync - uint16_t l_gdb_links_count = 0; - PVT(l_net)->gdb_sync_nodes_links_count = 0; - char **l_gdb_sync_nodes_links = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_links", &l_gdb_links_count); - if (l_gdb_sync_nodes_links && l_gdb_links_count > 0) { - l_net_pvt->gdb_sync_nodes_links_ips = DAP_NEW_Z_SIZE(uint32_t, l_gdb_links_count * sizeof(uint32_t)); - if (!l_net_pvt->gdb_sync_nodes_links_ips) { - log_it(L_CRITICAL, "Memory allocation error"); - dap_config_close(l_cfg); - return -1; - } - l_net_pvt->gdb_sync_nodes_links_ports = DAP_NEW_SIZE(uint16_t, l_gdb_links_count * sizeof(uint16_t)); - if (!l_net_pvt->gdb_sync_nodes_links_ports) { - log_it(L_CRITICAL, "Memory allocation error"); - DAP_DEL_Z(l_net_pvt->gdb_sync_nodes_links_ips); - dap_config_close(l_cfg); - return -1; - } - for(uint16_t i = 0; i < l_gdb_links_count; i++) { - char *l_gdb_link_port_str = strchr(l_gdb_sync_nodes_links[i], ':'); - if (!l_gdb_link_port_str) { - continue; - } - uint16_t l_gdb_link_port = atoi(l_gdb_link_port_str + 1); - if (!l_gdb_link_port) - continue; - int l_gdb_link_len = l_gdb_link_port_str - l_gdb_sync_nodes_links[i]; - char l_gdb_link_ip_str[l_gdb_link_len + 1]; - memcpy(l_gdb_link_ip_str, l_gdb_sync_nodes_links[i], l_gdb_link_len); - l_gdb_link_ip_str[l_gdb_link_len] = '\0'; - struct in_addr l_in_addr; - if (inet_pton(AF_INET, (const char *)l_gdb_link_ip_str, &l_in_addr) > 0) { - PVT(l_net)->gdb_sync_nodes_links_ips[PVT(l_net)->gdb_sync_nodes_links_count] = l_in_addr.s_addr; - PVT(l_net)->gdb_sync_nodes_links_ports[PVT(l_net)->gdb_sync_nodes_links_count] = l_gdb_link_port; - PVT(l_net)->gdb_sync_nodes_links_count++; - } - } - } - // groups for special sync - uint16_t l_gdb_sync_groups_count; - char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &l_gdb_sync_groups_count); - if (l_gdb_sync_groups && l_gdb_sync_groups_count > 0) { - for(uint16_t i = 0; i < l_gdb_sync_groups_count; i++) { - // add group to special sync - dap_global_db_add_sync_extra_group(l_net->pub.name, l_gdb_sync_groups[i], s_gbd_history_callback_notify, l_net); - } - } - // Add network to the list dap_chain_net_item_t * l_net_item = DAP_NEW_Z( dap_chain_net_item_t); if (!l_net_item) { @@ -2524,44 +2227,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) // wait time before reconnect attempt with same link l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10); - const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto"); - - const char * l_node_addr_str = NULL; - const char * l_node_alias_str = NULL; - - // use unique addr from pub key - if(!dap_strcmp(l_node_addr_type, "auto")) { - size_t l_pub_key_data_size = 0; - uint8_t *l_pub_key_data = NULL; - - // read pub key - char *l_addr_key = dap_strdup_printf("node-addr"); - l_pub_key_data = dap_global_db_get_sync(GROUP_LOCAL_NODE_ADDR, l_addr_key, &l_pub_key_data_size, NULL, NULL); - // generate a new pub key if it doesn't exist - if(!l_pub_key_data || !l_pub_key_data_size){ - log_it(L_CRITICAL, "Memory allocation error"); - dap_config_close(l_cfg); - return -1; - } - // generate addr from pub_key - dap_chain_hash_fast_t l_hash; - if(l_pub_key_data_size > 0 && dap_hash_fast(l_pub_key_data, l_pub_key_data_size, &l_hash) == 1) { - l_node_addr_str = dap_strdup_printf("%04X::%04X::%04X::%04X", - (uint16_t) *(uint16_t*) (l_hash.raw), - (uint16_t) *(uint16_t*) (l_hash.raw + 2), - (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 4), - (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 2)); - } - DAP_DELETE(l_addr_key); - DAP_DELETE(l_pub_key_data); - } - // use static addr from setting - else if(!dap_strcmp(l_node_addr_type, "static")) { - //const char * l_node_ipv4_str = dap_config_get_item_str(l_cfg , "general" ,"node-ipv4"); - l_node_addr_str = dap_strdup(dap_config_get_item_str(l_cfg, "general", "node-addr")); - l_node_alias_str = dap_config_get_item_str(l_cfg, "general", "node-alias"); - } - log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them", l_net_pvt->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len ); PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_aliases_count * sizeof(struct in_addr)); @@ -2575,8 +2240,8 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) ( l_seed_nodes_ipv6_len && i < l_seed_nodes_ipv6_len ) || ( l_seed_nodes_hostnames_len && i < l_seed_nodes_hostnames_len ) ); i++) { - dap_chain_node_addr_t l_seed_node_addr = { 0 }, *l_seed_node_addr_gdb = NULL; - dap_chain_node_info_t l_node_info = { 0 }, *l_node_info_gdb = NULL; + dap_chain_node_addr_t l_seed_node_addr = { 0 }; + dap_chain_node_info_t l_node_info = { 0 }; log_it(L_NOTICE, "Check alias %s in db", l_net_pvt->seed_aliases[i]); snprintf(l_node_info.hdr.alias,sizeof (l_node_info.hdr.alias),"%s", PVT(l_net)->seed_aliases[i]); @@ -2606,38 +2271,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) log_it(L_ERROR, "%s", gai_strerror(l_ret_code)); } } -/* - l_seed_node_addr_gdb = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i]); - l_node_info_gdb = l_seed_node_addr_gdb ? dap_chain_node_info_read(l_net, l_seed_node_addr_gdb) : NULL; - - l_node_info.hdr.address = l_seed_node_addr; - if (l_node_info.hdr.ext_addr_v4.s_addr || -#ifdef DAP_OS_BSD - l_node_info.hdr.ext_addr_v6.__u6_addr.__u6_addr32[0] -#else - l_node_info.hdr.ext_addr_v6.s6_addr32[0] -#endif - ) { - //Let's check if config was altered - int l_ret = l_node_info_gdb ? memcmp(&l_node_info, l_node_info_gdb, sizeof(dap_chain_node_info_t)) : 1; - if (!l_ret) { - log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" already in list", NODE_ADDR_FP_ARGS_S(l_seed_node_addr)); - } else { - // Either not yet added or must be altered - l_ret = dap_chain_node_info_save(l_net, &l_node_info); - if (!l_ret) { - if (dap_chain_node_alias_register(l_net,l_net_pvt->seed_aliases[i], &l_seed_node_addr)) - log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" added to the curent list", NODE_ADDR_FP_ARGS_S(l_seed_node_addr)); - else - log_it(L_WARNING,"Cant register alias %s for address "NODE_ADDR_FP_STR, l_net_pvt->seed_aliases[i], NODE_ADDR_FP_ARGS_S(l_seed_node_addr)); - } else { - log_it(L_WARNING,"Cant save node info for address "NODE_ADDR_FP_STR" return code %d", NODE_ADDR_FP_ARGS_S(l_seed_node_addr), l_ret); - } - } - } else - log_it(L_WARNING,"No address for seed node, can't populate global_db with it"); - DAP_DEL_Z(l_seed_node_addr_gdb); - DAP_DEL_Z(l_node_info_gdb);*/ } dap_chain_net_node_list_init(); @@ -2665,67 +2298,49 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) } DAP_DELETE(l_bootstrap_name); } - if ( l_node_addr_str || l_node_alias_str ){ - dap_chain_node_addr_t * l_node_addr; - if ( l_node_addr_str == NULL) - l_node_addr = dap_chain_node_alias_find(l_net, l_node_alias_str); - else { - l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t); - if (!l_node_addr) { - log_it(L_CRITICAL, "Memory allocation error"); - dap_config_close(l_cfg); - return -1; - } - if (dap_chain_node_addr_from_str(l_node_addr, l_node_addr_str) == 0) - log_it(L_NOTICE, "Parse node addr "NODE_ADDR_FP_STR" successfully", NODE_ADDR_FP_ARGS(l_node_addr)); - else - DAP_DEL_Z(l_node_addr); - l_net_pvt->node_addr = l_node_addr; - } - if ( l_node_addr ) { - char *l_addr_hash_str = dap_chain_node_addr_to_hash_str(l_node_addr); - // save current node address - dap_db_set_cur_node_addr(l_node_addr->uint64, l_net->pub.name); - if(!l_addr_hash_str){ - log_it(L_ERROR,"Can't get hash string for node address!"); - } else { - l_net_pvt->node_info = dap_chain_node_info_read (l_net, l_node_addr); - if ( !l_net_pvt->node_info ) { // If not present - create it - l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t); - if (!l_net_pvt->node_info) { - log_it(L_CRITICAL, "Memory allocation error"); - DAP_DEL_Z(l_node_addr); - dap_config_close(l_cfg); - return -1; - } - l_net_pvt->node_info->hdr.address = *l_node_addr; - if (dap_config_get_item_bool_default(g_config,"server","enabled",false) ){ - const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config,"server","ext_address",NULL); - const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config,"server","ext_address6",NULL); - uint16_t l_ext_port = dap_config_get_item_uint16_default(g_config,"server","ext_port_tcp", 8079); - uint16_t l_node_info_port = l_ext_port ? l_ext_port : - dap_config_get_item_uint16_default(g_config,"server","listen_port_tcp",8079); - if (l_ext_addr_v4) - inet_pton(AF_INET,l_ext_addr_v4,&l_net_pvt->node_info->hdr.ext_addr_v4 ); - if (l_ext_addr_v6) - inet_pton(AF_INET6,l_ext_addr_v6,&l_net_pvt->node_info->hdr.ext_addr_v6 ); - l_net_pvt->node_info->hdr.ext_port =l_node_info_port; - } else - log_it(L_INFO,"Server is disabled, add only node address in nodelist"); - } - log_it(L_NOTICE,"GDB Info: node_addr: " NODE_ADDR_FP_STR" links: %u cell_id: 0x%016"DAP_UINT64_FORMAT_X, - NODE_ADDR_FP_ARGS(l_node_addr), - l_net_pvt->node_info->hdr.links_number, - l_net_pvt->node_info->hdr.cell_id.uint64); - } - DAP_DELETE(l_addr_hash_str); - } - else{ - log_it(L_WARNING, "Not present our own address %s in database", (l_node_alias_str) ? l_node_alias_str: ""); + + const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto"); + if (!dap_strcmp(l_node_addr_type, "static")) { + const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr", + dap_config_get_item_str(l_cfg, "general", "node-alias")); + if (l_node_alias_str) { + dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str); + if (!l_alias_addr) + dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr); + } else + log_it(L_ERROR, "Can't read alias for node address from config"); + + } else if (dap_strcmp(l_node_addr_type, "auto")) + log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'"); + + l_net_pvt->node_info = dap_chain_node_info_read(l_net, &g_node_addr); + if ( !l_net_pvt->node_info ) { // If not present - create it + l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t); + if (!l_net_pvt->node_info) { + log_it(L_CRITICAL, "Memory allocation error"); + dap_config_close(l_cfg); + return -1; } + l_net_pvt->node_info->hdr.address = g_node_addr; + if (dap_config_get_item_bool_default(g_config, "server", "enabled", false)) { + const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config, "server", "ext_address", NULL); + const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config, "server", "ext_address6", NULL); + uint16_t l_node_info_port = dap_config_get_item_uint16_default(g_config, "server", "ext_port_tcp", + dap_config_get_item_uint16_default(g_config, "server", "listen_port_tcp", 8079)); + if (l_ext_addr_v4) + inet_pton(AF_INET, l_ext_addr_v4, &l_net_pvt->node_info->hdr.ext_addr_v4); + if (l_ext_addr_v6) + inet_pton(AF_INET6, l_ext_addr_v6, &l_net_pvt->node_info->hdr.ext_addr_v6); + l_net_pvt->node_info->hdr.ext_port = l_node_info_port; + } else + log_it(L_INFO, "Server is disabled, add only node address in nodelist"); } + log_it(L_NOTICE, "Net load information: node_addr " NODE_ADDR_FP_STR ", balancers links %u, cell_id 0x%016"DAP_UINT64_FORMAT_X, + NODE_ADDR_FP_ARGS_S(g_node_addr), + l_net_pvt->seed_aliases_count, + l_net_pvt->node_info->hdr.cell_id.uint64); - /* *** Chaiins init by configs *** */ + /* *** Chains init by configs *** */ char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), l_net->pub.name); DIR * l_chains_dir = opendir(l_chains_path); DAP_DEL_Z(l_chains_path); @@ -2829,20 +2444,18 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) default: l_ledger_flags |= DAP_CHAIN_LEDGER_CHECK_CELLS_DS | DAP_CHAIN_LEDGER_CHECK_TOKEN_EMISSION; } - dap_list_t *l_net_keys = NULL; for (dap_chain_t *l_chain = l_net->pub.chains; l_chain; l_chain = l_chain->next) { if (!l_chain->callback_get_poa_certs) continue; - l_net_keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL); - if (l_net_keys) + l_net->pub.keys = l_chain->callback_get_poa_certs(l_chain, NULL, NULL); + if (l_net->pub.keys) break; } - if (!l_net_keys) - log_it(L_WARNING,"PoA certificates for net %s not found.", l_net->pub.name); + if (!l_net->pub.keys) + log_it(L_WARNING, "PoA certificates for net %s not found", l_net->pub.name); // init LEDGER model - l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.id, l_net->pub.name, l_net->pub.native_ticker, l_net_keys); + l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.id, l_net->pub.name, l_net->pub.native_ticker, l_net->pub.keys); - DAP_DELETE(l_node_addr_str); dap_config_close(l_cfg); return 0; } @@ -2978,15 +2591,72 @@ int s_net_load(dap_chain_net_t *a_net) l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false); - dap_chain_net_add_gdb_notify_callback(l_net, dap_chain_net_sync_gdb_broadcast, l_net); - DL_FOREACH(l_net->pub.chains, l_chain) - // add a callback to monitor changes in the chain - dap_chain_add_callback_notify(l_chain, s_chain_callback_notify, l_net); + // Init GlobalDB clusters for mempool, service and nodes (with aliases) + l_net->pub.gdb_groups_prefix = dap_strdup( + dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix", + dap_config_get_item_str(l_cfg, "general", "name"))); + // Zerochain mempool cluster + char *l_gdb_mempool_mask = dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, l_net->pub.chains->name); + l_net_pvt->zerochain_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_net->pub.name, l_gdb_mempool_mask, + DAP_CHAIN_NET_MEMPOOL_TTL, true, + s_network_change_notify, l_net, + DAP_GDB_MEMBER_ROLE_USER, + DAP_CLUSTER_ROLE_EMBEDDED); + if (!l_net_pvt->zerochain_cluster) { + log_it(L_ERROR, "Can't initialize zerochain cluster for network %s", l_net->pub.name); + return -1; + } + dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->zerochain_cluster); + DAP_DELETE(l_gdb_mempool_mask); + // Other chains mempool cluster + l_gdb_mempool_mask = dap_strdup_printf("%s.*.mempool", l_net->pub.gdb_groups_prefix); + l_net_pvt->mempool_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_net->pub.name, l_gdb_mempool_mask, + DAP_CHAIN_NET_MEMPOOL_TTL, true, + s_network_change_notify, l_net, + DAP_GDB_MEMBER_ROLE_USER, + DAP_CLUSTER_ROLE_EMBEDDED); + if (!l_net_pvt->mempool_cluster) { + log_it(L_ERROR, "Can't initialize mempool cluster for network %s", l_net->pub.name); + return -1; + } + dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->mempool_cluster); + DAP_DELETE(l_gdb_mempool_mask); + // Service orders cluster + l_gdb_mempool_mask = dap_strdup_printf("%s.service.orders", l_net->pub.gdb_groups_prefix); + l_net_pvt->orders_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_net->pub.name, l_gdb_mempool_mask, + 0, true, + s_network_change_notify, l_net, + DAP_GDB_MEMBER_ROLE_GUEST, + DAP_CLUSTER_ROLE_EMBEDDED); + if (!l_net_pvt->orders_cluster) { + log_it(L_ERROR, "Can't initialize orders cluster for network %s", l_net->pub.name); + return -1; + } + dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->orders_cluster); + DAP_DELETE(l_gdb_mempool_mask); + // Nodes and its aliases cluster + l_net->pub.gdb_nodes = dap_strdup_printf("%s.nodes",l_net->pub.gdb_groups_prefix); + l_net->pub.gdb_nodes_aliases = dap_strdup_printf("%s.nodes.aliases",l_net->pub.gdb_groups_prefix); + l_gdb_mempool_mask = dap_strdup_printf("%s.nodes*", l_net->pub.gdb_groups_prefix); + l_net_pvt->nodes_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_net->pub.name, l_gdb_mempool_mask, + 0, true, + s_network_change_notify, l_net, + DAP_GDB_MEMBER_ROLE_GUEST, + DAP_CLUSTER_ROLE_EMBEDDED); + if (!l_net_pvt->nodes_cluster) { + log_it(L_ERROR, "Can't initialize nodes cluster for network %s", l_net->pub.name); + return -1; + } + dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->nodes_cluster); + DAP_DELETE(l_gdb_mempool_mask); uint32_t l_timeout = dap_config_get_item_uint32_default(g_config, "node_client", "timer_update_states", 600); PVT(l_net)->main_timer = dap_interval_timer_create(l_timeout * 1000, s_main_timer_callback, l_net); log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name); - PVT(l_net)->update_links_timer = dap_interval_timer_create(600 * 1000, s_update_links_timer_callback, l_net); dap_config_close(l_cfg); @@ -2996,6 +2666,23 @@ int s_net_load(dap_chain_net_t *a_net) return 0; } +int dap_chain_net_add_poa_certs_to_cluster(dap_chain_net_t *a_net, dap_global_db_cluster_t *a_cluster) +{ + dap_return_val_if_fail(a_net && a_cluster, -1); + for (dap_list_t *it = a_net->pub.keys; it; it = it->next) { + dap_pkey_t *l_pkey = it->data; + dap_stream_node_addr_t l_poa_addr = dap_stream_node_addr_from_pkey(l_pkey); + dap_global_db_cluster_member_add(a_cluster, &l_poa_addr, DAP_GDB_MEMBER_ROLE_ROOT); + } + return 0; +} + +bool dap_chain_net_add_validator_to_clusters(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_addr) +{ + bool l_ret = dap_global_db_cluster_member_add(PVT(a_net)->mempool_cluster, a_addr, DAP_GDB_MEMBER_ROLE_ROOT); + return !l_ret ? false : dap_global_db_cluster_member_add(PVT(a_net)->orders_cluster, a_addr, DAP_GDB_MEMBER_ROLE_USER); +} + /** * @brief dap_chain_net_deinit */ @@ -3221,34 +2908,7 @@ void dap_chain_net_set_state(dap_chain_net_t *l_net, dap_chain_net_state_t a_sta return; } PVT(l_net)->state = a_state; - dap_proc_queue_add_callback(dap_events_worker_get_auto(), s_net_states_proc,l_net); -} - - -/** - * @brief dap_chain_net_get_cur_addr - * @param l_net - * @return - */ -dap_chain_node_addr_t *dap_chain_net_get_cur_addr( dap_chain_net_t *a_net) -{ - return a_net ? (PVT(a_net)->node_info ? &PVT(a_net)->node_info->hdr.address : PVT(a_net)->node_addr) : NULL; -} - -uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t *a_net) -{ - if (!a_net) - return 0; - uint64_t l_ret = 0; - if (PVT(a_net)->node_addr == NULL) { // Cache address if not present - l_ret = dap_chain_net_get_cur_node_addr_gdb_sync(a_net->pub.name); - if (l_ret) { - PVT(a_net)->node_addr = DAP_NEW_Z(dap_chain_node_addr_t); - PVT(a_net)->node_addr->uint64 = l_ret; - } - } else - l_ret = PVT(a_net)->node_addr->uint64; - return l_ret; + dap_proc_thread_callback_add(NULL, s_net_states_proc, l_net); } dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net) @@ -3690,95 +3350,7 @@ void dap_chain_net_announce_addrs() { char l_node_addr_str[INET_ADDRSTRLEN] = { '\0' }; inet_ntop(AF_INET, &l_net_pvt->node_info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); log_it(L_MSG, "Announce our node address "NODE_ADDR_FP_STR" < %s:%u > in net %s", - NODE_ADDR_FP_ARGS(l_net_pvt->node_addr), l_node_addr_str, l_net_pvt->node_info->hdr.ext_port, l_net_item->name); + NODE_ADDR_FP_ARGS_S(g_node_addr), l_node_addr_str, l_net_pvt->node_info->hdr.ext_port, l_net_item->name); } } } - -char *dap_chain_net_links_dump(dap_chain_net_t *a_net) { - dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); - pthread_mutex_lock(&l_net_pvt->uplinks_mutex); - dap_string_t *l_str_uplinks = dap_string_new("---------------------------\n" - "| ↑\\↓ |\t#\t|\t\tIP\t\t|\tPort\t|\n"); - struct net_link *l_link, *l_link_tmp = NULL; - size_t l_up_count = 0; - HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) { - dap_string_append_printf(l_str_uplinks, "| ↑ |\t%zu\t|\t%s\t\t|\t%u\t|\n", - ++l_up_count, - inet_ntoa(l_link->link_info->hdr.ext_addr_v4), - l_link->link_info->hdr.ext_port); - } - - size_t l_down_count = 0; - dap_string_t *l_str_downlinks = dap_string_new("---------------------------\n" - "| ↑\\↓ |\t#\t|\t\tIP\t\t|\tPort\t|\n"); - pthread_mutex_unlock(&l_net_pvt->uplinks_mutex); - pthread_mutex_lock(&l_net_pvt->downlinks_mutex); - struct downlink *l_downlink = NULL, *l_downtmp = NULL; - HASH_ITER(hh, l_net_pvt->downlinks, l_downlink, l_downtmp) { - dap_string_append_printf(l_str_downlinks, "| ↓ |\t%zu\t|\t%s\t\t|\t%u\t|\n", - ++l_down_count, - l_downlink->addr, l_downlink->port); - } - pthread_mutex_unlock(&l_net_pvt->downlinks_mutex); - char *l_res_str = dap_strdup_printf("Count links: %zu\n\nUplinks: %zu\n%s\n\nDownlinks: %zu\n%s\n", - l_up_count + l_down_count, l_up_count, l_str_uplinks->str, - l_down_count, l_str_downlinks->str); - dap_string_free(l_str_uplinks, true); - dap_string_free(l_str_downlinks, true); - return l_res_str; -} - -/** - * @brief init node addr and set in gdb - * @param - - * @return 0 if no errors - */ -int s_net_init_node_addr_cert() -{ - dap_config_t *l_cfg = NULL; - dap_string_t *l_cfg_path = dap_string_new("cellframe-node"); - - if( !(l_cfg = dap_config_open(l_cfg_path->str)) ) { - log_it(L_ERROR,"Can't open default node config"); - dap_string_free(l_cfg_path,true); - return -1; - } - dap_string_free(l_cfg_path,true); - - const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto"); - // use unique addr from pub key - size_t l_pub_key_data_size = 0; - uint8_t *l_pub_key_data = NULL; - - // read pub key - char *l_addr_key = dap_strdup_printf("node-addr"); - l_pub_key_data = dap_global_db_get_sync(GROUP_LOCAL_NODE_ADDR, l_addr_key, &l_pub_key_data_size, NULL, NULL); - // generate a new pub key if it doesn't exist - if(!l_pub_key_data || !l_pub_key_data_size) { - const char *l_certs_name_str = l_addr_key; - dap_cert_t **l_certs = NULL; - size_t l_certs_size = 0; - dap_cert_t *l_cert = NULL; - // Load certs or create if not found - if(!dap_cert_parse_str_list(l_certs_name_str, &l_certs, &l_certs_size)) { // Load certs - const char *l_cert_folder = dap_cert_get_folder(0); - // create new cert - if(l_cert_folder) { - char *l_cert_path = dap_strdup_printf("%s/%s.dcert", l_cert_folder, l_certs_name_str); - l_cert = dap_cert_generate(l_certs_name_str, l_cert_path, DAP_ENC_KEY_TYPE_SIG_DILITHIUM); - DAP_DELETE(l_cert_path); - } - } - if(l_certs_size > 0) - l_cert = l_certs[0]; - if(l_cert) { - l_pub_key_data = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_data_size); - // save pub key - if(l_pub_key_data && l_pub_key_data_size > 0) - dap_global_db_set(GROUP_LOCAL_NODE_ADDR, l_addr_key, l_pub_key_data, l_pub_key_data_size, false, - NULL, NULL); - } - } - return 0; -} diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 619defb2d4..0dd8131330 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -176,10 +176,10 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands dap_list_free(l_node_addr_list); } -static int callback_compare_node_list(const void *a_item1, const void *a_item2) +static int callback_compare_node_list(dap_list_t *a_item1, dap_list_t *a_item2) { - dap_chain_node_info_t *l_item1 = (dap_chain_node_info_t*)((dap_list_t*)a_item1)->data, - *l_item2 = (dap_chain_node_info_t*)((dap_list_t*)a_item2)->data; + dap_chain_node_info_t *l_item1 = a_item1->data, + *l_item2 = a_item2->data; if (!l_item1 || !l_item2) { log_it(L_CRITICAL, "Invalid element"); return 0; diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c index 2043d5b3f2..025f7256a5 100644 --- a/modules/net/dap_chain_net_node_list.c +++ b/modules/net/dap_chain_net_node_list.c @@ -208,7 +208,7 @@ static int dap_chain_net_node_list_wait(struct node_link_request *a_node_list_re return ret; } -int dap_chain_net_node_list_request (dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_request, bool a_sync) +int dap_chain_net_node_list_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_request, bool a_sync) { dap_chain_node_info_t *l_link_node_info = dap_get_balancer_link_from_cfg(a_net); if (!l_link_node_info) @@ -256,7 +256,7 @@ int dap_chain_net_node_list_request (dap_chain_net_t *a_net, dap_chain_node_info s_node_list_request_deinit(l_node_list_request); return ret; } -static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +static void s_node_list_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { if (!a_arg || !a_obj || !a_obj->key) return; @@ -265,7 +265,7 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_ size_t l_size_obj_need = (sizeof(dap_chain_node_info_t)); if (!dap_strcmp(a_obj->group, l_net->pub.gdb_nodes)) { - if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD) { + if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) { dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *)a_obj->value; size_t l_size_obj = (a_obj->value_len - (l_node_info->hdr.links_number * sizeof(dap_chain_node_addr_t))); @@ -273,7 +273,7 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_ { if(l_node_info->hdr.owner_address.uint64 == 0){ log_it(L_NOTICE, "Node %s removed, there is not pinners", a_obj->key); - dap_global_db_del_unsafe(a_context, a_obj->group, a_obj->key); + dap_global_db_del_sync(a_obj->group, a_obj->key); } else { char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' }; inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN); @@ -290,13 +290,12 @@ static void s_node_list_callback_notify(dap_global_db_context_t *a_context, dap_ } else { - dap_global_db_del_unsafe(a_context, a_obj->group, a_obj->key); + dap_global_db_del_sync(a_obj->group, a_obj->key); log_it(L_NOTICE, "Wrong size! data size %lu need - (%lu) %s removed ",l_size_obj, l_size_obj_need, a_obj->key); } } } - } int dap_chain_net_node_list_init() diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index a7c387ba5e..ed40377c87 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -49,40 +49,6 @@ #define LOG_TAG "chain_node" -/** - * Generate node address - */ -dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id) -{ - dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t); - if (!l_addr) { - log_it(L_CRITICAL, "Memory allocation error"); - return NULL; - } - dap_chain_hash_fast_t l_hash; - dap_hash_fast(&a_net_id, sizeof(dap_chain_net_id_t), &l_hash); - // first 4 bytes is last 4 bytes of shard id hash - memcpy(l_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); - // last 4 bytes is random - randombytes(l_addr->raw + sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); - // for LITTLE_ENDIAN (Intel), do nothing, otherwise swap bytes - l_addr->uint64 = le64toh(l_addr->uint64); // l_addr->raw the same l_addr->uint64 - return l_addr; -} - -/** - * Check the validity of the node address by cell id - */ -bool dap_chain_node_check_addr(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_addr) -{ - if (!a_addr || !a_net) - return false; - dap_chain_hash_fast_t l_hash; - dap_hash_fast(&a_net->pub.id, sizeof(dap_chain_net_id_t), &l_hash); - // first 4 bytes is last 4 bytes of shard id hash - return !memcmp(a_addr->raw, l_hash.raw + sizeof(l_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); -} - /** * Register alias in base */ @@ -96,11 +62,18 @@ bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, * @param alias * @return */ -dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const char *a_alias) +dap_chain_node_addr_t *dap_chain_node_alias_find(dap_chain_net_t *a_net, const char *a_alias) { + dap_return_val_if_fail(a_alias && a_net, NULL); size_t l_addr_size =0; - return (dap_chain_node_addr_t*)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases, - a_alias, &l_addr_size, NULL, NULL); + dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases, + a_alias, &l_addr_size, NULL, NULL); + if (l_addr_size != sizeof(dap_chain_node_addr_t)) { + log_it(L_WARNING, "Address in database is corrupted for alias %s", a_alias); + DAP_DELETE(l_addr); + return NULL; + } + return l_addr; } /** @@ -328,121 +301,3 @@ bool dap_chain_node_mempool_autoproc_init() return true; } -/** - * @brief dap_chain_node_mempool_deinit - */ -void dap_chain_node_mempool_autoproc_deinit() -{ -} - - -/** - * @brief Sets a current node adress. - * @param a_address a current node adress - * @param a_net_name a net name string - * @return True if success, otherwise false - */ -static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name, time_t a_expire_time) -{ -char l_key [DAP_GLOBAL_DB_KEY_MAX]; -bool l_ret; - - if(!a_net_name) - return false; - - snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name); - - if ( (l_ret = dap_global_db_set(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &a_address, sizeof(a_address), - true, NULL, NULL)) == 0 ) { - snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s_time", a_net_name); - l_ret = dap_global_db_set(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &a_expire_time, sizeof(time_t), - true, NULL, NULL) == DAP_GLOBAL_DB_RC_SUCCESS; - } - - return l_ret; -} - -/** - * @brief Sets an adress of a current node and no expire time. - * - * @param a_address an adress of a current node - * @param a_net_name a net name string - * @return Returns true if siccessful, otherwise false - */ -bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name ) -{ - return dap_db_set_cur_node_addr_common(a_address,a_net_name,0); -} - -/** - * @brief Sets an address of a current node and expire time. - * - * @param a_address an address of a current node - * @param a_net_name a net name string - * @return Returns true if successful, otherwise false - */ -bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name ) -{ - return dap_db_set_cur_node_addr_common(a_address,a_net_name, time(NULL)); -} - -/** - * @brief Gets an adress of current node by a net name. - * - * @param a_net_name a net name string - * @return Returns an adress if successful, otherwise 0. - */ -uint64_t dap_chain_net_get_cur_node_addr_gdb_sync(char *a_net_name) -{ -char l_key[DAP_GLOBAL_DB_KEY_MAX], l_key_time[DAP_GLOBAL_DB_KEY_MAX]; -uint8_t *l_node_addr_data, *l_node_time_data; -size_t l_node_addr_len = 0, l_node_time_len = 0; -uint64_t l_node_addr_ret = 0; -time_t l_node_time = 0; - - if(!a_net_name) - return 0; - - snprintf(l_key, sizeof(l_key) - 1, "cur_node_addr_%s", a_net_name); - snprintf(l_key_time, sizeof(l_key_time) - 1, "cur_node_addr_%s_time", a_net_name); - - l_node_addr_data = dap_global_db_get_sync(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key, &l_node_addr_len, NULL, NULL); - l_node_time_data = dap_global_db_get_sync(DAP_GLOBAL_DB_LOCAL_GENERAL, l_key_time, &l_node_time_len, NULL, NULL); - - if(l_node_addr_data && (l_node_addr_len == sizeof(uint64_t)) ) - l_node_addr_ret = *( (uint64_t *) l_node_addr_data ); - - if(l_node_time_data && (l_node_time_len == sizeof(time_t)) ) - l_node_time = *( (time_t *) l_node_time_data ); - - DAP_DELETE(l_node_addr_data); - DAP_DELETE(l_node_time_data); - - // time delta in seconds - static int64_t addr_time_expired = -1; - // read time-expired - - if(addr_time_expired == -1) { - dap_string_t *l_cfg_path = dap_string_new("network/"); - dap_string_append(l_cfg_path, a_net_name); - dap_config_t *l_cfg; - - if((l_cfg = dap_config_open(l_cfg_path->str)) == NULL) { - log_it(L_ERROR, "Can't open default network config"); - addr_time_expired = 0; - } else { - addr_time_expired = 3600 * - dap_config_get_item_int64_default(l_cfg, "general", "node-addr-expired", - NODE_TIME_EXPIRED_DEFAULT); - } - dap_string_free(l_cfg_path, true); - } - - time_t l_dt = time(NULL) - l_node_time; - //NODE_TIME_EXPIRED - if(l_node_time && l_dt > addr_time_expired) { - l_node_addr_ret = 0; - } - - return l_node_addr_ret; -} diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 28018cd932..7584b9baa8 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -99,7 +99,7 @@ #include "dap_chain_ledger.h" #include "dap_chain_mempool.h" #include "dap_global_db.h" -#include "dap_global_db_remote.h" +#include "dap_global_db_cluster.h" #include "dap_stream_ch_chain_net.h" #include "dap_stream_ch_chain.h" @@ -114,31 +114,6 @@ static void s_dap_chain_net_purge(dap_chain_net_t *a_net); -/** - * @brief dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias - * Find in base addr by alias - * - * return addr, NULL if not found - * @param a_net - * @param a_alias - * @return dap_chain_node_addr_t* - */ -dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, const char *a_alias) -{ - dap_chain_node_addr_t *l_addr = NULL; - if(!a_alias) - return NULL; - const char *a_key = a_alias; - size_t l_addr_size = 0; - l_addr = (dap_chain_node_addr_t*) (void*) dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases,a_key, &l_addr_size,NULL, NULL); - if(l_addr_size != sizeof(dap_chain_node_addr_t)) { - DAP_DELETE(l_addr); - l_addr = NULL; - } - return l_addr; -} - - /** * @brief dap_list_t* get_aliases_by_name Get the aliases by name object * Find in base alias by addr @@ -184,7 +159,7 @@ static dap_list_t* get_aliases_by_name(dap_chain_net_t * l_net, dap_chain_node_a static dap_chain_node_addr_t* s_node_info_get_addr(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_addr, const char *a_alias_str) { dap_chain_node_addr_t *l_address = a_alias_str - ? dap_chain_node_addr_get_by_alias(a_net, a_alias_str) + ? dap_chain_node_alias_find(a_net, a_alias_str) : a_addr && a_addr->uint64 ? DAP_DUP(a_addr) : NULL; if (!l_address) log_it(L_ERROR, "Node address with specified params not found"); @@ -348,13 +323,6 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info dap_cli_server_cmd_set_reply_text(a_str_reply, "addr not found"); return -1; } - // check, current node have this addr or no - uint64_t l_cur_addr = dap_chain_net_get_cur_node_addr_gdb_sync(a_net->pub.name); - if(l_cur_addr && l_cur_addr == a_node_info->hdr.address.uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "current node cannot be deleted"); - return -1; - } - // find addr by alias or addr_str dap_chain_node_addr_t *address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, alias_str); if(!address) { @@ -1384,7 +1352,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) case CMD_CONNECT: { // get address from alias if addr not defined if(alias_str && !l_node_addr.uint64) { - dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str); + dap_chain_node_addr_t *address_tmp = dap_chain_node_alias_find(l_net, alias_str); if(address_tmp) { l_node_addr = *address_tmp; DAP_DELETE(address_tmp); @@ -1488,68 +1456,17 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) //DAP_DELETE(l_remote_node_info); return -1; } - log_it(L_NOTICE, "Stream connection established"); - dap_stream_ch_chain_sync_request_t l_sync_request = {}; - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, DAP_STREAM_CH_ID); - // fill begin id - l_sync_request.id_start = 1; - // fill current node address - l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); - - // if need to get current node address (feature-2630) - if(!l_sync_request.node_addr.uint64 ) - { - log_it(L_NOTICE, "Now get node addr"); - uint8_t l_ch_id = DAP_STREAM_CH_ID_NET; - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id); - - size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain, - DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, - //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST, - l_net->pub.id, - NULL, 0); - if(res == 0) { - log_it(L_WARNING, "Can't send DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST packet"); - dap_chain_node_client_close_mt(l_node_client); - DAP_DELETE(l_remote_node_info); - return -1; - } - int timeout_ms = 15000; // 15 sec = 15 000 ms - int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); - switch (l_res) { - case 0: - if(l_node_client->cur_node_addr.uint64 != 0) { - log_it(L_INFO, "Node address leased"); - l_sync_request.node_addr.uint64 = l_node_client->cur_node_addr.uint64; - - // save cur address - // already saved - // dap_db_set_cur_node_addr_exp(l_sync_request.node_addr.uint64, l_net->pub.name); - } - else - log_it(L_WARNING, "Node address leased wrong!"); - break; - case -1: - log_it(L_WARNING, "Timeout with addr leasing"); - default: - if(l_res != -1) - log_it(L_WARNING, "Node address request error %d", l_res); - /*dap_chain_node_client_close(l_node_client); - DAP_DELETE(l_remote_node_info); - return -1;*/ - } - } - log_it(L_NOTICE, "Now lets sync all"); - - log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %"DAP_UINT64_FORMAT_U":%"DAP_UINT64_FORMAT_U" period", l_sync_request.id_start, - l_sync_request.id_end); - // copy l_sync_request to current - //dap_stream_ch_chain_t * l_s_ch_chain = DAP_STREAM_CH_CHAIN(l_ch_chain); - //l_s_ch_chain->request_net_id.uint64 = l_net->pub.id.uint64; - //l_s_ch_chain->request_cell_id.uint64 = l_chain_cell_id_null.uint64; - //memcpy(&l_s_ch_chain->request, &l_sync_request, sizeof(l_sync_request)); + dap_stream_ch_chain_sync_request_t l_sync_request = {}; + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, DAP_STREAM_CH_ID); + // fill begin id + l_sync_request.id_start = 1; + // fill current node address + l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); + + log_it(L_INFO, "Requested GLOBAL_DB syncronizatoin, %"DAP_UINT64_FORMAT_U":%"DAP_UINT64_FORMAT_U" period", + l_sync_request.id_start, l_sync_request.id_end); if(0 == dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_net->pub.id.uint64, 0, 0, &l_sync_request, sizeof(l_sync_request))) { @@ -1585,11 +1502,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_client_reset(l_node_client); // send request dap_stream_ch_chain_sync_request_t l_sync_request = {}; - dap_chain_hash_fast_t *l_hash = dap_chain_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain); - if (l_hash) { - l_sync_request.hash_from = *l_hash; - DAP_DELETE(l_hash); - } if(0 == dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_net->pub.id.uint64, l_chain->id.uint64, l_remote_node_info->hdr.cell_id.uint64, &l_sync_request, sizeof(l_sync_request))) { @@ -1624,7 +1536,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) case CMD_HANDSHAKE: { // get address from alias if addr not defined if(alias_str && !l_node_addr.uint64) { - dap_chain_node_addr_t *address_tmp = dap_chain_node_addr_get_by_alias(l_net, alias_str); + dap_chain_node_addr_t *address_tmp = dap_chain_node_alias_find(l_net, alias_str); if(address_tmp) { l_node_addr = *address_tmp; DAP_DELETE(address_tmp); @@ -1662,11 +1574,16 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) DAP_DELETE(node_info); dap_cli_server_cmd_set_reply_text(a_str_reply, "Connection established"); } break; + case CMD_CONNECTIONS: { - char *l_reply = dap_chain_net_links_dump(l_net); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_reply); - DAP_DELETE(l_reply); + dap_cluster_t *l_links_cluster = dap_cluster_by_mnemonim(l_net->pub.name); + if (!l_links_cluster) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Not found links cluster for net %s", l_net->pub.name); + break; + } + *a_str_reply = dap_cluster_get_links_info(l_links_cluster); } break; + case CMD_BAN: { dap_chain_net_t *l_netl = NULL; dap_chain_t *l_chain = NULL; @@ -6408,7 +6325,8 @@ int cmd_gdb_export(int a_argc, char **a_argv, char **a_str_reply) } dap_enc_base64_encode(l_store_obj[i].value, l_store_obj[i].value_len, l_value_enc_str, DAP_ENC_DATA_TYPE_B64); struct json_object *jobj = json_object_new_object(); - json_object_object_add(jobj, "id", json_object_new_int64((int64_t)l_store_obj[i].id)); + // TODO export sign and CRC and flags + //json_object_object_add(jobj, "id", json_object_new_int64((int64_t)l_store_obj[i].id)); json_object_object_add(jobj, "key", json_object_new_string(l_store_obj[i].key)); json_object_object_add(jobj, "value", json_object_new_string(l_value_enc_str)); json_object_object_add(jobj, "value_len", json_object_new_int64((int64_t)l_store_obj[i].value_len)); @@ -6491,15 +6409,15 @@ int cmd_gdb_import(int a_argc, char **a_argv, char ** a_str_reply) return -1; } for (size_t j = 0; j < l_records_count; ++j) { - struct json_object *l_record, *l_id, *l_key, *l_value, *l_value_len, *l_ts; + struct json_object *l_record, *l_key, *l_value, *l_value_len, *l_ts; l_record = json_object_array_get_idx(l_json_records, j); - l_id = json_object_object_get(l_record, "id"); + //l_id = json_object_object_get(l_record, "id"); l_key = json_object_object_get(l_record, "key"); l_value = json_object_object_get(l_record, "value"); l_value_len = json_object_object_get(l_record, "value_len"); l_ts = json_object_object_get(l_record, "timestamp"); - // - l_group_store[j].id = (uint64_t)json_object_get_int64(l_id); + // TODO import sign and CRC and flags + // l_group_store[j].id = (uint64_t)json_object_get_int64(l_id); l_group_store[j].key = dap_strdup(json_object_get_string(l_key)); l_group_store[j].group = dap_strdup(l_group_name); dap_nanotime_t l_temp = json_object_get_int64(l_ts); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index b2dc753e96..955dfa0b03 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -56,7 +56,6 @@ #include "dap_uuid.h" #include "dap_client.h" #include "dap_client_pvt.h" -#include "dap_global_db_remote.h" #include "dap_chain.h" #include "dap_chain_cell.h" #include "dap_chain_net_srv.h" @@ -281,7 +280,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) if (l_node_client->keep_connection) { if(l_node_client->stream_worker){ s_timer_update_states_callback(l_node_client); - l_node_client->sync_timer = dap_timerfd_start_on_worker(l_stream->esocket->context->worker, + l_node_client->sync_timer = dap_timerfd_start_on_worker(l_stream->esocket->worker, s_timer_update_states * 1000, s_timer_update_states_callback, l_node_client); @@ -306,29 +305,6 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c { dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t *) a_arg; switch (a_pkt_type) { - // get new generated current node address - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE: { - if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) { - l_node_client->cur_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data; - } - pthread_mutex_lock(&l_node_client->wait_mutex); - l_node_client->state = NODE_CLIENT_STATE_NODE_ADDR_LEASED; - dap_cond_signal(l_node_client->wait_cond); - pthread_mutex_unlock(&l_node_client->wait_mutex); - break; - } - // get remote node address - case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR: { - - if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) { - l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data; - } - pthread_mutex_lock(&l_node_client->wait_mutex); - l_node_client->state = NODE_CLIENT_STATE_GET_NODE_ADDR; - dap_cond_signal(l_node_client->wait_cond); - pthread_mutex_unlock(&l_node_client->wait_mutex); - break; - } case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY: { if(a_pkt_net_data_size == sizeof(dap_chain_node_addr_t)) { l_node_client->remote_node_addr = *(dap_chain_node_addr_t*)a_pkt_net->data; @@ -507,8 +483,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch case DAP_STREAM_CH_CHAIN_PKT_TYPE_DELETE: { dap_chain_net_t *l_net = l_node_client->net; assert(l_net); - dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(l_net); - log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" %s", l_net->pub.name, NODE_ADDR_FP_ARGS(l_node_addr), + log_it(L_DEBUG, "In: State node %s."NODE_ADDR_FP_STR" %s", l_net->pub.name, NODE_ADDR_FP_ARGS_S(g_node_addr), a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_TIMEOUT ? "is timeout for sync" : "stream closed"); l_node_client->state = NODE_CLIENT_STATE_ERROR; if (l_node_client->sync_timer) @@ -537,7 +512,7 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch * @param a_is_pinned * @param a_arg */ -static void s_save_stat_to_database_callback_set_stat (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg) +static void s_save_stat_to_database_callback_set_stat(dap_global_db_instance_t *a_dbi, int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg) { if( a_rc != DAP_GLOBAL_DB_RC_SUCCESS) log_it(L_ERROR,"Can't save stats to GlobalDB, code %d", a_rc); @@ -557,7 +532,7 @@ static void s_save_stat_to_database_callback_set_stat (dap_global_db_context_t * * @param a_is_pinned * @param a_arg */ -static void s_save_stat_to_database_callback_get_last_stat (dap_global_db_context_t * a_global_db_context,int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg) +static void s_save_stat_to_database_callback_get_last_stat(dap_global_db_instance_t *a_dbi, int a_rc, const char * a_group, const char * a_key, const void * a_value, const size_t a_value_len, dap_nanotime_t a_value_ts, bool a_is_pinned, void * a_arg) { char * l_json_str = (char *) a_arg; uint64_t l_key = 0; diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c index 04898ac3b8..ec584ca0dd 100644 --- a/modules/net/dap_chain_node_dns_client.c +++ b/modules/net/dap_chain_node_dns_client.c @@ -25,6 +25,7 @@ #include "dap_net.h" #include "dap_events.h" +#include "dap_context.h" #include "dap_timerfd.h" #include "dap_chain_node_dns_server.h" #include "dap_chain_node_dns_client.h" @@ -77,7 +78,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket, int l_answers_count = ntohs(*(uint16_t *)l_cur); if (l_answers_count != 1) { log_it(L_WARNING, "Incorrect DNS answer format"); - l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, EINVAL); + l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, EINVAL); l_dns_client->is_callbacks_called = true; a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; a_esocket->buf_in_size = a_esocket->buf_out_size = 0; @@ -100,7 +101,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket, *(dap_chain_node_info_t*)l_link_full_node_list->nodes_info = l_result; l_link_full_node_list->count_node = 1; - l_dns_client->callback_success(a_esocket->context->worker, l_link_full_node_list, l_dns_client->callbacks_arg); + l_dns_client->callback_success(a_esocket->worker, l_link_full_node_list, l_dns_client->callbacks_arg); l_dns_client->is_callbacks_called = true; a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; a_esocket->buf_in_size = a_esocket->buf_out_size = 0; @@ -116,7 +117,7 @@ static void s_dns_client_esocket_error_callback(dap_events_socket_t * a_esocket, { struct dns_client * l_dns_client = (struct dns_client*) a_esocket->_inheritor; log_it(L_ERROR,"DNS client esocket error %d", a_error); - l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, a_error); + l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, a_error); l_dns_client->is_callbacks_called = true; } @@ -141,7 +142,7 @@ static bool s_dns_client_esocket_timeout_callback(void * a_arg) struct dns_client * l_dns_client = (struct dns_client*) l_es->_inheritor; log_it(L_WARNING,"DNS request timeout, bad network?"); if(! l_dns_client->is_callbacks_called ){ - l_dns_client->callback_error(l_es->context->worker, l_dns_client->callbacks_arg, ETIMEDOUT); + l_dns_client->callback_error(l_es->worker, l_dns_client->callbacks_arg, ETIMEDOUT); l_dns_client->is_callbacks_called = true; } dap_events_socket_remove_and_delete_unsafe( l_es, false); @@ -160,7 +161,7 @@ static void s_dns_client_esocket_delete_callback(dap_events_socket_t * a_esocket (void) a_arg; struct dns_client * l_dns_client = (struct dns_client*) a_esocket->_inheritor; if(! l_dns_client->is_callbacks_called ) - l_dns_client->callback_error(a_esocket->context->worker, l_dns_client->callbacks_arg, EBUSY); + l_dns_client->callback_error(a_esocket->worker, l_dns_client->callbacks_arg, EBUSY); if(l_dns_client->name) DAP_DELETE(l_dns_client->name); } diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index bf9a95796f..11ff056fb6 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -32,7 +32,6 @@ #include "dap_chain_node.h" #include "dap_string.h" #include "dap_global_db.h" -#include "dap_global_db_remote.h" #include "dap_chain_net_balancer.h" #define LOG_TAG "dap_chain_node_dns_server" @@ -289,7 +288,7 @@ void dap_dns_server_start( uint16_t a_port) } dap_events_socket_callbacks_t l_cb = {}; l_cb.read_callback = dap_dns_client_read; - s_dns_server->instance = dap_server_new( NULL, a_port, SERVER_UDP, &l_cb); + s_dns_server->instance = dap_server_new(NULL, a_port, DAP_SERVER_UDP, &l_cb); if (!s_dns_server->instance) { log_it(L_ERROR, "Can't start DNS server"); return; diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index ff92297f3d..48dce658f9 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -36,7 +36,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_list.h" #include "dap_chain_common.h" #include "dap_chain.h" -#include "dap_chain_pvt.h" #include "dap_chain_node.h" #include "dap_chain_ledger.h" #include "dap_chain_net_decree.h" @@ -46,7 +45,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "uthash.h" #define DAP_CHAIN_NET_NAME_MAX 32 -#define DAP_BROADCAST_LIFETIME 15 // minutes +#define DAP_CHAIN_NET_MEMPOOL_TTL 48 // Hours struct dap_chain_node_info; typedef struct dap_chain_node_client dap_chain_node_client_t; @@ -70,6 +69,8 @@ typedef struct dap_chain_net{ char * gdb_nodes_aliases; char * gdb_nodes; + dap_list_t *keys; // List of PoA certs for net + bool mempool_autoproc; dap_chain_t * chains; // double-linked list of chains @@ -79,7 +80,7 @@ typedef struct dap_chain_net{ pthread_mutex_t balancer_mutex; dap_list_t *link_list; - dap_list_t *bridged_networks; // List of bridged network ID's allowed to cross-network TXs + dap_list_t *bridged_networks; // List of bridged network ID's allowed to cross-network TX } pub; uint8_t pvt[]; } dap_chain_net_t; @@ -98,6 +99,8 @@ typedef bool (dap_chain_datum_filter_func_t)(dap_chain_datum_t *a_datum, dap_cha int dap_chain_net_init(void); void dap_chain_net_deinit(void); +DAP_STATIC_INLINE uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t *a_net) { return g_node_addr.uint64; } + void dap_chain_net_load_all(); int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state); @@ -129,6 +132,7 @@ bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net); bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client); bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client); +void dap_chain_net_add_cluster_link(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_node_addr); 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); uint16_t dap_chain_net_get_acl_idx(dap_chain_net_t *a_net); @@ -139,7 +143,6 @@ dap_string_t* dap_cli_list_net(); dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name); dap_chain_t *dap_chain_net_get_chain_by_id(dap_chain_net_t *l_net, dap_chain_id_t a_chain_id); -dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net); uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net); dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net); const char* dap_chain_net_get_type(dap_chain_t *l_chain); @@ -149,8 +152,8 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * a_net); dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net); dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net); dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net); - - +int dap_chain_net_add_poa_certs_to_cluster(dap_chain_net_t *a_net, dap_global_db_cluster_t *a_cluster); +bool dap_chain_net_add_validator_to_clusters(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_addr); /** * @brief dap_chain_net_get_gdb_group_mempool @@ -161,15 +164,15 @@ DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_mempool_new(dap_chain_t *a_c { dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL; return l_net - ? dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix,a_chain->name) + ? dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, a_chain->name) : NULL; } -DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_from_chain_new(dap_chain_t *a_chain) +DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_nochain_new(dap_chain_t *a_chain) { dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL; return l_net - ? dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X, l_net->pub.name, a_chain->id.uint64) + ? dap_strdup_printf("%s.chain-%s.data", l_net->pub.name, a_chain->name) : NULL; } @@ -177,14 +180,10 @@ dap_chain_t *dap_chain_net_get_chain_by_chain_type(dap_chain_net_t *a_net, dap_c dap_chain_t *dap_chain_net_get_default_chain_by_chain_type(dap_chain_net_t *a_net, dap_chain_type_t a_datum_type); char *dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t *a_net, dap_chain_type_t a_datum_type); dap_chain_net_t **dap_chain_net_list(uint16_t *a_size); -bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr); int dap_chain_net_verify_datum_for_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, dap_hash_fast_t *a_datum_hash); char *dap_chain_net_verify_datum_err_code_to_str(dap_chain_datum_t *a_datum, int a_code); -void dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_worker, dap_stream_ch_uuid_t a_ch_uuid, dap_events_socket_uuid_t a_esocket_uuid, char *a_addr, int a_port); -void dap_chain_net_del_downlink(dap_stream_ch_uuid_t *a_ch_uuid); void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); -void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); /** * @brief dap_chain_datum_list diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index b5f8155889..e11cb0e92c 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -25,47 +25,12 @@ #include "dap_list.h" #include "dap_worker.h" #include "dap_events_socket.h" - +#include "dap_stream.h" #include "dap_chain_common.h" #include "dap_global_db.h" #include "dap_chain.h" -// Default time of a node address expired in hours -#define NODE_TIME_EXPIRED_DEFAULT 720 - typedef struct dap_chain_net dap_chain_net_t; -/** - * Node Declaration request - * - */ - -#define DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE 32 -typedef struct dap_chain_node_delc_req{ - dap_chain_node_addr_t node_address; - uint64_t create_ts; - union{ - uint8_t raw[DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE]; - char str[DAP_CHAIN_NODE_DECL_REQ_INFO_SIZE]; - } info; -} DAP_ALIGN_PACKED dap_chain_decl_req_t; - -/** - * @struct dap_chain_node decl - * @details New node declaration - * - */ -#define DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE 32 -typedef struct dap_chain_node_decl{ - dap_chain_decl_req_t request; - uint64_t accept_ts; - struct in_addr accept_addr_v4; - struct in6_addr accept_addr_v6; - union{ - uint8_t raw[DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE]; - char str[DAP_CHAIN_NODE_DECL_ACCEPT_INFO_SIZE]; - } accept_info; -} DAP_ALIGN_PACKED dap_chain_node_decl_t; - typedef struct dap_chain_node_info { struct { dap_chain_node_addr_t address; @@ -81,17 +46,16 @@ typedef struct dap_chain_node_info { dap_chain_node_addr_t links[]; // dap_chain_addr_t } DAP_ALIGN_PACKED dap_chain_node_info_t; -typedef struct dap_chain_node_publ{ - dap_chain_hash_fast_t decl_hash; - dap_chain_node_info_t node_info; -} DAP_ALIGN_PACKED dap_chain_node_publ_t; +typedef dap_stream_node_addr_t dap_chain_node_addr_t; +#define dap_chain_node_addr_str_check dap_stream_node_addr_str_check +#define dap_chain_node_addr_from_str dap_stream_node_addr_from_str +#define dap_chain_node_addr_not_null dap_stream_node_addr_not_null /** * Calculate size of struct dap_chain_node_info_t */ size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info); - /** * Compare addresses of two dap_chain_node_info_t structures * @@ -111,23 +75,6 @@ bool dap_chain_node_info_match(dap_chain_node_info_t *node_info1, dap_chain_node */ //uint8_t* dap_chain_node_info_serialize(dap_chain_node_info_t *node_info, size_t *size); -/** - * Deserialize dap_chain_node_info_t - * size[in] - length of input string - * return data or NULL if error - */ -//dap_chain_node_info_t* dap_chain_node_info_deserialize(uint8_t *node_info_str, size_t size); - -/** - * Generate node addr by shard id - */ -dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_id_t a_net_id); - -/** - * Check the validity of the node address by shard id - */ -bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr); - dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias); bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr); bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias); @@ -144,9 +91,4 @@ bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, const char *a_datum_hash_str); void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force); bool dap_chain_node_mempool_autoproc_init(); -void dap_chain_node_mempool_autoproc_deinit(); - -// Set addr for current node -bool dap_db_set_cur_node_addr(uint64_t a_address, char *a_net_name); -bool dap_db_set_cur_node_addr_exp(uint64_t a_address, char *a_net_name ); -uint64_t dap_chain_net_get_cur_node_addr_gdb_sync(char *a_net_name); +inline static void dap_chain_node_mempool_autoproc_deinit() {} diff --git a/modules/net/include/dap_chain_node_cli_cmd.h b/modules/net/include/dap_chain_node_cli_cmd.h index 48eb99f2d0..5888451143 100644 --- a/modules/net/include/dap_chain_node_cli_cmd.h +++ b/modules/net/include/dap_chain_node_cli_cmd.h @@ -30,14 +30,6 @@ #include "dap_chain_node.h" #include "dap_chain_node_cli.h" -/** - * Find in base addr by alias - * - * return addr, NULL if not found - */ -dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, const char *alias); - - int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int a_argc, char **a_argv, char ** a_str_reply, dap_chain_t ** a_chain, dap_chain_net_t ** a_net); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index fd3d1fcb24..31b85360a2 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -49,6 +49,7 @@ #include "dap_chain.h" #include "dap_chain_common.h" #include "dap_chain_net_srv.h" +#include "dap_chain_net_tx.h" #include "dap_chain_net_srv_order.h" #include "dap_chain_net_srv_stream_session.h" #include "dap_stream_ch_chain_net_srv.h" @@ -793,23 +794,42 @@ static bool s_pay_verificator_callback(dap_ledger_t * a_ledger, dap_chain_tx_out return false; } - // Check out value is equal to value in receipt - dap_list_t *l_items_list = dap_chain_datum_tx_items_get(a_tx_in, TX_ITEM_TYPE_OUT, NULL), *l_item; - dap_chain_addr_t l_provider_addr = { }; - dap_chain_addr_fill(&l_provider_addr, l_provider_sign_type, &l_provider_pkey_hash, dap_chain_net_id_by_name(a_ledger->net_name)); - int l_ret = -1; - DL_FOREACH(l_items_list, l_item) { - if (dap_chain_addr_compare(&l_provider_addr, &((dap_chain_tx_out_t*)l_item->data)->addr)) { - l_ret = !compare256(((dap_chain_tx_out_t*)l_item->data)->header.value, l_receipt->receipt_info.value_datoshi) ? 0 : 1; - if (l_ret) { - log_it(L_ERROR, "Value in tx out is not equal to value in receipt"); // TODO: print the balances! + // check remainder on srv pay cond out is valid + // find 'out' items + dap_list_t *l_list_out = dap_chain_datum_tx_items_get((dap_chain_datum_tx_t*) a_tx_in, TX_ITEM_TYPE_OUT_ALL, NULL); + uint256_t l_value = l_receipt->receipt_info.value_datoshi; + uint256_t l_cond_out_value = {}; + dap_chain_addr_t l_network_fee_addr = {}; + dap_chain_net_tx_get_fee(a_ledger->net_id, NULL, &l_network_fee_addr); + int l_item_idx = 0; + for (dap_list_t * l_list_tmp = l_list_out; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_item_idx++) { + dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data; + switch (l_type) { + case TX_ITEM_TYPE_OUT: { // 256 + dap_chain_tx_out_t *l_tx_out = (dap_chain_tx_out_t *)l_list_tmp->data; + if (dap_chain_addr_compare(&l_tx_out->addr, &l_network_fee_addr)){ + SUM_256_256(l_value, l_tx_out->header.value, &l_value); } - break; + } break; + case TX_ITEM_TYPE_OUT_COND: { + dap_chain_tx_out_cond_t *l_tx_out = (dap_chain_tx_out_cond_t *)l_list_tmp->data; + if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE){ + SUM_256_256(l_value, l_cond_out_value = l_tx_out->header.value, &l_value); + } else if (l_tx_out->header.subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY){ + l_cond_out_value = l_tx_out->header.value; + } + } break; + default: {} } } - dap_list_free(l_items_list); - debug_if(l_ret == -1, L_ERROR, "Not found out in tx matching provider addr"); - return !l_ret; + + if (!compare256(l_value, l_cond_out_value)){ + log_it(L_ERROR, "Value in tx out is invalid!"); + dap_list_free(l_list_out); + return false; + } + dap_list_free(l_list_out); + return true; } int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, const char *a_config_section){ @@ -833,10 +853,6 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons a_srv->grace_period = dap_config_get_item_uint32_default(g_config, a_config_section, "grace_period", 60); a_srv->allow_free_srv = dap_config_get_item_bool_default(g_config, a_config_section, "allow_free_srv", false); int l_err_code = 0; - dap_chain_node_addr_t *l_node_addr = NULL; - l_node_addr = dap_chain_net_get_cur_addr(l_net); - if (!l_node_addr) - return -1; size_t l_orders_count = 0; uint64_t l_max_price_cfg = dap_config_get_item_uint64_default(g_config, a_config_section, "max_price", 0xFFFFFFFFFFFFFFF); char *l_gdb_order_group = dap_chain_net_srv_order_get_gdb_group(l_net); @@ -844,7 +860,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons for (size_t i=0; i < l_orders_count; i++){ l_err_code = -4; dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len); - if (l_order->node_addr.uint64 == l_node_addr->uint64 && + if (l_order->node_addr.uint64 == g_node_addr.uint64 && l_order->srv_uid.uint64 == a_srv->uid.uint64) { l_err_code = 0; dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 7ffd009ea5..a36bf37f8e 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -64,7 +64,7 @@ struct dap_order_notify { }; static dap_list_t *s_order_notify_callbacks = NULL; -static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); +static void s_srv_order_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg); static dap_timerfd_t *s_timer_order_check_decree_sign = NULL; static void s_srv_order_check_decree_sign_timer() { @@ -656,15 +656,12 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d } } -static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +static void s_srv_order_callback_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { if (!a_arg || !a_obj || !a_obj->key) return; dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; - dap_global_db_context_t * l_gdb_context = dap_global_db_context_current(); assert(l_net); - assert(l_gdb_context); - char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net); if (!dap_strcmp(a_obj->group, l_gdb_group_str)) { @@ -672,15 +669,15 @@ static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_ struct dap_order_notify *l_notifier = (struct dap_order_notify *)it->data; if ((l_notifier->net == NULL || l_notifier->net == l_net) && l_notifier->callback) { - l_notifier->callback(a_context, a_obj, l_notifier->cb_arg); + l_notifier->callback(a_dbi, a_obj, l_notifier->cb_arg); } } bool l_allow_unsigned_orders = dap_config_get_item_bool_default(g_config, "srv", "allow_unsigned_orders", false); - if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD) { + if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) { dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_obj->value; if (l_order->version != 3) { log_it(L_NOTICE, "Order %s removed version != 3.", a_obj->key); - dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); + dap_global_db_del_sync(a_obj->group, a_obj->key); } else { if (l_allow_unsigned_orders) { log_it(L_DEBUG, "The mode that disables verification of the order signature is enabled."); @@ -691,7 +688,7 @@ static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_ sizeof(dap_chain_net_srv_order_t) + l_order->ext_size); if (l_verify) { log_it(L_ERROR, "Order unverified, err %d", l_verify); - dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); + dap_global_db_del_sync(a_obj->group, a_obj->key); } } } diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 9d95c9c882..3c18fe87ad 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -36,7 +36,7 @@ static dap_chain_net_srv_t *s_srv_datum = NULL; static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply); -void s_order_notficator(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); +void s_order_notficator(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg); int dap_chain_net_srv_datum_init() { @@ -195,20 +195,16 @@ static int s_srv_datum_cli(int argc, char ** argv, char **a_str_reply) { * @param a_value * @param a_value_len */ -void s_order_notficator(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +void s_order_notficator(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { - if (a_obj->type == DAP_DB$K_OPTYPE_DEL) + if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_DEL) return; dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read((byte_t *)a_obj->value, a_obj->value_len); // Old format comliance - dap_global_db_context_t * l_gdb_context = dap_global_db_context_current(); - assert(l_gdb_context); if (!l_order && a_obj->key) { log_it(L_NOTICE, "Order %s is corrupted", a_obj->key); - if(dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key) != 0 ){ + if (dap_global_db_driver_delete(a_obj, 1) != 0) log_it(L_ERROR,"Can't delete order %s", a_obj->key); - } - return; // order is corrupted } diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index ed6a402b2c..19b8d96dca 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -265,14 +265,14 @@ int dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_signing_addr) return 0; } -dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_is_active) +dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_only_active) { dap_list_t *l_ret = NULL; if (!s_srv_stake || !s_srv_stake->itemlist) return l_ret; for (dap_chain_net_srv_stake_item_t *l_stake = s_srv_stake->itemlist; l_stake; l_stake = l_stake->hh.next) if (a_net_id.uint64 == l_stake->signing_addr.net_id.uint64 && - l_stake->is_active == a_is_active) + a_only_active ? l_stake->is_active : true) l_ret = dap_list_append(l_ret, DAP_DUP(l_stake)); return l_ret; } @@ -971,10 +971,9 @@ char *s_stake_order_create(dap_chain_net_t *a_net, uint256_t *a_fee, dap_enc_key dap_chain_hash_fast_t l_tx_hash = {}; dap_chain_net_srv_order_direction_t l_dir = SERV_DIR_SELL; const char *l_native_ticker = a_net->pub.native_ticker; - dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_net); dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_PCS}; dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; - char *l_order_hash_str = dap_chain_net_srv_order_create(a_net, l_dir, l_uid, *l_node_addr, + char *l_order_hash_str = dap_chain_net_srv_order_create(a_net, l_dir, l_uid, g_node_addr, l_tx_hash, a_fee, l_unit, l_native_ticker, 0, NULL, 0, 1, NULL, 0, a_key); return l_order_hash_str; @@ -1313,10 +1312,10 @@ static void s_get_tx_filter_callback(dap_chain_net_t* a_net, dap_chain_datum_tx_ return; } -static int callback_compare_tx_list(const void *a_datum1, const void *a_datum2) +static int s_callback_compare_tx_list(dap_list_t *a_datum1, dap_list_t *a_datum2) { - dap_chain_datum_tx_t *l_datum1 = (dap_chain_datum_tx_t*)((dap_list_t*)a_datum1)->data, - *l_datum2 = (dap_chain_datum_tx_t*)((dap_list_t*)a_datum2)->data; + dap_chain_datum_tx_t *l_datum1 = a_datum1->data, + *l_datum2 = a_datum2->data; if (!l_datum1 || !l_datum2) { log_it(L_CRITICAL, "Invalid element"); return 0; @@ -1831,7 +1830,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) char *l_coins = NULL; char* l_node_address_text_block = NULL; dap_chain_net_get_tx_all(l_net,TX_SEARCH_TYPE_NET,s_get_tx_filter_callback, l_args); - l_args->ret = dap_list_sort(l_args->ret, callback_compare_tx_list); + l_args->ret = dap_list_sort(l_args->ret, s_callback_compare_tx_list); for(dap_list_t *tx = l_args->ret; tx; tx = tx->next) { l_datum_tx = (dap_chain_datum_tx_t*)tx->data; diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index ca59e92cd6..d008914557 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -72,7 +72,7 @@ uint256_t dap_chain_net_srv_stake_get_allowed_min_value(); int dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr); int dap_chain_net_srv_stake_verify_key_and_node(dap_chain_addr_t* a_signing_addr, dap_chain_node_addr_t* a_node_addr); -dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_is_active); +dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, bool a_only_active); dap_chain_node_addr_t *dap_chain_net_srv_stake_key_get_node_addr(dap_chain_addr_t *a_signing_addr); bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 06d6415d9a..ad2d44767b 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -82,6 +82,7 @@ typedef struct iphdr dap_os_iphdr_t; #include "dap_strfuncs.h" #include "dap_config.h" +#include "dap_context.h" #include "dap_events_socket.h" #include "dap_http_client.h" @@ -312,10 +313,6 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in DAP_DEL_Z(l_pkt_out); return false; } - /* - dap_stream_worker_t *l_stream_worker = (dap_stream_worker_t *)dap_worker_get_current()->_inheritor; - s_tun_client_send_data_inter(l_stream_worker->queue_ch_io_input[l_ch_vpn_info->worker->id], l_ch_vpn_info->ch_vpn, l_pkt_out); - */ if(s_debug_more){ #ifdef DAP_OS_LINUX struct in_addr l_in_daddr = { .s_addr = ((dap_os_iphdr_t*)l_pkt_out->data)->daddr }; @@ -376,7 +373,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void switch (l_msg->type) { case TUN_SOCKET_MSG_ESOCKET_REASSIGNED: { assert(l_msg->esocket_reassigment.worker_id < s_tun_sockets_count); - dap_chain_net_srv_vpn_tun_socket_t* l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id]; + dap_chain_net_srv_vpn_tun_socket_t* l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id]; assert(l_tun_sock); dap_chain_net_srv_ch_vpn_info_t* l_info = NULL; HASH_FIND(hh, l_tun_sock->clients, &l_msg->esocket_reassigment.addr, sizeof(l_msg->esocket_reassigment.addr), l_info); @@ -384,11 +381,11 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void l_info->worker = dap_events_worker_get(l_msg->esocket_reassigment.worker_id); l_info->queue_msg = s_tun_sockets_queue_msg[l_msg->esocket_reassigment.worker_id]; l_info->is_reassigned_once = true; - l_info->is_on_this_worker = (a_esocket_queue->context->worker->id == l_msg->esocket_reassigment.worker_id); + l_info->is_on_this_worker = (a_esocket_queue->worker->id == l_msg->esocket_reassigment.worker_id); if (s_debug_more) { char l_addrbuf[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &l_msg->esocket_reassigment.addr, l_addrbuf, sizeof(l_addrbuf)); - log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u", a_esocket_queue->context->worker->id, + log_it(L_INFO, "Tun:%u message: addr %s reassign on worker #%u", a_esocket_queue->worker->id, l_addrbuf, l_msg->esocket_reassigment.worker_id); } } @@ -396,13 +393,13 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void char l_addrbuf[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &l_msg->esocket_reassigment.addr, l_addrbuf, sizeof(l_addrbuf)); log_it(L_INFO, "Reassigment message for address %s on worker %u comes but no such address was found on tun socket %u", - l_addrbuf, l_msg->esocket_reassigment.worker_id, a_esocket_queue->context->worker->id); + l_addrbuf, l_msg->esocket_reassigment.worker_id, a_esocket_queue->worker->id); } } break; /* l_msg->type == TUN_SOCKET_MSG_ESOCKET_REASSIGNED */ case TUN_SOCKET_MSG_IP_ASSIGNED:{ assert(l_msg->ip_assigment.worker_id < s_tun_sockets_count); - dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id]; + dap_chain_net_srv_vpn_tun_socket_t * l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id]; assert(l_tun_sock); dap_chain_net_srv_ch_vpn_info_t * l_new_info = NULL; @@ -423,7 +420,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void l_new_info->queue_msg = s_tun_sockets_queue_msg[l_msg->ip_assigment.worker_id]; l_new_info->usage_id = l_msg->ip_assigment.usage_id; l_new_info->is_reassigned_once = l_msg->is_reassigned_once; - l_new_info->is_on_this_worker = (l_msg->ip_assigment.worker_id == a_esocket_queue->context->worker->id); + l_new_info->is_on_this_worker = (l_msg->ip_assigment.worker_id == a_esocket_queue->worker->id); l_new_info->esocket = l_msg->esocket; l_new_info->esocket_uuid = l_msg->esocket_uuid; l_new_info->worker = dap_events_worker_get(l_msg->ip_assigment.worker_id); @@ -431,7 +428,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void if (dap_log_level_get() <= L_INFO) { char l_addrbuf[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &l_msg->ip_assigment.addr, l_addrbuf, sizeof(l_addrbuf)); - log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u", a_esocket_queue->context->worker->id, + log_it(L_DEBUG, "Tun:%u message: addr %s assigned for worker #%u on tun #u", a_esocket_queue->worker->id, l_addrbuf, l_msg->ip_assigment.worker_id); } } @@ -439,7 +436,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void case TUN_SOCKET_MSG_IP_UNASSIGNED:{ assert(l_msg->ip_unassigment.worker_id < s_tun_sockets_count); - dap_chain_net_srv_vpn_tun_socket_t *l_tun_sock = s_tun_sockets[a_esocket_queue->context->worker->id]; + dap_chain_net_srv_vpn_tun_socket_t *l_tun_sock = s_tun_sockets[a_esocket_queue->worker->id]; assert(l_tun_sock); dap_chain_net_srv_ch_vpn_info_t *l_new_info = NULL; @@ -460,18 +457,18 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void }break; /* l_msg->type == TUN_SOCKET_MSG_IP_UNASSIGNED */ case TUN_SOCKET_MSG_CH_VPN_SEND: { - if (dap_context_find(a_esocket_queue->context->worker->context, l_msg->esocket_uuid) == l_msg->esocket) { + if (dap_context_find(a_esocket_queue->worker->context, l_msg->esocket_uuid) == l_msg->esocket) { s_tun_client_send_data_unsafe(l_msg->ch_vpn, l_msg->ch_vpn_send.pkt); if (s_debug_more) { char l_addrbuf[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &l_msg->ip_assigment.addr, l_addrbuf, sizeof(l_addrbuf)); log_it(L_DEBUG, "Tun:%u message: send %u bytes for ch vpn protocol", - a_esocket_queue->context->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size); + a_esocket_queue->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size); } } else { log_it(L_ERROR, "MSG: No esocket %p on worker #%u, lost %d data", - l_msg->esocket, a_esocket_queue->context->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size); + l_msg->esocket, a_esocket_queue->worker->id, l_msg->ch_vpn_send.pkt->header.op_data.data_size); } DAP_DELETE(l_msg->ch_vpn_send.pkt); } break; /* l_msg->type == TUN_SOCKET_MSG_CH_VPN_SEND */ @@ -1198,7 +1195,7 @@ static void s_ch_vpn_esocket_unassigned(dap_events_socket_t* a_es, dap_worker_t //dap_chain_net_srv_ch_vpn_info_t * l_info = NULL; // HASH_FIND(hh,l_tun_sock->clients,&l_ch_vpn->addr_ipv4 , sizeof (l_ch_vpn->addr_ipv4), l_info); - s_tun_send_msg_esocket_reassigned_all_inter(a_es->context->worker->id, l_ch_vpn, l_ch_vpn->ch->stream->esocket, + s_tun_send_msg_esocket_reassigned_all_inter(a_es->worker->id, l_ch_vpn, l_ch_vpn->ch->stream->esocket, l_ch_vpn->ch->stream->esocket_uuid, l_ch_vpn->addr_ipv4); } @@ -1846,9 +1843,9 @@ static void s_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) static void s_es_tun_delete(dap_events_socket_t * a_es, void * arg) { (void) arg; - if (a_es->context->worker) { - s_tun_sockets[a_es->context->worker->id] = NULL; - dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->context->worker->id],false); + if (a_es->worker) { + s_tun_sockets[a_es->worker->id] = NULL; + dap_events_socket_remove_and_delete_unsafe(s_tun_sockets_queue_msg[a_es->worker->id],false); log_it(L_NOTICE,"Destroyed TUN event socket"); } } @@ -1968,11 +1965,11 @@ static void s_es_tun_read(dap_events_socket_t * a_es, void * arg) } if (l_vpn_info) { if ( !l_vpn_info->is_on_this_worker && !l_vpn_info->is_reassigned_once && s_raw_server->auto_cpu_reassignment) { - log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->context->worker->id); + log_it(L_NOTICE, "Reassigning from worker %u to %u", l_vpn_info->worker->id, a_es->worker->id); l_vpn_info->is_reassigned_once = true; - s_tun_send_msg_esocket_reassigned_all_inter(a_es->context->worker->id, l_vpn_info->ch_vpn, l_vpn_info->esocket, l_vpn_info->esocket_uuid, + s_tun_send_msg_esocket_reassigned_all_inter(a_es->worker->id, l_vpn_info->ch_vpn, l_vpn_info->esocket, l_vpn_info->esocket_uuid, l_vpn_info->addr_ipv4); - dap_events_socket_reassign_between_workers_mt(l_vpn_info->worker, l_vpn_info->esocket, a_es->context->worker); + dap_events_socket_reassign_between_workers_mt(l_vpn_info->worker, l_vpn_info->esocket, a_es->worker); } s_tun_client_send_data(l_vpn_info, a_es->buf_in, l_buf_in_size); } else if(s_debug_more) { @@ -2006,7 +2003,7 @@ static void s_es_tun_new(dap_events_socket_t * a_es, void * arg) (void) arg; dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t); if ( l_tun_socket ){ - dap_worker_t * l_worker = l_tun_socket->worker = a_es->context->worker; + dap_worker_t * l_worker = l_tun_socket->worker = a_es->worker; uint32_t l_worker_id = l_tun_socket->worker_id = l_worker->id; l_tun_socket->es = a_es; diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index 29e3e883b8..9b7b416466 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -351,7 +351,7 @@ void m_client_tun_new(dap_events_socket_t * a_es, void * arg) (void) arg; dap_chain_net_srv_vpn_tun_socket_t * l_tun_socket = DAP_NEW_Z(dap_chain_net_srv_vpn_tun_socket_t); if ( l_tun_socket ){ - l_tun_socket->worker = a_es->context->worker; + l_tun_socket->worker = a_es->worker; l_tun_socket->worker_id = l_tun_socket->worker->id; l_tun_socket->es = a_es; //s_tun_sockets_queue_msg[a_es->worker->id] = dap_events_socket_create_type_queue_ptr_unsafe(a_es->worker, s_tun_recv_msg_callback ); @@ -551,7 +551,7 @@ int dap_chain_net_vpn_client_tun_delete(void) { if(s_tun_events_socket) { pthread_mutex_lock(&s_clients_mutex); - dap_events_socket_remove_and_delete_mt(s_tun_events_socket->context->worker, s_tun_events_socket->uuid); + dap_events_socket_remove_and_delete_mt(s_tun_events_socket->worker, s_tun_events_socket->uuid); s_tun_events_socket = NULL; pthread_mutex_unlock(&s_clients_mutex); } diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index c1252c5029..5ac17d71d0 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -894,7 +894,6 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha dap_chain_hash_fast_t l_tx_hash = {}; dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_tx_hash); a_price->tx_hash = l_tx_hash; - dap_chain_node_addr_t *l_node_addr = dap_chain_net_get_cur_addr(a_price->net); dap_chain_net_srv_price_unit_uid_t l_unit = { .uint32 = SERV_UNIT_UNDEFINED}; dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_XCHANGE_ID }; uint256_t l_datoshi_buy = uint256_0; @@ -903,7 +902,7 @@ char *s_xchange_order_create(dap_chain_net_srv_xchange_price_t *a_price, dap_cha l_ext.datoshi_buy = l_datoshi_buy; strncpy(l_ext.token_buy, a_price->token_buy, DAP_CHAIN_TICKER_SIZE_MAX); uint32_t l_ext_size = sizeof(dap_srv_xchange_order_ext_t); - char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_SELL, l_uid, *l_node_addr, + char *l_order_hash_str = dap_chain_net_srv_order_create(a_price->net, SERV_DIR_SELL, l_uid, g_node_addr, l_tx_hash, &a_price->datoshi_sell, l_unit, a_price->token_sell, 0, (uint8_t *)&l_ext, l_ext_size, 0, NULL, 0, a_price->wallet_key); return l_order_hash_str; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 8f13d23ab3..e023afc930 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -139,6 +139,8 @@ static dap_chain_block_t *s_new_block_move(dap_chain_cs_blocks_t *a_blocks, size static size_t s_callback_count_atom(dap_chain_t *a_chain); static dap_list_t *s_callback_get_atoms(dap_chain_t *a_chain, size_t a_count, size_t a_page, bool a_reverse); +static int s_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config); + static bool s_seed_mode = false; static bool s_debug_more = false; @@ -149,7 +151,7 @@ static bool s_debug_more = false; */ int dap_chain_cs_blocks_init() { - dap_chain_cs_type_add("blocks", dap_chain_cs_blocks_new ); + dap_chain_cs_type_add("blocks", s_chain_cs_blocks_new); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); s_debug_more = dap_config_get_item_bool_default(g_config, "blocks", "debug_more", false); dap_cli_server_cmd_add ("block", s_cli_blocks, "Create and explore blockchains", @@ -198,7 +200,7 @@ void dap_chain_cs_blocks_deinit() dap_chain_block_cache_deinit(); } -int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config) +static int s_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config) { dap_chain_cs_blocks_t * l_cs_blocks = DAP_NEW_Z(dap_chain_cs_blocks_t); if (!l_cs_blocks) { @@ -293,15 +295,6 @@ int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config return 0; } -/** - * @brief dap_chain_cs_blocks_delete - * @param a_chain - */ -void dap_chain_cs_blocks_delete(dap_chain_t * a_chain) -{ - s_callback_delete(a_chain); -} - /** * @brief dap_chain_block_cs_cache_get_by_hash * @param a_blocks diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h index 4e1cf5494e..708dd05bba 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -66,7 +66,4 @@ typedef int (*dap_chain_blocks_block_callback_ptr_t)(dap_chain_cs_blocks_t *, da int dap_chain_cs_blocks_init(); void dap_chain_cs_blocks_deinit(); - -int dap_chain_cs_blocks_new(dap_chain_t * a_chain, dap_config_t * a_chain_config); -void dap_chain_cs_blocks_delete(dap_chain_t * a_chain); dap_chain_block_cache_t * dap_chain_block_cs_cache_get_by_hash(dap_chain_cs_blocks_t * a_blocks, dap_chain_hash_fast_t *a_block_hash); diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 74c84fba9a..003da1bff4 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -88,6 +88,8 @@ typedef struct dap_chain_cs_dag_pvt { #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt ) +static int s_chain_cs_dag_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg); +static void s_chain_cs_dag_delete(dap_chain_t *a_chain); static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain); static void s_dap_chain_cs_dag_threshold_free(dap_chain_cs_dag_t *a_dag); static dap_chain_cs_dag_event_item_t *s_dag_proc_treshold(dap_chain_cs_dag_t *a_dag); @@ -147,7 +149,7 @@ static bool s_seed_mode = false, s_debug_more = false, s_threshold_enabled = fal int dap_chain_cs_dag_init() { srand((unsigned int) time(NULL)); - dap_chain_cs_type_add( "dag", dap_chain_cs_dag_new ); + dap_chain_cs_type_add( "dag", s_chain_cs_dag_new ); s_seed_mode = dap_config_get_item_bool_default(g_config, "general", "seed_mode", false); s_debug_more = dap_config_get_item_bool_default(g_config, "dag", "debug_more", false); s_threshold_enabled = dap_config_get_item_bool_default(g_config, "dag", "threshold_enabled",false); @@ -181,25 +183,22 @@ void dap_chain_cs_dag_deinit(void) } -static void s_history_callback_round_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) +static void s_round_changes_notify(dap_global_db_instance_t *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { dap_chain_cs_dag_t *l_dag = (dap_chain_cs_dag_t *)a_arg; assert(l_dag); dap_chain_net_t *l_net = dap_chain_net_by_id(l_dag->chain->net_id); debug_if(s_debug_more, L_DEBUG, "%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu", l_net->pub.name, l_dag->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len); - if (a_obj->type == DAP_DB$K_OPTYPE_ADD && l_dag->callback_cs_event_round_sync) { - if (!l_dag->broadcast_disable) - dap_chain_cs_dag_event_broadcast(l_dag, a_obj, a_context); - if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) { // check key for round increment, if no than process event + if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD && l_dag->callback_cs_event_round_sync) { + if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) // check key for round increment, if no than process event l_dag->callback_cs_event_round_sync(l_dag, a_obj->type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len); - } else { + else log_it(L_INFO, "Global round ID: %lu", *(uint64_t*)a_obj->value); - } } } -static bool s_dag_rounds_events_iter(dap_global_db_context_t *a_context, +static bool s_dag_rounds_events_iter(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group, const size_t a_values_current, const size_t a_values_count, dap_store_obj_t *a_values, void *a_arg) @@ -210,8 +209,8 @@ static bool s_dag_rounds_events_iter(dap_global_db_context_t *a_context, for (size_t i = 0; i < a_values_count; i++) { dap_store_obj_t *l_obj_cur = a_values + i; - l_obj_cur->type = DAP_DB$K_OPTYPE_ADD; - s_history_callback_round_notify(a_context, a_values + i, a_arg); + l_obj_cur->type = DAP_GLOBAL_DB_OPTYPE_ADD; + s_round_changes_notify(a_dbi, a_values + i, a_arg); } return true; } @@ -222,11 +221,11 @@ static void s_timer_process_callback(void *a_arg) } /** - * @brief dap_chain_cs_dag_new + * @brief s_chain_cs_dag_new * @param a_chain * @param a_chain_cfg */ -int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) +static int s_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { dap_chain_cs_dag_t * l_dag = DAP_NEW_Z(dap_chain_cs_dag_t); if (!l_dag){ @@ -247,7 +246,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) pthread_mutex_init(&PVT(l_dag)->events_mutex, &l_mutex_attr); pthread_mutexattr_destroy(&l_mutex_attr); - a_chain->callback_delete = dap_chain_cs_dag_delete; + a_chain->callback_delete = s_chain_cs_dag_delete; a_chain->callback_purge = s_dap_chain_cs_dag_purge; // Atom element callbacks @@ -323,7 +322,11 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); l_dag->gdb_group_events_round_new = dap_strdup_printf(l_dag->is_celled ? "dag-%s-%s-%016llx-round.new" : "dag-%s-%s-round.new", l_net->pub.gdb_groups_prefix, a_chain->name, 0LLU); - dap_global_db_add_sync_extra_group(l_net->pub.name, l_dag->gdb_group_events_round_new, s_history_callback_round_notify, l_dag); + dap_global_db_cluster_t *l_dag_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), + l_dag->gdb_group_events_round_new, l_dag->gdb_group_events_round_new, + 900, true, s_round_changes_notify, l_dag, + DAP_GDB_MEMBER_ROLE_NOBODY, DAP_CLUSTER_ROLE_AUTONOMIC); + dap_chain_net_add_poa_certs_to_cluster(l_net, l_dag_cluster); byte_t *l_current_round = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL); l_dag->round_current = l_current_round ? *(uint64_t*)l_current_round : 0; DAP_DELETE(l_current_round); @@ -410,11 +413,11 @@ static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain) } /** - * @brief dap_chain_cs_dag_delete + * @brief s_chain_cs_dag_delete * @param a_dag * @return */ -void dap_chain_cs_dag_delete(dap_chain_t * a_chain) +static void s_chain_cs_dag_delete(dap_chain_t * a_chain) { s_dap_chain_cs_dag_purge(a_chain); dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain ); @@ -1532,7 +1535,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key); } else { // add event to delete - l_list_to_del = dap_list_prepend(l_list_to_del, l_objs[i].key); + l_list_to_del = dap_list_prepend(l_list_to_del, (void *)l_objs[i].key); dap_string_append_printf(l_str_ret_tmp, "Event %s added in chain successfully\n", l_objs[i].key); } diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index c4c171d6fa..2150c23428 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -208,44 +208,6 @@ size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t return a_round_item_size+l_sign_size; } -static void s_event_broadcast_from_context(dap_global_db_context_t *a_context, void *a_arg) -{ - dap_chain_cs_dag_event_round_broadcast_t *l_arg = a_arg; - dap_chain_net_t *l_net = dap_chain_net_by_id(l_arg->dag->chain->net_id); - dap_chain_net_sync_gdb_broadcast(a_context, l_arg->obj, l_net); - dap_store_obj_free_one(l_arg->obj); - DAP_DELETE(a_arg); -} - -static bool s_event_broadcast_send(dap_chain_cs_dag_event_round_broadcast_t *a_arg) -{ - dap_chain_net_t *l_net = dap_chain_net_by_id(a_arg->dag->chain->net_id); - if (dap_chain_net_get_state(l_net) != NET_STATE_SYNC_GDB) - dap_global_db_context_exec(s_event_broadcast_from_context, a_arg); - else if (a_arg->attempts++ < 10) - return true; - return false; -} - -void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_context_t *a_context) -{ - dap_chain_cs_dag_event_round_broadcast_t *l_arg = DAP_NEW(dap_chain_cs_dag_event_round_broadcast_t); - if (!l_arg) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - l_arg->dag = a_dag; - l_arg->obj = dap_store_obj_copy(a_obj, 1); - l_arg->context = a_context; - l_arg->attempts = 0; - if (!s_event_broadcast_send(l_arg)) - return; - if (dap_timerfd_start(3 * 1000, - (dap_timerfd_callback_t)s_event_broadcast_send, - l_arg) == NULL) - log_it(L_ERROR, "Can't run timer for broadcast Event %s", a_obj->key); -} - /** * @brief dap_chain_cs_dag_event_gdb_set * @param a_dag diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index 34f407772d..8e07f06824 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -61,7 +61,6 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_hal_item_t *hal; atomic_uint_fast64_t round_current, round_completed; - bool broadcast_disable; uint16_t datum_add_hashes_count; char * gdb_group_events_round_new; @@ -80,7 +79,5 @@ typedef struct dap_chain_cs_dag int dap_chain_cs_dag_init(); void dap_chain_cs_dag_deinit(void); -int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); -void dap_chain_cs_dag_delete(dap_chain_t * a_chain); void dap_chain_cs_dag_proc_event_round_new(dap_chain_cs_dag_t *a_dag); dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag, dap_chain_hash_fast_t * a_hash); diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h index 388508dccb..68c7f42988 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -60,13 +60,6 @@ typedef struct dap_chain_cs_dag_event_round_item { uint8_t event_n_signs[]; // event // dap_chain_cs_dag_event_t } DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_item_t; -typedef struct dap_chain_cs_dag_event_round_broadcast { - dap_chain_cs_dag_t *dag; - dap_store_obj_t *obj; - dap_global_db_context_t *context; - int attempts; -} dap_chain_cs_dag_event_round_broadcast_t; - dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id, dap_chain_datum_t *a_datum, dap_enc_key_t *a_key, dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size); @@ -90,10 +83,7 @@ static inline size_t dap_chain_cs_dag_event_get_datum_size_maximum(dap_chain_cs_ : 0; } -// dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, -// size_t * a_event_size_new, -// dap_chain_net_t * a_net, dap_enc_key_t * a_key); -size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t * a_key); +size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_enc_key_t *a_key); size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size, dap_enc_key_t *a_key); bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, dap_enc_key_t * a_key); @@ -101,47 +91,45 @@ bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_ dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number); /** - * @brief dap_chain_cs_dag_event_calc_size + * @brief dap_chain_cs_dag_event_calc_size_excl_signs * @param a_event * @return */ -/** -static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event) +static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t *a_event, size_t a_event_size) { - if(!a_event) + if (a_event_size < sizeof(a_event->header)) return 0; size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); - - size_t l_datum_size = dap_chain_datum_size(l_datum); - uint8_t * l_signs = a_event->hashes_n_datum_n_signs - +l_hashes_size+l_datum_size; - uint16_t l_signs_offset = 0; - uint16_t l_signs_passed; - for ( l_signs_passed=0; l_signs_passed < a_event->header.signs_count; l_signs_passed++){ - dap_sign_t * l_sign = (dap_sign_t *) l_signs+l_signs_offset; - l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header); - } - - return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size; + if (a_event_size < l_hashes_size + sizeof(a_event->header)) + return 0; + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); + size_t l_ret = dap_chain_datum_size(l_datum) + l_hashes_size + sizeof(a_event->header); + if (a_event_size < l_ret) + return 0; + return l_ret; } -**/ /** - * @brief dap_chain_cs_dag_event_calc_size_excl_signs + * @brief dap_chain_cs_dag_event_calc_size * @param a_event * @return */ -static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) +static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size) { - if (a_event_size < sizeof(a_event->header)) - return -1; - size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); - if (l_hashes_size > a_event_size) - return -1; - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); - size_t l_datum_size = dap_chain_datum_size(l_datum); - return l_hashes_size + sizeof (a_event->header) + l_datum_size; + if (!a_event || !a_limit_size) + return 0; + size_t l_signs_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_limit_size); + if (!l_signs_offset) + return 0; + byte_t *l_signs = (byte_t *)a_event + l_signs_offset; + size_t l_signs_size = 0; + for (uint16_t l_signs_passed = 0; l_signs_passed < a_event->header.signs_count; l_signs_passed++) { + dap_sign_t *l_sign = (dap_sign_t *)(l_signs + l_signs_size); + l_signs_size += dap_sign_get_size(l_sign); + if (a_limit_size < l_signs_offset + l_signs_size) + return 0; + } + return l_signs_offset + l_signs_size; } /** @@ -159,7 +147,7 @@ static inline size_t dap_chain_cs_dag_event_round_item_get_size(dap_chain_cs_dag return sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_round_item->data_size; } -void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_context_t *a_context); +void dap_chain_cs_dag_event_broadcast(dap_chain_cs_dag_t *a_dag, dap_store_obj_t *a_obj, dap_global_db_instance_t *a_dbi); bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_hash_str, dap_chain_cs_dag_event_t *a_event, size_t a_event_size, dap_chain_cs_dag_event_round_item_t *a_round_item); diff --git a/modules/consensus/none/CMakeLists.txt b/modules/type/none/CMakeLists.txt similarity index 100% rename from modules/consensus/none/CMakeLists.txt rename to modules/type/none/CMakeLists.txt diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/type/none/dap_chain_cs_none.c similarity index 54% rename from modules/consensus/none/dap_chain_cs_none.c rename to modules/type/none/dap_chain_cs_none.c index 6a8f04291b..f06e892f69 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/type/none/dap_chain_cs_none.c @@ -44,123 +44,92 @@ #define CONSENSUS_NAME "none" -typedef struct dap_chain_gdb_datum_hash_item{ +typedef struct dap_nonconsensus_datum_hash_item { char key[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_t datum_data_hash; - uint8_t padding[2]; - struct dap_chain_gdb_datum_hash_item *prev, *next; -} dap_chain_gdb_datum_hash_item_t; + struct dap_nonconsensus_datum_hash_item *prev, *next; +} dap_nonconsensus_datum_hash_item_t; -typedef struct dap_chain_gdb_private -{ - bool celled; +typedef struct dap_nonconsensus_private { bool is_load_mode; // If load mode - not save when new atom adds - uint8_t padding[7]; char *group_datums; - dap_chain_t *chain; - pthread_cond_t load_cond; pthread_mutex_t load_mutex; - dap_chain_gdb_datum_hash_item_t * hash_items; -} dap_chain_gdb_private_t; + dap_nonconsensus_datum_hash_item_t * hash_items; +} dap_nonconsensus_private_t; -#define PVT(a) ( (a) ? (dap_chain_gdb_private_t* ) (a)->_internal : NULL) +#define PVT(a) ((a) ? (dap_nonconsensus_private_t *)(a)->_internal : NULL) // Atomic element organization callbacks -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Accept new event in gdb -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Verify new event in gdb -static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get gdb event header size +static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Accept new event in gdb +static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Verify new event in gdb +static size_t s_nonconsensus_callback_atom_get_static_hdr_size(void); // Get gdb event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold); -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, +static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold); +static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create_from(dap_chain_t * a_chain, dap_chain_atom_ptr_t a, size_t a_atom_size); // Delete iterator -static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); // Get the fisrt event from gdb +static void s_nonconsensus_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); // Get the fisrt event from gdb -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t s_nonconsensus_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); // Get event(s) from gdb -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the fisrt event from gdb -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the next event from gdb -static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the fisrt event from gdb +static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the next event from gdb +static dap_chain_atom_ptr_t *s_nonconsensus_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, size_t * a_links_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events -static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t *s_nonconsensus_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, size_t * a_lasts_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events -static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count); -static dap_time_t s_chain_callback_atom_get_timestamp(dap_chain_atom_ptr_t a_atom) { return ((dap_chain_datum_t *)a_atom)->header.ts_create; } -static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, +static dap_chain_datum_t **s_nonconsensus_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count); +static dap_time_t s_nonconsensus_callback_atom_get_timestamp(dap_chain_atom_ptr_t a_atom) { return ((dap_chain_datum_t *)a_atom)->header.ts_create; } +static size_t s_nonconsensus_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size); -static void s_chain_gdb_ledger_load(dap_chain_t *a_chain); - -/** - * @brief stub for consensus - * - * @param a_chain chain object - * @param a_chain_cfg chain config object - * @return int - */ -static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) -{ - return dap_chain_gdb_new(a_chain, a_chain_cfg); -} +static void s_nonconsensus_ledger_load(dap_chain_t *a_chain); +static int s_cs_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); +static void s_nonconsensus_delete(dap_chain_t *a_chain); /** * @brief dap_chain_cs_gdb_init * Initialize GDB chain items organization class * @return */ -int dap_chain_gdb_init(void) +int dap_nonconsensus_init(void) { - dap_chain_cs_add(CONSENSUS_NAME, s_cs_callback_new); - dap_chain_cs_type_add(CONSENSUS_NAME, dap_chain_gdb_new); - + dap_chain_cs_add(CONSENSUS_NAME, s_cs_callback_new); // It's a type and CS itself log_it(L_NOTICE, "Initialized GDB chain items organization class"); return 0; } /** - * @brief if current network in ONLINE state send to all connected node - * executes, when you add data to gdb chain (class=gdb in chain config) - * @param a_arg arguments. Can be network object (dap_chain_net_t) - * @param a_op_code object type (f.e. l_net->type from dap_store_obj) - * @param a_group group, for example "chain-gdb.home21-network.chain-F" - * @param a_key key hex value, f.e. 0x12EFA084271BAA5EEE93B988E73444B76B4DF5F63DADA4B300B051E29C2F93 - * @param a_value buffer with data - * @param a_value_len buffer size - */ -static void s_history_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg) -{ - if (a_arg){ - dap_chain_gdb_t * l_gdb = (dap_chain_gdb_t *) a_arg; - dap_chain_net_t *l_net = dap_chain_net_by_id( l_gdb->chain->net_id); - log_it(L_DEBUG,"%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu",l_net->pub.name, - l_gdb->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len); - s_chain_callback_atom_add(l_gdb->chain, a_obj->value, a_obj->value_len); - dap_chain_net_sync_gdb_broadcast(a_context, a_obj, l_net); - } -} - -/** - * @brief set PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true + * @brief set PVT(DAP_NONCONSENSUS(a_chain))->is_load_mode = true * * @param a_chain dap_chain_t object */ -static void s_dap_chain_gdb_callback_purge(dap_chain_t *a_chain) +static void s_nonconsensus_callback_purge(dap_chain_t *a_chain) { - PVT(DAP_CHAIN_GDB(a_chain))->is_load_mode = true; + PVT(DAP_NONCONSENSUS(a_chain))->is_load_mode = true; } -static void s_callback_memepool_notify(dap_global_db_context_t *a_context UNUSED_ARG, dap_store_obj_t *a_obj, void *a_arg) +static void s_nonconsensus_callback_mempool_notify(dap_global_db_instance_t UNUSED_ARG *a_dbi, dap_store_obj_t *a_obj, void *a_arg) { - if (a_obj->type == DAP_DB$K_OPTYPE_ADD) + if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) dap_chain_node_mempool_process_all(a_arg, false); } +static void s_changes_callback_notify(dap_global_db_instance_t UNUSED_ARG *a_dbi, dap_store_obj_t *a_obj, void *a_arg) +{ + dap_return_if_fail(a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD && a_obj->value_len && a_obj->value); + dap_chain_t *l_chain = a_arg; + if (a_obj->type == DAP_GLOBAL_DB_OPTYPE_DEL) + return; + s_nonconsensus_callback_atom_add(l_chain, (dap_chain_datum_t *)a_obj->value, a_obj->value_len); +} + /** * @brief configure chain gdb * Set atom element callbacks @@ -168,87 +137,83 @@ static void s_callback_memepool_notify(dap_global_db_context_t *a_context UNUSED * @param a_chain_cfg dap_config_t config object * @return int */ -int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) +static int s_cs_callback_new(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_chain_cfg) { - dap_chain_gdb_t *l_gdb = DAP_NEW_Z(dap_chain_gdb_t); - if (!l_gdb) { + dap_nonconsensus_t *l_nochain = DAP_NEW_Z(dap_nonconsensus_t); + if (!l_nochain) { log_it(L_CRITICAL, "Memory allocation error"); return -1; } - dap_chain_gdb_private_t *l_gdb_priv = DAP_NEW_Z(dap_chain_gdb_private_t); - if (!l_gdb_priv) { + dap_nonconsensus_private_t *l_nochain_priv = DAP_NEW_Z(dap_nonconsensus_private_t); + if (!l_nochain_priv) { log_it(L_CRITICAL, "Memory allocation error"); - DAP_DELETE(l_gdb); - return -1; + DAP_DELETE(l_nochain); + return -2; } - l_gdb->chain = a_chain; - l_gdb->_internal = (void*) l_gdb_priv; - a_chain->_inheritor = l_gdb; - - l_gdb_priv->celled = dap_config_get_item_bool_default(a_chain_cfg, CONSENSUS_NAME, "celled",false); + l_nochain->chain = a_chain; + l_nochain->_internal = (void*) l_nochain_priv; + a_chain->_inheritor = l_nochain; dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); - l_gdb_priv->chain = a_chain; - - if(!l_gdb_priv->celled){ - l_gdb_priv->group_datums = dap_strdup_printf( "chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name, - a_chain->id.uint64); - }else { - // here is not work because dap_chain_net_load() not yet fully performed - l_gdb_priv->group_datums = dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X".cell-%016"DAP_UINT64_FORMAT_X, - l_net->pub.name, a_chain->id.uint64, a_chain->cells->id.uint64); - } + l_nochain_priv->chain = a_chain; + l_nochain_priv->group_datums = dap_chain_net_get_gdb_group_nochain_new(a_chain); // Add group prefix that will be tracking all changes - dap_global_db_add_sync_group(l_net->pub.name, "chain-gdb", s_history_callback_notify, l_gdb); + if (dap_global_db_cluster_add(dap_global_db_instance_get_default(), l_net->pub.name, + l_nochain_priv->group_datums, 0, true, + s_changes_callback_notify, a_chain, + DAP_GDB_MEMBER_ROLE_USER, DAP_CLUSTER_ROLE_EMBEDDED)) { + log_it(L_ERROR, "Can't create global DB cluster for synchronization"); + return -3; + } - dap_chain_add_mempool_notify_callback(a_chain, s_callback_memepool_notify, a_chain); + dap_chain_add_mempool_notify_callback(a_chain, s_nonconsensus_callback_mempool_notify, a_chain); - pthread_cond_init(&l_gdb_priv->load_cond, NULL); - pthread_mutex_init(&l_gdb_priv->load_mutex, NULL); + pthread_cond_init(&l_nochain_priv->load_cond, NULL); + pthread_mutex_init(&l_nochain_priv->load_mutex, NULL); - a_chain->callback_delete = dap_chain_gdb_delete; - a_chain->callback_purge = s_dap_chain_gdb_callback_purge; + a_chain->callback_delete = s_nonconsensus_delete; + a_chain->callback_purge = s_nonconsensus_callback_purge; // Atom element callbacks - a_chain->callback_atom_add = s_chain_callback_atom_add; // Accept new element in chain - a_chain->callback_atom_verify = s_chain_callback_atom_verify; // Verify new element in chain - a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size + a_chain->callback_atom_add = s_nonconsensus_callback_atom_add; // Accept new element in chain + a_chain->callback_atom_verify = s_nonconsensus_callback_atom_verify; // Verify new element in chain + a_chain->callback_atom_get_hdr_static_size = s_nonconsensus_callback_atom_get_static_hdr_size; // Get dag event hdr size - a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create; - a_chain->callback_atom_iter_create_from = s_chain_callback_atom_iter_create_from; - a_chain->callback_atom_iter_delete = s_chain_callback_atom_iter_delete; + a_chain->callback_atom_iter_create = s_nonconsensus_callback_atom_iter_create; + a_chain->callback_atom_iter_create_from = s_nonconsensus_callback_atom_iter_create_from; + a_chain->callback_atom_iter_delete = s_nonconsensus_callback_atom_iter_delete; - a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash; - a_chain->callback_add_datums = s_chain_callback_datums_pool_proc; + a_chain->callback_atom_find_by_hash = s_nonconsensus_callback_atom_iter_find_by_hash; + a_chain->callback_add_datums = s_nonconsensus_callback_datums_pool_proc; // Linear pass through - a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain - a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one + a_chain->callback_atom_iter_get_first = s_nonconsensus_callback_atom_iter_get_first; // Get the fisrt element from chain + a_chain->callback_atom_iter_get_next = s_nonconsensus_callback_atom_iter_get_next; // Get the next element from chain from the current one - a_chain->callback_atom_iter_get_links = s_chain_callback_atom_iter_get_links; // Get the next element from chain from the current one - a_chain->callback_atom_iter_get_lasts = s_chain_callback_atom_iter_get_lasts; - a_chain->callback_atom_get_datums = s_chain_callback_atom_get_datum; - a_chain->callback_atom_get_timestamp = s_chain_callback_atom_get_timestamp; + a_chain->callback_atom_iter_get_links = s_nonconsensus_callback_atom_iter_get_links; // Get the next element from chain from the current one + a_chain->callback_atom_iter_get_lasts = s_nonconsensus_callback_atom_iter_get_lasts; + a_chain->callback_atom_get_datums = s_nonconsensus_callback_atom_get_datum; + a_chain->callback_atom_get_timestamp = s_nonconsensus_callback_atom_get_timestamp; - a_chain->callback_load_from_gdb = s_chain_gdb_ledger_load; + a_chain->callback_load_from_gdb = s_nonconsensus_ledger_load; return 0; } /** - * @brief clear dap_chain_gdb_t object + * @brief clear dap_nonconsensus_t object * * @param a_chain dap_chain_t chain object */ -void dap_chain_gdb_delete(dap_chain_t * a_chain) +static void s_nonconsensus_delete(dap_chain_t *a_chain) { - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); - dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb); + dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain); + dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain); - DAP_DELETE(l_gdb_priv->group_datums); + DAP_DELETE(l_nochain_priv->group_datums); - DAP_DELETE(l_gdb); + DAP_DELETE(l_nochain); if (a_chain) a_chain->_inheritor = NULL; } @@ -259,13 +224,13 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain) * @param a_chain dap_chain_t * chain object * @return const char* */ -const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) +const char* dap_nonconsensus_get_group(dap_chain_t * a_chain) { if(!a_chain) return NULL; - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); - dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb); - return l_gdb_priv->group_datums; + dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain); + dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain); + return l_nochain_priv->group_datums; } @@ -299,7 +264,7 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) * @param a_values * @param a_arg */ -static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_db_context, +static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_instance_t *a_dbi, UNUSED_ARG int a_rc, UNUSED_ARG const char *a_group, UNUSED_ARG const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) @@ -307,21 +272,21 @@ static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_ assert(a_arg); dap_chain_t * l_chain = (dap_chain_t *) a_arg; assert(l_chain); - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(l_chain); - assert(l_gdb); - dap_chain_gdb_private_t * l_gdb_pvt = PVT(l_gdb); - assert(l_gdb_pvt); + dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(l_chain); + assert(l_nochain); + dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain); + assert(l_nochain_pvt); // make list of datums for(size_t i = 0; i < a_values_count; i++) { dap_global_db_obj_t *it = a_values + i; - s_chain_callback_atom_add(l_chain, it->value, it->value_len); - log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_gdb_pvt->group_datums); + s_nonconsensus_callback_atom_add(l_chain, it->value, it->value_len); + log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_nochain_pvt->group_datums); } - pthread_mutex_lock(&l_gdb_pvt->load_mutex); - l_gdb_pvt->is_load_mode = false; - pthread_cond_broadcast(&l_gdb_pvt->load_cond); - pthread_mutex_unlock(&l_gdb_pvt->load_mutex); + pthread_mutex_lock(&l_nochain_pvt->load_mutex); + l_nochain_pvt->is_load_mode = false; + pthread_cond_broadcast(&l_nochain_pvt->load_cond); + pthread_mutex_unlock(&l_nochain_pvt->load_mutex); return true; } @@ -332,29 +297,29 @@ static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_context_t *a_global_ * @param a_chain chain dap_chain_t object * @return int return 0 if OK otherwise negative error code */ -static void s_chain_gdb_ledger_load(dap_chain_t *a_chain) +static void s_nonconsensus_ledger_load(dap_chain_t *a_chain) { - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); - dap_chain_gdb_private_t * l_gdb_pvt = PVT(l_gdb); + dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain); + dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain); // load ledger - l_gdb_pvt->is_load_mode = true; + l_nochain_pvt->is_load_mode = true; // Read the entire database into an array of size bytes - pthread_mutex_lock(&l_gdb_pvt->load_mutex); - dap_global_db_get_all(l_gdb_pvt->group_datums, 0, s_ledger_load_callback, a_chain); - while (l_gdb_pvt->is_load_mode) - pthread_cond_wait(&l_gdb_pvt->load_cond, &l_gdb_pvt->load_mutex); - pthread_mutex_unlock(&l_gdb_pvt->load_mutex); + pthread_mutex_lock(&l_nochain_pvt->load_mutex); + dap_global_db_get_all(l_nochain_pvt->group_datums, 0, s_ledger_load_callback, a_chain); + while (l_nochain_pvt->is_load_mode) + pthread_cond_wait(&l_nochain_pvt->load_cond, &l_nochain_pvt->load_mutex); + pthread_mutex_unlock(&l_nochain_pvt->load_mutex); } /** - * @brief call s_chain_callback_atom_add for every dap_chain_datum_t objects in a_datums array + * @brief call s_nonconsensus_callback_atom_add for every dap_chain_datum_t objects in a_datums array * * @param a_chain dap_chain_t chain object (f.e. plasma) * @param a_datums dap_chain_datum array with dap_chain_datum objects * @param a_datums_count object counts in datums array * @return size_t */ -static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count) +static size_t s_nonconsensus_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_count) { for(size_t i = 0; i < a_datums_count; i++) { dap_chain_datum_t *l_datum = a_datums[i]; @@ -367,7 +332,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain log_it(L_ERROR, "Verified datum %s not passed the check, code %d", l_db_key, l_rc); return i; } - dap_global_db_set(PVT(DAP_CHAIN_GDB(a_chain))->group_datums, l_db_key, l_datum, + dap_global_db_set(PVT(DAP_NONCONSENSUS(a_chain))->group_datums, l_db_key, l_datum, dap_chain_datum_size(l_datum), false, NULL, NULL); } return a_datums_count; @@ -381,21 +346,21 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain * @param a_atom_size atom size * @return dap_chain_atom_verify_res_t */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) +static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { if (NULL == a_chain) { - log_it(L_WARNING, "Arguments is NULL for s_chain_callback_atom_add"); + log_it(L_WARNING, "Arguments is NULL for s_nonconsensus_callback_atom_add"); return ATOM_REJECT; } - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); - dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb); + dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain); + dap_nonconsensus_private_t *l_nochain_priv = PVT(l_nochain); dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom; dap_hash_fast_t l_datum_hash; dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_datum_hash); if(dap_chain_datum_add(a_chain, l_datum, a_atom_size, &l_datum_hash)) return ATOM_REJECT; - dap_chain_gdb_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_chain_gdb_datum_hash_item_t); + dap_nonconsensus_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_nonconsensus_datum_hash_item_t); if (!l_hash_item) { log_it(L_CRITICAL, "Memory allocation error"); return ATOM_REJECT; @@ -403,8 +368,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha size_t l_datum_size = dap_chain_datum_size(l_datum); dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash ); dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash, l_hash_item->key, sizeof(l_hash_item->key)); - DL_APPEND(l_gdb_priv->hash_items, l_hash_item); - if (!l_gdb_priv->is_load_mode && a_chain->atom_notifiers) { + DL_APPEND(l_nochain_priv->hash_items, l_hash_item); + if (!l_nochain_priv->is_load_mode && a_chain->atom_notifiers) { dap_list_t *l_iter; DL_FOREACH(a_chain->atom_notifiers, l_iter) { dap_chain_atom_notifier_t *l_notifier = (dap_chain_atom_notifier_t*)l_iter->data; @@ -423,7 +388,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha * @param a_atom_size size of atom * @return dap_chain_atom_verify_res_t */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) +static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { (void) a_chain; (void) a_atom; @@ -437,7 +402,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ * * @return size_t */ -static size_t s_chain_callback_atom_get_static_hdr_size() +static size_t s_nonconsensus_callback_atom_get_static_hdr_size() { static dap_chain_datum_t *l_datum_null=NULL; return sizeof(l_datum_null->header); @@ -450,7 +415,7 @@ static size_t s_chain_callback_atom_get_static_hdr_size() * @param a_chain dap_chain_t a_chain * @return dap_chain_atom_iter_t* */ -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold) +static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); if (!l_iter) { @@ -471,7 +436,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ * @param a_atom_size size of atom * @return dap_chain_atom_iter_t* */ -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, +static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create_from(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); @@ -492,7 +457,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * execute DAP_DELETE(a_atom_iter) * @param a_atom_iter dap_chain_atom_iter_t object */ -static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter) +static void s_nonconsensus_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter) { DAP_DEL_Z(a_atom_iter->cur_item); DAP_DEL_Z(a_atom_iter->cur_hash); @@ -508,16 +473,16 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite * @param a_atom_size size of atom object * @return dap_chain_atom_ptr_t */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t s_nonconsensus_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) { char l_key[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(a_atom_hash, l_key, sizeof(l_key)); size_t l_ret_size; dap_chain_atom_ptr_t l_ret = NULL; - dap_chain_gdb_t *l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain); - if (l_gdb) { - l_ret = dap_global_db_get_sync(PVT(l_gdb)->group_datums, l_key, &l_ret_size, NULL, NULL); + dap_nonconsensus_t *l_nochain = DAP_NONCONSENSUS(a_atom_iter->chain); + if (l_nochain) { + l_ret = dap_global_db_get_sync(PVT(l_nochain)->group_datums, l_key, &l_ret_size, NULL, NULL); *a_atom_size = l_ret_size; } return l_ret; @@ -530,7 +495,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at * @param a_atom_size a_atom_size atom size * @return dap_chain_atom_ptr_t */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size) +static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size) { if (!a_atom_iter) return NULL; @@ -539,11 +504,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ DAP_DEL_Z(a_atom_iter->cur_hash); } dap_chain_datum_t * l_datum = NULL; - dap_chain_gdb_datum_hash_item_t *l_item = PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->hash_items; + dap_nonconsensus_datum_hash_item_t *l_item = PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->hash_items; a_atom_iter->cur_item = l_item; if (a_atom_iter->cur_item) { size_t l_datum_size = 0; - l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums, + l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, NULL, NULL); DAP_DEL_Z(a_atom_iter->cur); a_atom_iter->cur = l_datum; @@ -568,16 +533,16 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ * @param a_atom_size size_t a_atom_size * @return dap_chain_atom_ptr_t */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size) +static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_get_next(dap_chain_atom_iter_t *a_atom_iter, size_t *a_atom_size) { dap_chain_datum_t * l_datum = NULL; - dap_chain_gdb_datum_hash_item_t *l_item = (dap_chain_gdb_datum_hash_item_t*)a_atom_iter->cur_item; + dap_nonconsensus_datum_hash_item_t *l_item = (dap_nonconsensus_datum_hash_item_t*)a_atom_iter->cur_item; if (l_item) l_item = l_item->next; a_atom_iter->cur_item = l_item; if (a_atom_iter->cur_item ){ size_t l_datum_size =0; - l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, NULL, NULL); + l_datum = (dap_chain_datum_t *)dap_global_db_get_sync(PVT(DAP_NONCONSENSUS(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, NULL, NULL); if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it DAP_DELETE(a_atom_iter->cur); a_atom_iter->cur = l_datum; @@ -603,7 +568,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i * @param a_links_sizes_ptr * @return dap_chain_atom_ptr_t* */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t* s_nonconsensus_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, size_t * a_links_size_ptr, size_t **a_links_sizes_ptr) { (void) a_atom_iter; @@ -620,7 +585,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom * @param a_links_sizes_ptr * @return dap_chain_atom_ptr_t* */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, +static dap_chain_atom_ptr_t* s_nonconsensus_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, size_t * a_lasts_size_ptr, size_t **a_links_sizes_ptr) { (void) a_atom_iter; @@ -637,7 +602,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom * @param a_datums_count count of datums * @return dap_chain_datum_t** */ -static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count) +static dap_chain_datum_t **s_nonconsensus_callback_atom_get_datum(dap_chain_atom_ptr_t a_atom, size_t a_atom_size, size_t *a_datums_count) { UNUSED(a_atom_size); if (a_atom){ diff --git a/modules/consensus/none/include/dap_chain_cs_none.h b/modules/type/none/include/dap_chain_cs_none.h similarity index 76% rename from modules/consensus/none/include/dap_chain_cs_none.h rename to modules/type/none/include/dap_chain_cs_none.h index a74d629674..885509be82 100644 --- a/modules/consensus/none/include/dap_chain_cs_none.h +++ b/modules/type/none/include/dap_chain_cs_none.h @@ -26,16 +26,13 @@ #include "dap_chain.h" -typedef struct dap_chain_gdb { - +typedef struct dap_nonconsensus { dap_chain_t *chain; void * _internal; // private data void * _inheritor; // inheritor object +} dap_nonconsensus_t; -} dap_chain_gdb_t; -#define DAP_CHAIN_GDB(a) ( (a) ? (dap_chain_gdb_t *) (a)->_inheritor : NULL) +#define DAP_NONCONSENSUS(a) ((a) ? (dap_nonconsensus_t *)(a)->_inheritor : NULL) -int dap_chain_gdb_init(void); -int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); -void dap_chain_gdb_delete(dap_chain_t * a_chain); -const char* dap_chain_gdb_get_group(dap_chain_t * a_chain); +int dap_nonconsensus_init(void); +const char* dap_nonconsensus_get_group(dap_chain_t * a_chain); diff --git a/modules/wallet/CMakeLists.txt b/modules/wallet/CMakeLists.txt index b6219a6e24..4bcf36d090 100644 --- a/modules/wallet/CMakeLists.txt +++ b/modules/wallet/CMakeLists.txt @@ -7,6 +7,10 @@ file(GLOB DAP_CHAIN_WALLET_HEADERS include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_WALLET_SRCS} ${DAP_CHAIN_WALLET_HEADERS}) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_net crc32c_adler) - +if (CELLFRAME_SDK_STANDALONE_BUILD) + target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../dap-sdk/3rdparty/crc32c_adler) +else() + target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../dap-sdk/3rdparty/crc32c_adler) +endif() target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index 2d0b3a7cc3..9681248852 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -69,8 +69,6 @@ static char s_wallet_ext [] = ".dwallet"; static pthread_rwlock_t s_wallet_n_pass_lock = PTHREAD_RWLOCK_INITIALIZER; /* Coordinate access to the hash-table */ static dap_chain_wallet_n_pass_t *s_wallet_n_pass; /* A hash table to keep passwords for wallets */ -#define CRC32C_INIT 0xEDB88320 - /* * DESCRIPTION: Add/update a record for wallet into the internaly used table of name/password pair. * Thhose records are supposed to be used for operations with the password-protected wallets. -- GitLab