diff --git a/dap_chain_net_srv_common.c b/dap_chain_net_srv_common.c index cd1709eef82484bf4919439e5851c57512d953e1..bbb4c4cb6471220dfb2db990bfcfd9a97eaf1932 100755 --- a/dap_chain_net_srv_common.c +++ b/dap_chain_net_srv_common.c @@ -1,20 +1,48 @@ #include <stdint.h> +#include "dap_strfuncs.h" #include "rand/dap_rand.h" #include "dap_chain_net_srv_common.h" #include "dap_chain_datum_tx_items.h" #include "dap_chain_utxo.h" +/** + * copy a_value_dst to a_uid_src + */ +void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst) +{ + memset(a_uid_src->raw, 0, sizeof(a_uid_src->raw)); + memcpy(a_uid_src->raw, &a_value_dst, min(sizeof(a_uid_src->raw), sizeof(uint128_t))); +} + /** * Generate unique id for service */ -bool dap_chain_net_srv_gen_uid(dap_chain_net_srv_uid_t *a_srv) +bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size) { if(!a_srv) return false; - randombytes(a_srv, sizeof(dap_chain_net_srv_uid_t)); + randombytes(a_srv, a_srv_size); return true; } +/** + * Initialize dap_chain_net_srv_abstract_t structure + */ +void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id, + uint64_t a_price, uint8_t a_price_units, const char *a_decription) +{ + memset(a_cond, 0, sizeof(dap_chain_net_srv_abstract_t)); + // generate unique proposal_id + dap_chain_net_srv_gen_uid((uint8_t*) &a_cond->proposal_id, sizeof(a_cond->proposal_id)); + // fill structure + a_cond->class = a_class; + dap_chain_net_srv_uid_set(&a_cond->type_id, a_type_id); + a_cond->price = a_price; + a_cond->price_units = a_price_units; + if(a_decription) + strncpy(a_cond->decription, a_decription, sizeof(a_cond->decription) - 1); +} + /** * */ @@ -23,9 +51,11 @@ uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, siz { dap_chain_addr_t *l_addr = (a_addr_base58) ? dap_chain_str_to_addr(a_addr_base58) : NULL; dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; - + dap_chain_sign_type_t l_sig_type; + if(l_addr) + memcpy(&l_sig_type, &l_addr->sig_type, sizeof(dap_chain_sign_type_t)); // Search all value in transactions with l_addr in 'out_cond' item - uint64_t l_value = 0;//!!!dap_chain_node_datum_tx_cache_get_out_cond_value(l_addr, &l_tx_out_cond); + uint64_t l_value = dap_chain_utxo_tx_cache_get_out_cond_value(l_addr, &l_tx_out_cond); DAP_DELETE(l_addr); // not found transaction with l_addr in 'out_cond' item if(!l_value) @@ -33,13 +63,13 @@ uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, siz size_t l_pkey_size = 0; size_t l_cond_size = 0; - uint8_t *l_cond = dap_chain_datum_tx_out_cond_item_get_pkey(l_tx_out_cond, &l_cond_size); - uint8_t *l_pkey = dap_chain_datum_tx_out_cond_item_get_cond(l_tx_out_cond, &l_pkey_size); + uint8_t *l_cond = dap_chain_datum_tx_out_cond_item_get_cond(l_tx_out_cond, &l_cond_size); + uint8_t *l_pkey = dap_chain_datum_tx_out_cond_item_get_pkey(l_tx_out_cond, &l_pkey_size); // create l_chain_sign for check a_sign dap_chain_sign_t *l_chain_sign = DAP_NEW_Z_SIZE(dap_chain_sign_t, sizeof(dap_chain_sign_t) + a_sign_size + l_pkey_size); - l_chain_sign->header.type = l_addr->sig_type; + l_chain_sign->header.type = l_sig_type; l_chain_sign->header.sign_size = l_pkey_size; l_chain_sign->header.sign_pkey_size = l_pkey_size; // write serialized public key to dap_chain_sign_t diff --git a/dap_chain_net_srv_common.h b/dap_chain_net_srv_common.h index ee6835544d2aff9491dac791246f37e8d1670cc5..9600c48046144c62b193270815ff99564b607377 100755 --- a/dap_chain_net_srv_common.h +++ b/dap_chain_net_srv_common.h @@ -5,16 +5,15 @@ #include "dap_math_ops.h" #define DAP_CHAIN_NET_SRV_UID_SIZE 16 -typedef union{ +typedef union { uint8_t raw[DAP_CHAIN_NET_SRV_UID_SIZE]; -#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + #if DAP_CHAIN_NET_SRV_UID_SIZE == 8 uint64_t raw_ui64[1]; #elif DAP_CHAIN_NET_SRV_UID_SIZE == 16 uint64_t raw_ui64[2]; dap_uint128_t raw_ui128[1]; #endif -} dap_chain_net_srv_uid_t; - +} dap_chain_net_srv_uid_t; //Classes of services enum { @@ -27,12 +26,18 @@ enum { SERV_ID_VPN = 1, }; +//Units of service +enum { + SERV_UNIT_MB = 1, // megabytes + SERV_UNIT_SEC = 2 // seconds +}; + typedef struct dap_chain_net_srv_abstract { - uint64_t proposal_id; // id trade proposal. Must be unique to the node. + uint128_t proposal_id; // id trade proposal. Must be unique to the network - uint8_t class; //Class of service - uint8_t type_id; //Type of service + uint8_t class; //Class of service (once or permanent) + dap_chain_net_srv_uid_t type_id; //Type of service union { struct { int bandwith; @@ -40,8 +45,8 @@ typedef struct dap_chain_net_srv_abstract int limit_bytes; } vpn; /*struct { - int value; - } another_srv;*/ + int value; + } another_srv;*/ } proposal_params; //size_t pub_key_data_size; @@ -50,10 +55,18 @@ typedef struct dap_chain_net_srv_abstract uint64_t price; // service price, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. uint8_t price_units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT char decription[128]; -} DAP_ALIGN_PACKED dap_chain_net_srv_abstract_t; +}DAP_ALIGN_PACKED dap_chain_net_srv_abstract_t; + +// Initialize dap_chain_net_srv_abstract_t structure +void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id, + uint64_t a_price, uint8_t a_price_units, const char *a_decription); + +// copy a_value_dst to a_uid_src +void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst); // generate new dap_chain_net_srv_uid_t -bool dap_chain_net_srv_gen_uid(dap_chain_net_srv_uid_t *a_srv); +bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size); + uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, size_t a_sign_size, const dap_chain_net_srv_abstract_t **a_cond_out);