Skip to content
Snippets Groups Projects

Compare revisions

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

Source

Select target project
No results found

Target

Select target project
  • cellframe/cellframe-sdk
  • MIKA83/cellframe-sdk
2 results
Show changes
Commits on Source (38)
Showing
with 199 additions and 151 deletions
......@@ -9,8 +9,8 @@ linux: !android {
win32 {
CONFIG(release, debug | release): sdk_build.commands = "$$shell_path($$PWD/../cellframe-sdk/prod_build/build.sh)" --target windows release -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
CONFIG(debug, debug | release): sdk_build.commands = "$$shell_path($$PWD/../cellframe-sdk/prod_build/build.sh)" --target windows rwd -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
CONFIG(release, debug | release): sdk_build.commands = "$$PWD/../cellframe-sdk/prod_build/build.sh" --target windows release -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
CONFIG(debug, debug | release): sdk_build.commands = "$$PWD/../cellframe-sdk/prod_build/build.sh" --target windows rwd -DINSTALL_SDK=1 -DCMAKE_INSTALL_PREFIX=/ -DCELLFRAME_NO_OPTIMIZATION=1
}
......
Subproject commit d6b6934683168160e7d25647ceef59d9439de2c3
Subproject commit 2f34b05c0f69e859315913608937eaf2b101986d
......@@ -777,6 +777,7 @@ struct chain_thread_datum_removed_notifier {
dap_chain_t *chain;
dap_chain_cell_id_t cell_id;
dap_hash_fast_t hash;
dap_chain_datum_t *datum;
int ret_code;
};
......@@ -807,7 +808,7 @@ static bool s_notify_datum_removed_on_thread(void *a_arg)
{
struct chain_thread_datum_removed_notifier *l_arg = a_arg;
assert(l_arg->callback);
l_arg->callback(l_arg->callback_arg, &l_arg->hash);
l_arg->callback(l_arg->callback_arg, &l_arg->hash, l_arg->datum);
DAP_DELETE(l_arg);
return false;
}
......@@ -928,7 +929,7 @@ void dap_chain_datum_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_
}
}
void dap_chain_datum_removed_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash) {
void dap_chain_datum_removed_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash, dap_chain_datum_t *a_datum) {
#ifdef DAP_CHAIN_BLOCKS_TEST
return;
#endif
......@@ -946,7 +947,7 @@ void dap_chain_datum_removed_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fa
*l_arg = (struct chain_thread_datum_removed_notifier) {
.callback = l_notifier->callback, .callback_arg = l_notifier->arg,
.chain = a_chain_cell->chain, .cell_id = a_chain_cell->id,
.hash = *a_hash};
.hash = *a_hash, .datum = a_datum};
dap_proc_thread_callback_add_pri(l_notifier->proc_thread, s_notify_datum_removed_on_thread, l_arg, DAP_QUEUE_MSG_PRIORITY_LOW);
}
}
......
......@@ -128,7 +128,7 @@ typedef size_t (*dap_chain_callback_add_datums_t)(dap_chain_t * , dap_chain_datu
typedef void (*dap_chain_callback_notify_t)(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, dap_chain_hash_fast_t *a_atom_hash, void *a_atom, size_t a_atom_size); //change in chain happened
typedef void (*dap_chain_callback_datum_notify_t)(void *a_arg, dap_chain_hash_fast_t *a_datum_hash, dap_chain_hash_fast_t *a_atom_hash, void *a_datum,
size_t a_datum_size, int a_ret_code, uint32_t a_action, dap_chain_net_srv_uid_t a_uid); //change in chain happened
typedef void (*dap_chain_callback_datum_removed_notify_t)(void *a_arg, dap_chain_hash_fast_t *a_datum_hash); //change in chain happened
typedef void (*dap_chain_callback_datum_removed_notify_t)(void *a_arg, dap_chain_hash_fast_t *a_datum_hash, dap_chain_datum_t *a_datum); //change in chain happened
typedef uint64_t (*dap_chain_callback_get_count)(dap_chain_t *a_chain);
typedef dap_list_t *(*dap_chain_callback_get_list)(dap_chain_t *a_chain, size_t a_count, size_t a_page, bool a_reverse);
......@@ -313,7 +313,7 @@ void dap_chain_add_callback_datum_removed_from_index_notify(dap_chain_t *a_chain
void dap_chain_atom_confirmed_notify_add(dap_chain_t *a_chain, dap_chain_callback_notify_t a_callback, void *a_arg, uint64_t a_conf_cnt);
void dap_chain_atom_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash, const uint8_t *a_atom, size_t a_atom_size);
void dap_chain_datum_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash, dap_hash_fast_t *a_atom_hash, const uint8_t *a_datum, size_t a_datum_size, int a_ret_code, uint32_t a_action, dap_chain_net_srv_uid_t a_uid);
void dap_chain_datum_removed_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash);
void dap_chain_datum_removed_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash, dap_chain_datum_t *a_datum);
void dap_chain_atom_add_from_threshold(dap_chain_t *a_chain);
dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size);
bool dap_chain_get_atom_last_hash_num(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, dap_hash_fast_t *a_atom_hash, uint64_t *a_atom_num);
......
......@@ -213,17 +213,17 @@ int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr)
return memcmp(a_addr->checksum.raw, l_checksum.raw, sizeof(l_checksum.raw));
}
void s_set_offset_limit_json(json_object * a_json_obj_out, size_t *a_start, size_t *a_and, size_t a_limit, size_t a_offset, size_t a_and_count)
void dap_chain_set_offset_limit_json(json_object * a_json_obj_out, size_t *a_start, size_t *a_and, size_t a_limit, size_t a_offset, size_t a_and_count)
{
json_object* json_obj_lim = json_object_new_object();
if (a_offset > 0) {
*a_start = a_offset;
json_object_object_add(json_obj_lim, "offset", json_object_new_int(*a_start));
json_object_object_add(json_obj_lim, "offset", json_object_new_uint64(*a_start));
}
*a_and = a_and_count;
if (a_limit > 0) {
*a_and = *a_start + a_limit;
json_object_object_add(json_obj_lim, "limit", json_object_new_int(*a_and - *a_start));
json_object_object_add(json_obj_lim, "limit", json_object_new_uint64(*a_and - *a_start));
}
else
json_object_object_add(json_obj_lim, "limit", json_object_new_string("unlimit"));
......
......@@ -39,10 +39,9 @@
*/
dap_chain_datum_tx_t* dap_chain_datum_tx_create(void)
{
dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t);
return tx
? tx->header.ts_created = time(NULL), tx
: ( log_it(L_CRITICAL, "%s", c_error_memory_alloc), NULL );
dap_chain_datum_tx_t *tx = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_datum_tx_t, NULL);
tx->header.ts_created = time(NULL);
return tx;
}
/**
......@@ -74,7 +73,8 @@ int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const void *a_item)
{
size_t size = 0;
dap_return_val_if_pass(!a_tx || !*a_tx || !(size = dap_chain_datum_item_tx_get_size(a_item, 0)), -1 );
dap_chain_datum_tx_t *tx_new = DAP_REALLOC_RET_VAL_IF_FAIL( *a_tx, dap_chain_datum_tx_get_size(*a_tx) + size, -2 );
size_t new_size = dap_chain_datum_tx_get_size(*a_tx) + size;
dap_chain_datum_tx_t *tx_new = DAP_REALLOC_RET_VAL_IF_FAIL( *a_tx, new_size, -2 );
memcpy((uint8_t*) tx_new->tx_items + tx_new->header.tx_items_size, a_item, size);
tx_new->header.tx_items_size += size;
*a_tx = tx_new;
......@@ -240,9 +240,13 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx, int a_sign_num)
{
dap_return_val_if_pass(!a_tx, -1);
int l_ret = -4, l_sign_num = 0;
byte_t *l_item = NULL; size_t l_item_size;
byte_t *l_item = NULL, *l_first_item = NULL; size_t l_item_size;
TX_ITEM_ITER_TX(l_item, l_item_size, a_tx) {
if ( *l_item == TX_ITEM_TYPE_SIG && l_sign_num++ == a_sign_num )
if (*l_item != TX_ITEM_TYPE_SIG)
continue;
if (!l_first_item)
l_first_item = l_item;
if (l_sign_num++ == a_sign_num)
break;
}
if (!l_item || !l_item_size)
......@@ -254,9 +258,9 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx, int a_sign_num)
dap_chain_datum_tx_t *l_tx;
byte_t *l_tx_data;
if ( l_sign_item->header.version ) {
l_data_size = (size_t)( l_item - (byte_t*)a_tx );
l_data_size = (size_t)( l_first_item - (byte_t *)a_tx );
l_tx = dap_config_get_item_bool_default(g_config, "ledger", "mapped", true)
? DAP_DUP_SIZE(a_tx, dap_chain_datum_tx_get_size(a_tx)) : a_tx;
? DAP_DUP_SIZE(a_tx, l_data_size) : a_tx;
l_tx_data = (byte_t*)l_tx;
l_tx->header.tx_items_size = 0;
} else {
......
......@@ -147,10 +147,7 @@ dap_chain_tx_in_ems_t *dap_chain_datum_tx_item_in_ems_create(dap_chain_id_t a_id
{
if(!a_ticker)
return NULL;
dap_chain_tx_in_ems_t *l_item = DAP_NEW_Z(dap_chain_tx_in_ems_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_in_ems_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_ems_t, NULL);
l_item->header.type = TX_ITEM_TYPE_IN_EMS;
l_item->header.token_emission_chain_id.uint64 = a_id.uint64;
l_item->header.token_emission_hash = *a_datum_token_hash;
......@@ -167,9 +164,7 @@ dap_chain_tx_in_t* dap_chain_datum_tx_item_in_create(dap_chain_hash_fast_t *a_tx
{
if(!a_tx_prev_hash)
return NULL;
dap_chain_tx_in_t *l_item = DAP_NEW_Z(dap_chain_tx_in_t);
if (!l_item)
return NULL;
dap_chain_tx_in_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_t, NULL);
l_item->header.type = TX_ITEM_TYPE_IN;
l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
l_item->header.tx_prev_hash = *a_tx_prev_hash;
......@@ -180,9 +175,7 @@ dap_chain_tx_in_reward_t *dap_chain_datum_tx_item_in_reward_create(dap_chain_has
{
if (!a_block_hash)
return NULL;
dap_chain_tx_in_reward_t *l_item = DAP_NEW_Z(dap_chain_tx_in_reward_t);
if (!l_item)
return NULL;
dap_chain_tx_in_reward_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_reward_t, NULL);
l_item->type = TX_ITEM_TYPE_IN_REWARD;
l_item->block_hash = *a_block_hash;
return l_item;
......@@ -192,17 +185,10 @@ dap_chain_tx_in_reward_t *dap_chain_datum_tx_item_in_reward_create(dap_chain_has
* Create tsd section
*/
dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, size_t a_size) {
if (!a_data || !a_size) {
return NULL;
}
dap_tsd_t *l_tsd = dap_tsd_create(a_type, a_data, a_size);
size_t l_tsd_sz = dap_tsd_size(l_tsd);
dap_chain_tx_tsd_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_tsd_t,
sizeof(dap_chain_tx_tsd_t) + l_tsd_sz);
memcpy(l_item->tsd, l_tsd, l_tsd_sz);
DAP_DELETE(l_tsd);
l_item->header.type = TX_ITEM_TYPE_TSD;
l_item->header.size = l_tsd_sz;
dap_return_val_if_fail(a_data && a_size, NULL);
dap_chain_tx_tsd_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_tsd_t, sizeof(dap_chain_tx_tsd_t) + sizeof(dap_tsd_t) + a_size, NULL);
*l_item = (dap_chain_tx_tsd_t){ .header = { .type = TX_ITEM_TYPE_TSD, .size = sizeof(dap_tsd_t) + a_size }};
dap_tsd_write(l_item->tsd, (uint16_t)a_type, a_data, a_size);
return l_item;
}
......@@ -218,10 +204,7 @@ dap_chain_tx_in_cond_t* dap_chain_datum_tx_item_in_cond_create(dap_chain_hash_fa
{
if(!a_tx_prev_hash )
return NULL;
dap_chain_tx_in_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_in_cond_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_in_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_in_cond_t, NULL);
l_item->header.type = TX_ITEM_TYPE_IN_COND;
l_item->header.receipt_idx = a_receipt_idx;
l_item->header.tx_out_prev_idx = a_tx_out_prev_idx;
......@@ -238,10 +221,7 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a
{
if (!a_addr || IS_ZERO_256(a_value))
return NULL;
dap_chain_tx_out_t *l_item = DAP_NEW_Z(dap_chain_tx_out_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_t, NULL);
l_item->addr = *a_addr;
l_item->header.type = TX_ITEM_TYPE_OUT;
l_item->header.value = a_value;
......@@ -250,14 +230,9 @@ dap_chain_tx_out_t* dap_chain_datum_tx_item_out_create(const dap_chain_addr_t *a
dap_chain_tx_out_ext_t* dap_chain_datum_tx_item_out_ext_create(const dap_chain_addr_t *a_addr, uint256_t a_value, const char *a_token)
{
if (!a_addr || !a_token)
return NULL;
if (IS_ZERO_256(a_value))
if (!a_addr || !a_token || IS_ZERO_256(a_value))
return NULL;
dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z(dap_chain_tx_out_ext_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_ext_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_ext_t, NULL);
l_item->header.type = TX_ITEM_TYPE_OUT_EXT;
l_item->header.value = a_value;
l_item->addr = *a_addr;
......@@ -269,10 +244,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_fee(uint256_t a
{
if (IS_ZERO_256(a_value))
return NULL;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE;
......@@ -289,14 +261,9 @@ dap_chain_tx_out_cond_t* dap_chain_datum_tx_item_out_cond_create_srv_pay(dap_pke
dap_chain_net_srv_price_unit_uid_t a_unit,
const void *a_params, size_t a_params_size)
{
if (!a_key || !a_key->header.size )
return NULL;
if (IS_ZERO_256(a_value))
if (!a_key || !a_key->header.size || IS_ZERO_256(a_value))
return NULL;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
if (l_item == NULL)
return NULL;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY;
......@@ -321,7 +288,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_xchange(dap
return NULL;
if (IS_ZERO_256(a_value_sell) || IS_ZERO_256(a_value_rate))
return NULL;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size);
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + a_params_size, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value_sell;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE;
......@@ -346,10 +313,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake(dap_c
return NULL;
size_t l_tsd_total_size = a_sovereign_addr && !dap_chain_addr_is_blank(a_sovereign_addr) ?
dap_chain_datum_tx_item_out_cond_create_srv_stake_get_tsd_size() : 0;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE;
......@@ -379,10 +343,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_stake_lock(
{
if (IS_ZERO_256(a_value))
return NULL;
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z(dap_chain_tx_out_cond_t);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK;
......@@ -400,10 +361,7 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega
if (IS_ZERO_256(a_value))
return NULL;
size_t l_tsd_total_size = a_pkey_hashes_count * (sizeof(dap_hash_fast_t) + sizeof(dap_tsd_t));
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size);
if (!l_item) {
return NULL;
}
dap_chain_tx_out_cond_t *l_item = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_out_cond_t, sizeof(dap_chain_tx_out_cond_t) + l_tsd_total_size, NULL);
l_item->header.item_type = TX_ITEM_TYPE_OUT_COND;
l_item->header.value = a_value;
l_item->header.subtype = DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_EMIT_DELEGATE;
......@@ -416,34 +374,47 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega
return l_item;
}
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create_from_sign(const dap_sign_t *a_sign)
{
dap_return_val_if_fail(a_sign, NULL);
size_t l_chain_sign_size = dap_sign_get_size((dap_sign_t *)a_sign); // sign data
dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE_RET_VAL_IF_FAIL(dap_chain_tx_sig_t,
sizeof(dap_chain_tx_sig_t) + l_chain_sign_size, NULL);
l_tx_sig->header.type = TX_ITEM_TYPE_SIG;
l_tx_sig->header.version = 1;
l_tx_sig->header.sig_size = (uint32_t)l_chain_sign_size;
memcpy(l_tx_sig->sig, a_sign, l_chain_sign_size);
return l_tx_sig;
}
dap_sign_t *dap_chain_datum_tx_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx)
{
dap_return_val_if_fail(a_key && a_tx, NULL);
uint8_t *l_tx_sig_present = dap_chain_datum_tx_item_get(a_tx, NULL, NULL, TX_ITEM_TYPE_SIG, NULL);
size_t l_tx_size = sizeof(dap_chain_datum_tx_t) +
(l_tx_sig_present ? (size_t)(l_tx_sig_present - a_tx->tx_items)
: a_tx->header.tx_items_size);
dap_chain_datum_tx_t *l_tx = DAP_DUP_SIZE_RET_VAL_IF_FAIL((dap_chain_datum_tx_t *)a_tx, l_tx_size, NULL);
l_tx->header.tx_items_size = 0;
dap_sign_t *ret = dap_sign_create(a_key, l_tx, l_tx_size, 0);
DAP_DELETE(l_tx);
return ret;
}
/**
* Create item dap_chain_tx_sig_t
*
* return item, NULL Error
*/
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, dap_chain_datum_tx_t *a_tx)
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx)
{
dap_return_val_if_fail(a_key && a_tx, NULL);
size_t l_tx_size = a_tx->header.tx_items_size + sizeof(dap_chain_datum_tx_t);
dap_chain_datum_tx_t *l_tx = DAP_DUP_SIZE(a_tx, l_tx_size);
if (!l_tx) {
log_it(L_CRITICAL, "%s", c_error_memory_alloc);
return NULL;
}
l_tx->header.tx_items_size = 0;
dap_sign_t *l_chain_sign = dap_sign_create(a_key, l_tx, l_tx_size, 0);
DAP_DELETE(l_tx);
dap_sign_t *l_chain_sign = dap_chain_datum_tx_sign_create(a_key, a_tx);
if (!l_chain_sign)
return NULL;
size_t l_chain_sign_size = dap_sign_get_size(l_chain_sign); // sign data
dap_chain_tx_sig_t *l_tx_sig = DAP_NEW_Z_SIZE(dap_chain_tx_sig_t,
sizeof(dap_chain_tx_sig_t) + l_chain_sign_size);
l_tx_sig->header.type = TX_ITEM_TYPE_SIG;
l_tx_sig->header.version = 1;
l_tx_sig->header.sig_size = (uint32_t)l_chain_sign_size;
memcpy(l_tx_sig->sig, l_chain_sign, l_chain_sign_size);
dap_chain_tx_sig_t *ret = dap_chain_datum_tx_item_sign_create_from_sign(l_chain_sign);
DAP_DELETE(l_chain_sign);
return l_tx_sig;
return ret;
}
/**
......@@ -484,14 +455,14 @@ byte_t *dap_chain_datum_tx_item_get_data(dap_chain_tx_tsd_t *a_tx_tsd, int *a_ty
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx,
uint8_t *dap_chain_datum_tx_item_get(const dap_chain_datum_tx_t *a_tx, int *a_item_idx,
byte_t *a_iter, dap_chain_tx_item_type_t a_type, size_t *a_item_out_size)
{
if (!a_tx)
return NULL;
int i = a_item_idx ? *a_item_idx : 0, j = -1;
byte_t *l_end = a_tx->tx_items + a_tx->header.tx_items_size,
*l_begin = i || !a_iter || a_iter < a_tx->tx_items || a_iter > l_end ? a_tx->tx_items : a_iter;
const byte_t *l_end = a_tx->tx_items + a_tx->header.tx_items_size,
*l_begin = i || !a_iter || a_iter < a_tx->tx_items || a_iter > l_end ? a_tx->tx_items : a_iter;
size_t l_left_size = (size_t)(l_end - l_begin), l_tx_item_size;
byte_t *l_item;
#define m_item_idx_n_size(item, idx, size) ({ \
......
......@@ -234,7 +234,7 @@ int dap_chain_addr_fill_from_key(dap_chain_addr_t *a_addr, dap_enc_key_t *a_key,
int dap_chain_addr_fill_from_sign(dap_chain_addr_t *a_addr, dap_sign_t *a_sign, dap_chain_net_id_t a_net_id);
int dap_chain_addr_check_sum(const dap_chain_addr_t *a_addr);
void s_set_offset_limit_json(json_object * a_json_obj_out, size_t *a_start, size_t *a_and, size_t a_limit, size_t a_offset, size_t a_and_count);
void dap_chain_set_offset_limit_json(json_object * a_json_obj_out, size_t *a_start, size_t *a_and, size_t a_limit, size_t a_offset, size_t a_and_count);
DAP_STATIC_INLINE bool dap_chain_addr_compare(const dap_chain_addr_t *a_addr1, const dap_chain_addr_t *a_addr2)
{
......
......@@ -104,6 +104,7 @@
#define DAP_CHAIN_DATUM_ID_SIZE 2
// Datum subchain type id
typedef union dap_chain_datum_typeid{
uint8_t data[DAP_CHAIN_DATUM_ID_SIZE];
......@@ -129,6 +130,10 @@ typedef struct dap_chain_datum{
byte_t data[]; /// Stored datum body
} DAP_ALIGN_PACKED dap_chain_datum_t;
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief dap_chain_datum_size
* @param a_datum
......@@ -168,3 +173,7 @@ bool dap_chain_datum_dump_tx_json(json_object* a_json_arr_reply,
dap_chain_net_id_t a_net_id);
json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum);
void dap_chain_datum_dump_json(json_object* a_json_arr_reply,json_object *a_obj_out, dap_chain_datum_t *a_datum, const char *a_hash_out_type, dap_chain_net_id_t a_net_id, bool a_verbose);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -43,6 +43,12 @@ typedef struct dap_chain_datum_anchor{
// ANCHOR TSD types
#define DAP_CHAIN_DATUM_ANCHOR_TSD_TYPE_DECREE_HASH 0x0001
#ifdef __cplusplus
extern "C" {
#endif
DAP_STATIC_INLINE size_t dap_chain_datum_anchor_get_size(dap_chain_datum_anchor_t *a_datum_anchor)
{
return sizeof(*a_datum_anchor) + a_datum_anchor->header.data_size + a_datum_anchor->header.signs_size;
......@@ -53,3 +59,7 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign
size_t a_certs_size, const char *a_hash_out_type);
void dap_chain_datum_anchor_certs_dump_json(json_object * a_json_out, byte_t * a_signs, size_t a_certs_size, const char *a_hash_out_type);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -94,6 +94,11 @@ DAP_STATIC_INLINE size_t dap_chain_datum_decree_get_size(dap_chain_datum_decree_
#define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_ACTION 0x010A
#define DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGNATURE_TYPE 0x010B
#ifdef __cplusplus
extern "C" {
#endif
DAP_STATIC_INLINE const char *dap_chain_datum_decree_subtype_to_str(uint16_t a_decree_subtype)
{
switch(a_decree_subtype) {
......@@ -343,3 +348,8 @@ void dap_chain_datum_decree_certs_dump_json(json_object * a_json_out, byte_t * a
*/
dap_chain_datum_decree_t* dap_chain_datum_decree_sign_in_cycle(dap_cert_t ** a_certs, dap_chain_datum_decree_t *a_datum_decree,
size_t a_certs_count, size_t *a_total_sign_count);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -20,3 +20,10 @@
along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -214,30 +214,6 @@ typedef struct dap_chain_datum_token_tsd_delegate_from_stake_lock {
#define DAP_CHAIN_DATUM_TOKEN_FLAG_UNDEFINED 0xffff
DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag)
{
switch (a_flag) {
case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER";
default: return "UNKNOWN FLAG OR FLAGS GROUP";
}
}
uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
/// -------- General tsd types ----
// Flags set/unsed
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_SET_FLAGS 0x0001
......@@ -295,29 +271,6 @@ uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_REMOVE 0x0024
#define DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_BLOCKED_CLEAR 0x0025
// Get delegated ticker
DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker)
{
if (!a_buf || !a_ticker)
return -1;
*a_buf = 'm';
dap_strncpy(a_buf + 1, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1);
return 0;
}
DAP_STATIC_INLINE bool dap_chain_datum_token_is_old(uint8_t a_type)
{
return a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
}
/* Token emission section */
struct DAP_ALIGN_PACKED dap_chain_emission_header_v0 {
uint8_t version;
uint8_t type; // Emission Type
......@@ -407,6 +360,57 @@ typedef struct dap_chain_datum_token_emission {
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_CROSSCHAIN "CROSSCHAIN"
#define DAP_CHAIN_DATUM_TOKEN_EMISSION_SOURCE_SUBTYPE_BRIDGE_OUT "OUT"
#ifdef __cplusplus
extern "C" {
#endif
DAP_STATIC_INLINE const char *dap_chain_datum_token_flag_to_str(uint32_t a_flag)
{
switch (a_flag) {
case DAP_CHAIN_DATUM_TOKEN_FLAG_NONE: return "NONE";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_BLOCKED: return "ALL_SENDER_BLOCKED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_ALLOWED: return "ALL_SENDER_ALLOWED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_FROZEN: return "ALL_SENDER_FROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_SENDER_UNFROZEN: return "ALL_SENDER_UNFROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_BLOCKED: return "ALL_RECEIVER_BLOCKED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_ALLOWED: return "ALL_RECEIVER_ALLOWED";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_FROZEN: return "ALL_RECEIVER_FROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_ALL_RECEIVER_UNFROZEN: return "ALL_RECEIVER_UNFROZEN";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_ALL: return "STATIC_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_FLAGS: return "STATIC_FLAGS";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_ALL: return "STATIC_PERMISSIONS_ALL";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_DATUM_TYPE: return "STATIC_PERMISSIONS_DATUM_TYPE";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_SENDER: return "TATIC_PERMISSIONS_TX_SENDER";
case DAP_CHAIN_DATUM_TOKEN_FLAG_STATIC_PERMISSIONS_TX_RECEIVER: return "STATIC_PERMISSIONS_TX_RECEIVER";
default: return "UNKNOWN FLAG OR FLAGS GROUP";
}
}
uint32_t dap_chain_datum_token_flag_from_str(const char *a_str);
// Get delegated ticker
DAP_STATIC_INLINE int dap_chain_datum_token_get_delegated_ticker(char *a_buf, const char *a_ticker)
{
if (!a_buf || !a_ticker)
return -1;
*a_buf = 'm';
dap_strncpy(a_buf + 1, a_ticker, DAP_CHAIN_TICKER_SIZE_MAX - 1);
return 0;
}
DAP_STATIC_INLINE bool dap_chain_datum_token_is_old(uint8_t a_type)
{
return a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE
|| a_type == DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC;
}
/* Token emission section */
DAP_STATIC_INLINE const char *dap_chain_datum_emission_type_str(uint8_t a_type)
{
switch (a_type) {
......@@ -437,3 +441,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_append_sign(dap_sign_
dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t *a_emission, size_t *a_signs_count);
// 256 TYPE
bool dap_chain_datum_token_is_old(uint8_t a_type);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -29,6 +29,7 @@
#include "dap_time.h"
#include "dap_pkey.h"
/**
* @struct dap_chain_datum_tx
* @brief Transaction section, consists from lot of tx_items
......@@ -56,6 +57,10 @@ typedef struct dap_chain_datum_tx {
!!( item = dap_chain_datum_tx_item_get(tx, &item_index, (byte_t*)item + item_size, item_type, &item_size) );\
item_index = 0 )
#ifdef __cplusplus
extern "C" {
#endif
/**
* Create empty transaction
*
......@@ -182,3 +187,7 @@ DAP_STATIC_INLINE dap_hash_fast_t dap_chain_node_datum_tx_calc_hash(dap_chain_da
dap_hash_fast_t l_res;
return dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_res), l_res;
}
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -27,6 +27,8 @@
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
......@@ -45,3 +47,4 @@ typedef struct dap_chain_tx_used_out_item {
uint32_t num_idx_out;
uint256_t value;
} dap_chain_tx_used_out_item_t;
......@@ -27,6 +27,7 @@
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_item
* @brief Sections belongs to heading tx section, with inputs, outputs and others tx relatated items
......
......@@ -27,6 +27,7 @@
#include "dap_common.h"
#include "dap_chain_common.h"
/**
* @struct dap_chain_tx_token
* @brief Token item
......@@ -58,3 +59,4 @@ typedef struct dap_chain_tx_in_ems_ext{
uint16_t ext_tx_out_idx; // Output index
} header; /// Only header's hash is used for verification
} DAP_ALIGN_PACKED dap_chain_tx_in_ems_ext_t;
......@@ -28,3 +28,4 @@ typedef struct dap_chain_tx_in_reward {
dap_chain_tx_item_type_t type; /// @param type @brief Transaction item type
dap_hash_t block_hash; /// @param block_hash @brief Hash of the block signed with current validator
} DAP_ALIGN_PACKED dap_chain_tx_in_reward_t;
......@@ -75,6 +75,9 @@ typedef struct dap_chain_datum_tx_item_groups {
} dap_chain_datum_tx_item_groups_t;
#ifdef __cplusplus
extern "C" {
#endif
/**
* Get item name by item type
*
......@@ -216,7 +219,11 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_item_out_cond_create_srv_emit_delega
*
* return item, NULL Error
*/
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, dap_chain_datum_tx_t *a_tx);
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx);
dap_chain_tx_sig_t *dap_chain_datum_tx_item_sign_create_from_sign(const dap_sign_t *a_sign);
dap_sign_t *dap_chain_datum_tx_sign_create(dap_enc_key_t *a_key, const dap_chain_datum_tx_t *a_tx);
/**
* Get sign from sign item
......@@ -237,7 +244,7 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_get_tsd_by_type(dap_chain_datum_tx_t
* a_item_out_size size[out] size of returned item
* return item data, NULL Error index or bad format transaction
*/
uint8_t* dap_chain_datum_tx_item_get( dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
uint8_t* dap_chain_datum_tx_item_get(const dap_chain_datum_tx_t *a_tx, int *a_item_idx_start,
byte_t *a_iter, dap_chain_tx_item_type_t a_type, size_t *a_item_out_size);
// Get Nth item of pointed type
uint8_t *dap_chain_datum_tx_item_get_nth(dap_chain_datum_tx_t *a_tx, dap_chain_tx_item_type_t a_type, int a_item_idx);
......@@ -249,3 +256,6 @@ dap_chain_tx_out_cond_t *dap_chain_datum_tx_out_cond_get(dap_chain_datum_tx_t *a
#define dap_chain_datum_tx_out_get_by_out_idx(a_tx, a_out_num) \
dap_chain_datum_tx_item_get_nth(a_tx, TX_ITEM_TYPE_OUT_ALL, a_out_num);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
......@@ -28,6 +28,7 @@
#include "dap_chain_common.h"
#include "dap_chain_datum_tx.h"
/**
* @struct dap_chain_tx_out
* @brief Transaction item outout
......@@ -48,3 +49,4 @@ typedef struct dap_chain_tx_out {
} DAP_PACKED header; /// Only header's hash is used for verification
dap_chain_addr_t addr; ////
} DAP_PACKED dap_chain_tx_out_t;