Skip to content
Snippets Groups Projects
Commit ffbe1929 authored by Aleksandr Lysikov's avatar Aleksandr Lysikov
Browse files

added find the transaction in the cache by the public key that signed

parent a4d6c5e2
No related branches found
No related tags found
No related merge requests found
......@@ -31,80 +31,28 @@
#define LOG_TAG "dap_chain_datum_tx"
static size_t dap_chain_tx_in_get_size(dap_chain_tx_in_t *a_item)
{
size_t size = sizeof(dap_chain_tx_in_t); // + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_out_get_size(dap_chain_tx_out_t *a_item)
{
size_t size = sizeof(dap_chain_tx_out_t);
return size;
}
static size_t dap_chain_tx_pkey_get_size(dap_chain_tx_pkey_t *a_item)
{
size_t size = sizeof(dap_chain_tx_pkey_t) + a_item->header.sig_size;
return size;
}
static size_t dap_chain_tx_sig_get_size(dap_chain_tx_sig_t *item)
{
size_t size = sizeof(dap_chain_tx_sig_t) + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_token_get_size(dap_chain_tx_token_t *a_item)
{
size_t size = sizeof(dap_chain_tx_token_t);
return size;
}
/**
* Get item type
* Create empty transaction
*
* return type, or TX_ITEM_TYPE_ANY if error
* return transaction, 0 Error
*/
dap_chain_tx_item_type_t dap_chain_datum_item_get_type(const uint8_t *a_item)
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void)
{
dap_chain_tx_in_t *l_item_tx_in = (dap_chain_tx_in_t*) a_item;
dap_chain_tx_item_type_t type = (l_item_tx_in) ? l_item_tx_in->header.type : TX_ITEM_TYPE_ANY;
return type;
dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t);
tx->header.lock_time = time(NULL);
return tx;
}
/**
* Get item size
*
* return size, 0 Error
* Delete transaction
*/
int dap_chain_datum_item_get_size(const uint8_t *a_item)
void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx)
{
dap_chain_tx_in_t *item_tx_in = (dap_chain_tx_in_t*) a_item;
dap_chain_tx_item_type_t type = dap_chain_datum_item_get_type(a_item);
size_t size = 0;
switch (type) {
case TX_ITEM_TYPE_IN: // Transaction inputs
size = dap_chain_tx_in_get_size((dap_chain_tx_in_t*) a_item);
break;
case TX_ITEM_TYPE_OUT: // Transaction outputs
size = dap_chain_tx_out_get_size((dap_chain_tx_out_t*) a_item);
break;
case TX_ITEM_TYPE_PKEY: // Transaction public keys
size = dap_chain_tx_pkey_get_size((dap_chain_tx_pkey_t*) a_item);
break;
case TX_ITEM_TYPE_SIG: // Transaction signatures
size = dap_chain_tx_sig_get_size((dap_chain_tx_sig_t*) a_item);
break;
case TX_ITEM_TYPE_TOKEN: // token item
size = dap_chain_tx_token_get_size((dap_chain_tx_token_t*) a_item);
break;
default:
return 0;
}
return size;
if(a_tx)
DAP_DELETE(a_tx);
}
/**
* Get size of transaction
*
......@@ -124,7 +72,7 @@ int dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx)
*/
int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const uint8_t *a_item)
{
size_t size = dap_chain_datum_item_get_size(a_item);
size_t size = dap_chain_datum_item_tx_get_size(a_item);
if(!size)
return -1;
dap_chain_datum_tx_t *tx_cur = *a_tx;
......@@ -147,7 +95,7 @@ int dap_chain_datum_tx_add_sign(dap_chain_datum_tx_t **a_tx, dap_enc_key_t *a_ke
// sign all previous items in transaction
const void *l_data = (*a_tx)->tx_items;
const size_t l_data_size = (*a_tx)->header.tx_items_size;
dap_chain_tx_sig_t *l_tx_sig = dap_chain_datum_item_sign_create(a_key, l_data, l_data_size);
dap_chain_tx_sig_t *l_tx_sig = dap_chain_datum_tx_item_sign_create(a_key, l_data, l_data_size);
if(l_tx_sig) {
int l_ret = dap_chain_datum_tx_add_item(a_tx, (const uint8_t*) l_tx_sig);
DAP_DELETE(l_tx_sig);
......@@ -169,10 +117,10 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx)
uint32_t tx_items_pos = 0, tx_items_size = tx->header.tx_items_size;
while(tx_items_pos < tx_items_size) {
uint8_t *item = tx->tx_items + tx_items_pos;
int item_size = dap_chain_datum_item_get_size(item);
int item_size = dap_chain_datum_item_tx_get_size(item);
if(!item_size)
return -1;
if(dap_chain_datum_item_get_type(item) == TX_ITEM_TYPE_SIG) {
if(dap_chain_datum_tx_item_get_type(item) == TX_ITEM_TYPE_SIG) {
dap_chain_tx_sig_t *item_tx_sig = (dap_chain_tx_sig_t*) item;
dap_chain_sign_t *a_chain_sign = (dap_chain_sign_t*) item_tx_sig->sig;
if(dap_chain_sign_verify(a_chain_sign, tx->tx_items, tx_items_pos) != 1) {
......
......@@ -49,19 +49,18 @@ typedef struct dap_chain_datum_tx{
uint8_t tx_items[];
} DAP_ALIGN_PACKED dap_chain_datum_tx_t;
/**
* Get item type
* Create empty transaction
*
* return type, or TX_ITEM_TYPE_ANY if error
* return transaction, 0 Error
*/
dap_chain_tx_item_type_t dap_chain_datum_item_get_type(const uint8_t *a_item);
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void);
/**
* Get item size
*
* return size, 0 Error
* Delete transaction
*/
int dap_chain_datum_item_get_size(const uint8_t *a_item);
void dap_chain_datum_tx_delete(dap_chain_datum_tx_t *a_tx);
/**
* Get size of transaction
......
......@@ -31,6 +31,7 @@
#include "dap_chain_datum_tx_items.h"
#include "dap_chain_datum_tx_cache.h"
// sample https://github.com/troydhanson/uthash/blob/master/tests/example.c
typedef struct list_linked_item {
dap_chain_hash_fast_t tx_hash_fast;
dap_chain_datum_tx_t *tx;
......@@ -43,22 +44,22 @@ static list_cached_item_t *s_datum_list = NULL;
// for separate access to connect_list
static pthread_mutex_t s_hash_list_mutex = PTHREAD_MUTEX_INITIALIZER;
int dap_chain_node_datum_tx_cache_init(dap_enc_key_t *a_key, const char *a_token_name, dap_chain_addr_t *a_addr, uint64_t a_value)
int dap_chain_node_datum_tx_cache_init(dap_enc_key_t *a_key, const char *a_token_name, dap_chain_addr_t *a_addr,
uint64_t a_value)
{
// create first transaction
dap_chain_datum_tx_t *l_tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, sizeof(dap_chain_datum_tx_t));
dap_chain_hash_fast_t l_tx_prev_hash = {0};
dap_chain_hash_fast_t l_tx_prev_hash = { 0 };
// create items
dap_chain_tx_token_t *l_token = dap_chain_datum_item_token_create(a_token_name);
dap_chain_tx_out_t *l_in = dap_chain_datum_item_in_create(&l_tx_prev_hash, 0);
dap_chain_tx_out_t *l_out = dap_chain_datum_item_out_create(a_addr, a_value);
dap_chain_tx_token_t *l_token = dap_chain_datum_tx_item_token_create(a_token_name);
dap_chain_tx_in_t *l_in = dap_chain_datum_tx_item_in_create(&l_tx_prev_hash, 0);
dap_chain_tx_out_t *l_out = dap_chain_datum_tx_item_out_create(a_addr, a_value);
// pack items to transaction
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_token);
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_in);
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*)l_out);
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_token);
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_in);
dap_chain_datum_tx_add_item(&l_tx, (const uint8_t*) l_out);
dap_chain_datum_tx_add_sign(&l_tx, a_key);
DAP_DELETE(l_token);
DAP_DELETE(l_in);
......@@ -158,7 +159,7 @@ void dap_chain_node_datum_tx_cache_del_all(void)
}
/**
* Get transaction by hash
* Get transaction in the cache by hash
*
* return transaction, or NULL if transaction not found in the cache
*/
......@@ -178,3 +179,35 @@ const dap_chain_datum_tx_t* dap_chain_node_datum_tx_cache_find(dap_chain_hash_fa
return l_tx_ret;
}
/**
* Get the transaction in the cache by the public key that signed the transaction, starting with a_tx_first_hash
*
* a_pkey[in] public key that signed the transaction
* a_pkey_size[in] public key size
* a_tx_first_hash [in/out] hash of the initial transaction/ found transaction, if 0 start from the beginning
*/
const dap_chain_datum_tx_t* dap_chain_node_datum_tx_cache_find_by_pkey(char *a_pkey, size_t a_pkey_size,
dap_chain_hash_fast_t *a_tx_first_hash)
{
if(!a_pkey || !a_tx_first_hash)
return NULL;
dap_chain_datum_tx_t *l_cur_tx = NULL;
int l_ret = -1;
list_cached_item_t *l_iter_current, *l_item_tmp;
pthread_mutex_lock(&s_hash_list_mutex);
HASH_ITER(hh, s_datum_list , l_iter_current, l_item_tmp)
{
dap_chain_datum_tx_t *l_tx_tmp = l_iter_current->tx;
// Get sign item from transaction
const dap_chain_tx_sig_t *l_tx_sig = (const dap_chain_tx_sig_t*) dap_chain_datum_tx_item_get(l_tx_tmp, NULL,
TX_ITEM_TYPE_SIG, NULL);
// Get sign from transaction
dap_chain_sign_t *l_sig = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t*)l_tx_sig);
if(l_sig && a_pkey_size == l_sig->header.sign_pkey_size && !memcmp(a_pkey, l_sig->pkey_n_sign, a_pkey_size)) {
l_cur_tx = l_tx_tmp;
break;
}
}
pthread_mutex_unlock(&s_hash_list_mutex);
return l_cur_tx;
}
......@@ -49,7 +49,7 @@ int dap_chain_node_datum_tx_cache_del(dap_chain_hash_fast_t *tx_hash);
void dap_chain_node_datum_tx_cache_del_all(void);
/**
* Get transaction by hash
* Get transaction in the cache by hash
*
* return transaction, or NULL if transaction not found in the cache
*/
......
......@@ -34,12 +34,86 @@
#include "dap_chain_datum_tx_out.h"
#include "dap_chain_datum_tx_items.h"
static size_t dap_chain_tx_in_get_size(dap_chain_tx_in_t *a_item)
{
size_t size = sizeof(dap_chain_tx_in_t); // + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_out_get_size(dap_chain_tx_out_t *a_item)
{
size_t size = sizeof(dap_chain_tx_out_t);
return size;
}
static size_t dap_chain_tx_pkey_get_size(dap_chain_tx_pkey_t *a_item)
{
size_t size = sizeof(dap_chain_tx_pkey_t) + a_item->header.sig_size;
return size;
}
static size_t dap_chain_tx_sig_get_size(dap_chain_tx_sig_t *item)
{
size_t size = sizeof(dap_chain_tx_sig_t) + item->header.sig_size;
return size;
}
static size_t dap_chain_tx_token_get_size(dap_chain_tx_token_t *a_item)
{
size_t size = sizeof(dap_chain_tx_token_t);
return size;
}
/**
* Get item type
*
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item)
{
dap_chain_tx_in_t *l_item_tx_in = (dap_chain_tx_in_t*) a_item;
dap_chain_tx_item_type_t type = (l_item_tx_in) ? l_item_tx_in->header.type : TX_ITEM_TYPE_ANY;
return type;
}
/**
* Get item size
*
* return size, 0 Error
*/
int dap_chain_datum_item_tx_get_size(const uint8_t *a_item)
{
dap_chain_tx_in_t *item_tx_in = (dap_chain_tx_in_t*) a_item;
dap_chain_tx_item_type_t type = dap_chain_datum_tx_item_get_type(a_item);
size_t size = 0;
switch (type) {
case TX_ITEM_TYPE_IN: // Transaction inputs
size = dap_chain_tx_in_get_size((dap_chain_tx_in_t*) a_item);
break;
case TX_ITEM_TYPE_OUT: // Transaction outputs
size = dap_chain_tx_out_get_size((dap_chain_tx_out_t*) a_item);
break;
case TX_ITEM_TYPE_PKEY: // Transaction public keys
size = dap_chain_tx_pkey_get_size((dap_chain_tx_pkey_t*) a_item);
break;
case TX_ITEM_TYPE_SIG: // Transaction signatures
size = dap_chain_tx_sig_get_size((dap_chain_tx_sig_t*) a_item);
break;
case TX_ITEM_TYPE_TOKEN: // token item
size = dap_chain_tx_token_get_size((dap_chain_tx_token_t*) a_item);
break;
default:
return 0;
}
return size;
}
/**
* Create item dap_chain_tx_token_t
*
* return item, NULL Error
*/
dap_chain_tx_token_t* dap_chain_datum_item_token_create(const char *a_name)
dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(const char *a_name)
{
if(!a_name)
return NULL;
......@@ -57,7 +131,7 @@ dap_chain_tx_token_t* dap_chain_datum_item_token_create(const char *a_name)
*
* return item, NULL Error
*/
dap_chain_tx_in_t* dap_chain_datum_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx)
dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx)
{
if(!a_tx_prev_hash)
return NULL;
......@@ -73,7 +147,7 @@ dap_chain_tx_in_t* dap_chain_datum_item_in_create(dap_chain_hash_fast_t *a_tx_pr
*
* return item, NULL Error
*/
dap_chain_tx_out_t* dap_chain_datum_item_out_create(dap_chain_addr_t *a_addr, uint64_t a_value)
dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(dap_chain_addr_t *a_addr, uint64_t a_value)
{
if(!a_addr)
return NULL;
......@@ -89,7 +163,7 @@ dap_chain_tx_out_t* dap_chain_datum_item_out_create(dap_chain_addr_t *a_addr, ui
*
* return item, NULL Error
*/
dap_chain_tx_sig_t* dap_chain_datum_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size)
dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size)
{
if(!a_key || !a_data || !a_data_size)
return NULL;
......@@ -107,33 +181,48 @@ dap_chain_tx_sig_t* dap_chain_datum_item_sign_create(dap_enc_key_t *a_key, const
return l_tx_sig;
}
/**
* Get sign from sign item
*
* return sign, NULL Error
*/
dap_chain_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig)
{
if(!a_tx_sig || !a_tx_sig->header.sig_size)
return NULL;
dap_chain_sign_t *l_chain_sign = (dap_chain_sign_t*)a_tx_sig->sig;
return l_chain_sign;
}
/**
* Get item from transaction
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_out_size size[out] returned item
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
const uint8_t* dap_chain_datum_item_get(dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
const uint8_t* dap_chain_datum_tx_item_get(dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
dap_chain_tx_item_type_t a_type, int *a_item_out_size)
{
if(!a_tx || !a_item_idx_start)
if(!a_tx)
return NULL;
uint32_t l_tx_items_pos = 0, l_tx_items_size = a_tx->header.tx_items_size;
int l_item_idx = 0;
while(l_tx_items_pos < l_tx_items_size) {
uint8_t *l_item = a_tx->tx_items + l_tx_items_pos;
int l_item_size = dap_chain_datum_item_get_size(l_item);
int l_item_size = dap_chain_datum_item_tx_get_size(l_item);
if(!l_item_size)
return NULL;
// check index
if(l_item_idx >= *a_item_idx_start) {
if(!a_item_idx_start || l_item_idx >= *a_item_idx_start) {
// check type
if(a_type == TX_ITEM_TYPE_ANY || a_type == dap_chain_datum_item_get_type(l_item)) {
*a_item_idx_start = l_item_idx;
*a_item_out_size = l_item_size;
if(a_type == TX_ITEM_TYPE_ANY || a_type == dap_chain_datum_tx_item_get_type(l_item)) {
if(a_item_idx_start)
*a_item_idx_start = l_item_idx;
if(a_item_out_size)
*a_item_out_size = l_item_size;
return l_item;
}
}
......
......@@ -28,6 +28,7 @@
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_sign.h"
#include "dap_chain_datum_tx.h"
#include "dap_chain_datum_tx_in.h"
#include "dap_chain_datum_tx_out.h"
......@@ -35,19 +36,33 @@
#include "dap_chain_datum_tx_pkey.h"
#include "dap_chain_datum_tx_token.h"
/**
* Get item type
*
* return type, or TX_ITEM_TYPE_ANY if error
*/
dap_chain_tx_item_type_t dap_chain_datum_tx_item_get_type(const uint8_t *a_item);
/**
* Get item size
*
* return size, 0 Error
*/
int dap_chain_datum_item_tx_get_size(const uint8_t *a_item);
/**
* Create item dap_chain_tx_token_t
*
* return item, NULL Error
*/
dap_chain_tx_token_t* dap_chain_datum_item_token_create(const char *a_name);
dap_chain_tx_token_t* dap_chain_datum_tx_item_token_create(const char *a_name);
/**
* Create item dap_chain_tx_out_t
*
* return item, NULL Error
*/
dap_chain_tx_in_t* dap_chain_datum_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx);
dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx_prev_hash, uint32_t a_tx_out_prev_idx);
/**
......@@ -55,12 +70,30 @@ dap_chain_tx_in_t* dap_chain_datum_item_in_create(dap_chain_hash_fast_t *a_tx_pr
*
* return item, NULL Error
*/
dap_chain_tx_out_t* dap_chain_datum_item_out_create(dap_chain_addr_t *a_addr, uint64_t a_value);
dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(dap_chain_addr_t *a_addr, uint64_t a_value);
/**
* Create item dap_chain_tx_sig_t
*
* return item, NULL Error
*/
dap_chain_tx_sig_t* dap_chain_datum_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
dap_chain_tx_sig_t* dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const void *a_data, size_t a_data_size);
/**
* Get sign from sign item
*
* return sign, NULL Error
*/
dap_chain_sign_t* dap_chain_datum_tx_item_sign_get_sig(dap_chain_tx_sig_t *a_tx_sig);
/**
* Get item from transaction
*
* a_tx [in] transaction
* a_item_idx_start[in/out] start index / found index of item in transaction, if 0 then from beginning
* a_type[in] type of item being find, if TX_ITEM_TYPE_ANY - any item
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
const uint8_t* dap_chain_datum_tx_item_get(dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
dap_chain_tx_item_type_t a_type, int *a_item_out_size);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment