Exemple #1
0
     $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();
     // //возьмем хэш текущего блока и номер блока
Exemple #2
0
 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;
 }