function downloadFile($url, $path) { global $db; $newfname = $path; $file = fopen($url, "rb"); if ($file) { $newf = fopen($newfname, "wb"); if ($newf) { while (!feof($file)) { fwrite($newf, fread($file, 1024 * 8), 1024 * 8); upd_deamon_time($db); if (check_deamon_restart($db)) { main_unlock(); exit; } } } } if ($file) { fclose($file); } if ($newf) { fclose($newf); } }
// для тестов получим что там есть $tmp_testblock_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT *\n\t\t\tFROM `" . DB_PREFIX . "testblock`\n\t\t\t", 'fetch_array'); debug_print($tmp_testblock_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print("LOAD DATA LOCAL INFILE '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // т.к. эти данные создали мы сами, то пишем их сразу в таблицу проверенных данных, которые будут отправлены другим нодам $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tLOAD DATA LOCAL INFILE '{$file}' REPLACE INTO TABLE `" . DB_PREFIX . "testblock`\n\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t(`block_id`,`time`,`level`,`user_id`, @header_hash, @signature, @mrkl_root)\n\t\t\tSET `header_hash` = UNHEX(@header_hash),\n\t\t\t\t `signature` = UNHEX(@signature),\n\t\t\t\t `mrkl_root` = UNHEX(@mrkl_root)\n\t\t\t"); unlink($file); // иногда не вставлялось, т.к. уже что-то было в testblock . добавил REPLACE debug_print('AffectedRows=' . $db->getAffectedRows(), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); /// ####################################### // Отмечаем транзакции, которые попали в transactions_testblock // Пока для эксперимента // если не отмечать, то получается, что и в transactions_testblock и в transactions будут провернные тр-ии, которые откатятся дважды if ($used_transactions) { $used_transactions = substr($used_transactions, 0, -1); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tUPDATE `" . DB_PREFIX . "transactions`\n\t\t\t\tSET `used`=1\n\t\t\t\tWHERE `hash` IN ({$used_transactions})\n\t\t\t\t"); // для теста тупо удаляем, т.к. она уже есть в transactions_testblock /* $db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, " DELETE FROM `".DB_PREFIX."transactions` WHERE `hash` IN ({$used_transactions}) ");*/ } // ############################################ main_unlock(); debug_print('end<<<<<<<<<<<<<<<<<<<<<<<', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); unset($testBlock, $data, $for_sign, $mrkl_root_binary, $mrkl_root, $mrkl_array, $data_hex, $row, $transactions); //ob_save(); sleep(1); // временно //exit; } while (true);
public function __construct($db, $wo_lock = false) { if ($wo_lock) { $this->wo_lock = true; } else { $this->wo_lock = false; } $this->db = $db; /*// получаем наш miner_id и приватный ключ нода $this->my_table = $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__," SELECT `user_id`, `miner_id` , `private_key` FROM `".DB_PREFIX.MY_PREFIX."my_table` LEFT JOIN `my_node_keys` ON 1=1 WHERE `block_id` = (SELECT max(`block_id`) FROM `".DB_PREFIX.MY_PREFIX."my_node_keys`) ", 'fetch_array' );*/ // print 'testblock my_table'; //print_r($this->my_table); if (!$this->wo_lock) { main_lock(); } // последний успешно записанный блок $this->prev_block = $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT LOWER(HEX(`hash`)) as `hash`,\n\t\t\t\t\t\t\t LOWER(HEX(`head_hash`)) as `head_hash`,\n\t\t\t\t\t\t\t `block_id`,\n\t\t\t\t\t\t\t `time`,\n\t\t\t\t\t\t\t `level`\n\t\t\t\tFROM `" . DB_PREFIX . "info_block`\n\t\t\t\t", 'fetch_array'); // print 'testblock prev_block'; //print_r($this->prev_block); // общее кол-во майнеров. $max_miner_id = $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT max(`miner_id`)\n\t\t\t\tFROM `" . DB_PREFIX . "miners`\n\t\t\t\t", 'fetch_one'); $i = 0; do { // если майнера заморозили то у него исчезает miner_id, чтобы не попасть на такой пустой miner_id // нужно пербирать энтропию, пока не дойдем до существующего miner_id if ($i == 0) { $entropy = self::get_entropy($this->prev_block['head_hash']); } else { $block_id = $this->prev_block['block_id'] - $i; if ($block_id < 1) { break; } // bug fixed //if ($this->prev_block['block_id']>10) { $new_head_hash = $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\t\t\tSELECT LOWER(HEX(`head_hash`)) as `head_hash`\n\t\t\t\t\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\t\t\t\t\tWHERE `id` = {$block_id}\n\t\t\t\t\t\t\t", 'fetch_one'); $entropy = self::get_entropy($new_head_hash); /*} else { $entropy = $this->db->query( __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__," SELECT `head_hash` FROM `".DB_PREFIX."block_chain` WHERE `id` = {$block_id} ", 'fetch_one' ); }*/ } debug_print('$entropy=' . $entropy, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$max_miner_id=' . $max_miner_id, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $cur_miner_id = self::get_block_generator_miner_id($max_miner_id, $entropy); // получим ID юзера по его miner_id $this->cur_user_id = $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `user_id`\n\t\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\t\tWHERE `miner_id` = {$cur_miner_id}\n\t\t\t\t\t", 'fetch_one'); $i++; } while (!$this->cur_user_id); $collective = get_my_users_ids($db, true); debug_print('$collective = ' . print_r($collective, true), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // в сингл-моде будет только $my_miners_ids[0] $my_miners_ids = get_my_miners_ids($this->db, $collective); debug_print('$my_miners_ids = ' . print_r($my_miners_ids, true), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // есть ли кто-то из нашего пула (или сингл-мода), кто находится на 0-м уровне if (in_array($cur_miner_id, $my_miners_ids)) { $this->level = 0; $this->levels_range[0][1] = $this->levels_range[0][0] = 1; $this->miner_id = $cur_miner_id; } else { $this->levels_range = self::get_block_generator_miner_id_range($cur_miner_id, $max_miner_id); debug_print($this->levels_range, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if ($my_miners_ids) { list($this->miner_id, $this->level) = $this->find_miner_id_level($my_miners_ids, $this->levels_range); } else { $this->level = 'NULL'; // у нас нет уровня, т.к. пуст $my_miners_ids, т.е. на сервере нет майнеров $this->miner_id = 0; } } $this->user_id = $this->db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `user_id`\n\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\tWHERE `miner_id` = {$this->miner_id}\n\t\t\t\t", 'fetch_one'); debug_print('$this->level =' . $this->level, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$this->miner_id =' . $this->miner_id, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$this->user_id =' . $this->user_id, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); if (!$this->wo_lock) { main_unlock(); } self::$_instance = $this; }