$res = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\t\tSELECT `" . DB_PREFIX . "miners_data`.`user_id`, `" . DB_PREFIX . "miners_data`.`host`, `node_public_key`\n\t\t\t\t\tFROM `" . DB_PREFIX . "nodes_connection`\n\t\t\t\t\tLEFT JOIN `" . DB_PREFIX . "miners_data` ON `" . DB_PREFIX . "nodes_connection`.`user_id` = `" . DB_PREFIX . "miners_data`.`user_id`\n\t\t\t\t\t"); while ($row = $db->fetchArray($res)) { $hosts[] = array('user_id' => $row['user_id'], 'host' => $row['host'], 'node_public_key' => $row['node_public_key']); } // хосты могут еще не успеть набраться if (!$hosts) { sleep(1); continue; } } else { // защищеннй режим $node_data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `node_public_key`,\n\t\t\t\t\t\t\t `host`\n\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\tWHERE `user_id` = {$my_config['static_node_user_id']}\n\t\t\t\t", 'fetch_array'); $hosts[] = array('host' => $my_config['local_gate_ip'], 'node_public_key' => $node_data['node_public_key'], 'user_id' => $my_config['static_node_user_id']); } debug_print($hosts, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $my_users_ids = get_my_users_ids($db); $my_miners_ids = get_my_miners_ids($db, $my_users_ids); // если среди тр-ий есть смена нодовского ключа, то слать через отправку хэшей с последющей отдачей данных может не получиться // т.к. при некорректном нодовском ключе придет зашифрованый запрос на отдачу данных, а мы его не сможем расшифровать т.к. ключ у нас неверный $change_node_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT count(*)\n\t\t\tFROM `" . DB_PREFIX . "transactions`\n\t\t\tWHERE `type` = " . ParseData::findType('change_node_key') . " AND\n\t\t\t\t\t\t `user_id` IN (" . implode(',', $my_users_ids) . ")\n\t\t\t", 'fetch_one'); // если я майнер и работаю в обычном режиме, то должен слать хэши if ($my_miners_ids && !$my_config['local_gate_ip'] && !$change_node_key) { // опредлим, от кого будем слать $r = array_rand($my_miners_ids); $my_miner_id = $my_miners_ids[$r]; $my_user_id = $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` = {$my_miner_id}\n\t\t\t\t", 'fetch_one'); for ($i = 0; $i < sizeof($hosts); $i++) { $urls[$i] = array('url' => $hosts[$i]['host'] . 'gate_hashes.php', 'node_public_key' => $hosts[$i]['node_public_key'], 'user_id' => $hosts[$i]['user_id']); } //main_lock(); // //возьмем хэш текущего блока и номер блока
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; }