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; }