diff --git a/dap_chain.c b/dap_chain.c
index 96405f873274d2223e9aaff39011bb269a485379..33f0bc2626ba5e72aed193e6ee035295041c1020 100644
--- a/dap_chain.c
+++ b/dap_chain.c
@@ -52,7 +52,10 @@ dap_chain_file_header_t g_silver_header;
  */
 int dap_chain_init()
 {
-    dap_chain_open();
+    dap_chain_prepare_env();
+
+    //dap_chain_show_hash_blocks_file(g_gold_hash_blocks_file);
+    //dap_chain_show_hash_blocks_file(g_silver_hash_blocks_file);
     return 0;
 }
 
@@ -78,7 +81,7 @@ void dap_chain_mine_stop(){
 
 void dap_chain_set_default(bool a_is_gold){
 
-    if (a_is_gold = true){
+    if (true == a_is_gold){
         g_gold_chain.difficulty = 1;
         g_gold_chain.blocks_count = 0;
 
@@ -119,15 +122,15 @@ void dap_chain_count_new_block(dap_chain_block_cache_t *l_block_cache)
  * @param a_file_cache
  * @return
  */
-int dap_chain_open()
+int dap_chain_prepare_env()
 {
     dap_chain_block_t *l_new_block = dap_chain_block_new(NULL);
     dap_chain_block_cache_t *l_new_block_cache = dap_chain_block_cache_new(l_new_block);
-    g_gold_chain.block_first = l_new_block_cache;
+    g_gold_chain.block_cache_first = l_new_block_cache;
 
     l_new_block = dap_chain_block_new(NULL);
     l_new_block_cache = dap_chain_block_cache_new(l_new_block);
-    g_gold_chain.block_last = l_new_block_cache;
+    g_gold_chain.block_cache_last = l_new_block_cache;
 
     g_gold_chain.difficulty = 1;
     //DAP_CHAIN_INTERNAL_LOCAL_NEW(g_gold_chain);
@@ -135,11 +138,11 @@ int dap_chain_open()
 
     l_new_block = dap_chain_block_new(NULL);
     l_new_block_cache = dap_chain_block_cache_new(l_new_block);
-    g_silver_chain.block_first = l_new_block_cache;
+    g_silver_chain.block_cache_first = l_new_block_cache;
 
     l_new_block = dap_chain_block_new(NULL);
     l_new_block_cache = dap_chain_block_cache_new(l_new_block);
-    g_silver_chain.block_last = l_new_block_cache;
+    g_silver_chain.block_cache_last = l_new_block_cache;
 
     g_silver_chain.difficulty = 1;
     //DAP_CHAIN_INTERNAL_LOCAL_NEW(g_silver_chain);
@@ -190,12 +193,13 @@ void dap_chain_block_write(dap_chain_block_cache_t *l_block_cache){
     l_hash_type_chain->blocks_count++;
 
     fseek(l_hash_type_file, 0, SEEK_END);
-    fwrite(l_block_cache->block, sizeof(l_block_cache->block->header), 1, l_hash_type_file);
+    int ret = fwrite(&(l_block_cache->block->header), sizeof(l_block_cache->block->header), 1, l_hash_type_file);
+    //log_it(L_ERROR, "Dap_chain_write_block - %d blocks written", ret);
 
-    memcpy(l_hash_type_chain->block_last->block, l_block_cache->block, sizeof l_block_cache->block->header);
-    l_hash_type_chain->block_last->block_hash = l_block_cache->block_hash;
-    l_hash_type_chain->block_last->block_mine_time = l_block_cache->block_mine_time;
-    l_hash_type_chain->block_last->sections_size = l_block_cache->sections_size;
+    memcpy(l_hash_type_chain->block_cache_last->block, l_block_cache->block, sizeof (dap_chain_block_t));
+    l_hash_type_chain->block_cache_last->block_hash = l_block_cache->block_hash;
+    l_hash_type_chain->block_cache_last->block_mine_time = l_block_cache->block_mine_time;
+    l_hash_type_chain->block_cache_last->sections_size = l_block_cache->sections_size;
 }
 
 /**
@@ -207,9 +211,9 @@ void dap_chain_block_write(dap_chain_block_cache_t *l_block_cache){
 int dap_chain_files_open()
 {
     //bool l_is_need_set_gold = false, l_is_need_set_silver = false;
-    size_t l_header_size = sizeof(g_gold_chain.blocks_count) + sizeof(g_gold_chain.difficulty)
+    size_t l_file_header_size = sizeof(g_gold_chain.blocks_count) + sizeof(g_gold_chain.difficulty)
                  + sizeof(dap_chain_file_header_t);
-
+    log_it(L_ERROR, "Dap_chain_size of header - %u Bytes", l_file_header_size);
     //--------------------------------------------------------------------
     //Init/load gold_hash_file
     //if( access( GOLD_HASH_FILE_NAME, F_OK ) == -1 )
@@ -222,7 +226,7 @@ int dap_chain_files_open()
     }
 
     fseek(g_gold_hash_blocks_file, 0, SEEK_END);
-    if (ftell(g_gold_hash_blocks_file) < l_header_size){
+    if (ftell(g_gold_hash_blocks_file) < l_file_header_size){
         fseek(g_gold_hash_blocks_file, 0, SEEK_SET);
         dap_chain_set_default(true);
     }else{
@@ -233,22 +237,25 @@ int dap_chain_files_open()
     }
 
     fseek(g_gold_hash_blocks_file, 0, SEEK_END);
-    size_t l_file_blocks_sz = ftell(g_gold_hash_blocks_file) - l_header_size;
-    if (0 != l_file_blocks_sz %  sizeof (dap_chain_block_t)){
+    long int l_file_blocks_sz = ftell(g_gold_hash_blocks_file) - (long int)l_file_header_size;
+    long int l_block_header_size = sizeof (g_gold_chain.block_cache_first->block->header);
+    if (0 != l_file_blocks_sz % l_block_header_size){
         log_it(L_ERROR, "Gold hash file is corrupted!");
-        return -2;
+
+        // to get rid of extra trash bytes at the end of the file
+        ftruncate( fileno(g_gold_hash_blocks_file), (l_file_blocks_sz - l_file_blocks_sz % l_block_header_size ) + l_file_header_size);
+
+        // or just return an error
+        //return -2;
     }
     if (l_file_blocks_sz > 0) {
-        fseek(g_gold_hash_blocks_file, l_header_size, SEEK_SET);
-        fread(g_gold_chain.block_first->block, sizeof(dap_chain_block_t), 1, g_gold_hash_blocks_file);
-        dap_chain_block_cache_dump(g_gold_chain.block_first);
+        fseek(g_gold_hash_blocks_file, l_file_header_size, SEEK_SET);
+        fread(&g_gold_chain.block_cache_first->block->header, l_block_header_size, 1, g_gold_hash_blocks_file);
+        dap_chain_block_cache_dump(g_gold_chain.block_cache_first);
 
-        fseek(g_gold_hash_blocks_file, -(int)sizeof(dap_chain_block_t), SEEK_END);
-        fread(g_gold_chain.block_last->block, sizeof(dap_chain_block_t), 1, g_gold_hash_blocks_file);
-        dap_chain_block_cache_dump(g_gold_chain.block_last);
-    } else {
-        memset(g_gold_chain.block_first, 0, sizeof(dap_chain_block_t));
-        memset(g_gold_chain.block_first, 0, sizeof(dap_chain_block_t));
+        fseek(g_gold_hash_blocks_file, -l_block_header_size, SEEK_END);
+        fread(&g_gold_chain.block_cache_last->block->header, l_block_header_size, 1, g_gold_hash_blocks_file);
+        dap_chain_block_cache_dump(g_gold_chain.block_cache_last);
     }
     //log_it(L_INFO, "Header size - %d. Header and hash size - %d. Total file size - %d.",
     //       l_header_size, l_header_and_hash_size, ftell(file_gold_hash_blocks));
@@ -269,7 +276,7 @@ int dap_chain_files_open()
     }
 
     fseek(g_silver_hash_blocks_file, 0, SEEK_END);
-    if (ftell(g_silver_hash_blocks_file) < l_header_size){
+    if (ftell(g_silver_hash_blocks_file) < l_file_header_size){
         fseek(g_silver_hash_blocks_file, 0, SEEK_SET);
         dap_chain_set_default(false);
     }else{
@@ -280,22 +287,24 @@ int dap_chain_files_open()
     }
 
     fseek(g_silver_hash_blocks_file, 0, SEEK_END);
-    l_file_blocks_sz = ftell(g_silver_hash_blocks_file) - l_header_size;
-    if (0 != l_file_blocks_sz %  sizeof (dap_chain_block_t)){
+    l_file_blocks_sz = ftell(g_silver_hash_blocks_file) - (long int)l_file_header_size;
+    if (0 != l_file_blocks_sz % l_block_header_size){
         log_it(L_ERROR, "Silver hash file is corrupted!");
-        return -4;
+
+        // to get rid of extra trash bytes at the end of the file
+        ftruncate( fileno(g_silver_hash_blocks_file), (l_file_blocks_sz - l_file_blocks_sz % l_block_header_size ) + l_file_header_size);
+
+        // or just return an error
+        //return -4;
     }
     if (l_file_blocks_sz > 0) {
-        fseek(g_silver_hash_blocks_file, l_header_size, SEEK_SET);
-        fread(g_silver_chain.block_first->block, sizeof(dap_chain_block_t), 1, g_silver_hash_blocks_file);
-        dap_chain_block_cache_dump(g_silver_chain.block_first);
+        fseek(g_silver_hash_blocks_file, l_file_header_size, SEEK_SET);
+        fread(g_silver_chain.block_cache_first->block, sizeof(dap_chain_block_t), 1, g_silver_hash_blocks_file);
+        dap_chain_block_cache_dump(g_silver_chain.block_cache_first);
 
         fseek(g_silver_hash_blocks_file, -(int)sizeof(dap_chain_block_t), SEEK_END);
-        fread(g_silver_chain.block_last->block, sizeof(dap_chain_block_t), 1, g_silver_hash_blocks_file);
-        dap_chain_block_cache_dump(g_silver_chain.block_last);
-    } else {
-        memset(g_silver_chain.block_first, 0, sizeof(dap_chain_block_t));
-        memset(g_silver_chain.block_first, 0, sizeof(dap_chain_block_t));
+        fread(g_silver_chain.block_cache_last->block, sizeof(dap_chain_block_t), 1, g_silver_hash_blocks_file);
+        dap_chain_block_cache_dump(g_silver_chain.block_cache_last);
     }
     //log_it(L_INFO, "Header size - %d. Header and hash size - %d. Total file size - %d.",
     //       l_header_size, l_header_and_hash_size, ftell(file_silver_hash_blocks));
@@ -338,8 +347,8 @@ dap_chain_block_cache_t* dap_chain_allocate_next_block(dap_chain_t * a_chain)
 {
     dap_chain_block_t* l_block = NULL;
     dap_chain_block_cache_t* l_block_cache = NULL;
-    if ( a_chain->block_last )
-        l_block = dap_chain_block_new( &a_chain->block_last->block_hash );
+    if ( a_chain->block_cache_last )
+        l_block = dap_chain_block_new( &a_chain->block_cache_last->block_hash );
     else
         l_block = dap_chain_block_new( NULL );
 
@@ -352,3 +361,46 @@ dap_chain_block_cache_t* dap_chain_allocate_next_block(dap_chain_t * a_chain)
         return NULL;
     }
 }
+
+void dap_chain_show_hash_blocks_file(FILE *a_hash_blocks_file)
+{
+    if (NULL == a_hash_blocks_file)
+        return;
+
+    dap_chain_t l_chain;
+    dap_chain_file_header_t l_header;
+    dap_chain_block_t l_block;
+
+    fseek(a_hash_blocks_file, 0, SEEK_SET);
+    fread(&l_chain.blocks_count, sizeof(l_chain.blocks_count), 1, a_hash_blocks_file);
+    fread(&l_chain.difficulty, sizeof(l_chain.difficulty), 1, a_hash_blocks_file);
+    fread(&l_header, sizeof(l_header), 1, a_hash_blocks_file);
+
+    fseek(a_hash_blocks_file, 40, SEEK_SET);
+    char buf[PATH_MAX];
+    snprintf(buf, sizeof buf, "/proc/self/fd/%d", fileno(a_hash_blocks_file));
+    readlink(buf, buf, sizeof buf);
+    log_it(L_INFO, " Start of hash sequense from file %s", buf);
+
+    size_t l_ret_sz = fread(&l_block, sizeof(l_block.header), 1, a_hash_blocks_file);
+    while (l_ret_sz > 0){
+        char * l_prev_hash_str = dap_chain_hash_to_str_new(&l_block.header.prev_block);
+        log_it(L_INFO, "  **    prev_block      %s", l_prev_hash_str);
+        DAP_DELETE(l_prev_hash_str);
+        l_ret_sz = fread(&l_block, sizeof(l_block.header), 1, a_hash_blocks_file);
+    }
+    log_it(L_INFO, " End of hash sequense!\n");
+
+}
+
+dap_chain_block_t *dap_chain_get_last_mined_block(bool a_is_gold)
+{
+    dap_chain_block_t *l_new_block = dap_chain_block_new(NULL);
+
+    if (true == a_is_gold)
+        memcpy(l_new_block, g_gold_chain.block_cache_last->block, sizeof (dap_chain_block_t));
+    else
+        memcpy(l_new_block, g_silver_chain.block_cache_last->block, sizeof (dap_chain_block_t));
+
+    return l_new_block;
+}
diff --git a/dap_chain.h b/dap_chain.h
index c4e6480ba211bd2c826c6f59c01bad146ce57a47..e10a961c25a29a5d56f078db91fdcbf1d682a816 100644
--- a/dap_chain.h
+++ b/dap_chain.h
@@ -28,8 +28,8 @@
 #include "dap_chain_block_cache.h"
 
 typedef struct dap_chain{
-    dap_chain_block_cache_t * block_first; // Mapped area start
-    dap_chain_block_cache_t * block_last; // Last block in mapped area
+    dap_chain_block_cache_t * block_cache_first; // Mapped area start
+    dap_chain_block_cache_t * block_cache_last; // Last block in mapped area
     uint64_t blocks_count;
     uint64_t difficulty;
 
@@ -41,21 +41,21 @@ int dap_chain_init();
 void dap_chain_deinit();
 
 //dap_chain_t * dap_chain_open(const char * a_file_storage,const char * a_file_cache);
-int dap_chain_open();
+int dap_chain_prepare_env();
 void dap_chain_remap(dap_chain_t * a_chain, size_t a_offset);
 void dap_chain_save(dap_chain_t * a_chain);
 void dap_chain_info_dump_log(dap_chain_t * a_chain);
 
 
-
-//работа с файлом
 int dap_chain_files_open();
 void dap_chain_block_write   (dap_chain_block_cache_t *l_block_cache);
 void dap_chain_update       (dap_chain_block_cache_t *l_block_cache);
 void dap_chain_mine_stop();
 void dap_chain_set_default(bool a_is_gold);
 void dap_chain_count_new_block(dap_chain_block_cache_t *l_block_cache);
-//работа с файлом
+void dap_chain_show_hash_blocks_file(FILE *a_hash_blocks_file);
+
+dap_chain_block_t* dap_chain_get_last_mined_block(bool a_is_gold);
 
 dap_chain_block_cache_t* dap_chain_allocate_next_block(dap_chain_t * a_chain);