diff --git a/dap_chain_node.c b/dap_chain_node.c index d2c09b125a4dd44c23483a308682b2ce2e304473..24bad7a6f39a423cee8bf5a918d9a96c78085e1c 100644 --- a/dap_chain_node.c +++ b/dap_chain_node.c @@ -38,8 +38,8 @@ dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_shard_id_t *shard_id) if(!shard_id) return NULL; dap_chain_node_addr_t *a_addr = DAP_NEW_Z(dap_chain_node_addr_t); - dap_chain_hash_t a_hash; - dap_hash(shard_id, sizeof(dap_chain_shard_id_t), a_hash.raw, sizeof(a_hash.raw), DAP_HASH_TYPE_KECCAK); + dap_chain_hash_fast_t a_hash; + dap_hash_fast(shard_id, sizeof(dap_chain_shard_id_t), &a_hash); // first 4 bytes is last 4 bytes of shard id hash memcpy(a_addr->raw, a_hash.raw + sizeof(a_hash.raw) - sizeof(uint64_t) / 2, sizeof(uint64_t) / 2); // last 4 bytes is random diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index 457c25e4935dda64f11a3fd03f705f44823d31c4..ed9008d53501e728ac0c7f5b524bdd31cf72d1db 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -42,10 +42,8 @@ #include "dap_chain_node_cli_cmd.h" #include "dap_chain_datum.h" -#include "dap_chain_datum_tx_in.h" -#include "dap_chain_datum_tx_out.h" -#include "dap_chain_datum_tx_pkey.h" -#include "dap_chain_datum_tx_sig.h" +#include "dap_chain_datum_tx_ctrl.h" +#include "dap_chain_datum_tx_items.h" #include "dap_chain_datum_tx_cache.h" // Max and min macros @@ -983,40 +981,6 @@ int com_help(int argc, const char ** argv, char **str_reply) return -1; } -dap_chain_datum_tx_t* create_tx(const char *net_name) -{ - dap_chain_tx_in_t tx_in; - dap_chain_tx_in_t tx_out; - - tx_in.header.type = TX_ITEM_TYPE_IN; - //tx_in.header.sig_size = 0; - //tx_in - - dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t); - tx->header.lock_time = time(NULL); - int res = dap_chain_datum_tx_add_item(&tx, (const uint8_t*) &tx_in); - //dap_chain_tx_in_t - - //dap_chain_hash_t a_hash_fast; - //dap_hash((char*) tx, sizeof(tx), a_hash_fast.raw, sizeof(a_hash_fast.raw), DAP_HASH_TYPE_KECCAK); - - /* - // create file with dap_chain_t - dap_chain_id_t a_chain_id = {0x1}; - dap_chain_net_id_t a_chain_net_id = {0x2}; - dap_chain_shard_id_t a_shard_id = {0x3}; - - dap_chain_t *a_chain = dap_chain_create(a_chain_net_id, a_chain_id, a_shard_id); - const char * a_chain_net_name = "0x1"; - const char * a_chain_cfg_name = "chain-0"; - dap_chain_t *ch2 = dap_chain_load_from_cfg(a_chain_net_name, a_chain_cfg_name); - - //dap_chain_net_t *l_net = dap_chain_net_by_name(net_name); - //dap_chain_id_t *chain = l_net->pub.chains; - */ - return tx; -} - /** * com_tx_create command * @@ -1026,77 +990,174 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) { // create wallet const char *a_wallets_path = "/opt/kelvin-node/etc"; - const char *a_wallet_name = "w1"; + const char *a_wallet_name_bliss = "w_bliss"; + const char *a_wallet_name_bliss2 = "w_bliss2"; + const char *a_wallet_name_picnic = "w_picnic"; + const char *a_wallet_name_tesla = "w_tesla"; + dap_chain_net_id_t a_net_id = { 0x1 }; - dap_chain_sign_type_t a_sig_type = { SIG_TYPE_TESLA }; + //dap_chain_sign_type_t a_sig_type = { SIG_TYPE_TESLA }; //dap_chain_sign_type_t a_sig_type = { SIG_TYPE_PICNIC }; //dap_chain_sign_type_t a_sig_type = { SIG_TYPE_BLISS }; - dap_chain_wallet_t *wallet = dap_chain_wallet_create(a_wallet_name, a_wallets_path, a_net_id, a_sig_type); - dap_chain_wallet_t *wallet2 = dap_chain_wallet_open(a_wallet_name, a_wallets_path); - //wallet = dap_chain_wallet_open(a_wallet_name, a_wallets_path); - //dap_chain_wallet_save(wallet2); - dap_chain_datum_tx_t *tx = create_tx("0x123"); + //dap_chain_wallet_t *wallet0 = dap_chain_wallet_create(a_wallet_name, a_wallets_path, a_net_id, a_sig_type); + + dap_chain_wallet_t *wallet_bliss = dap_chain_wallet_open(a_wallet_name_bliss, a_wallets_path); + dap_chain_wallet_t *wallet_bliss2 = dap_chain_wallet_open(a_wallet_name_bliss2, a_wallets_path); + dap_chain_wallet_t *wallet_picnic = dap_chain_wallet_open(a_wallet_name_picnic, a_wallets_path); + dap_chain_wallet_t *wallet_tesla = dap_chain_wallet_open(a_wallet_name_tesla, a_wallets_path); + dap_enc_key_t *l_key_bliss = dap_chain_wallet_get_key(wallet_bliss, 0); + dap_enc_key_t *l_key_bliss2 = dap_chain_wallet_get_key(wallet_bliss2, 0); + dap_enc_key_t *l_key_picnic = dap_chain_wallet_get_key(wallet_picnic, 0); + dap_enc_key_t *l_key_tesla = dap_chain_wallet_get_key(wallet_tesla, 0); + /*/ debug - test check signing + { + + + int a_data_size = 50; + char *a_data = "DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify"; + + dap_enc_key_t *l_key0 = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_BLISS, NULL, 0, NULL, 0, 0); + dap_enc_key_t *l_key1 = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_TESLA, NULL, 0, NULL, 0, 0); + dap_enc_key_t *l_key2 = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_PICNIC, NULL, 0, NULL, 0, 0); + dap_enc_key_t *l_key = dap_chain_wallet_get_key(wallet, 0); + + size_t l_buflen_out; + char *l_data; + l_data = dap_enc_key_serealize_pub_key(l_key0, &l_buflen_out); + dap_enc_key_deserealize_pub_key(l_key0, l_data, l_buflen_out); + l_data = dap_enc_key_serealize_pub_key(l_key1, &l_buflen_out); + dap_enc_key_deserealize_pub_key(l_key1, l_data, l_buflen_out); + l_data = dap_enc_key_serealize_pub_key(l_key2, &l_buflen_out); + dap_enc_key_deserealize_pub_key(l_key2, l_data, l_buflen_out); + l_data = dap_enc_key_serealize_pub_key(l_key, &l_buflen_out); + dap_enc_key_deserealize_pub_key(l_key, l_data, l_buflen_out); + + dap_chain_sign_t *l_chain_sign; + l_chain_sign = dap_chain_sign_create(l_key0, a_data, a_data_size, 0); + int l_size0 = dap_chain_sign_get_size(l_chain_sign); + int l_verify0 = dap_chain_sign_verify(l_chain_sign, a_data, a_data_size); + DAP_DELETE(l_chain_sign); + l_chain_sign = dap_chain_sign_create(l_key1, a_data, a_data_size, 0); + int l_size1 = dap_chain_sign_get_size(l_chain_sign); + int l_verify1 = dap_chain_sign_verify(l_chain_sign, a_data, a_data_size); + DAP_DELETE(l_chain_sign); + l_chain_sign = dap_chain_sign_create(l_key2, a_data, a_data_size, 0); + int l_size2 = dap_chain_sign_get_size(l_chain_sign); + int l_verify2 = dap_chain_sign_verify(l_chain_sign, a_data, a_data_size); + DAP_DELETE(l_chain_sign); + l_chain_sign = dap_chain_sign_create(l_key, a_data, a_data_size, 0); + int l_size = dap_chain_sign_get_size(l_chain_sign); + int l_verify = dap_chain_sign_verify(l_chain_sign, a_data, a_data_size); + DAP_DELETE(l_chain_sign); + printf("verify=%d/%d %d/%d %d/%d %d/%d\n", l_size0, l_verify0, l_size1, l_verify1, l_size2, l_verify2, l_size, + l_verify); + + dap_enc_key_delete(l_key0); + dap_enc_key_delete(l_key1); + dap_enc_key_delete(l_key2); + }*/ static bool l_first_start = true; if(l_first_start) { const char *l_token_name = "KLVN"; - dap_enc_key_t *l_key = dap_chain_wallet_get_key(wallet, 0); - const dap_chain_addr_t *l_addr = dap_chain_wallet_get_addr(wallet); - dap_chain_node_datum_tx_cache_init(l_key, l_token_name, (dap_chain_addr_t*)l_addr, 1000); + dap_enc_key_t *l_key = dap_chain_wallet_get_key(wallet_bliss, 0); + const dap_chain_addr_t *l_addr = dap_chain_wallet_get_addr(wallet_bliss); + dap_chain_node_datum_tx_cache_init(l_key, l_token_name, (dap_chain_addr_t*) l_addr, 1000); l_first_start = false; } - - const dap_chain_addr_t *addr = dap_chain_wallet_get_addr(wallet); - - char *addr_str = dap_chain_addr_to_str((dap_chain_addr_t*)addr); - const dap_chain_addr_t *addr2 = dap_chain_str_to_addr(addr_str); - char *addr_str2 = dap_chain_addr_to_str(addr2); - free(addr_str); - - // debug - check signing - { - int a_data_size = 50; - char *a_data = "DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify"; - - - dap_enc_key_t *a_key0 = dap_enc_key_new_generate(DAP_ENC_KEY_TYPE_SIG_BLISS, NULL, 0, NULL, 0, 0); - - dap_enc_key_t *a_key1 = dap_chain_wallet_get_key(wallet, 0); - dap_enc_key_t *a_key2 = dap_chain_wallet_get_key(wallet2, 0); - dap_chain_sign_t *a_chain_sign0 = dap_chain_sign_create(a_key0, a_data, a_data_size, 0); - dap_chain_sign_t *a_chain_sign1 = dap_chain_sign_create(a_key1, a_data, a_data_size, 0); - dap_chain_sign_t *a_chain_sign2 = dap_chain_sign_create(a_key2, a_data, a_data_size, 0); - size_t a_chain_sign_size = dap_chain_sign_get_size(a_chain_sign1); - int verify0 = dap_chain_sign_verify(a_chain_sign0, a_data, a_data_size); - int verify1 = dap_chain_sign_verify(a_chain_sign1, a_data, a_data_size); - int verify2 = dap_chain_sign_verify(a_chain_sign2, a_data, a_data_size); - printf("a_chain_sign=%d verify=%d %d %d\n", a_chain_sign_size, verify0, verify1, verify2); - free(a_chain_sign2); - free(a_chain_sign1); - free(a_chain_sign0); - //dap_enc_key_delete(a_key2); - dap_enc_key_delete(a_key0); - //dap_enc_key_delete(a_key1); - } - - if(wallet) { - if(dap_chain_wallet_get_certs_number(wallet) > 0) { - dap_chain_pkey_t *pk0 = dap_chain_wallet_get_pkey(wallet, 0); - dap_enc_key_t *a_key = dap_chain_wallet_get_key(wallet, 0); - //dap_enc_key_t *a_key1 = dap_chain_wallet_get_key(wallet, 0); - //dap_enc_key_t *a_key2 = dap_chain_wallet_get_key(wallet2, 0); - int res = dap_chain_datum_tx_add_sign(&tx, a_key); - int res1 = dap_chain_datum_tx_add_sign(&tx, a_key); - int res2 = dap_chain_datum_tx_add_sign(&tx, a_key); - int res3 = dap_chain_datum_tx_verify_sign(tx); - res3 = 0; - } - dap_chain_wallet_close(wallet); - DAP_DELETE(tx); - } + int res; + // transfer from 1st transaction to addr_w_bliss + /* dap_chain_datum_tx_t *l_tx = dap_chain_datum_tx_create(); + dap_chain_hash_fast_t l_tx_prev_hash = { 0 }; + uint32_t l_tx_out_prev_idx = 0; + dap_chain_tx_in_t *l_tx_item_in = dap_chain_datum_tx_item_in_create(&l_tx_prev_hash, l_tx_out_prev_idx); + res = dap_chain_datum_tx_add_item(&l_tx, (const uint8_t *) l_tx_item_in); + res = dap_chain_datum_tx_add_sign_item(&l_tx, l_key); + res = dap_chain_node_datum_tx_cache_add(l_tx); + DAP_DELETE(l_tx);*/ + + char *addr_w_bliss = + "EXh66KVCxChbKHQcTWKYJXhua6HVZecpxuTTmWGuqm1V4vy5mVq52wD8rMQvfUnmJHsL4MuoJ7YVSFqn2RrdoN19mqHP1aQXSQPnXDR6oP9vsBPwYC9PhSvAxFystX"; + char *addr_w_bliss2 = + "EXh66KVCxChbKHQcTeGf8TT7KhcCiiQ9TrPn6rcbNoNKuhAyJ4T9zr5yMfMCXGLVHmxVKZ6J4E9Zc7pNmAa4yrKNb3DkS34jxD6Q4MCXbHJMAPFEVtMoDdFMtCysE2"; + char *addr_w_picnic = + "EXh66KVCxChbKJLxZbyNJLxfF8CfGZmdenQWuqtr8MnXavhJaLo6vckjpYgpcevBo3zB65sAGQJT3ctYVwQnASc6sYyaawFHnacsrcP47PB4XfLYiEDZvwog4AVdbC"; + + dap_chain_addr_t *addr_1 = (dap_chain_addr_t *) dap_chain_wallet_get_addr(wallet_bliss); + dap_chain_addr_t *addr_2 = dap_chain_str_to_addr(addr_w_bliss2); + dap_chain_addr_t *addr_3 = dap_chain_str_to_addr(addr_w_picnic); + + //char *addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) addr_from); + //const dap_chain_addr_t *addr2 = dap_chain_str_to_addr(addr_str); + //char *addr_str2 = dap_chain_addr_to_str(addr2); + //int a = strcmp(addr_str,addr_str2); + + uint64_t balance1 = dap_chain_datum_tx_cache_calc_balance(addr_1); + uint64_t balance2 = dap_chain_datum_tx_cache_calc_balance(addr_2); + uint64_t balance3 = dap_chain_datum_tx_cache_calc_balance(addr_3); + printf("transactions in cache=%d balance %lld %lld %lld\n", dap_chain_node_datum_tx_cache_count(), + balance1, balance2, balance3); + + res = dap_chain_datum_tx_ctrl_create_transfer(l_key_bliss, addr_1, addr_2, addr_3, 100, 2); + printf("transfer=%d\n", res); + balance1 = dap_chain_datum_tx_cache_calc_balance(addr_1); + balance2 = dap_chain_datum_tx_cache_calc_balance(addr_2); + balance3 = dap_chain_datum_tx_cache_calc_balance(addr_3); + printf("transactions in cache=%d balance %lld %lld %lld\n", dap_chain_node_datum_tx_cache_count(), + balance1, balance2, balance3); + + res = dap_chain_datum_tx_ctrl_create_transfer(l_key_bliss2, addr_2, addr_3, addr_3, 200, 2); + printf("transfer=%d\n", res); + balance1 = dap_chain_datum_tx_cache_calc_balance(addr_1); + balance2 = dap_chain_datum_tx_cache_calc_balance(addr_2); + balance3 = dap_chain_datum_tx_cache_calc_balance(addr_3); + printf("transactions in cache=%d balance %lld %lld %lld\n", dap_chain_node_datum_tx_cache_count(), + balance1, balance2, balance3); + + dap_chain_wallet_close(wallet_bliss); + dap_chain_wallet_close(wallet_bliss2); + dap_chain_wallet_close(wallet_picnic); + dap_chain_wallet_close(wallet_tesla); set_reply_text(str_reply, "com_tx_create ok"); return 0; + + /*/dap_chain_datum_tx_vefify(l_tx); + + char *addr_w_tesla = "ad8VdHszE1zxS2SDFsvTsmQVBh1G7exkvPy6DiUtjzpgiGY82iMaWeP83K6Euh9fih2G3WN1E6SpfWdCfxA7yjyTu3yrw"; + char *addr_w_picnic = + "ad8VdHszE1zx5WVKbKugtuBAimU3QT5FCnWMKKaYpMmeRwTwTNULiM7eyYiBskEG9LSN5NCp5roadQtCXe4caJqKPcWiB"; + char *addr_w_bliss = "ad8VdHszE1zx5UAFyPFYryPdMiXPMeQDL5gy6jUztE6NJsTN4idtU4xtKHkknXBYfoXQUJDUYHkL5B2QDgyisdQ715hnF"; + const dap_chain_addr_t *addr = dap_chain_wallet_get_addr(wallet); + + + dap_chain_datum_tx_t *l_tx_tmp = dap_chain_node_datum_tx_cache_find_by_pkey(l_key->pub_key_data, + l_key->pub_key_data_size, NULL); + + char *addr_str = dap_chain_addr_to_str((dap_chain_addr_t*) addr); + const dap_chain_addr_t *addr2 = dap_chain_str_to_addr(addr_str); + char *addr_str2 = dap_chain_addr_to_str(addr2); + free(addr_str); + free(addr_str2); + + if(wallet) { + if(dap_chain_wallet_get_certs_number(wallet) > 0) { + dap_chain_pkey_t *pk0 = dap_chain_wallet_get_pkey(wallet, 0); + dap_enc_key_t *a_key = dap_chain_wallet_get_key(wallet, 0); + //dap_enc_key_t *a_key1 = dap_chain_wallet_get_key(wallet, 0); + //dap_enc_key_t *a_key2 = dap_chain_wallet_get_key(wallet2, 0); + + int res = dap_chain_datum_tx_add_item(&l_tx, l_tx_item_in); + int res1 = dap_chain_datum_tx_add_sign(&l_tx, a_key); + int res2 = dap_chain_datum_tx_add_sign(&l_tx, a_key); + int res3 = dap_chain_datum_tx_verify_sign(l_tx); + res3 = 0; + } + dap_chain_wallet_close(wallet); + DAP_DELETE(l_tx); + } + set_reply_text(str_reply, "com_tx_create ok"); + return 0;*/ } /**