diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c index e2f613465fc7df5721c6a5c110a3f366ed4c6283..ba4d7d84b93cec870b55e07fff0aa66073d4412c 100644 --- a/modules/common/dap_chain_datum_decree.c +++ b/modules/common/dap_chain_datum_decree.c @@ -47,6 +47,24 @@ dap_sign_t *dap_chain_datum_decree_get_signs(dap_chain_datum_decree_t *a_decree, return l_signs_section; } +bool dap_chain_datum_decree_find_pkey(dap_chain_datum_decree_t *a_decree, dap_pkey_t *a_pkey) +{ + dap_return_val_if_pass(!a_decree || !a_pkey || !a_pkey->header.size, false); + dap_sign_t *l_signs_section = (dap_sign_t*)(a_decree->data_n_signs + a_decree->header.data_size); + size_t l_sign_size = 0; + bool l_ret = false; + for (uint64_t l_offset = 0; !l_ret && l_offset + sizeof(dap_sign_t) < a_decree->header.signs_size; l_offset += l_sign_size) { + dap_sign_t *l_sign = (dap_sign_t *)(a_decree->data_n_signs + a_decree->header.data_size + l_offset); + l_sign_size = dap_sign_get_size(l_sign); + if (l_offset + l_sign_size <= l_offset || l_offset + l_sign_size > a_decree->header.signs_size) + break; + size_t l_pkey_ser_size = 0; + const uint8_t *l_pkey_ser = dap_sign_get_pkey(l_sign, &l_pkey_ser_size), + l_ret = (l_pkey_ser_size == a_pkey->header.size) && !memcmp(l_pkey_ser, a_pkey->pkey, l_pkey_ser_size); + } + return l_ret; +} + int dap_chain_datum_decree_get_fee(dap_chain_datum_decree_t *a_decree, uint256_t *a_fee_value) { dap_return_val_if_fail(a_decree && a_fee_value, -1); @@ -397,9 +415,17 @@ dap_chain_datum_decree_t *dap_chain_datum_decree_sign_in_cycle(dap_cert_t **a_ce { size_t l_cur_sign_offset = a_datum_decree->header.data_size + a_datum_decree->header.signs_size; size_t l_total_signs_size = a_datum_decree->header.signs_size, l_total_sign_count = 0; - for(size_t i = 0; i < a_certs_count; i++) { - dap_sign_t * l_sign = dap_cert_sign(a_certs[i], a_datum_decree, + dap_pkey_t *l_cur_pkey = dap_cert_to_pkey(a_certs[i]); + if (dap_chain_datum_decree_find_pkey(a_datum_decree, l_cur_pkey)) { + dap_chain_hash_fast_t l_pkey_hash = { }; + dap_pkey_get_hash(l_cur_pkey, &l_pkey_hash); + log_it(L_ERROR, "Sign with %s pkey already exist in decree", dap_hash_fast_to_str_static(&l_pkey_hash)); + DAP_DELETE(l_cur_pkey); + continue;; + } + DAP_DELETE(l_cur_pkey); + dap_sign_t *l_sign = dap_cert_sign(a_certs[i], a_datum_decree, sizeof(dap_chain_datum_decree_t) + a_datum_decree->header.data_size, DAP_SIGN_HASH_TYPE_DEFAULT); if (!l_sign) { log_it(L_ERROR, "Decree signing failed"); diff --git a/modules/common/include/dap_chain_datum_decree.h b/modules/common/include/dap_chain_datum_decree.h index 0704a90437eef1d41b866481a778494892d5bf51..95c10046bfb503e506bfc37f2f45dd19bfce2c4c 100644 --- a/modules/common/include/dap_chain_datum_decree.h +++ b/modules/common/include/dap_chain_datum_decree.h @@ -352,3 +352,12 @@ 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); + +/** + * @brief dap_chain_datum_decree_find_sign + * @details find pkey in decree + * @param a_decree - decree to search sign + * @param a_pkey - pkey to search + * @return true if finded + */ +bool dap_chain_datum_decree_find_pkey(dap_chain_datum_decree_t *a_decree, dap_pkey_t *a_pkey); \ No newline at end of file diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 36eccd76128cf6100c3059b33e123f474d03eda8..290bb02790046f592f775f6a175043a117e798e4 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -1793,8 +1793,7 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) l_chain?l_chain->name:"<undefined>"); return -5; } - DAP_DELETE(l_datum_hash_hex_str); - DAP_DELETE(l_datum_hash_base58_str); + DAP_DEL_MULTY(l_datum_hash_hex_str, l_datum_hash_base58_str); } else { dap_cli_server_cmd_set_reply_text(a_str_reply, "decree sign need -datum <datum hash> argument"); return -2;