$my_miner_id = get_my_miner_id($db); // если юзер уже майнер, то у него должно быть настроено точное время if ($my_miner_id) { $diff = intval(ntp_time()); if ($diff > $variables_['alert_error_time']) { $lng['alert_time'] = str_ireplace('[sec]', $diff, $lng['alert_time']); echo "\n\t\t\t\t\t <div class=\"alert alert-danger alert-dismissable\" style='margin-top: 30px'><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>\n\t\t\t\t <h4>Warning!</h4>\n\t\t\t\t <div>{$lng['alert_time']}</div>\n\t\t\t\t </div>\n\t\t\t\t "; } } } if (empty($_SESSION['restricted'])) { // после обнуления таблиц my_node_key будет пуст // получим время из последнего блока $last_block_bin = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `data`\n\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\tORDER BY `id` DESC\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_one'); ParseData::string_shift($last_block_bin, 5); $block_time = ParseData::binary_dec_string_shift($last_block_bin, 4); // дождемся загрузки свежих блоков // if (time() - $block_time < 600) { закомменчено, т.к. при ручном откате до какого-то блока время будет старое $my_node_key = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `private_key`\n\t\t\t\tFROM `" . DB_PREFIX . MY_PREFIX . "my_node_keys`\n\t\t\t\tWHERE `block_id` > 0\n\t\t\t\tLIMIT 1\n\t\t\t\t", 'fetch_one'); $my_miner_id = get_my_miner_id($db); if (!$my_node_key && $my_miner_id > 0) { echo "\n\t\t\t\t\t <div class=\"alert alert-danger alert-dismissable\" style='margin-top: 30px'><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>\n\t\t\t\t <h4>Warning!</h4>\n\t\t\t\t <div>{$lng['alert_change_node_key']}</div>\n\t\t\t\t </div>\n\t\t\t\t "; } //} } // просто информируем, что в данном разделе у юзера нет прав $skip_community = array('node_config', 'nulling', 'start_stop'); $skip_restricted_users = array('node_config', 'change_node_key', 'nulling', 'start_stop', 'cash_requests_in', 'cash_requests_out', 'upgrade', 'notifications', 'interface'); if (!node_admin_access($db) && in_array($tpl_name, $skip_community) || !empty($_SESSION['restricted']) && in_array($tpl_name, $skip_restricted_users)) { echo "\n\t\t\t <div class=\"alert alert-danger alert-dismissable\" style='margin-top: 30px'><button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">×</button>\n\t\t\t <h4>Warning!</h4>\n\t\t\t <div>{$lng['permission_denied']}</div>\n\t\t\t </div>\n\t\t\t "; }
curl_close($ch); /* в ответ получаем: BLOCK_ID 4 TIME 4 USER_ID 5 SIGN от 128 до 512 байт. Подпись от TYPE, BLOCK_ID, PREV_BLOCK_HASH, TIME, USER_ID, LEVEL, MRKL_ROOT Размер всех тр-ий, размер 1 тр-ии, тело тр-ии. Хэши три-ий (порядок тр-ий) */ debug_print('$send_data=' . $send_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$binary_data=' . $binary_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // Разбираем полученные бинарные данные. $new_testblock['block_id'] = ParseData::binary_dec_string_shift($binary_data, 4); $new_testblock['time'] = ParseData::binary_dec_string_shift($binary_data, 4); $new_testblock['user_id'] = ParseData::binary_dec_string_shift($binary_data, 5); $sign_size = ParseData::decode_length($binary_data); $new_testblock['signature'] = ParseData::string_shift($binary_data, $sign_size); $new_testblock['signature_hex'] = bin2hex($new_testblock['signature']); debug_print($new_testblock, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // недостающие тр-ии $length = ParseData::decode_length($binary_data); // размер всех тр-ий $tr_binary = ParseData::string_shift($binary_data, $length); do { // берем по одной тр-ии $length = ParseData::decode_length($tr_binary); print '$length=' . $length . "\n"; if ($length == 0) { break; }
debug_print('$encrypted_data=' . $encrypted_data, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); debug_print('$encrypted_data=' . bin2hex($encrypted_data), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); // извлечем ключ, декодируем его и декодируем им данные $binary_tx = decrypt_data($encrypted_data, $db); if (substr($binary_tx, 0, 7) == '[error]') { die($binary_tx); } //debug_print('$binary_tx='.$binary_tx, __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); list(, $tx_hex) = unpack("H*", $binary_tx); $tx_hash = md5($binary_tx); $variables = ParseData::get_variables($db, array('max_tx_size')); // проверим размер if (strlen($binary_tx) > $variables['max_tx_size']) { die("error tx size"); } $block_data['type'] = ParseData::binary_dec_string_shift($binary_tx, 1); $block_data['time'] = ParseData::binary_dec_string_shift($binary_tx, 4); $size = ParseData::decode_length($binary_tx); $block_data['user_id'] = ParseData::string_shift($binary_tx, $size); if ($block_data['user_id'] == 1) { $high_rate = 1; } else { $high_rate = 0; } // заливаем тр-ию в БД $data = "{$tx_hash}\t{$high_rate}\t{$tx_hex}"; debug_print("data={$data}", __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__); $file = save_tmp_644('FTB', $data); $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tLOAD DATA LOCAL INFILE '{$file}'\n\t\t\tIGNORE INTO TABLE `" . DB_PREFIX . "queue_tx`\n\t\t\tFIELDS TERMINATED BY '\t'\n\t\t\t(@hash, `high_rate`, @data)\n\t\t\tSET `hash` = UNHEX(@hash),\n\t\t\t\t `data` = UNHEX(@data)\n\t\t\t"); unlink($file); //debug_print($db->printsql()."\ngetAffectedRows=".$db->getAffectedRows(), __FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__);
function get_my_notice_data() { global $db, $lng; if (empty($_SESSION['restricted'])) { $data = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, ' SELECT `user_id`, `miner_id`, `status` FROM `' . DB_PREFIX . MY_PREFIX . 'my_table` ', 'fetch_array'); if (!$data['user_id']) { $tpl['account_status'] = 'searching'; } else { if ($data['status'] == 'bad_key') { $tpl['account_status'] = 'bad_key'; } else { if ($data['miner_id']) { $tpl['account_status'] = 'miner'; } else { if ($data['user_id']) { $tpl['account_status'] = 'user'; } } } } } else { // user_id уже есть, т.к. мы смогли зайти в урезанном режиме по паблик-кею // проверим, может есть что-то в miners_data $user_id = intval($_SESSION['user_id']); $status = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\t\tSELECT `status`\n\t\t\t\tFROM `" . DB_PREFIX . "miners_data`\n\t\t\t\tWHERE `user_id` = {$user_id}\n\t\t\t\tLIMIT 1\n\t\t\t\t", 'fetch_one'); if ($status) { $tpl['account_status'] = $status; } else { $tpl['account_status'] = 'user'; } } $tpl['account_status'] = $lng['status_' . $tpl['account_status']]; $confirmed_block_id = get_confirmed_block_id($db); $confirmed_block_id = $confirmed_block_id ? $confirmed_block_id : 1; // получим время из последнего подвержденного блока $last_block_bin = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT `data`\n\t\t\tFROM `" . DB_PREFIX . "block_chain`\n\t\t\tWHERE `id` = {$confirmed_block_id}\n\t\t\tLIMIT 1\n\t\t\t", 'fetch_one'); ParseData::string_shift($last_block_bin, 1); // уберем тип $block_id = ParseData::binary_dec_string_shift($last_block_bin, 4); $block_time = ParseData::binary_dec_string_shift($last_block_bin, 4); $tpl['time_last_block'] = date('d-m-Y H:i:s', $block_time); $tpl['time_last_block_int'] = $block_time; $tpl['cur_block_id'] = $block_id; $tpl['connections'] = $db->query(__FILE__, __LINE__, __FUNCTION__, __CLASS__, __METHOD__, "\n\t\t\tSELECT count(*)\n\t\t\tFROM `" . DB_PREFIX . "nodes_connection`\n\t\t\t", 'fetch_one'); if (time() - $block_time > 1800) { $tpl['main_status'] = $lng['downloading_blocks']; $tpl['main_status_complete'] = 0; } else { $tpl['main_status'] = $lng['downloading_complete']; $tpl['main_status_complete'] = 1; } return $tpl; }