Exemplo n.º 1
0
         continue 2;
     }
     upd_deamon_time($db);
     // из-за задержек с main_lock время уже прошло и выходим раньше, чем закончится цикл
     if (time() - $start_sleep > $sleep) {
         debug_print('break', __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
         break;
     }
     sleep(1);
     // спим 1 сек. общее время = $sleep
 }
 /*
  *  Закончили спать, теперь генерим блок
  * Но, всё, что было до main_unlock может стать недействительным, т.е. надо обновить данные
  * */
 main_lock();
 // т.к. за промежуток в main_unlock и main_lock мог прийти новый блок и sleep_time могло увеличиться, то нужно проверить время
 $testBlock = new testblock($db, true);
 // сколько прошло сек с момента генерации прошлого блока
 $diff = time() - $testBlock->prev_block['time'];
 debug_print('$diff=' . $diff, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 // вычитаем уже прошедшее время
 $sleep = $sleep > $diff ? $sleep - $diff : 0;
 debug_print('$sleep=' . $sleep, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
 // если нужно доспать, то просто вернемся в начало и доспим нужное время. И на всякий случай убедимся, что блок не изменился
 if ($sleep > 0 || $testBlock->prev_block['head_hash'] != $prev_head_hash) {
     debug_print("continue", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
     main_unlock();
     unset($testBlock);
     sleep(1);
     continue;
Exemplo n.º 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;
 }